More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,546 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Liquidity ET... | 60565175 | 3 days ago | IN | 20.85 AVAX | 0.00001931 | ||||
Add Liquidity ET... | 60413810 | 6 days ago | IN | 5 AVAX | 0.00004273 | ||||
Add Liquidity ET... | 60411712 | 6 days ago | IN | 38.5 AVAX | 0.00001898 | ||||
Add Liquidity ET... | 60239132 | 9 days ago | IN | 14.75 AVAX | 0.00002437 | ||||
Add Liquidity ET... | 60227974 | 9 days ago | IN | 24 AVAX | 0.00001599 | ||||
Add Liquidity ET... | 60209986 | 9 days ago | IN | 10 AVAX | 0.00002166 | ||||
Add Liquidity ET... | 59898904 | 14 days ago | IN | 27.64482704 AVAX | 0.00043842 | ||||
Add Liquidity ET... | 59892873 | 15 days ago | IN | 50 AVAX | 0.00034558 | ||||
Add Liquidity ET... | 59870927 | 15 days ago | IN | 14 AVAX | 0.00021273 | ||||
Add Liquidity ET... | 59850003 | 15 days ago | IN | 14 AVAX | 0.01341351 | ||||
Add Liquidity ET... | 59849529 | 15 days ago | IN | 43 AVAX | 0.00659331 | ||||
Add Liquidity ET... | 59848054 | 15 days ago | IN | 12.89167602 AVAX | 0.00019161 | ||||
Add Liquidity ET... | 59847802 | 15 days ago | IN | 40 AVAX | 0.00028184 | ||||
Add Liquidity ET... | 59822934 | 16 days ago | IN | 20.25 AVAX | 0.00022984 | ||||
Add Liquidity ET... | 59822296 | 16 days ago | IN | 17.19396949 AVAX | 0.00021099 | ||||
Add Liquidity ET... | 59821134 | 16 days ago | IN | 16.31153976 AVAX | 0.00031556 | ||||
Add Liquidity ET... | 59818469 | 16 days ago | IN | 7.03002085 AVAX | 0.00027154 | ||||
Add Liquidity ET... | 59758012 | 17 days ago | IN | 77 AVAX | 0.00021602 | ||||
Add Liquidity ET... | 59698243 | 19 days ago | IN | 15.7419665 AVAX | 0.00020877 | ||||
Add Liquidity ET... | 59520945 | 22 days ago | IN | 20 AVAX | 0.0002577 | ||||
Add Liquidity ET... | 59496600 | 23 days ago | IN | 5.2 AVAX | 0.00019888 | ||||
Add Liquidity ET... | 59496343 | 23 days ago | IN | 15.1 AVAX | 0.000216 | ||||
Add Liquidity ET... | 59268403 | 28 days ago | IN | 20 AVAX | 0.000216 | ||||
Add Liquidity ET... | 59243408 | 28 days ago | IN | 14 AVAX | 0.0002667 | ||||
Add Liquidity ET... | 59215617 | 29 days ago | IN | 20 AVAX | 0.00024912 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
60712154 | 32 hrs ago | 3.01484957 AVAX | ||||
60712154 | 32 hrs ago | 3.01484957 AVAX | ||||
60707878 | 33 hrs ago | 16.89528658 AVAX | ||||
60707878 | 33 hrs ago | 16.89528658 AVAX | ||||
60647139 | 2 days ago | 19.61814082 AVAX | ||||
60647139 | 2 days ago | 19.61814082 AVAX | ||||
60646473 | 2 days ago | 31.33996417 AVAX | ||||
60646473 | 2 days ago | 31.33996417 AVAX | ||||
60641174 | 2 days ago | 28.24338274 AVAX | ||||
60641174 | 2 days ago | 28.24338274 AVAX | ||||
60592746 | 3 days ago | 5.5347447 AVAX | ||||
60592746 | 3 days ago | 5.5347447 AVAX | ||||
60565175 | 3 days ago | 1 wei | ||||
60565175 | 3 days ago | 20.84999999 AVAX | ||||
60413810 | 6 days ago | 1 wei | ||||
60413810 | 6 days ago | 4.99999999 AVAX | ||||
60411712 | 6 days ago | 1 wei | ||||
60411712 | 6 days ago | 38.49999999 AVAX | ||||
60372135 | 7 days ago | 8.47512672 AVAX | ||||
60372135 | 7 days ago | 8.47512672 AVAX | ||||
60339468 | 7 days ago | 10.74065735 AVAX | ||||
60339468 | 7 days ago | 12.76812583 AVAX | ||||
60339468 | 7 days ago | 23.50878319 AVAX | ||||
60338495 | 7 days ago | 25.73756638 AVAX | ||||
60338495 | 7 days ago | 10.15156447 AVAX |
Loading...
Loading
Contract Name:
VaporDEXRouter02
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; import "./libraries/VaporDEXLibrary.sol"; import "./libraries/TransferHelper.sol"; import "./interfaces/IVaporDEXRouter02.sol"; import "./interfaces/IVaporDEXFactory.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IWETH.sol"; contract VaporDEXRouter02 is IVaporDEXRouter02 { address public immutable override factory; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "VaporDEXRouter: EXPIRED"); _; } constructor(address _factory, address _WETH) { require(_factory != address(0) && _WETH != address(0), "Address 0"); factory = _factory; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } // **** 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 (IVaporDEXFactory(factory).getPair(tokenA, tokenB) == address(0)) { IVaporDEXFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = VaporDEXLibrary.getReserves(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = VaporDEXLibrary.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "VaporDEXRouter: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = VaporDEXLibrary.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "VaporDEXRouter: 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 = VaporDEXLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IVaporDEXPair(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 = VaporDEXLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IVaporDEXPair(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 = VaporDEXLibrary.pairFor(factory, tokenA, tokenB); require(IVaporDEXPair(pair).transferFrom(msg.sender, pair, liquidity), "VaporDEXRouter: Transfer failed"); // send liquidity to pair (uint256 amount0, uint256 amount1) = IVaporDEXPair(pair).burn(to); (address token0, ) = VaporDEXLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "VaporDEXRouter: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "VaporDEXRouter: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); 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 = VaporDEXLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? type(uint256).max : liquidity; IVaporDEXPair(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 = VaporDEXLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IVaporDEXPair(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, IERC20VaporDEX(token).balanceOf(address(this))); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } 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 = VaporDEXLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IVaporDEXPair(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, ) = VaporDEXLibrary.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 ? VaporDEXLibrary.pairFor(factory, output, path[i + 2]) : _to; IVaporDEXPair(VaporDEXLibrary.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = VaporDEXLibrary.getAmountsOut(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "VaporDEXRouter: INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, VaporDEXLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _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 = VaporDEXLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "VaporDEXRouter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, VaporDEXLibrary.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, "VaporDEXRouter: INVALID_PATH"); amounts = VaporDEXLibrary.getAmountsOut(factory, msg.value, path); require(amounts[amounts.length - 1] >= amountOutMin, "VaporDEXRouter: INSUFFICIENT_OUTPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(VaporDEXLibrary.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, "VaporDEXRouter: INVALID_PATH"); amounts = VaporDEXLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "VaporDEXRouter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, VaporDEXLibrary.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, "VaporDEXRouter: INVALID_PATH"); amounts = VaporDEXLibrary.getAmountsOut(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "VaporDEXRouter: INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, VaporDEXLibrary.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 swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "VaporDEXRouter: INVALID_PATH"); amounts = VaporDEXLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, "VaporDEXRouter: EXCESSIVE_INPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(VaporDEXLibrary.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, ) = VaporDEXLibrary.sortTokens(input, output); IVaporDEXPair pair = IVaporDEXPair(VaporDEXLibrary.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 = IERC20VaporDEX(input).balanceOf(address(pair)) - reserveInput; amountOutput = VaporDEXLibrary.getAmountOut(amountInput, reserveInput, reserveOutput); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? VaporDEXLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, VaporDEXLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20VaporDEX(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( (IERC20VaporDEX(path[path.length - 1]).balanceOf(to) - balanceBefore) >= amountOutMin, "VaporDEXRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "VaporDEXRouter: INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert(IWETH(WETH).transfer(VaporDEXLibrary.pairFor(factory, path[0], path[1]), amountIn)); uint256 balanceBefore = IERC20VaporDEX(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( (IERC20VaporDEX(path[path.length - 1]).balanceOf(to) - balanceBefore) >= amountOutMin, "VaporDEXRouter: 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, "VaporDEXRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, VaporDEXLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20VaporDEX(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, "VaporDEXRouter: 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 VaporDEXLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure virtual override returns (uint256 amountOut) { return VaporDEXLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure virtual override returns (uint256 amountIn) { return VaporDEXLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) public view virtual override returns (uint256[] memory amounts) { return VaporDEXLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) public view virtual override returns (uint256[] memory amounts) { return VaporDEXLibrary.getAmountsIn(factory, amountOut, path); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; // 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: 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: 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: TRANSFER_FROM_FAILED"); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; interface IERC20VaporDEX { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; import "../interfaces/IVaporDEXPair.sol"; library VaporDEXLibrary { // 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, "VaporDEXLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "VaporDEXLibrary: 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( uint160( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"5535878326bb95214a15436b03ccd939cc50793ba2e1c97c33a23473a9d7f4ad" // init code hash ) ) ) ) ); } // 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, ) = IVaporDEXPair(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, "VaporDEXLibrary: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "VaporDEXLibrary: INSUFFICIENT_LIQUIDITY"); amountB = (amountA * 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, "VaporDEXLibrary: INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "VaporDEXLibrary: INSUFFICIENT_LIQUIDITY"); uint256 amountInWithFee = amountIn * 9971; uint256 numerator = amountInWithFee * reserveOut; uint256 denominator = reserveIn * 10000 + 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, "VaporDEXLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "VaporDEXLibrary: INSUFFICIENT_LIQUIDITY"); uint256 numerator = reserveIn * amountOut * 1000; uint256 denominator = (reserveOut - amountOut) * 997; amountIn = (numerator / denominator) + 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, "VaporDEXLibrary: 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, "VaporDEXLibrary: 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); } } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; interface IVaporDEXFactory { function feeCollector() external view returns (address); function feeCollectorSetter() external view returns (address); function migrator() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeCollector(address) external; function setFeeCollectorSetter(address) external; function setMigrator(address) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; import "./IVaporDEXRouter01.sol"; interface IVaporDEXRouter02 is IVaporDEXRouter01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; import "./IVaporDEXERC20.sol"; interface IVaporDEXPair is IVaporDEXERC20 { event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; interface IVaporDEXERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.12; interface IVaporDEXRouter01 { function factory() external view returns (address); function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 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 returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"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":"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":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","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"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"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":"swapExactETHForTokensSupportingFeeOnTransferTokens","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":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","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
60c06040523480156200001157600080fd5b5060405162004320380380620043208339810160408190526200003491620000c7565b6001600160a01b038216158015906200005557506001600160a01b03811615155b620000925760405162461bcd60e51b815260206004820152600960248201526804164647265737320360bc1b604482015260640160405180910390fd5b6001600160a01b039182166080521660a052620000ff565b80516001600160a01b0381168114620000c257600080fd5b919050565b60008060408385031215620000db57600080fd5b620000e683620000aa565b9150620000f660208401620000aa565b90509250929050565b60805160a05161408f620002916000396000818161015f0152818161036d01528181610522015281816105710152818161062d0152818161085001528181610b8701528181610cc201528181611013015281816110f6015281816111a10152818161123401528181611352015281816113e001528181611628015281816116e001528181611771015281816117ee0152818161186201528181611cf101528181611ee201528181611f3801528181611f6c015281816120010152818161213a0152818161224c01526122da01526000818161042c015281816106a90152818161077b015281816109360152818161096d01528181610a6401528181610c0301528181610ca001528181610dd7015281816112af015281816114120152818161155d0152818161189401528181611ab001528181611c9f01528181611ccf01528181611df801528181611f16015281816121b50152818161230c01528181612ba201528181612bf201528181612ebd01528181613066015281816133c80152818161346b01526134e2015261408f6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a01551461041a578063d06ca61f1461044e578063ded9382a1461046e578063e8e337001461048e578063f305d719146104c9578063fb3bdb41146104dc57600080fd5b80638803dbee1461033b578063ad5c46481461035b578063ad615dec146103a7578063af2979eb146103c7578063b6f9de95146103e7578063baa2abde146103fa57600080fd5b80634a25d94a116101085780634a25d94a146102885780635b0d5984146102a85780635c11d795146102c8578063791ac947146102e85780637ff36ab51461030857806385f8c2591461031b57600080fd5b806302751cec14610193578063054d50d4146101cd57806318cbafe5146101fb5780631f00ca74146102285780632195995c1461024857806338ed17391461026857600080fd5b3661018e57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018c5761018c613689565b005b600080fd5b34801561019f57600080fd5b506101b36101ae3660046136c7565b6104ef565b604080519283526020830191909152015b60405180910390f35b3480156101d957600080fd5b506101ed6101e8366004613725565b6105eb565b6040519081526020016101c4565b34801561020757600080fd5b5061021b610216366004613796565b610600565b6040516101c49190613809565b34801561023457600080fd5b5061021b610243366004613863565b61092f565b34801561025457600080fd5b506101b3610263366004613953565b610963565b34801561027457600080fd5b5061021b610283366004613796565b610a3c565b34801561029457600080fd5b5061021b6102a3366004613796565b610b5a565b3480156102b457600080fd5b506101ed6102c33660046139fd565b610c98565b3480156102d457600080fd5b5061018c6102e3366004613796565b610d85565b3480156102f457600080fd5b5061018c610303366004613796565b610fe8565b61021b610316366004613a93565b61120f565b34801561032757600080fd5b506101ed610336366004613725565b611528565b34801561034757600080fd5b5061021b610356366004613796565b611535565b34801561036757600080fd5b5061038f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c4565b3480156103b357600080fd5b506101ed6103c2366004613725565b6115f2565b3480156103d357600080fd5b506101ed6103e23660046136c7565b6115ff565b61018c6103f5366004613a93565b61174e565b34801561040657600080fd5b506101b3610415366004613afa565b611a85565b34801561042657600080fd5b5061038f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561045a57600080fd5b5061021b610469366004613863565b611c98565b34801561047a57600080fd5b506101b36104893660046139fd565b611cc5565b34801561049a57600080fd5b506104ae6104a9366004613b6c565b611db8565b604080519384526020840192909252908201526060016101c4565b6104ae6104d73660046136c7565b611eb6565b61021b6104ea366004613a93565b612115565b600080824281101561051c5760405162461bcd60e51b815260040161051390613be8565b60405180910390fd5b61054b897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611a85565b909350915061055b898685612464565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156105bd57600080fd5b505af11580156105d1573d6000803e3d6000fd5b505050506105df858361257f565b50965096945050505050565b60006105f884848461264d565b949350505050565b606081428110156106235760405162461bcd60e51b815260040161051390613be8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661065a600182613c35565b81811061066957610669613c4c565b905060200201602081019061067e9190613c62565b6001600160a01b0316146106a45760405162461bcd60e51b815260040161051390613c7f565b6107027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061272b92505050565b91508682600184516107149190613c35565b8151811061072457610724613c4c565b6020026020010151101561074a5760405162461bcd60e51b815260040161051390613cb6565b61080f8686600081811061076057610760613c4c565b90506020020160208101906107759190613c62565b336107ef7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106107ad576107ad613c4c565b90506020020160208101906107c29190613c62565b8b8b60018181106107d5576107d5613c4c565b90506020020160208101906107ea9190613c62565b6128b6565b8560008151811061080257610802613c4c565b602002602001015161298f565b61084e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612abf915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855161088c9190613c35565b8151811061089c5761089c613c4c565b60200260200101516040518263ffffffff1660e01b81526004016108c291815260200190565b600060405180830381600087803b1580156108dc57600080fd5b505af11580156108f0573d6000803e3d6000fd5b505050506109248483600185516109079190613c35565b8151811061091757610917613c4c565b602002602001015161257f565b509695505050505050565b606061095c7f00000000000000000000000000000000000000000000000000000000000000008484612cc7565b9392505050565b60008060006109937f00000000000000000000000000000000000000000000000000000000000000008f8f6128b6565b90506000876109a2578c6109a6565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906109e1903390309086908f908e908e908e90600401613d00565b600060405180830381600087803b1580156109fb57600080fd5b505af1158015610a0f573d6000803e3d6000fd5b50505050610a228f8f8f8f8f8f8f611a85565b809450819550505050509b509b9950505050505050505050565b60608142811015610a5f5760405162461bcd60e51b815260040161051390613be8565b610abd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061272b92505050565b9150868260018451610acf9190613c35565b81518110610adf57610adf613c4c565b60200260200101511015610b055760405162461bcd60e51b815260040161051390613cb6565b610b1b8686600081811061076057610760613c4c565b61092482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612abf915050565b60608142811015610b7d5760405162461bcd60e51b815260040161051390613be8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610bb4600182613c35565b818110610bc357610bc3613c4c565b9050602002016020810190610bd89190613c62565b6001600160a01b031614610bfe5760405162461bcd60e51b815260040161051390613c7f565b610c5c7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc792505050565b91508682600081518110610c7257610c72613c4c565b6020026020010151111561074a5760405162461bcd60e51b815260040161051390613d41565b600080610ce67f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006128b6565b9050600086610cf5578b610cf9565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610d34903390309086908e908d908d908d90600401613d00565b600060405180830381600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b50505050610d748d8d8d8d8d8d6115ff565b9d9c50505050505050505050505050565b8042811015610da65760405162461bcd60e51b815260040161051390613be8565b610e3785856000818110610dbc57610dbc613c4c565b9050602002016020810190610dd19190613c62565b33610e317f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0957610e09613c4c565b9050602002016020810190610e1e9190613c62565b8a8a60018181106107d5576107d5613c4c565b8a61298f565b60008585610e46600182613c35565b818110610e5557610e55613c4c565b9050602002016020810190610e6a9190613c62565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed69190613d87565b9050610f16868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612e48915050565b86818787610f25600182613c35565b818110610f3457610f34613c4c565b9050602002016020810190610f499190613c62565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190613d87565b610fc09190613c35565b1015610fde5760405162461bcd60e51b815260040161051390613cb6565b5050505050505050565b80428110156110095760405162461bcd60e51b815260040161051390613be8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611040600182613c35565b81811061104f5761104f613c4c565b90506020020160208101906110649190613c62565b6001600160a01b03161461108a5760405162461bcd60e51b815260040161051390613c7f565b6110a085856000818110610dbc57610dbc613c4c565b6110de858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612e48915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190613d87565b90508681101561118b5760405162461bcd60e51b815260040161051390613cb6565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111ed57600080fd5b505af1158015611201573d6000803e3d6000fd5b50505050610fde848261257f565b606081428110156112325760405162461bcd60e51b815260040161051390613be8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061126f5761126f613c4c565b90506020020160208101906112849190613c62565b6001600160a01b0316146112aa5760405162461bcd60e51b815260040161051390613c7f565b6113087f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061272b92505050565b915086826001845161131a9190613c35565b8151811061132a5761132a613c4c565b602002602001015110156113505760405162461bcd60e51b815260040161051390613cb6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061139257611392613c4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113c557600080fd5b505af11580156113d9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6114447f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0957610e09613c4c565b8460008151811061145757611457613c4c565b60200260200101516040518363ffffffff1660e01b81526004016114909291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190613da0565b6114df576114df613689565b61151e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612abf915050565b5095945050505050565b60006105f8848484613122565b606081428110156115585760405162461bcd60e51b815260040161051390613be8565b6115b67f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc792505050565b915086826000815181106115cc576115cc613c4c565b60200260200101511115610b055760405162461bcd60e51b815260040161051390613d41565b60006105f8848484613206565b600081428110156116225760405162461bcd60e51b815260040161051390613be8565b611651887f00000000000000000000000000000000000000000000000000000000000000008989893089611a85565b6040516370a0823160e01b81523060048201529093506116ca9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa1580156116a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c59190613d87565b612464565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561172c57600080fd5b505af1158015611740573d6000803e3d6000fd5b50505050610924848361257f565b804281101561176f5760405162461bcd60e51b815260040161051390613be8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106117ac576117ac613c4c565b90506020020160208101906117c19190613c62565b6001600160a01b0316146117e75760405162461bcd60e51b815260040161051390613c7f565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118c67f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0957610e09613c4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119379190613da0565b61194357611943613689565b60008686611952600182613c35565b81811061196157611961613c4c565b90506020020160208101906119769190613c62565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190613d87565b9050611a22878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612e48915050565b87818888611a31600182613c35565b818110611a4057611a40613c4c565b9050602002016020810190611a559190613c62565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f75565b6000808242811015611aa95760405162461bcd60e51b815260040161051390613be8565b6000611ad67f00000000000000000000000000000000000000000000000000000000000000008c8c6128b6565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190613da0565b611b9c5760405162461bcd60e51b815260206004820152601f60248201527f5661706f72444558526f757465723a205472616e73666572206661696c6564006044820152606401610513565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0c9190613dbd565b915091506000611c1c8e8e6132a4565b509050806001600160a01b03168e6001600160a01b031614611c3f578183611c42565b82825b90975095508a871015611c675760405162461bcd60e51b815260040161051390613de1565b89861015611c875760405162461bcd60e51b815260040161051390613e26565b505050505097509795505050505050565b606061095c7f0000000000000000000000000000000000000000000000000000000000000000848461272b565b6000806000611d157f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006128b6565b9050600087611d24578c611d28565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d63903390309086908f908e908e908e90600401613d00565b600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b50505050611da38e8e8e8e8e8e6104ef565b909f909e509c50505050505050505050505050565b60008060008342811015611dde5760405162461bcd60e51b815260040161051390613be8565b611dec8c8c8c8c8c8c61339a565b90945092506000611e1e7f00000000000000000000000000000000000000000000000000000000000000008e8e6128b6565b9050611e2c8d33838861298f565b611e388c33838761298f565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea49190613d87565b92505050985098509895505050505050565b60008060008342811015611edc5760405162461bcd60e51b815260040161051390613be8565b611f0a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61339a565b90945092506000611f5c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006128b6565b9050611f6a8b33838861298f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fc557600080fd5b505af1158015611fd9573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af115801561204e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120729190613da0565b61207e5761207e613689565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190613d87565b92508334111561210757612107336121028634613c35565b61257f565b505096509650969350505050565b606081428110156121385760405162461bcd60e51b815260040161051390613be8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061217557612175613c4c565b905060200201602081019061218a9190613c62565b6001600160a01b0316146121b05760405162461bcd60e51b815260040161051390613c7f565b61220e7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc792505050565b9150348260008151811061222457612224613c4c565b6020026020010151111561224a5760405162461bcd60e51b815260040161051390613d41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061228c5761228c613c4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122bf57600080fd5b505af11580156122d3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61233e7f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0957610e09613c4c565b8460008151811061235157612351613c4c565b60200260200101516040518363ffffffff1660e01b815260040161238a9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156123a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cd9190613da0565b6123d9576123d9613689565b61241882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612abf915050565b8160008151811061242b5761242b613c4c565b602002602001015134111561151e5761151e338360008151811061245157612451613c4c565b6020026020010151346121029190613c35565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916124c09190613e97565b6000604051808303816000865af19150503d80600081146124fd576040519150601f19603f3d011682016040523d82523d6000602084013e612502565b606091505b509150915081801561252c57508051158061252c57508080602001905181019061252c9190613da0565b6125785760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610513565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516125a99190613e97565b60006040518083038185875af1925050503d80600081146125e6576040519150601f19603f3d011682016040523d82523d6000602084013e6125eb565b606091505b50509050806126485760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610513565b505050565b60008084116126b15760405162461bcd60e51b815260206004820152602a60248201527f5661706f724445584c6962726172793a20494e53554646494349454e545f494e60448201526914155517d05353d5539560b21b6064820152608401610513565b6000831180156126c15750600082115b6126dd5760405162461bcd60e51b815260040161051390613eb3565b60006126eb856126f3613efa565b905060006126f98483613efa565b905060008261270a87612710613efa565b6127149190613f19565b90506127208183613f31565b979650505050505050565b606060028251101561277f5760405162461bcd60e51b815260206004820152601d60248201527f5661706f724445584c6962726172793a20494e56414c49445f504154480000006044820152606401610513565b815167ffffffffffffffff8111156127995761279961384d565b6040519080825280602002602001820160405280156127c2578160200160208202803683370190505b50905082816000815181106127d9576127d9613c4c565b60200260200101818152505060005b600183516127f69190613c35565b8110156128ae576000806128498786858151811061281657612816613c4c565b60200260200101518786600161282c9190613f19565b8151811061283c5761283c613c4c565b60200260200101516135bf565b9150915061287184848151811061286257612862613c4c565b6020026020010151838361264d565b8461287d856001613f19565b8151811061288d5761288d613c4c565b602002602001018181525050505080806128a690613f53565b9150506127e8565b509392505050565b60008060006128c585856132a4565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012060405160200161296d9291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f5535878326bb95214a15436b03ccd939cc50793ba2e1c97c33a23473a9d7f4ad603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916129f39190613e97565b6000604051808303816000865af19150503d8060008114612a30576040519150601f19603f3d011682016040523d82523d6000602084013e612a35565b606091505b5091509150818015612a5f575080511580612a5f575080806020019051810190612a5f9190613da0565b612ab75760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610513565b505050505050565b60005b60018351612ad09190613c35565b811015612cc157600080848381518110612aec57612aec613c4c565b602002602001015185846001612b029190613f19565b81518110612b1257612b12613c4c565b6020026020010151915091506000612b2a83836132a4565b509050600087612b3b866001613f19565b81518110612b4b57612b4b613c4c565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612b7957826000612b7d565b6000835b91509150600060028a51612b919190613c35565b8810612b9d5788612beb565b612beb7f0000000000000000000000000000000000000000000000000000000000000000878c612bce8c6002613f19565b81518110612bde57612bde613c4c565b60200260200101516128b6565b9050612c187f000000000000000000000000000000000000000000000000000000000000000088886128b6565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612c55576020820181803683370190505b506040518563ffffffff1660e01b8152600401612c759493929190613f6e565b600060405180830381600087803b158015612c8f57600080fd5b505af1158015612ca3573d6000803e3d6000fd5b50505050505050505050508080612cb990613f53565b915050612ac2565b50505050565b6060600282511015612d1b5760405162461bcd60e51b815260206004820152601d60248201527f5661706f724445584c6962726172793a20494e56414c49445f504154480000006044820152606401610513565b815167ffffffffffffffff811115612d3557612d3561384d565b604051908082528060200260200182016040528015612d5e578160200160208202803683370190505b509050828160018351612d719190613c35565b81518110612d8157612d81613c4c565b602002602001018181525050600060018351612d9d9190613c35565b90505b80156128ae57600080612de38786612db9600187613c35565b81518110612dc957612dc9613c4c565b602002602001015187868151811061283c5761283c613c4c565b91509150612e0b848481518110612dfc57612dfc613c4c565b60200260200101518383613122565b84612e17600186613c35565b81518110612e2757612e27613c4c565b60200260200101818152505050508080612e4090613fbe565b915050612da0565b60005b60018351612e599190613c35565b81101561264857600080848381518110612e7557612e75613c4c565b602002602001015185846001612e8b9190613f19565b81518110612e9b57612e9b613c4c565b6020026020010151915091506000612eb383836132a4565b5090506000612ee37f000000000000000000000000000000000000000000000000000000000000000085856128b6565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190613fec565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614612f87578284612f8a565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015612fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffc9190613d87565b6130069190613c35565b955061301386838361264d565b945050505050600080856001600160a01b0316886001600160a01b03161461303d57826000613041565b6000835b91509150600060028c516130559190613c35565b8a10613061578a613092565b6130927f0000000000000000000000000000000000000000000000000000000000000000898e612bce8e6002613f19565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906130d49086908690869060248101613f6e565b600060405180830381600087803b1580156130ee57600080fd5b505af1158015613102573d6000803e3d6000fd5b50505050505050505050505050808061311a90613f53565b915050612e4b565b60008084116131875760405162461bcd60e51b815260206004820152602b60248201527f5661706f724445584c6962726172793a20494e53554646494349454e545f4f5560448201526a1514155517d05353d5539560aa1b6064820152608401610513565b6000831180156131975750600082115b6131b35760405162461bcd60e51b815260040161051390613eb3565b60006131bf8585613efa565b6131cb906103e8613efa565b905060006131d98685613c35565b6131e5906103e5613efa565b90506131f18183613f31565b6131fc906001613f19565b9695505050505050565b60008084116132635760405162461bcd60e51b8152602060048201526024808201527f5661706f724445584c6962726172793a20494e53554646494349454e545f414d60448201526313d5539560e21b6064820152608401610513565b6000831180156132735750600082115b61328f5760405162461bcd60e51b815260040161051390613eb3565b8261329a8386613efa565b6105f89190613f31565b600080826001600160a01b0316846001600160a01b031614156133155760405162461bcd60e51b8152602060048201526024808201527f5661706f724445584c6962726172793a204944454e544943414c5f41444452456044820152635353455360e01b6064820152608401610513565b826001600160a01b0316846001600160a01b031610613335578284613338565b83835b90925090506001600160a01b0382166133935760405162461bcd60e51b815260206004820152601d60248201527f5661706f724445584c6962726172793a205a45524f5f414444524553530000006044820152606401610513565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015613411573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613435919061403c565b6001600160a01b031614156134da576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af11580156134b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d8919061403c565b505b6000806135087f00000000000000000000000000000000000000000000000000000000000000008b8b6135bf565b9150915081600014801561351a575080155b1561352a578793508692506135b2565b6000613537898484613206565b905087811161356b57858110156135605760405162461bcd60e51b815260040161051390613e26565b8894509250826135b0565b6000613578898486613206565b90508981111561358a5761358a613689565b878110156135aa5760405162461bcd60e51b815260040161051390613de1565b94508793505b505b5050965096945050505050565b60008060006135ce85856132a4565b5090506000806135df8888886128b6565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561361c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136409190613fec565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461367757808261367a565b81815b90999098509650505050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03811681146136b457600080fd5b50565b80356136c28161369f565b919050565b60008060008060008060c087890312156136e057600080fd5b86356136eb8161369f565b955060208701359450604087013593506060870135925060808701356137108161369f565b8092505060a087013590509295509295509295565b60008060006060848603121561373a57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261376357600080fd5b50813567ffffffffffffffff81111561377b57600080fd5b6020830191508360208260051b850101111561339357600080fd5b60008060008060008060a087890312156137af57600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156137d457600080fd5b6137e089828a01613751565b90955093505060608701356137f48161369f565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561384157835183529284019291840191600101613825565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561387657600080fd5b8235915060208084013567ffffffffffffffff8082111561389657600080fd5b818601915086601f8301126138aa57600080fd5b8135818111156138bc576138bc61384d565b8060051b604051601f19603f830116810181811085821117156138e1576138e161384d565b6040529182528482019250838101850191898311156138ff57600080fd5b938501935b8285101561392457613915856136b7565b84529385019392850192613904565b8096505050505050509250929050565b80151581146136b457600080fd5b803560ff811681146136c257600080fd5b60008060008060008060008060008060006101608c8e03121561397557600080fd5b8b356139808161369f565b9a5060208c01356139908161369f565b995060408c0135985060608c0135975060808c0135965060a08c01356139b58161369f565b955060c08c0135945060e08c01356139cc81613934565b93506139db6101008d01613942565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215613a1d57600080fd5b8a35613a288161369f565b995060208b0135985060408b0135975060608b0135965060808b0135613a4d8161369f565b955060a08b0135945060c08b0135613a6481613934565b9350613a7260e08c01613942565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215613aab57600080fd5b85359450602086013567ffffffffffffffff811115613ac957600080fd5b613ad588828901613751565b9095509350506040860135613ae98161369f565b949793965091946060013592915050565b600080600080600080600060e0888a031215613b1557600080fd5b8735613b208161369f565b96506020880135613b308161369f565b955060408801359450606088013593506080880135925060a0880135613b558161369f565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613b8957600080fd5b8835613b948161369f565b97506020890135613ba48161369f565b965060408901359550606089013594506080890135935060a0890135925060c0890135613bd08161369f565b8092505060e089013590509295985092959890939650565b60208082526017908201527f5661706f72444558526f757465723a2045585049524544000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c4757613c47613c1f565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613c7457600080fd5b813561095c8161369f565b6020808252601c908201527f5661706f72444558526f757465723a20494e56414c49445f5041544800000000604082015260600190565b6020808252602a908201527f5661706f72444558526f757465723a20494e53554646494349454e545f4f555460408201526914155517d05353d5539560b21b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526026908201527f5661706f72444558526f757465723a204558434553534956455f494e5055545f604082015265105353d5539560d21b606082015260800190565b600060208284031215613d9957600080fd5b5051919050565b600060208284031215613db257600080fd5b815161095c81613934565b60008060408385031215613dd057600080fd5b505080516020909101519092909150565b60208082526025908201527f5661706f72444558526f757465723a20494e53554646494349454e545f415f416040820152641353d5539560da1b606082015260800190565b60208082526025908201527f5661706f72444558526f757465723a20494e53554646494349454e545f425f416040820152641353d5539560da1b606082015260800190565b60005b83811015613e86578181015183820152602001613e6e565b83811115612cc15750506000910152565b60008251613ea9818460208701613e6b565b9190910192915050565b60208082526027908201527f5661706f724445584c6962726172793a20494e53554646494349454e545f4c496040820152665155494449545960c81b606082015260800190565b6000816000190483118215151615613f1457613f14613c1f565b500290565b60008219821115613f2c57613f2c613c1f565b500190565b600082613f4e57634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415613f6757613f67613c1f565b5060010190565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613fa78160a0850160208701613e6b565b601f01601f19169190910160a00195945050505050565b600081613fcd57613fcd613c1f565b506000190190565b80516001600160701b03811681146136c257600080fd5b60008060006060848603121561400157600080fd5b61400a84613fd5565b925061401860208501613fd5565b9150604084015163ffffffff8116811461403157600080fd5b809150509250925092565b60006020828403121561404e57600080fd5b815161095c8161369f56fea26469706673582212208b8ffaf7b773362c154af8b73c206513831e0e9bbbb9309282a10674d877748564736f6c634300080c0033000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Deployed Bytecode
0x60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a01551461041a578063d06ca61f1461044e578063ded9382a1461046e578063e8e337001461048e578063f305d719146104c9578063fb3bdb41146104dc57600080fd5b80638803dbee1461033b578063ad5c46481461035b578063ad615dec146103a7578063af2979eb146103c7578063b6f9de95146103e7578063baa2abde146103fa57600080fd5b80634a25d94a116101085780634a25d94a146102885780635b0d5984146102a85780635c11d795146102c8578063791ac947146102e85780637ff36ab51461030857806385f8c2591461031b57600080fd5b806302751cec14610193578063054d50d4146101cd57806318cbafe5146101fb5780631f00ca74146102285780632195995c1461024857806338ed17391461026857600080fd5b3661018e57336001600160a01b037f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7161461018c5761018c613689565b005b600080fd5b34801561019f57600080fd5b506101b36101ae3660046136c7565b6104ef565b604080519283526020830191909152015b60405180910390f35b3480156101d957600080fd5b506101ed6101e8366004613725565b6105eb565b6040519081526020016101c4565b34801561020757600080fd5b5061021b610216366004613796565b610600565b6040516101c49190613809565b34801561023457600080fd5b5061021b610243366004613863565b61092f565b34801561025457600080fd5b506101b3610263366004613953565b610963565b34801561027457600080fd5b5061021b610283366004613796565b610a3c565b34801561029457600080fd5b5061021b6102a3366004613796565b610b5a565b3480156102b457600080fd5b506101ed6102c33660046139fd565b610c98565b3480156102d457600080fd5b5061018c6102e3366004613796565b610d85565b3480156102f457600080fd5b5061018c610303366004613796565b610fe8565b61021b610316366004613a93565b61120f565b34801561032757600080fd5b506101ed610336366004613725565b611528565b34801561034757600080fd5b5061021b610356366004613796565b611535565b34801561036757600080fd5b5061038f7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c781565b6040516001600160a01b0390911681526020016101c4565b3480156103b357600080fd5b506101ed6103c2366004613725565b6115f2565b3480156103d357600080fd5b506101ed6103e23660046136c7565b6115ff565b61018c6103f5366004613a93565b61174e565b34801561040657600080fd5b506101b3610415366004613afa565b611a85565b34801561042657600080fd5b5061038f7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25781565b34801561045a57600080fd5b5061021b610469366004613863565b611c98565b34801561047a57600080fd5b506101b36104893660046139fd565b611cc5565b34801561049a57600080fd5b506104ae6104a9366004613b6c565b611db8565b604080519384526020840192909252908201526060016101c4565b6104ae6104d73660046136c7565b611eb6565b61021b6104ea366004613a93565b612115565b600080824281101561051c5760405162461bcd60e51b815260040161051390613be8565b60405180910390fd5b61054b897f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c78a8a8a308a611a85565b909350915061055b898685612464565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156105bd57600080fd5b505af11580156105d1573d6000803e3d6000fd5b505050506105df858361257f565b50965096945050505050565b60006105f884848461264d565b949350505050565b606081428110156106235760405162461bcd60e51b815260040161051390613be8565b6001600160a01b037f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c716868661065a600182613c35565b81811061066957610669613c4c565b905060200201602081019061067e9190613c62565b6001600160a01b0316146106a45760405162461bcd60e51b815260040161051390613c7f565b6107027f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061272b92505050565b91508682600184516107149190613c35565b8151811061072457610724613c4c565b6020026020010151101561074a5760405162461bcd60e51b815260040161051390613cb6565b61080f8686600081811061076057610760613c4c565b90506020020160208101906107759190613c62565b336107ef7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578a8a60008181106107ad576107ad613c4c565b90506020020160208101906107c29190613c62565b8b8b60018181106107d5576107d5613c4c565b90506020020160208101906107ea9190613c62565b6128b6565b8560008151811061080257610802613c4c565b602002602001015161298f565b61084e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612abf915050565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316632e1a7d4d836001855161088c9190613c35565b8151811061089c5761089c613c4c565b60200260200101516040518263ffffffff1660e01b81526004016108c291815260200190565b600060405180830381600087803b1580156108dc57600080fd5b505af11580156108f0573d6000803e3d6000fd5b505050506109248483600185516109079190613c35565b8151811061091757610917613c4c565b602002602001015161257f565b509695505050505050565b606061095c7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578484612cc7565b9392505050565b60008060006109937f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578f8f6128b6565b90506000876109a2578c6109a6565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906109e1903390309086908f908e908e908e90600401613d00565b600060405180830381600087803b1580156109fb57600080fd5b505af1158015610a0f573d6000803e3d6000fd5b50505050610a228f8f8f8f8f8f8f611a85565b809450819550505050509b509b9950505050505050505050565b60608142811015610a5f5760405162461bcd60e51b815260040161051390613be8565b610abd7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061272b92505050565b9150868260018451610acf9190613c35565b81518110610adf57610adf613c4c565b60200260200101511015610b055760405162461bcd60e51b815260040161051390613cb6565b610b1b8686600081811061076057610760613c4c565b61092482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612abf915050565b60608142811015610b7d5760405162461bcd60e51b815260040161051390613be8565b6001600160a01b037f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7168686610bb4600182613c35565b818110610bc357610bc3613c4c565b9050602002016020810190610bd89190613c62565b6001600160a01b031614610bfe5760405162461bcd60e51b815260040161051390613c7f565b610c5c7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25789888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc792505050565b91508682600081518110610c7257610c72613c4c565b6020026020010151111561074a5760405162461bcd60e51b815260040161051390613d41565b600080610ce67f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578d7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76128b6565b9050600086610cf5578b610cf9565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610d34903390309086908e908d908d908d90600401613d00565b600060405180830381600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b50505050610d748d8d8d8d8d8d6115ff565b9d9c50505050505050505050505050565b8042811015610da65760405162461bcd60e51b815260040161051390613be8565b610e3785856000818110610dbc57610dbc613c4c565b9050602002016020810190610dd19190613c62565b33610e317f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25789896000818110610e0957610e09613c4c565b9050602002016020810190610e1e9190613c62565b8a8a60018181106107d5576107d5613c4c565b8a61298f565b60008585610e46600182613c35565b818110610e5557610e55613c4c565b9050602002016020810190610e6a9190613c62565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed69190613d87565b9050610f16868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612e48915050565b86818787610f25600182613c35565b818110610f3457610f34613c4c565b9050602002016020810190610f499190613c62565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190613d87565b610fc09190613c35565b1015610fde5760405162461bcd60e51b815260040161051390613cb6565b5050505050505050565b80428110156110095760405162461bcd60e51b815260040161051390613be8565b6001600160a01b037f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7168585611040600182613c35565b81811061104f5761104f613c4c565b90506020020160208101906110649190613c62565b6001600160a01b03161461108a5760405162461bcd60e51b815260040161051390613c7f565b6110a085856000818110610dbc57610dbc613c4c565b6110de858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612e48915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316906370a0823190602401602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190613d87565b90508681101561118b5760405162461bcd60e51b815260040161051390613cb6565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111ed57600080fd5b505af1158015611201573d6000803e3d6000fd5b50505050610fde848261257f565b606081428110156112325760405162461bcd60e51b815260040161051390613be8565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b03168686600081811061126f5761126f613c4c565b90506020020160208101906112849190613c62565b6001600160a01b0316146112aa5760405162461bcd60e51b815260040161051390613c7f565b6113087f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2573488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061272b92505050565b915086826001845161131a9190613c35565b8151811061132a5761132a613c4c565b602002602001015110156113505760405162461bcd60e51b815260040161051390613cb6565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db08360008151811061139257611392613c4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113c557600080fd5b505af11580156113d9573d6000803e3d6000fd5b50505050507f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663a9059cbb6114447f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25789896000818110610e0957610e09613c4c565b8460008151811061145757611457613c4c565b60200260200101516040518363ffffffff1660e01b81526004016114909291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190613da0565b6114df576114df613689565b61151e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612abf915050565b5095945050505050565b60006105f8848484613122565b606081428110156115585760405162461bcd60e51b815260040161051390613be8565b6115b67f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25789888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc792505050565b915086826000815181106115cc576115cc613c4c565b60200260200101511115610b055760405162461bcd60e51b815260040161051390613d41565b60006105f8848484613206565b600081428110156116225760405162461bcd60e51b815260040161051390613be8565b611651887f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c78989893089611a85565b6040516370a0823160e01b81523060048201529093506116ca9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa1580156116a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c59190613d87565b612464565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561172c57600080fd5b505af1158015611740573d6000803e3d6000fd5b50505050610924848361257f565b804281101561176f5760405162461bcd60e51b815260040161051390613be8565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316858560008181106117ac576117ac613c4c565b90506020020160208101906117c19190613c62565b6001600160a01b0316146117e75760405162461bcd60e51b815260040161051390613c7f565b60003490507f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b50505050507f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663a9059cbb6118c67f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25789896000818110610e0957610e09613c4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119379190613da0565b61194357611943613689565b60008686611952600182613c35565b81811061196157611961613c4c565b90506020020160208101906119769190613c62565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156119be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e29190613d87565b9050611a22878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612e48915050565b87818888611a31600182613c35565b818110611a4057611a40613c4c565b9050602002016020810190611a559190613c62565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f75565b6000808242811015611aa95760405162461bcd60e51b815260040161051390613be8565b6000611ad67f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578c8c6128b6565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190613da0565b611b9c5760405162461bcd60e51b815260206004820152601f60248201527f5661706f72444558526f757465723a205472616e73666572206661696c6564006044820152606401610513565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0c9190613dbd565b915091506000611c1c8e8e6132a4565b509050806001600160a01b03168e6001600160a01b031614611c3f578183611c42565b82825b90975095508a871015611c675760405162461bcd60e51b815260040161051390613de1565b89861015611c875760405162461bcd60e51b815260040161051390613e26565b505050505097509795505050505050565b606061095c7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257848461272b565b6000806000611d157f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578e7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76128b6565b9050600087611d24578c611d28565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d63903390309086908f908e908e908e90600401613d00565b600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b50505050611da38e8e8e8e8e8e6104ef565b909f909e509c50505050505050505050505050565b60008060008342811015611dde5760405162461bcd60e51b815260040161051390613be8565b611dec8c8c8c8c8c8c61339a565b90945092506000611e1e7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578e8e6128b6565b9050611e2c8d33838861298f565b611e388c33838761298f565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea49190613d87565b92505050985098509895505050505050565b60008060008342811015611edc5760405162461bcd60e51b815260040161051390613be8565b611f0a8a7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c78b348c8c61339a565b90945092506000611f5c7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578c7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76128b6565b9050611f6a8b33838861298f565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fc557600080fd5b505af1158015611fd9573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c716935063a9059cbb925060440190506020604051808303816000875af115801561204e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120729190613da0565b61207e5761207e613689565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190613d87565b92508334111561210757612107336121028634613c35565b61257f565b505096509650969350505050565b606081428110156121385760405162461bcd60e51b815260040161051390613be8565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b03168686600081811061217557612175613c4c565b905060200201602081019061218a9190613c62565b6001600160a01b0316146121b05760405162461bcd60e51b815260040161051390613c7f565b61220e7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25788888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc792505050565b9150348260008151811061222457612224613c4c565b6020026020010151111561224a5760405162461bcd60e51b815260040161051390613d41565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db08360008151811061228c5761228c613c4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122bf57600080fd5b505af11580156122d3573d6000803e3d6000fd5b50505050507f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663a9059cbb61233e7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25789896000818110610e0957610e09613c4c565b8460008151811061235157612351613c4c565b60200260200101516040518363ffffffff1660e01b815260040161238a9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156123a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cd9190613da0565b6123d9576123d9613689565b61241882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612abf915050565b8160008151811061242b5761242b613c4c565b602002602001015134111561151e5761151e338360008151811061245157612451613c4c565b6020026020010151346121029190613c35565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916124c09190613e97565b6000604051808303816000865af19150503d80600081146124fd576040519150601f19603f3d011682016040523d82523d6000602084013e612502565b606091505b509150915081801561252c57508051158061252c57508080602001905181019061252c9190613da0565b6125785760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610513565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516125a99190613e97565b60006040518083038185875af1925050503d80600081146125e6576040519150601f19603f3d011682016040523d82523d6000602084013e6125eb565b606091505b50509050806126485760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610513565b505050565b60008084116126b15760405162461bcd60e51b815260206004820152602a60248201527f5661706f724445584c6962726172793a20494e53554646494349454e545f494e60448201526914155517d05353d5539560b21b6064820152608401610513565b6000831180156126c15750600082115b6126dd5760405162461bcd60e51b815260040161051390613eb3565b60006126eb856126f3613efa565b905060006126f98483613efa565b905060008261270a87612710613efa565b6127149190613f19565b90506127208183613f31565b979650505050505050565b606060028251101561277f5760405162461bcd60e51b815260206004820152601d60248201527f5661706f724445584c6962726172793a20494e56414c49445f504154480000006044820152606401610513565b815167ffffffffffffffff8111156127995761279961384d565b6040519080825280602002602001820160405280156127c2578160200160208202803683370190505b50905082816000815181106127d9576127d9613c4c565b60200260200101818152505060005b600183516127f69190613c35565b8110156128ae576000806128498786858151811061281657612816613c4c565b60200260200101518786600161282c9190613f19565b8151811061283c5761283c613c4c565b60200260200101516135bf565b9150915061287184848151811061286257612862613c4c565b6020026020010151838361264d565b8461287d856001613f19565b8151811061288d5761288d613c4c565b602002602001018181525050505080806128a690613f53565b9150506127e8565b509392505050565b60008060006128c585856132a4565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012060405160200161296d9291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f5535878326bb95214a15436b03ccd939cc50793ba2e1c97c33a23473a9d7f4ad603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916129f39190613e97565b6000604051808303816000865af19150503d8060008114612a30576040519150601f19603f3d011682016040523d82523d6000602084013e612a35565b606091505b5091509150818015612a5f575080511580612a5f575080806020019051810190612a5f9190613da0565b612ab75760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610513565b505050505050565b60005b60018351612ad09190613c35565b811015612cc157600080848381518110612aec57612aec613c4c565b602002602001015185846001612b029190613f19565b81518110612b1257612b12613c4c565b6020026020010151915091506000612b2a83836132a4565b509050600087612b3b866001613f19565b81518110612b4b57612b4b613c4c565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612b7957826000612b7d565b6000835b91509150600060028a51612b919190613c35565b8810612b9d5788612beb565b612beb7f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257878c612bce8c6002613f19565b81518110612bde57612bde613c4c565b60200260200101516128b6565b9050612c187f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25788886128b6565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612c55576020820181803683370190505b506040518563ffffffff1660e01b8152600401612c759493929190613f6e565b600060405180830381600087803b158015612c8f57600080fd5b505af1158015612ca3573d6000803e3d6000fd5b50505050505050505050508080612cb990613f53565b915050612ac2565b50505050565b6060600282511015612d1b5760405162461bcd60e51b815260206004820152601d60248201527f5661706f724445584c6962726172793a20494e56414c49445f504154480000006044820152606401610513565b815167ffffffffffffffff811115612d3557612d3561384d565b604051908082528060200260200182016040528015612d5e578160200160208202803683370190505b509050828160018351612d719190613c35565b81518110612d8157612d81613c4c565b602002602001018181525050600060018351612d9d9190613c35565b90505b80156128ae57600080612de38786612db9600187613c35565b81518110612dc957612dc9613c4c565b602002602001015187868151811061283c5761283c613c4c565b91509150612e0b848481518110612dfc57612dfc613c4c565b60200260200101518383613122565b84612e17600186613c35565b81518110612e2757612e27613c4c565b60200260200101818152505050508080612e4090613fbe565b915050612da0565b60005b60018351612e599190613c35565b81101561264857600080848381518110612e7557612e75613c4c565b602002602001015185846001612e8b9190613f19565b81518110612e9b57612e9b613c4c565b6020026020010151915091506000612eb383836132a4565b5090506000612ee37f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae25785856128b6565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190613fec565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614612f87578284612f8a565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015612fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffc9190613d87565b6130069190613c35565b955061301386838361264d565b945050505050600080856001600160a01b0316886001600160a01b03161461303d57826000613041565b6000835b91509150600060028c516130559190613c35565b8a10613061578a613092565b6130927f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257898e612bce8e6002613f19565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906130d49086908690869060248101613f6e565b600060405180830381600087803b1580156130ee57600080fd5b505af1158015613102573d6000803e3d6000fd5b50505050505050505050505050808061311a90613f53565b915050612e4b565b60008084116131875760405162461bcd60e51b815260206004820152602b60248201527f5661706f724445584c6962726172793a20494e53554646494349454e545f4f5560448201526a1514155517d05353d5539560aa1b6064820152608401610513565b6000831180156131975750600082115b6131b35760405162461bcd60e51b815260040161051390613eb3565b60006131bf8585613efa565b6131cb906103e8613efa565b905060006131d98685613c35565b6131e5906103e5613efa565b90506131f18183613f31565b6131fc906001613f19565b9695505050505050565b60008084116132635760405162461bcd60e51b8152602060048201526024808201527f5661706f724445584c6962726172793a20494e53554646494349454e545f414d60448201526313d5539560e21b6064820152608401610513565b6000831180156132735750600082115b61328f5760405162461bcd60e51b815260040161051390613eb3565b8261329a8386613efa565b6105f89190613f31565b600080826001600160a01b0316846001600160a01b031614156133155760405162461bcd60e51b8152602060048201526024808201527f5661706f724445584c6962726172793a204944454e544943414c5f41444452456044820152635353455360e01b6064820152608401610513565b826001600160a01b0316846001600160a01b031610613335578284613338565b83835b90925090506001600160a01b0382166133935760405162461bcd60e51b815260206004820152601d60248201527f5661706f724445584c6962726172793a205a45524f5f414444524553530000006044820152606401610513565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2579091169063e6a4390590604401602060405180830381865afa158015613411573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613435919061403c565b6001600160a01b031614156134da576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257169063c9c65396906044016020604051808303816000875af11580156134b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d8919061403c565b505b6000806135087f000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae2578b8b6135bf565b9150915081600014801561351a575080155b1561352a578793508692506135b2565b6000613537898484613206565b905087811161356b57858110156135605760405162461bcd60e51b815260040161051390613e26565b8894509250826135b0565b6000613578898486613206565b90508981111561358a5761358a613689565b878110156135aa5760405162461bcd60e51b815260040161051390613de1565b94508793505b505b5050965096945050505050565b60008060006135ce85856132a4565b5090506000806135df8888886128b6565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561361c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136409190613fec565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461367757808261367a565b81815b90999098509650505050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03811681146136b457600080fd5b50565b80356136c28161369f565b919050565b60008060008060008060c087890312156136e057600080fd5b86356136eb8161369f565b955060208701359450604087013593506060870135925060808701356137108161369f565b8092505060a087013590509295509295509295565b60008060006060848603121561373a57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261376357600080fd5b50813567ffffffffffffffff81111561377b57600080fd5b6020830191508360208260051b850101111561339357600080fd5b60008060008060008060a087890312156137af57600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156137d457600080fd5b6137e089828a01613751565b90955093505060608701356137f48161369f565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561384157835183529284019291840191600101613825565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561387657600080fd5b8235915060208084013567ffffffffffffffff8082111561389657600080fd5b818601915086601f8301126138aa57600080fd5b8135818111156138bc576138bc61384d565b8060051b604051601f19603f830116810181811085821117156138e1576138e161384d565b6040529182528482019250838101850191898311156138ff57600080fd5b938501935b8285101561392457613915856136b7565b84529385019392850192613904565b8096505050505050509250929050565b80151581146136b457600080fd5b803560ff811681146136c257600080fd5b60008060008060008060008060008060006101608c8e03121561397557600080fd5b8b356139808161369f565b9a5060208c01356139908161369f565b995060408c0135985060608c0135975060808c0135965060a08c01356139b58161369f565b955060c08c0135945060e08c01356139cc81613934565b93506139db6101008d01613942565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215613a1d57600080fd5b8a35613a288161369f565b995060208b0135985060408b0135975060608b0135965060808b0135613a4d8161369f565b955060a08b0135945060c08b0135613a6481613934565b9350613a7260e08c01613942565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215613aab57600080fd5b85359450602086013567ffffffffffffffff811115613ac957600080fd5b613ad588828901613751565b9095509350506040860135613ae98161369f565b949793965091946060013592915050565b600080600080600080600060e0888a031215613b1557600080fd5b8735613b208161369f565b96506020880135613b308161369f565b955060408801359450606088013593506080880135925060a0880135613b558161369f565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613b8957600080fd5b8835613b948161369f565b97506020890135613ba48161369f565b965060408901359550606089013594506080890135935060a0890135925060c0890135613bd08161369f565b8092505060e089013590509295985092959890939650565b60208082526017908201527f5661706f72444558526f757465723a2045585049524544000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c4757613c47613c1f565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613c7457600080fd5b813561095c8161369f565b6020808252601c908201527f5661706f72444558526f757465723a20494e56414c49445f5041544800000000604082015260600190565b6020808252602a908201527f5661706f72444558526f757465723a20494e53554646494349454e545f4f555460408201526914155517d05353d5539560b21b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526026908201527f5661706f72444558526f757465723a204558434553534956455f494e5055545f604082015265105353d5539560d21b606082015260800190565b600060208284031215613d9957600080fd5b5051919050565b600060208284031215613db257600080fd5b815161095c81613934565b60008060408385031215613dd057600080fd5b505080516020909101519092909150565b60208082526025908201527f5661706f72444558526f757465723a20494e53554646494349454e545f415f416040820152641353d5539560da1b606082015260800190565b60208082526025908201527f5661706f72444558526f757465723a20494e53554646494349454e545f425f416040820152641353d5539560da1b606082015260800190565b60005b83811015613e86578181015183820152602001613e6e565b83811115612cc15750506000910152565b60008251613ea9818460208701613e6b565b9190910192915050565b60208082526027908201527f5661706f724445584c6962726172793a20494e53554646494349454e545f4c496040820152665155494449545960c81b606082015260800190565b6000816000190483118215151615613f1457613f14613c1f565b500290565b60008219821115613f2c57613f2c613c1f565b500190565b600082613f4e57634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415613f6757613f67613c1f565b5060010190565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613fa78160a0850160208701613e6b565b601f01601f19169190910160a00195945050505050565b600081613fcd57613fcd613c1f565b506000190190565b80516001600160701b03811681146136c257600080fd5b60008060006060848603121561400157600080fd5b61400a84613fd5565b925061401860208501613fd5565b9150604084015163ffffffff8116811461403157600080fd5b809150509250925092565b60006020828403121561404e57600080fd5b815161095c8161369f56fea26469706673582212208b8ffaf7b773362c154af8b73c206513831e0e9bbbb9309282a10674d877748564736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
-----Decoded View---------------
Arg [0] : _factory (address): 0xC009a670E2B02e21E7e75AE98e254F467f7ae257
Arg [1] : _WETH (address): 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c009a670e2b02e21e7e75ae98e254f467f7ae257
Arg [1] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.