Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4525437 | 19 hrs ago | 0.001 APE |
Loading...
Loading
Contract Name:
ApeswapRouter
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "./interfaces/IApeswapFactory.sol"; import "./libraries/TransferHelper.sol"; import "./interfaces/IApeswapRouter.sol"; import "./libraries/ApeswapLibrary.sol"; import "./libraries/SafeMath.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IWETH.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract ApeswapRouter is IApeswapRouter, Ownable { using SafeMath for uint256; address payable public feeWallet; address public immutable override factory; address public immutable override WETH; uint256 public fee; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "Apeswap: EXPIRED"); _; } constructor( address _factory, address _WETH ) Ownable(0x01E1F08D341b9b9DD106aE7099B754efaF398268) { factory = _factory; WETH = _WETH; fee = 1000; feeWallet = payable(0x01E1F08D341b9b9DD106aE7099B754efaF398268); } 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 (IApeswapFactory(factory).getPair(tokenA, tokenB) == address(0)) { IApeswapFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = ApeswapLibrary.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = ApeswapLibrary.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "Apeswap: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = ApeswapLibrary.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "Apeswap: 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 = ApeswapLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IApeswapPair(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 = ApeswapLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IApeswapPair(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 = ApeswapLibrary.pairFor(factory, tokenA, tokenB); IApeswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IApeswapPair(pair).burn(to); (address token0, ) = ApeswapLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "Apeswap: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "Apeswap: 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 = ApeswapLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? type(uint256).max : liquidity; IApeswapPair(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 = ApeswapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IApeswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountToken, amountETH) = removeLiquidityETH( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer( token, to, IERC20(token).balanceOf(address(this)) ); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } 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 = ApeswapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IApeswapPair(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, ) = ApeswapLibrary.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 ? ApeswapLibrary.pairFor(factory, output, path[i + 2]) : _to; IApeswapPair(ApeswapLibrary.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 payable virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = ApeswapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.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 payable virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = ApeswapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "Apeswap: EXCESSIVE_INPUT_AMOUNT"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.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, "Apeswap: INVALID_PATH"); require( msg.value >= fee, "Apeswap: INSUFFICIENT_FEE - Please send the exact fee amount" ); payable(feeWallet).transfer(fee); uint256 amountForSwap = msg.value - fee; require(amountForSwap > 0, "Apeswap: INSUFFICIENT_SWAP_AMOUNT"); amounts = ApeswapLibrary.getAmountsOut(factory, amountForSwap, path); require( amounts[amounts.length - 1] >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{value: amountForSwap}(); assert( IWETH(WETH).transfer( ApeswapLibrary.pairFor(factory, path[0], path[1]), amountForSwap ) ); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); amounts = ApeswapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "Apeswap: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.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 payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "Apeswap: INVALID_PATH"); amounts = ApeswapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.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, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap: Insufficient ETH for fee"); payable(feeWallet).transfer(fee); uint256 swapAmount = msg.value - fee; amounts = ApeswapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= swapAmount, "Apeswap: EXCESSIVE_INPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( ApeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); // Execute the token swap _swap(amounts, path, to); if (swapAmount > amounts[0]) { TransferHelper.safeTransferETH(msg.sender, swapAmount - 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, ) = ApeswapLibrary.sortTokens(input, output); IApeswapPair pair = IApeswapPair( ApeswapLibrary.pairFor(factory, input, output) ); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub( reserveInput ); amountOutput = ApeswapLibrary.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? ApeswapLibrary.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 payable virtual override ensure(deadline) { require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); uint256 amountIn = msg.value - fee; IWETH(WETH).deposit{value: amountIn}(); assert( IWETH(WETH).transfer( ApeswapLibrary.pairFor(factory, path[0], path[1]), amountIn ) ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return ApeswapLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return ApeswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return ApeswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint256 amountIn, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return ApeswapLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint256 amountOut, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return ApeswapLibrary.getAmountsIn(factory, amountOut, path); } function setFee(uint256 newFee) external onlyOwner { fee = newFee; } function withdrawFee(uint256 amount) external onlyOwner { uint256 balance = address(this).balance; require(amount > 0, "Amount must be greater than 0"); require(amount <= balance, "Insufficient contract balance"); (bool success, ) = owner().call{value: amount}(""); require(success, "Withdrawal failed"); } function setFeeWallet(address payable _feeWallet) external onlyOwner { feeWallet = _feeWallet; } }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT interface IApeswapFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() 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 setFeeTo(address) external; function setFeeToSetter(address) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT interface IApeswapRouter { 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 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 swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external payable 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 payable returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable ; 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 payable ; 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); }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT import "../interfaces/IApeswapPair.sol"; import "./SafeMath.sol"; library ApeswapLibrary { using SafeMath for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens( address tokenA, address tokenB ) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "ApeswapLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "ApeswapLibrary: 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"7af2cd06d86e4252f2c847dae09d1922eb5b0e90a2231ecaf7298d7aaf1f1ccf" // 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, ) = IApeswapPair( 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, "ApeswapLibrary: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "ApeswapLibrary: INSUFFICIENT_LIQUIDITY" ); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "ApeswapLibrary: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "ApeswapLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "ApeswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "ApeswapLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "ApeswapLibrary: 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, "ApeswapLibrary: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT interface IApeswapPair { 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; 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; }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT interface IERC20 { 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); }
pragma solidity ^0.8.19; // SPDX-License-Identifier: MIT interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"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":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address payable","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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_feeWallet","type":"address"}],"name":"setFeeWallet","outputs":[],"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":"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":"swapExactTokensForETHSupportingFeeOnTransferTokens","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":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"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":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801562000010575f80fd5b5060405162004a3738038062004a37833981016040819052620000339162000103565b7301e1f08d341b9b9dd106ae7099b754efaf398268620000538162000098565b506001600160a01b039182166080521660a0526103e8600255600180546001600160a01b0319167301e1f08d341b9b9dd106ae7099b754efaf39826817905562000139565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000fe575f80fd5b919050565b5f806040838503121562000115575f80fd5b6200012083620000e7565b91506200013060208401620000e7565b90509250929050565b60805160a051614770620002c75f395f81816101ee015281816104280152818161062f0152818161067e01528181610734015281816109ae01528181610d3201528181610edb01528181611298015281816113d40152818161147d0152818161150b01528181611743015281816117b3015281816119fe01528181611ab401528181611b4001528181611c2401528181611c940152818161226601528181612485015281816124da0152818161250e0152818161259f015281816126d201528181612888015261291101525f81816104ea015281816107b0015281816108dc01528181610a8f01528181610ac601528181610bb601528181610e0a01528181610eb901528181611044015281816116a1015281816117e50152818161190d01528181611cc601528181611edb015281816122160152818161224401528181612363015281816124b8015281816127f301528181612943015281816131de0152818161322e015281816134ed0152818161364c01528181613a6001528181613b000152613b7301526147705ff3fe6080604052600436106101de575f3560e01c806390d49b9d116100fd578063d06ca61f11610092578063f25f4b5611610062578063f25f4b5614610599578063f2fde38b146105b8578063f305d719146105d7578063fb3bdb41146105ea575f80fd5b8063d06ca61f1461050c578063ddca3f431461052b578063ded9382a14610540578063e8e337001461055f575f80fd5b8063b6f9de95116100cd578063b6f9de9514610488578063baa2abde1461049b578063be357616146104ba578063c45a0155146104d9575f80fd5b806390d49b9d146103f8578063ad5c464814610417578063ad615dec1461044a578063af2979eb14610469575f80fd5b80635c11d795116101735780637ff36ab5116101435780637ff36ab51461038357806385f8c259146103965780638803dbee146103b55780638da5cb5b146103c8575f80fd5b80635c11d7951461032a57806369fe0e2d1461033d578063715018a61461035c578063791ac94714610370575f80fd5b80632195995c116101ae5780632195995c146102c657806338ed1739146102e55780634a25d94a146102f85780635b0d59841461030b575f80fd5b806302751cec14610221578063054d50d41461025a57806318cbafe5146102875780631f00ca74146102a7575f80fd5b3661021d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461021b5761021b613e2c565b005b5f80fd5b34801561022c575f80fd5b5061024061023b366004613e64565b6105fd565b604080519283526020830191909152015b60405180910390f35b348015610265575f80fd5b50610279610274366004613ebe565b6106f3565b604051908152602001610251565b61029a610295366004613f28565b610707565b6040516102519190613f96565b3480156102b2575f80fd5b5061029a6102c1366004613fed565b610a88565b3480156102d1575f80fd5b506102406102e03660046140d6565b610abe565b61029a6102f3366004613f28565b610b8e565b61029a610306366004613f28565b610d05565b348015610316575f80fd5b50610279610325366004614179565b610eb2565b61021b610338366004613f28565b610f97565b348015610348575f80fd5b5061021b610357366004614209565b61124d565b348015610367575f80fd5b5061021b61125a565b61021b61037e366004613f28565b61126d565b61029a610391366004614220565b6114e6565b3480156103a1575f80fd5b506102796103b0366004613ebe565b6118d9565b61029a6103c3366004613f28565b6118e5565b3480156103d3575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610251565b348015610403575f80fd5b5061021b610412366004614282565b6119a0565b348015610422575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000000081565b348015610455575f80fd5b50610279610464366004613ebe565b6119ca565b348015610474575f80fd5b50610279610483366004613e64565b6119d6565b61021b610496366004614220565b611b1d565b3480156104a6575f80fd5b506102406104b53660046142a4565b611eb2565b3480156104c5575f80fd5b5061021b6104d4366004614209565b6120d0565b3480156104e4575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000000081565b348015610517575f80fd5b5061029a610526366004613fed565b61220f565b348015610536575f80fd5b5061027960025481565b34801561054b575f80fd5b5061024061055a366004614179565b61223c565b34801561056a575f80fd5b5061057e610579366004614311565b612326565b60408051938452602084019290925290820152606001610251565b3480156105a4575f80fd5b506001546103e0906001600160a01b031681565b3480156105c3575f80fd5b5061021b6105d2366004614282565b61241e565b61057e6105e5366004613e64565b61245b565b61029a6105f8366004614220565b6126ad565b5f8082428110156106295760405162461bcd60e51b815260040161062090614388565b60405180910390fd5b610658897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611eb2565b9093509150610668898685612a93565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156106c7575f80fd5b505af11580156106d9573d5f803e3d5ffd5b505050506106e78583612bbf565b50965096945050505050565b5f6106ff848484612c95565b949350505050565b6060814281101561072a5760405162461bcd60e51b815260040161062090614388565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866107616001826143c6565b818110610770576107706143d9565b90506020020160208101906107859190614282565b6001600160a01b0316146107ab5760405162461bcd60e51b8152600401610620906143ed565b6108087f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612d6b92505050565b915086826001845161081a91906143c6565b8151811061082a5761082a6143d9565b602002602001015110156108505760405162461bcd60e51b81526004016106209061441c565b6002543410156108725760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156108ab573d5f803e3d5ffd5b5061096e86865f8181106108c1576108c16143d9565b90506020020160208101906108d69190614282565b3361094f7f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061090d5761090d6143d9565b90506020020160208101906109229190614282565b8b8b6001818110610935576109356143d9565b905060200201602081019061094a9190614282565b612ef3565b855f81518110610961576109616143d9565b6020026020010151612fca565b6109ac828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613103915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185516109ea91906143c6565b815181106109fa576109fa6143d9565b60200260200101516040518263ffffffff1660e01b8152600401610a2091815260200190565b5f604051808303815f87803b158015610a37575f80fd5b505af1158015610a49573d5f803e3d5ffd5b50505050610a7d848360018551610a6091906143c6565b81518110610a7057610a706143d9565b6020026020010151612bbf565b509695505050505050565b6060610ab57f000000000000000000000000000000000000000000000000000000000000000084846132fd565b90505b92915050565b5f805f610aec7f00000000000000000000000000000000000000000000000000000000000000008f8f612ef3565b90505f87610afa578c610afd565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610b38903390309086908f908e908e908e906004016144a9565b5f604051808303815f87803b158015610b4f575f80fd5b505af1158015610b61573d5f803e3d5ffd5b50505050610b748f8f8f8f8f8f8f611eb2565b809450819550505050509b509b9950505050505050505050565b60608142811015610bb15760405162461bcd60e51b815260040161062090614388565b610c0e7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612d6b92505050565b9150868260018451610c2091906143c6565b81518110610c3057610c306143d9565b60200260200101511015610c565760405162461bcd60e51b81526004016106209061441c565b600254341015610c785760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610cb1573d5f803e3d5ffd5b50610cc786865f8181106108c1576108c16143d9565b610a7d828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613103915050565b60608142811015610d285760405162461bcd60e51b815260040161062090614388565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610d5f6001826143c6565b818110610d6e57610d6e6143d9565b9050602002016020810190610d839190614282565b6001600160a01b031614610da95760405162461bcd60e51b8152600401610620906143ed565b600254341015610dcb5760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610e04573d5f803e3d5ffd5b50610e627f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506132fd92505050565b915086825f81518110610e7757610e776143d9565b60200260200101511115610e9d5760405162461bcd60e51b8152600401610620906144ea565b61096e86865f8181106108c1576108c16143d9565b5f80610eff7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612ef3565b90505f86610f0d578b610f10565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f4b903390309086908e908d908d908d906004016144a9565b5f604051808303815f87803b158015610f62575f80fd5b505af1158015610f74573d5f803e3d5ffd5b50505050610f868d8d8d8d8d8d6119d6565b9d9c50505050505050505050505050565b8042811015610fb85760405162461bcd60e51b815260040161062090614388565b600254341015610fda5760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611013573d5f803e3d5ffd5b506110a385855f818110611029576110296143d9565b905060200201602081019061103e9190614282565b3361109d7f000000000000000000000000000000000000000000000000000000000000000089895f818110611075576110756143d9565b905060200201602081019061108a9190614282565b8a8a6001818110610935576109356143d9565b8a612fca565b5f85856110b16001826143c6565b8181106110c0576110c06143d9565b90506020020160208101906110d59190614282565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561111b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113f9190614521565b905061117e8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525088925061347c915050565b866112258288886111906001826143c6565b81811061119f5761119f6143d9565b90506020020160208101906111b49190614282565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f9190614521565b90613702565b10156112435760405162461bcd60e51b81526004016106209061441c565b5050505050505050565b611255613757565b600255565b611262613757565b61126b5f613783565b565b804281101561128e5760405162461bcd60e51b815260040161062090614388565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856112c56001826143c6565b8181106112d4576112d46143d9565b90506020020160208101906112e99190614282565b6001600160a01b03161461130f5760405162461bcd60e51b8152600401610620906143ed565b6002543410156113315760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f1935050505015801561136a573d5f803e3d5ffd5b5061138085855f818110611029576110296143d9565b6113bd8585808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525030925061347c915050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611421573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114459190614521565b9050868110156114675760405162461bcd60e51b81526004016106209061441c565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156114c6575f80fd5b505af11580156114d8573d5f803e3d5ffd5b505050506112438482612bbf565b606081428110156115095760405162461bcd60e51b815260040161062090614388565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f818110611545576115456143d9565b905060200201602081019061155a9190614282565b6001600160a01b0316146115805760405162461bcd60e51b8152600401610620906143ed565b6002543410156115f85760405162461bcd60e51b815260206004820152603c60248201527f417065737761703a20494e53554646494349454e545f464545202d20506c656160448201527f73652073656e64207468652065786163742066656520616d6f756e74000000006064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611631573d5f803e3d5ffd5b505f6002543461164191906143c6565b90505f811161169c5760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20494e53554646494349454e545f535741505f414d4f554e6044820152601560fa1b6064820152608401610620565b6116f97f0000000000000000000000000000000000000000000000000000000000000000828989808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612d6b92505050565b925087836001855161170b91906143c6565b8151811061171b5761171b6143d9565b602002602001015110156117415760405162461bcd60e51b81526004016106209061441c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561179a575f80fd5b505af11580156117ac573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118167f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061090d5761090d6143d9565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118849190614538565b61189057611890613e2c565b6118ce838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613103915050565b505095945050505050565b5f6106ff8484846137d2565b606081428110156119085760405162461bcd60e51b815260040161062090614388565b6119657f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506132fd92505050565b915086825f8151811061197a5761197a6143d9565b60200260200101511115610c565760405162461bcd60e51b8152600401610620906144ea565b6119a8613757565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f6106ff8484846138a4565b5f81428110156119f85760405162461bcd60e51b815260040161062090614388565b611a27887f00000000000000000000000000000000000000000000000000000000000000008989893089611eb2565b6040516370a0823160e01b8152306004820152909350611a9e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a999190614521565b612a93565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015611afd575f80fd5b505af1158015611b0f573d5f803e3d5ffd5b50505050610a7d8483612bbf565b8042811015611b3e5760405162461bcd60e51b815260040161062090614388565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685855f818110611b7a57611b7a6143d9565b9050602002016020810190611b8f9190614282565b6001600160a01b031614611bb55760405162461bcd60e51b8152600401610620906143ed565b600254341015611bd75760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611c10573d5f803e3d5ffd5b505f60025434611c2091906143c6565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015611c7b575f80fd5b505af1158015611c8d573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611cf77f000000000000000000000000000000000000000000000000000000000000000089895f818110611075576110756143d9565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d659190614538565b611d7157611d71613e2c565b5f8686611d7f6001826143c6565b818110611d8e57611d8e6143d9565b9050602002016020810190611da39190614282565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0d9190614521565b9050611e4c8787808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525089925061347c915050565b87611225828989611e5e6001826143c6565b818110611e6d57611e6d6143d9565b9050602002016020810190611e829190614282565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016111e0565b5f808242811015611ed55760405162461bcd60e51b815260040161062090614388565b5f611f017f00000000000000000000000000000000000000000000000000000000000000008c8c612ef3565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f789190614538565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe59190614553565b915091505f611ff48e8e61393f565b509050806001600160a01b03168e6001600160a01b03161461201757818361201a565b82825b90975095508a87101561206f5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b898610156120bf5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b505050505097509795505050505050565b6120d8613757565b47816121265760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610620565b808211156121765760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610620565b5f80546040516001600160a01b039091169084908381818185875af1925050503d805f81146121c0576040519150601f19603f3d011682016040523d82523d5f602084013e6121c5565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b6044820152606401610620565b505050565b6060610ab57f00000000000000000000000000000000000000000000000000000000000000008484612d6b565b5f805f61228a7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612ef3565b90505f87612298578c61229b565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906122d6903390309086908f908e908e908e906004016144a9565b5f604051808303815f87803b1580156122ed575f80fd5b505af11580156122ff573d5f803e3d5ffd5b505050506123118e8e8e8e8e8e6105fd565b909f909e509c50505050505050505050505050565b5f805f834281101561234a5760405162461bcd60e51b815260040161062090614388565b6123588c8c8c8c8c8c613a33565b90945092505f6123897f00000000000000000000000000000000000000000000000000000000000000008e8e612ef3565b90506123978d338388612fca565b6123a38c338387612fca565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156123e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240c9190614521565b92505050985098509895505050505050565b612426613757565b6001600160a01b03811661244f57604051631e4fbdf760e01b81525f6004820152602401610620565b61245881613783565b50565b5f805f834281101561247f5760405162461bcd60e51b815260040161062090614388565b6124ad8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613a33565b90945092505f6124fe7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612ef3565b905061250c8b338388612fca565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015612565575f80fd5b505af1158015612577573d5f803e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af11580156125e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260d9190614538565b61261957612619613e2c565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af115801561265e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126829190614521565b92508334111561269f5761269f3361269a86346143c6565b612bbf565b505096509650969350505050565b606081428110156126d05760405162461bcd60e51b815260040161062090614388565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f81811061270c5761270c6143d9565b90506020020160208101906127219190614282565b6001600160a01b0316146127475760405162461bcd60e51b8152600401610620906143ed565b6002543410156127a35760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20496e73756666696369656e742045544820666f722066656044820152606560f81b6064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156127dc573d5f803e3d5ffd5b505f600254346127ec91906143c6565b905061284b7f0000000000000000000000000000000000000000000000000000000000000000898989808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506132fd92505050565b925080835f81518110612860576128606143d9565b602002602001015111156128865760405162461bcd60e51b8152600401610620906144ea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0845f815181106128c7576128c76143d9565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b1580156128f8575f80fd5b505af115801561290a573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6129747f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061090d5761090d6143d9565b855f81518110612986576129866143d9565b60200260200101516040518363ffffffff1660e01b81526004016129bf9291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af11580156129db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ff9190614538565b612a0b57612a0b613e2c565b612a49838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613103915050565b825f81518110612a5b57612a5b6143d9565b60200260200101518111156118ce576118ce33845f81518110612a8057612a806143d9565b60200260200101518361269a91906143c6565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691612aee9190614597565b5f604051808303815f865af19150503d805f8114612b27576040519150601f19603f3d011682016040523d82523d5f602084013e612b2c565b606091505b5091509150818015612b56575080511580612b56575080806020019051810190612b569190614538565b612bb85760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610620565b5050505050565b604080515f808252602082019092526001600160a01b038416908390604051612be89190614597565b5f6040518083038185875af1925050503d805f8114612c22576040519150601f19603f3d011682016040523d82523d5f602084013e612c27565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610620565b5f808411612cf75760405162461bcd60e51b815260206004820152602960248201527f417065737761704c6962726172793a20494e53554646494349454e545f494e50604482015268155517d05353d5539560ba1b6064820152608401610620565b5f83118015612d0557505f82115b612d215760405162461bcd60e51b8152600401610620906145b2565b5f612d2e856103e5613cad565b90505f612d3b8285613cad565b90505f612d5483612d4e886103e8613cad565b90613d13565b9050612d6081836145f8565b979650505050505050565b6060600282511015612dbf5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff811115612dd957612dd9613fd9565b604051908082528060200260200182016040528015612e02578160200160208202803683370190505b50905082815f81518110612e1857612e186143d9565b6020026020010181815250505f5b60018351612e3491906143c6565b811015612eeb575f80612e8687868581518110612e5357612e536143d9565b602002602001015187866001612e699190614617565b81518110612e7957612e796143d9565b6020026020010151613d67565b91509150612eae848481518110612e9f57612e9f6143d9565b60200260200101518383612c95565b84612eba856001614617565b81518110612eca57612eca6143d9565b60200260200101818152505050508080612ee39061462a565b915050612e26565b509392505050565b5f805f612f00858561393f565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612fa89291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f7af2cd06d86e4252f2c847dae09d1922eb5b0e90a2231ecaf7298d7aaf1f1ccf603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9283929088169161302d9190614597565b5f604051808303815f865af19150503d805f8114613066576040519150601f19603f3d011682016040523d82523d5f602084013e61306b565b606091505b50915091508180156130955750805115806130955750808060200190518101906130959190614538565b6130fb5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610620565b505050505050565b5f5b6001835161311391906143c6565b8110156132f7575f8084838151811061312e5761312e6143d9565b6020026020010151858460016131449190614617565b81518110613154576131546143d9565b6020026020010151915091505f61316b838361393f565b5090505f8761317b866001614617565b8151811061318b5761318b6143d9565b602002602001015190505f80836001600160a01b0316866001600160a01b0316146131b757825f6131ba565b5f835b915091505f60028a516131cd91906143c6565b88106131d95788613227565b6132277f0000000000000000000000000000000000000000000000000000000000000000878c61320a8c6002614617565b8151811061321a5761321a6143d9565b6020026020010151612ef3565b90506132547f00000000000000000000000000000000000000000000000000000000000000008888612ef3565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015613290576020820181803683370190505b506040518563ffffffff1660e01b81526004016132b09493929190614642565b5f604051808303815f87803b1580156132c7575f80fd5b505af11580156132d9573d5f803e3d5ffd5b505050505050505050505080806132ef9061462a565b915050613105565b50505050565b60606002825110156133515760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff81111561336b5761336b613fd9565b604051908082528060200260200182016040528015613394578160200160208202803683370190505b5090508281600183516133a791906143c6565b815181106133b7576133b76143d9565b6020026020010181815250505f600183516133d291906143c6565b90505b8015612eeb575f8061341787866133ed6001876143c6565b815181106133fd576133fd6143d9565b6020026020010151878681518110612e7957612e796143d9565b9150915061343f848481518110613430576134306143d9565b602002602001015183836137d2565b8461344b6001866143c6565b8151811061345b5761345b6143d9565b6020026020010181815250505050808061347490614691565b9150506133d5565b5f5b6001835161348c91906143c6565b81101561220a575f808483815181106134a7576134a76143d9565b6020026020010151858460016134bd9190614617565b815181106134cd576134cd6143d9565b6020026020010151915091505f6134e4838361393f565b5090505f6135137f00000000000000000000000000000000000000000000000000000000000000008585612ef3565b90505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613555573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357991906146bc565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b0316146135b25782846135b5565b83835b6040516370a0823160e01b81526001600160a01b038a811660048301529294509092506135f0918491908d16906370a08231906024016111e0565b95506135fd868383612c95565b9450505050505f80856001600160a01b0316886001600160a01b03161461362557825f613628565b5f835b915091505f60028c5161363b91906143c6565b8a10613647578a613678565b6136787f0000000000000000000000000000000000000000000000000000000000000000898e61320a8e6002614617565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906136b99086908690869060248101614642565b5f604051808303815f87803b1580156136d0575f80fd5b505af11580156136e2573d5f803e3d5ffd5b5050505050505050505050505080806136fa9061462a565b91505061347e565b5f8261370e83826143c6565b9150811115610ab85760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610620565b5f546001600160a01b0316331461126b5760405163118cdaa760e01b8152336004820152602401610620565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8084116138355760405162461bcd60e51b815260206004820152602a60248201527f417065737761704c6962726172793a20494e53554646494349454e545f4f555460448201526914155517d05353d5539560b21b6064820152608401610620565b5f8311801561384357505f82115b61385f5760405162461bcd60e51b8152600401610620906145b2565b5f6138766103e86138708688613cad565b90613cad565b90505f6138896103e56138708689613702565b905061389a6001612d4e83856145f8565b9695505050505050565b5f8084116139005760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610620565b5f8311801561390e57505f82115b61392a5760405162461bcd60e51b8152600401610620906145b2565b826139358584613cad565b6106ff91906145f8565b5f80826001600160a01b0316846001600160a01b0316036139ae5760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610620565b826001600160a01b0316846001600160a01b0316106139ce5782846139d1565b83835b90925090506001600160a01b038216613a2c5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a205a45524f5f41444452455353000000006044820152606401610620565b9250929050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015613aa7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613acb9190614708565b6001600160a01b031603613b6c576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af1158015613b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b6a9190614708565b505b5f80613b997f00000000000000000000000000000000000000000000000000000000000000008b8b613d67565b91509150815f148015613baa575080155b15613bba57879350869250613ca0565b5f613bc68984846138a4565b9050878111613c2a5785811015613c1f5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b889450925082613c9e565b5f613c368984866138a4565b905089811115613c4857613c48613e2c565b87811015613c985760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b94508793505b505b5050965096945050505050565b5f811580613cd057508282613cc28183614723565b9250613cce90836145f8565b145b610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610620565b5f82613d1f8382614617565b9150811015610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610620565b5f805f613d74858561393f565b5090505f80613d84888888612ef3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613dbf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de391906146bc565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613e1a578082613e1d565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b0381168114612458575f80fd5b8035613e5f81613e40565b919050565b5f805f805f8060c08789031215613e79575f80fd5b8635613e8481613e40565b95506020870135945060408701359350606087013592506080870135613ea981613e40565b8092505060a087013590509295509295509295565b5f805f60608486031215613ed0575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112613ef7575f80fd5b50813567ffffffffffffffff811115613f0e575f80fd5b6020830191508360208260051b8501011115613a2c575f80fd5b5f805f805f8060a08789031215613f3d575f80fd5b8635955060208701359450604087013567ffffffffffffffff811115613f61575f80fd5b613f6d89828a01613ee7565b9095509350506060870135613f8181613e40565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b81811015613fcd57835183529284019291840191600101613fb1565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215613ffe575f80fd5b8235915060208084013567ffffffffffffffff8082111561401d575f80fd5b818601915086601f830112614030575f80fd5b81358181111561404257614042613fd9565b8060051b604051601f19603f8301168101818110858211171561406757614067613fd9565b604052918252848201925083810185019189831115614084575f80fd5b938501935b828510156140a95761409a85613e54565b84529385019392850192614089565b8096505050505050509250929050565b8015158114612458575f80fd5b803560ff81168114613e5f575f80fd5b5f805f805f805f805f805f6101608c8e0312156140f1575f80fd5b8b356140fc81613e40565b9a5060208c013561410c81613e40565b995060408c0135985060608c0135975060808c0135965060a08c013561413181613e40565b955060c08c0135945060e08c0135614148816140b9565b93506141576101008d016140c6565b92506101208c013591506101408c013590509295989b509295989b9093969950565b5f805f805f805f805f806101408b8d031215614193575f80fd5b8a3561419e81613e40565b995060208b0135985060408b0135975060608b0135965060808b01356141c381613e40565b955060a08b0135945060c08b01356141da816140b9565b93506141e860e08c016140c6565b92506101008b013591506101208b013590509295989b9194979a5092959850565b5f60208284031215614219575f80fd5b5035919050565b5f805f805f60808688031215614234575f80fd5b85359450602086013567ffffffffffffffff811115614251575f80fd5b61425d88828901613ee7565b909550935050604086013561427181613e40565b949793965091946060013592915050565b5f60208284031215614292575f80fd5b813561429d81613e40565b9392505050565b5f805f805f805f60e0888a0312156142ba575f80fd5b87356142c581613e40565b965060208801356142d581613e40565b955060408801359450606088013593506080880135925060a08801356142fa81613e40565b8092505060c0880135905092959891949750929550565b5f805f805f805f80610100898b031215614329575f80fd5b883561433481613e40565b9750602089013561434481613e40565b965060408901359550606089013594506080890135935060a0890135925060c089013561437081613e40565b8092505060e089013590509295985092959890939650565b60208082526010908201526f105c195cddd85c0e881156141254915160821b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ab857610ab86143b2565b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274082e0cae6eec2e07440929cac82989288bea082a89605b1b604082015260600190565b60208082526023908201527f417065737761703a20494e53554646494349454e545f4f55545055545f414d4f60408201526215539560ea1b606082015260800190565b6020808252602a908201527f417065737761703a2d20506c656173652073656e64207468652065786163742060408201526919995948185b5bdd5b9d60b21b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252601f908201527f417065737761703a204558434553534956455f494e5055545f414d4f554e5400604082015260600190565b5f60208284031215614531575f80fd5b5051919050565b5f60208284031215614548575f80fd5b815161429d816140b9565b5f8060408385031215614564575f80fd5b505080516020909101519092909150565b5f5b8381101561458f578181015183820152602001614577565b50505f910152565b5f82516145a8818460208701614575565b9190910192915050565b60208082526026908201527f417065737761704c6962726172793a20494e53554646494349454e545f4c495160408201526555494449545960d01b606082015260800190565b5f8261461257634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610ab857610ab86143b2565b5f6001820161463b5761463b6143b2565b5060010190565b84815283602082015260018060a01b0383166040820152608060608201525f825180608084015261467a8160a0850160208701614575565b601f01601f19169190910160a00195945050505050565b5f8161469f5761469f6143b2565b505f190190565b80516001600160701b0381168114613e5f575f80fd5b5f805f606084860312156146ce575f80fd5b6146d7846146a6565b92506146e5602085016146a6565b9150604084015163ffffffff811681146146fd575f80fd5b809150509250925092565b5f60208284031215614718575f80fd5b815161429d81613e40565b8082028115828204841417610ab857610ab86143b256fea2646970667358221220bd92424e1431cd0a1821546dc63a27e4e2077cb40b681b9577f25035f133ab6464736f6c63430008140033000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca00900000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557
Deployed Bytecode
0x6080604052600436106101de575f3560e01c806390d49b9d116100fd578063d06ca61f11610092578063f25f4b5611610062578063f25f4b5614610599578063f2fde38b146105b8578063f305d719146105d7578063fb3bdb41146105ea575f80fd5b8063d06ca61f1461050c578063ddca3f431461052b578063ded9382a14610540578063e8e337001461055f575f80fd5b8063b6f9de95116100cd578063b6f9de9514610488578063baa2abde1461049b578063be357616146104ba578063c45a0155146104d9575f80fd5b806390d49b9d146103f8578063ad5c464814610417578063ad615dec1461044a578063af2979eb14610469575f80fd5b80635c11d795116101735780637ff36ab5116101435780637ff36ab51461038357806385f8c259146103965780638803dbee146103b55780638da5cb5b146103c8575f80fd5b80635c11d7951461032a57806369fe0e2d1461033d578063715018a61461035c578063791ac94714610370575f80fd5b80632195995c116101ae5780632195995c146102c657806338ed1739146102e55780634a25d94a146102f85780635b0d59841461030b575f80fd5b806302751cec14610221578063054d50d41461025a57806318cbafe5146102875780631f00ca74146102a7575f80fd5b3661021d57336001600160a01b037f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557161461021b5761021b613e2c565b005b5f80fd5b34801561022c575f80fd5b5061024061023b366004613e64565b6105fd565b604080519283526020830191909152015b60405180910390f35b348015610265575f80fd5b50610279610274366004613ebe565b6106f3565b604051908152602001610251565b61029a610295366004613f28565b610707565b6040516102519190613f96565b3480156102b2575f80fd5b5061029a6102c1366004613fed565b610a88565b3480156102d1575f80fd5b506102406102e03660046140d6565b610abe565b61029a6102f3366004613f28565b610b8e565b61029a610306366004613f28565b610d05565b348015610316575f80fd5b50610279610325366004614179565b610eb2565b61021b610338366004613f28565b610f97565b348015610348575f80fd5b5061021b610357366004614209565b61124d565b348015610367575f80fd5b5061021b61125a565b61021b61037e366004613f28565b61126d565b61029a610391366004614220565b6114e6565b3480156103a1575f80fd5b506102796103b0366004613ebe565b6118d9565b61029a6103c3366004613f28565b6118e5565b3480156103d3575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610251565b348015610403575f80fd5b5061021b610412366004614282565b6119a0565b348015610422575f80fd5b506103e07f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b55781565b348015610455575f80fd5b50610279610464366004613ebe565b6119ca565b348015610474575f80fd5b50610279610483366004613e64565b6119d6565b61021b610496366004614220565b611b1d565b3480156104a6575f80fd5b506102406104b53660046142a4565b611eb2565b3480156104c5575f80fd5b5061021b6104d4366004614209565b6120d0565b3480156104e4575f80fd5b506103e07f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca00981565b348015610517575f80fd5b5061029a610526366004613fed565b61220f565b348015610536575f80fd5b5061027960025481565b34801561054b575f80fd5b5061024061055a366004614179565b61223c565b34801561056a575f80fd5b5061057e610579366004614311565b612326565b60408051938452602084019290925290820152606001610251565b3480156105a4575f80fd5b506001546103e0906001600160a01b031681565b3480156105c3575f80fd5b5061021b6105d2366004614282565b61241e565b61057e6105e5366004613e64565b61245b565b61029a6105f8366004614220565b6126ad565b5f8082428110156106295760405162461bcd60e51b815260040161062090614388565b60405180910390fd5b610658897f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5578a8a8a308a611eb2565b9093509150610668898685612a93565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156106c7575f80fd5b505af11580156106d9573d5f803e3d5ffd5b505050506106e78583612bbf565b50965096945050505050565b5f6106ff848484612c95565b949350505050565b6060814281101561072a5760405162461bcd60e51b815260040161062090614388565b6001600160a01b037f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5571686866107616001826143c6565b818110610770576107706143d9565b90506020020160208101906107859190614282565b6001600160a01b0316146107ab5760405162461bcd60e51b8152600401610620906143ed565b6108087f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612d6b92505050565b915086826001845161081a91906143c6565b8151811061082a5761082a6143d9565b602002602001015110156108505760405162461bcd60e51b81526004016106209061441c565b6002543410156108725760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156108ab573d5f803e3d5ffd5b5061096e86865f8181106108c1576108c16143d9565b90506020020160208101906108d69190614282565b3361094f7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098a8a5f81811061090d5761090d6143d9565b90506020020160208101906109229190614282565b8b8b6001818110610935576109356143d9565b905060200201602081019061094a9190614282565b612ef3565b855f81518110610961576109616143d9565b6020026020010151612fca565b6109ac828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613103915050565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b0316632e1a7d4d83600185516109ea91906143c6565b815181106109fa576109fa6143d9565b60200260200101516040518263ffffffff1660e01b8152600401610a2091815260200190565b5f604051808303815f87803b158015610a37575f80fd5b505af1158015610a49573d5f803e3d5ffd5b50505050610a7d848360018551610a6091906143c6565b81518110610a7057610a706143d9565b6020026020010151612bbf565b509695505050505050565b6060610ab57f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca00984846132fd565b90505b92915050565b5f805f610aec7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098f8f612ef3565b90505f87610afa578c610afd565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610b38903390309086908f908e908e908e906004016144a9565b5f604051808303815f87803b158015610b4f575f80fd5b505af1158015610b61573d5f803e3d5ffd5b50505050610b748f8f8f8f8f8f8f611eb2565b809450819550505050509b509b9950505050505050505050565b60608142811015610bb15760405162461bcd60e51b815260040161062090614388565b610c0e7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612d6b92505050565b9150868260018451610c2091906143c6565b81518110610c3057610c306143d9565b60200260200101511015610c565760405162461bcd60e51b81526004016106209061441c565b600254341015610c785760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610cb1573d5f803e3d5ffd5b50610cc786865f8181106108c1576108c16143d9565b610a7d828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613103915050565b60608142811015610d285760405162461bcd60e51b815260040161062090614388565b6001600160a01b037f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557168686610d5f6001826143c6565b818110610d6e57610d6e6143d9565b9050602002016020810190610d839190614282565b6001600160a01b031614610da95760405162461bcd60e51b8152600401610620906143ed565b600254341015610dcb5760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610e04573d5f803e3d5ffd5b50610e627f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506132fd92505050565b915086825f81518110610e7757610e776143d9565b60200260200101511115610e9d5760405162461bcd60e51b8152600401610620906144ea565b61096e86865f8181106108c1576108c16143d9565b5f80610eff7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098d7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557612ef3565b90505f86610f0d578b610f10565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f4b903390309086908e908d908d908d906004016144a9565b5f604051808303815f87803b158015610f62575f80fd5b505af1158015610f74573d5f803e3d5ffd5b50505050610f868d8d8d8d8d8d6119d6565b9d9c50505050505050505050505050565b8042811015610fb85760405162461bcd60e51b815260040161062090614388565b600254341015610fda5760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611013573d5f803e3d5ffd5b506110a385855f818110611029576110296143d9565b905060200201602081019061103e9190614282565b3361109d7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca00989895f818110611075576110756143d9565b905060200201602081019061108a9190614282565b8a8a6001818110610935576109356143d9565b8a612fca565b5f85856110b16001826143c6565b8181106110c0576110c06143d9565b90506020020160208101906110d59190614282565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561111b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113f9190614521565b905061117e8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525088925061347c915050565b866112258288886111906001826143c6565b81811061119f5761119f6143d9565b90506020020160208101906111b49190614282565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f9190614521565b90613702565b10156112435760405162461bcd60e51b81526004016106209061441c565b5050505050505050565b611255613757565b600255565b611262613757565b61126b5f613783565b565b804281101561128e5760405162461bcd60e51b815260040161062090614388565b6001600160a01b037f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5571685856112c56001826143c6565b8181106112d4576112d46143d9565b90506020020160208101906112e99190614282565b6001600160a01b03161461130f5760405162461bcd60e51b8152600401610620906143ed565b6002543410156113315760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f1935050505015801561136a573d5f803e3d5ffd5b5061138085855f818110611029576110296143d9565b6113bd8585808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525030925061347c915050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b0316906370a0823190602401602060405180830381865afa158015611421573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114459190614521565b9050868110156114675760405162461bcd60e51b81526004016106209061441c565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156114c6575f80fd5b505af11580156114d8573d5f803e3d5ffd5b505050506112438482612bbf565b606081428110156115095760405162461bcd60e51b815260040161062090614388565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031686865f818110611545576115456143d9565b905060200201602081019061155a9190614282565b6001600160a01b0316146115805760405162461bcd60e51b8152600401610620906143ed565b6002543410156115f85760405162461bcd60e51b815260206004820152603c60248201527f417065737761703a20494e53554646494349454e545f464545202d20506c656160448201527f73652073656e64207468652065786163742066656520616d6f756e74000000006064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611631573d5f803e3d5ffd5b505f6002543461164191906143c6565b90505f811161169c5760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20494e53554646494349454e545f535741505f414d4f554e6044820152601560fa1b6064820152608401610620565b6116f97f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009828989808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612d6b92505050565b925087836001855161170b91906143c6565b8151811061171b5761171b6143d9565b602002602001015110156117415760405162461bcd60e51b81526004016106209061441c565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561179a575f80fd5b505af11580156117ac573d5f803e3d5ffd5b50505050507f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663a9059cbb6118167f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098a8a5f81811061090d5761090d6143d9565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118849190614538565b61189057611890613e2c565b6118ce838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613103915050565b505095945050505050565b5f6106ff8484846137d2565b606081428110156119085760405162461bcd60e51b815260040161062090614388565b6119657f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506132fd92505050565b915086825f8151811061197a5761197a6143d9565b60200260200101511115610c565760405162461bcd60e51b8152600401610620906144ea565b6119a8613757565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f6106ff8484846138a4565b5f81428110156119f85760405162461bcd60e51b815260040161062090614388565b611a27887f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5578989893089611eb2565b6040516370a0823160e01b8152306004820152909350611a9e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a999190614521565b612a93565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015611afd575f80fd5b505af1158015611b0f573d5f803e3d5ffd5b50505050610a7d8483612bbf565b8042811015611b3e5760405162461bcd60e51b815260040161062090614388565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031685855f818110611b7a57611b7a6143d9565b9050602002016020810190611b8f9190614282565b6001600160a01b031614611bb55760405162461bcd60e51b8152600401610620906143ed565b600254341015611bd75760405162461bcd60e51b81526004016106209061445f565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611c10573d5f803e3d5ffd5b505f60025434611c2091906143c6565b90507f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015611c7b575f80fd5b505af1158015611c8d573d5f803e3d5ffd5b50505050507f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663a9059cbb611cf77f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca00989895f818110611075576110756143d9565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d659190614538565b611d7157611d71613e2c565b5f8686611d7f6001826143c6565b818110611d8e57611d8e6143d9565b9050602002016020810190611da39190614282565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0d9190614521565b9050611e4c8787808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525089925061347c915050565b87611225828989611e5e6001826143c6565b818110611e6d57611e6d6143d9565b9050602002016020810190611e829190614282565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016111e0565b5f808242811015611ed55760405162461bcd60e51b815260040161062090614388565b5f611f017f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098c8c612ef3565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f789190614538565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe59190614553565b915091505f611ff48e8e61393f565b509050806001600160a01b03168e6001600160a01b03161461201757818361201a565b82825b90975095508a87101561206f5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b898610156120bf5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b505050505097509795505050505050565b6120d8613757565b47816121265760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610620565b808211156121765760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610620565b5f80546040516001600160a01b039091169084908381818185875af1925050503d805f81146121c0576040519150601f19603f3d011682016040523d82523d5f602084013e6121c5565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b6044820152606401610620565b505050565b6060610ab57f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098484612d6b565b5f805f61228a7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098e7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557612ef3565b90505f87612298578c61229b565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906122d6903390309086908f908e908e908e906004016144a9565b5f604051808303815f87803b1580156122ed575f80fd5b505af11580156122ff573d5f803e3d5ffd5b505050506123118e8e8e8e8e8e6105fd565b909f909e509c50505050505050505050505050565b5f805f834281101561234a5760405162461bcd60e51b815260040161062090614388565b6123588c8c8c8c8c8c613a33565b90945092505f6123897f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098e8e612ef3565b90506123978d338388612fca565b6123a38c338387612fca565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156123e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240c9190614521565b92505050985098509895505050505050565b612426613757565b6001600160a01b03811661244f57604051631e4fbdf760e01b81525f6004820152602401610620565b61245881613783565b50565b5f805f834281101561247f5760405162461bcd60e51b815260040161062090614388565b6124ad8a7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5578b348c8c613a33565b90945092505f6124fe7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098c7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557612ef3565b905061250c8b338388612fca565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015612565575f80fd5b505af1158015612577573d5f803e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b55716935063a9059cbb925060440190506020604051808303815f875af11580156125e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260d9190614538565b61261957612619613e2c565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af115801561265e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126829190614521565b92508334111561269f5761269f3361269a86346143c6565b612bbf565b505096509650969350505050565b606081428110156126d05760405162461bcd60e51b815260040161062090614388565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031686865f81811061270c5761270c6143d9565b90506020020160208101906127219190614282565b6001600160a01b0316146127475760405162461bcd60e51b8152600401610620906143ed565b6002543410156127a35760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20496e73756666696369656e742045544820666f722066656044820152606560f81b6064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156127dc573d5f803e3d5ffd5b505f600254346127ec91906143c6565b905061284b7f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009898989808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506132fd92505050565b925080835f81518110612860576128606143d9565b602002602001015111156128865760405162461bcd60e51b8152600401610620906144ea565b7f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663d0e30db0845f815181106128c7576128c76143d9565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b1580156128f8575f80fd5b505af115801561290a573d5f803e3d5ffd5b50505050507f00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b5576001600160a01b031663a9059cbb6129747f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098a8a5f81811061090d5761090d6143d9565b855f81518110612986576129866143d9565b60200260200101516040518363ffffffff1660e01b81526004016129bf9291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af11580156129db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ff9190614538565b612a0b57612a0b613e2c565b612a49838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613103915050565b825f81518110612a5b57612a5b6143d9565b60200260200101518111156118ce576118ce33845f81518110612a8057612a806143d9565b60200260200101518361269a91906143c6565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691612aee9190614597565b5f604051808303815f865af19150503d805f8114612b27576040519150601f19603f3d011682016040523d82523d5f602084013e612b2c565b606091505b5091509150818015612b56575080511580612b56575080806020019051810190612b569190614538565b612bb85760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610620565b5050505050565b604080515f808252602082019092526001600160a01b038416908390604051612be89190614597565b5f6040518083038185875af1925050503d805f8114612c22576040519150601f19603f3d011682016040523d82523d5f602084013e612c27565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610620565b5f808411612cf75760405162461bcd60e51b815260206004820152602960248201527f417065737761704c6962726172793a20494e53554646494349454e545f494e50604482015268155517d05353d5539560ba1b6064820152608401610620565b5f83118015612d0557505f82115b612d215760405162461bcd60e51b8152600401610620906145b2565b5f612d2e856103e5613cad565b90505f612d3b8285613cad565b90505f612d5483612d4e886103e8613cad565b90613d13565b9050612d6081836145f8565b979650505050505050565b6060600282511015612dbf5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff811115612dd957612dd9613fd9565b604051908082528060200260200182016040528015612e02578160200160208202803683370190505b50905082815f81518110612e1857612e186143d9565b6020026020010181815250505f5b60018351612e3491906143c6565b811015612eeb575f80612e8687868581518110612e5357612e536143d9565b602002602001015187866001612e699190614617565b81518110612e7957612e796143d9565b6020026020010151613d67565b91509150612eae848481518110612e9f57612e9f6143d9565b60200260200101518383612c95565b84612eba856001614617565b81518110612eca57612eca6143d9565b60200260200101818152505050508080612ee39061462a565b915050612e26565b509392505050565b5f805f612f00858561393f565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612fa89291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f7af2cd06d86e4252f2c847dae09d1922eb5b0e90a2231ecaf7298d7aaf1f1ccf603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9283929088169161302d9190614597565b5f604051808303815f865af19150503d805f8114613066576040519150601f19603f3d011682016040523d82523d5f602084013e61306b565b606091505b50915091508180156130955750805115806130955750808060200190518101906130959190614538565b6130fb5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610620565b505050505050565b5f5b6001835161311391906143c6565b8110156132f7575f8084838151811061312e5761312e6143d9565b6020026020010151858460016131449190614617565b81518110613154576131546143d9565b6020026020010151915091505f61316b838361393f565b5090505f8761317b866001614617565b8151811061318b5761318b6143d9565b602002602001015190505f80836001600160a01b0316866001600160a01b0316146131b757825f6131ba565b5f835b915091505f60028a516131cd91906143c6565b88106131d95788613227565b6132277f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009878c61320a8c6002614617565b8151811061321a5761321a6143d9565b6020026020010151612ef3565b90506132547f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098888612ef3565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015613290576020820181803683370190505b506040518563ffffffff1660e01b81526004016132b09493929190614642565b5f604051808303815f87803b1580156132c7575f80fd5b505af11580156132d9573d5f803e3d5ffd5b505050505050505050505080806132ef9061462a565b915050613105565b50505050565b60606002825110156133515760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff81111561336b5761336b613fd9565b604051908082528060200260200182016040528015613394578160200160208202803683370190505b5090508281600183516133a791906143c6565b815181106133b7576133b76143d9565b6020026020010181815250505f600183516133d291906143c6565b90505b8015612eeb575f8061341787866133ed6001876143c6565b815181106133fd576133fd6143d9565b6020026020010151878681518110612e7957612e796143d9565b9150915061343f848481518110613430576134306143d9565b602002602001015183836137d2565b8461344b6001866143c6565b8151811061345b5761345b6143d9565b6020026020010181815250505050808061347490614691565b9150506133d5565b5f5b6001835161348c91906143c6565b81101561220a575f808483815181106134a7576134a76143d9565b6020026020010151858460016134bd9190614617565b815181106134cd576134cd6143d9565b6020026020010151915091505f6134e4838361393f565b5090505f6135137f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098585612ef3565b90505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613555573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357991906146bc565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b0316146135b25782846135b5565b83835b6040516370a0823160e01b81526001600160a01b038a811660048301529294509092506135f0918491908d16906370a08231906024016111e0565b95506135fd868383612c95565b9450505050505f80856001600160a01b0316886001600160a01b03161461362557825f613628565b5f835b915091505f60028c5161363b91906143c6565b8a10613647578a613678565b6136787f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009898e61320a8e6002614617565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906136b99086908690869060248101614642565b5f604051808303815f87803b1580156136d0575f80fd5b505af11580156136e2573d5f803e3d5ffd5b5050505050505050505050505080806136fa9061462a565b91505061347e565b5f8261370e83826143c6565b9150811115610ab85760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610620565b5f546001600160a01b0316331461126b5760405163118cdaa760e01b8152336004820152602401610620565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8084116138355760405162461bcd60e51b815260206004820152602a60248201527f417065737761704c6962726172793a20494e53554646494349454e545f4f555460448201526914155517d05353d5539560b21b6064820152608401610620565b5f8311801561384357505f82115b61385f5760405162461bcd60e51b8152600401610620906145b2565b5f6138766103e86138708688613cad565b90613cad565b90505f6138896103e56138708689613702565b905061389a6001612d4e83856145f8565b9695505050505050565b5f8084116139005760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610620565b5f8311801561390e57505f82115b61392a5760405162461bcd60e51b8152600401610620906145b2565b826139358584613cad565b6106ff91906145f8565b5f80826001600160a01b0316846001600160a01b0316036139ae5760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610620565b826001600160a01b0316846001600160a01b0316106139ce5782846139d1565b83835b90925090506001600160a01b038216613a2c5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a205a45524f5f41444452455353000000006044820152606401610620565b9250929050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0099091169063e6a4390590604401602060405180830381865afa158015613aa7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613acb9190614708565b6001600160a01b031603613b6c576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009169063c9c65396906044016020604051808303815f875af1158015613b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b6a9190614708565b505b5f80613b997f000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca0098b8b613d67565b91509150815f148015613baa575080155b15613bba57879350869250613ca0565b5f613bc68984846138a4565b9050878111613c2a5785811015613c1f5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b889450925082613c9e565b5f613c368984866138a4565b905089811115613c4857613c48613e2c565b87811015613c985760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b94508793505b505b5050965096945050505050565b5f811580613cd057508282613cc28183614723565b9250613cce90836145f8565b145b610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610620565b5f82613d1f8382614617565b9150811015610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610620565b5f805f613d74858561393f565b5090505f80613d84888888612ef3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613dbf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de391906146bc565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613e1a578082613e1d565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b0381168114612458575f80fd5b8035613e5f81613e40565b919050565b5f805f805f8060c08789031215613e79575f80fd5b8635613e8481613e40565b95506020870135945060408701359350606087013592506080870135613ea981613e40565b8092505060a087013590509295509295509295565b5f805f60608486031215613ed0575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112613ef7575f80fd5b50813567ffffffffffffffff811115613f0e575f80fd5b6020830191508360208260051b8501011115613a2c575f80fd5b5f805f805f8060a08789031215613f3d575f80fd5b8635955060208701359450604087013567ffffffffffffffff811115613f61575f80fd5b613f6d89828a01613ee7565b9095509350506060870135613f8181613e40565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b81811015613fcd57835183529284019291840191600101613fb1565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215613ffe575f80fd5b8235915060208084013567ffffffffffffffff8082111561401d575f80fd5b818601915086601f830112614030575f80fd5b81358181111561404257614042613fd9565b8060051b604051601f19603f8301168101818110858211171561406757614067613fd9565b604052918252848201925083810185019189831115614084575f80fd5b938501935b828510156140a95761409a85613e54565b84529385019392850192614089565b8096505050505050509250929050565b8015158114612458575f80fd5b803560ff81168114613e5f575f80fd5b5f805f805f805f805f805f6101608c8e0312156140f1575f80fd5b8b356140fc81613e40565b9a5060208c013561410c81613e40565b995060408c0135985060608c0135975060808c0135965060a08c013561413181613e40565b955060c08c0135945060e08c0135614148816140b9565b93506141576101008d016140c6565b92506101208c013591506101408c013590509295989b509295989b9093969950565b5f805f805f805f805f806101408b8d031215614193575f80fd5b8a3561419e81613e40565b995060208b0135985060408b0135975060608b0135965060808b01356141c381613e40565b955060a08b0135945060c08b01356141da816140b9565b93506141e860e08c016140c6565b92506101008b013591506101208b013590509295989b9194979a5092959850565b5f60208284031215614219575f80fd5b5035919050565b5f805f805f60808688031215614234575f80fd5b85359450602086013567ffffffffffffffff811115614251575f80fd5b61425d88828901613ee7565b909550935050604086013561427181613e40565b949793965091946060013592915050565b5f60208284031215614292575f80fd5b813561429d81613e40565b9392505050565b5f805f805f805f60e0888a0312156142ba575f80fd5b87356142c581613e40565b965060208801356142d581613e40565b955060408801359450606088013593506080880135925060a08801356142fa81613e40565b8092505060c0880135905092959891949750929550565b5f805f805f805f80610100898b031215614329575f80fd5b883561433481613e40565b9750602089013561434481613e40565b965060408901359550606089013594506080890135935060a0890135925060c089013561437081613e40565b8092505060e089013590509295985092959890939650565b60208082526010908201526f105c195cddd85c0e881156141254915160821b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ab857610ab86143b2565b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274082e0cae6eec2e07440929cac82989288bea082a89605b1b604082015260600190565b60208082526023908201527f417065737761703a20494e53554646494349454e545f4f55545055545f414d4f60408201526215539560ea1b606082015260800190565b6020808252602a908201527f417065737761703a2d20506c656173652073656e64207468652065786163742060408201526919995948185b5bdd5b9d60b21b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252601f908201527f417065737761703a204558434553534956455f494e5055545f414d4f554e5400604082015260600190565b5f60208284031215614531575f80fd5b5051919050565b5f60208284031215614548575f80fd5b815161429d816140b9565b5f8060408385031215614564575f80fd5b505080516020909101519092909150565b5f5b8381101561458f578181015183820152602001614577565b50505f910152565b5f82516145a8818460208701614575565b9190910192915050565b60208082526026908201527f417065737761704c6962726172793a20494e53554646494349454e545f4c495160408201526555494449545960d01b606082015260800190565b5f8261461257634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610ab857610ab86143b2565b5f6001820161463b5761463b6143b2565b5060010190565b84815283602082015260018060a01b0383166040820152608060608201525f825180608084015261467a8160a0850160208701614575565b601f01601f19169190910160a00195945050505050565b5f8161469f5761469f6143b2565b505f190190565b80516001600160701b0381168114613e5f575f80fd5b5f805f606084860312156146ce575f80fd5b6146d7846146a6565b92506146e5602085016146a6565b9150604084015163ffffffff811681146146fd575f80fd5b809150509250925092565b5f60208284031215614718575f80fd5b815161429d81613e40565b8082028115828204841417610ab857610ab86143b256fea2646970667358221220bd92424e1431cd0a1821546dc63a27e4e2077cb40b681b9577f25035f133ab6464736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca00900000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557
-----Decoded View---------------
Arg [0] : _factory (address): 0xf61cf68648E6878421ab04654cA6ec38122CA009
Arg [1] : _WETH (address): 0x48b62137EdfA95a428D35C09E44256a739F6B557
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f61cf68648e6878421ab04654ca6ec38122ca009
Arg [1] : 00000000000000000000000048b62137edfa95a428d35c09e44256a739f6b557
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.