Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 23 from a total of 23 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 18112844 | 369 days ago | IN | 0 ETH | 0.00612605 | ||||
Swap Exact ETH F... | 17970030 | 389 days ago | IN | 0.02 ETH | 0.00255518 | ||||
Swap Exact Token... | 17882068 | 401 days ago | IN | 0 ETH | 0.00202039 | ||||
Swap Exact Token... | 17864594 | 404 days ago | IN | 0 ETH | 0.00501398 | ||||
Swap Exact Token... | 17864585 | 404 days ago | IN | 0 ETH | 0.00569548 | ||||
Swap Exact Token... | 17864540 | 404 days ago | IN | 0 ETH | 0.00393065 | ||||
Swap Exact Token... | 17864454 | 404 days ago | IN | 0 ETH | 0.00467476 | ||||
Swap Exact Token... | 17864454 | 404 days ago | IN | 0 ETH | 0.00558802 | ||||
Swap Exact Token... | 17864452 | 404 days ago | IN | 0 ETH | 0.00583857 | ||||
Swap Exact Token... | 17864450 | 404 days ago | IN | 0 ETH | 0.00521805 | ||||
Swap Exact ETH F... | 17864443 | 404 days ago | IN | 0.13 ETH | 0.00564193 | ||||
Swap Exact ETH F... | 17864441 | 404 days ago | IN | 0.25 ETH | 0.00514018 | ||||
Swap Exact Token... | 17864441 | 404 days ago | IN | 0 ETH | 0.00573905 | ||||
Swap Exact ETH F... | 17864439 | 404 days ago | IN | 0.358 ETH | 0.0056452 | ||||
Swap Exact ETH F... | 17864437 | 404 days ago | IN | 0.28 ETH | 0.00603946 | ||||
Swap Exact ETH F... | 17864436 | 404 days ago | IN | 0.1 ETH | 0.00489778 | ||||
Swap Exact ETH F... | 17864435 | 404 days ago | IN | 0.12 ETH | 0.00547748 | ||||
Swap Exact ETH F... | 17864433 | 404 days ago | IN | 0.3 ETH | 0.00610201 | ||||
Swap Exact ETH F... | 17864431 | 404 days ago | IN | 0.1 ETH | 0.00552102 | ||||
Swap Exact ETH F... | 17864430 | 404 days ago | IN | 0.01 ETH | 0.00558749 | ||||
Swap Exact ETH F... | 17864428 | 404 days ago | IN | 0.2 ETH | 0.00741254 | ||||
Add Liquidity ET... | 17864425 | 404 days ago | IN | 0.26563194 ETH | 0.12054983 | ||||
0x60c06040 | 17746422 | 420 days ago | IN | 0 ETH | 0.06325729 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18112844 | 369 days ago | 0.24868426 ETH | ||||
18112844 | 369 days ago | 0.24868426 ETH | ||||
17970030 | 389 days ago | 0.02 ETH | ||||
17882068 | 401 days ago | 0.016631 ETH | ||||
17882068 | 401 days ago | 0.016631 ETH | ||||
17864594 | 404 days ago | 0.09751799 ETH | ||||
17864594 | 404 days ago | 0.09751799 ETH | ||||
17864585 | 404 days ago | 0.17719909 ETH | ||||
17864585 | 404 days ago | 0.17719909 ETH | ||||
17864540 | 404 days ago | 0.07172935 ETH | ||||
17864540 | 404 days ago | 0.07172935 ETH | ||||
17864454 | 404 days ago | 0.15824608 ETH | ||||
17864454 | 404 days ago | 0.15824608 ETH | ||||
17864454 | 404 days ago | 0.25177167 ETH | ||||
17864454 | 404 days ago | 0.25177167 ETH | ||||
17864450 | 404 days ago | 0.28348511 ETH | ||||
17864450 | 404 days ago | 0.28348511 ETH | ||||
17864443 | 404 days ago | 0.13 ETH | ||||
17864441 | 404 days ago | 0.25 ETH | ||||
17864441 | 404 days ago | 0.24537688 ETH | ||||
17864441 | 404 days ago | 0.24537688 ETH | ||||
17864439 | 404 days ago | 0.358 ETH | ||||
17864437 | 404 days ago | 0.28 ETH | ||||
17864436 | 404 days ago | 0.1 ETH | ||||
17864435 | 404 days ago | 0.12 ETH |
Loading...
Loading
Contract Name:
InedibleXRouterV1
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity =0.6.6; pragma experimental ABIEncoderV2; import "./interfaces/IInedibleXV1Factory.sol"; import "./interfaces/IInedibleXV1Pair.sol"; import "./v2-periphery/UniswapV2Router02.sol"; contract InedibleXRouterV1 is UniswapV2Router02 { struct LaunchParams { bool deployNewPool; bool launch; uint16 launchFeePct; uint40 lockDuration; } constructor( address factory, address WETH ) public UniswapV2Router02(factory, WETH) {} // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, LaunchParams memory launchParams ) internal virtual returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet if ( IInedibleXV1Factory(factory).getPair(tokenA, tokenB) == address(0) ) { require(launchParams.deployNewPool, "can't deploy a new pool"); IInedibleXV1Factory(factory).createPair( tokenA, tokenB, launchParams.launch, launchParams.launchFeePct, launchParams.lockDuration ); } else { require(!launchParams.deployNewPool, "pool already exists"); } (uint reserveA, uint reserveB) = UniswapV2Library.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = UniswapV2Library.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "UniswapV2Router: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = UniswapV2Library.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "UniswapV2Router: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline, LaunchParams calldata launchParams ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, launchParams ); address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IUniswapV2Pair(pair).mint(to); } function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline, LaunchParams calldata launchParams ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin, launchParams ); } address pair = UniswapV2Library.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IInedibleXV1Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } }
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, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); 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(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.5.0; interface IInedibleXV1Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint pairLength ); event InedibleCreated( address indexed token0, address indexed token1, address pair, uint pairLength, bool launch, uint lock ); function treasury() external view returns (address); function feeTo() external view returns (address); function dao() external view returns (address); function getPair( address tokenA, address tokenB ) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair( address tokenA, address tokenB, bool launch, uint16 launchFeePct, uint40 lock ) external returns (address pair); function setFeeTo(address) external; // added by inedible function setLaunchFeePct(uint16 _launchFeePct) external; function setMinSupplyPct(uint16 _minSupplyPct) external; function transferOwnership(address _newDao) external; function renounceOwnership() external; function acceptOwnership() external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.5.0; interface IInedibleXV1Pair { struct Balance { uint balance0; uint balance1; } event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance( address owner, address spender ) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom( address from, address to, uint value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn( address indexed sender, uint amount0, uint amount1, address indexed to ); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize( address _token0, address _token1, uint16 _minSupplyPct, uint16 _launchFeePct, bool _launch, uint40 _lockDuration ) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function swapTokensForExactETH( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapETHForExactTokens( uint amountOut, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function quote( uint amountA, uint reserveA, uint reserveB ) external pure returns (uint amountB); function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) external pure returns (uint amountOut); function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) external pure returns (uint amountIn); function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); function getAmountsIn( uint amountOut, address[] calldata path ) external view returns (uint[] memory amounts); }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.2; import "./IUniswapV2Router01.sol"; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
pragma solidity <0.7.0; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; interface IUniswapFactory { function getPair( address tokenA, address tokenB ) external view returns (address pair); } library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } library UniswapV2Library { using SafeMath for uint; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens( address tokenA, address tokenB ) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "UniswapV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "UniswapV2Library: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = IUniswapFactory(factory).getPair(token0, token1); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint reserveA, uint reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1, ) = IUniswapV2Pair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint amountA, uint reserveA, uint reserveB ) internal pure returns (uint amountB) { require(amountA > 0, "UniswapV2Library: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY" ); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) internal pure returns (uint amountOut) { require(amountIn > 0, "UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY" ); uint amountInWithFee = amountIn.mul(9964); uint numerator = amountInWithFee.mul(reserveOut); uint denominator = reserveIn.mul(10000).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( uint amountOut, uint reserveIn, uint reserveOut ) internal pure returns (uint amountIn) { require(amountOut > 0, "UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY" ); uint numerator = reserveIn.mul(amountOut).mul(10000); uint denominator = reserveOut.sub(amountOut).mul(9964); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint amountIn, address[] memory path ) internal view returns (uint[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint[](path.length); amounts[0] = amountIn; for (uint i; i < path.length - 1; i++) { (uint reserveIn, uint 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, uint amountOut, address[] memory path ) internal view returns (uint[] memory amounts) { require(path.length >= 2, "UniswapV2Library: INVALID_PATH"); amounts = new uint[](path.length); amounts[amounts.length - 1] = amountOut; for (uint i = path.length - 1; i > 0; i--) { (uint reserveIn, uint reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } }
pragma solidity =0.6.6; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; import "@uniswap/lib/contracts/libraries/TransferHelper.sol"; import "./interfaces/IUniswapV2Router02.sol"; import "./libraries/UniswapV2Library.sol"; import "../interfaces/IERC20.sol"; import "../interfaces/IWETH.sol"; import "../interfaces/IInedibleXV1Pair.sol"; contract UniswapV2Router02 is IUniswapV2Router02 { using SafeMath for uint; address public immutable override factory; address public immutable override WETH; modifier ensure(uint deadline) { require(deadline >= block.timestamp, "UniswapV2Router: EXPIRED"); _; } constructor(address _factory, address _WETH) public { factory = _factory; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal virtual returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) { IUniswapV2Factory(factory).createPair(tokenA, tokenB); } (uint reserveA, uint reserveB) = UniswapV2Library.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = UniswapV2Library.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "UniswapV2Router: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = UniswapV2Library.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "UniswapV2Router: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin ); address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IUniswapV2Pair(pair).mint(to); } function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable virtual override ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = UniswapV2Library.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IUniswapV2Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) { address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to); (address token0, ) = UniswapV2Library.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require( amountA >= amountAMin, "UniswapV2Router: INSUFFICIENT_A_AMOUNT" ); require( amountB >= amountBMin, "UniswapV2Router: INSUFFICIENT_B_AMOUNT" ); } function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public virtual override ensure(deadline) returns (uint amountToken, uint 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, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint amountA, uint amountB) { address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); uint value = approveMax ? uint(-1) : liquidity; IUniswapV2Pair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountA, amountB) = removeLiquidity( tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline ); } function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint amountToken, uint amountETH) { address pair = UniswapV2Library.pairFor(factory, token, WETH); uint value = approveMax ? uint(-1) : liquidity; IUniswapV2Pair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountToken, amountETH) = removeLiquidityETH( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public virtual override ensure(deadline) returns (uint 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, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint amountETH) { address pair = UniswapV2Library.pairFor(factory, token, WETH); uint value = approveMax ? uint(-1) : liquidity; IUniswapV2Pair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint[] memory amounts, address[] memory path, address _to ) internal virtual { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = UniswapV2Library.sortTokens(input, output); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to; IInedibleXV1Pair(UniswapV2Library.pairFor(factory, input, output)) .swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) returns (uint[] memory amounts) { amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) returns (uint[] memory amounts) { amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[0] == WETH, "UniswapV2Router: INVALID_PATH"); amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); } function swapTokensForExactETH( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH"); amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH"); amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint amountOut, address[] calldata path, address to, uint deadline ) external payable virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[0] == WETH, "UniswapV2Router: INVALID_PATH"); amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require( amounts[0] <= msg.value, "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = UniswapV2Library.sortTokens(input, output); IInedibleXV1Pair pair = IInedibleXV1Pair( UniswapV2Library.pairFor(factory, input, output) ); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1, ) = pair.getReserves(); (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub( reserveInput ); amountOutput = UniswapV2Library.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn ); uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "UniswapV2Router: INVALID_PATH"); uint amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert( IWETH(WETH).transfer( UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn ) ); uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint amountOut = IERC20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint amountA, uint reserveA, uint reserveB ) public pure virtual override returns (uint amountB) { return UniswapV2Library.quote(amountA, reserveA, reserveB); } function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) public pure virtual override returns (uint amountOut) { return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) public pure virtual override returns (uint amountIn) { return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint amountIn, address[] memory path ) public view virtual override returns (uint[] memory amounts) { return UniswapV2Library.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint amountOut, address[] memory path ) public view virtual override returns (uint[] memory amounts) { return UniswapV2Library.getAmountsIn(factory, amountOut, path); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"bool","name":"deployNewPool","type":"bool"},{"internalType":"bool","name":"launch","type":"bool"},{"internalType":"uint16","name":"launchFeePct","type":"uint16"},{"internalType":"uint40","name":"lockDuration","type":"uint40"}],"internalType":"struct InedibleXRouterV1.LaunchParams","name":"launchParams","type":"tuple"}],"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":"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"},{"components":[{"internalType":"bool","name":"deployNewPool","type":"bool"},{"internalType":"bool","name":"launch","type":"bool"},{"internalType":"uint16","name":"launchFeePct","type":"uint16"},{"internalType":"uint40","name":"lockDuration","type":"uint40"}],"internalType":"struct InedibleXRouterV1.LaunchParams","name":"launchParams","type":"tuple"}],"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":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620049c7380380620049c7833981016040819052620000349162000053565b6001600160601b0319606092831b8116608052911b1660a052620000aa565b6000806040838503121562000066578182fd5b8251620000738162000091565b6020840151909250620000868162000091565b809150509250929050565b6001600160a01b0381168114620000a757600080fd5b50565b60805160601c60a05160601c6147c26200020560003980610195528061052c528061057c528061063b528061082b5280610a255280610a8a5280610abe5280610b445280610eca5280610ff3528061133c528061140f52806114cd5280611563528061166c52806116f452806118eb52806119435280611a105280611aa45280611b1b5280611b8f5280611ffa52806121fd52806122535280612287528061230d5280612466528061256c52806125f45250806106ab528061076852806108f1528061092a5280610a685280610ca15280610dcc5280610f3a5280610fd1528061110252806115d85280611726528061185a5280611bc15280611dc55280611f7f5280611fa85280611fd85280612101528061223152806124db52806126265280612cdc5280612d1f5280612f065280612fe852806130a052806131cf528061333652806135c7528061367c528061370f52506147c26000f3fe6080604052600436106101855760003560e01c806385f8c259116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610493578063e8e33700146104b3578063f305d719146104d3578063fb3bdb41146104e6576101be565b8063baa2abde1461043e578063c45a01551461045e578063d06ca61f14610473576101be565b806385f8c259146103895780638803dbee146103a9578063ad5c4648146103c9578063ad615dec146103eb578063af2979eb1461040b578063b6f9de951461042b576101be565b806338ed17391161013e5780635b0d5984116101185780635b0d5984146103165780635c11d79514610336578063791ac947146103565780637ff36ab514610376576101be565b806338ed1739146102b65780633d529f7b146102d65780634a25d94a146102f6576101be565b806302751cec146101c3578063054d50d4146101fa57806318cbafe5146102275780631f00ca74146102545780632195995c1461027457806332e1144514610294576101be565b366101be57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101bc57fe5b005b600080fd5b3480156101cf57600080fd5b506101e36101de366004613bee565b6104f9565b6040516101f192919061468a565b60405180910390f35b34801561020657600080fd5b5061021a610215366004613fff565b6105f9565b6040516101f19190614681565b34801561023357600080fd5b50610247610242366004613f8e565b61060e565b6040516101f1919061412d565b34801561026057600080fd5b5061024761026f366004613eb4565b6108ea565b34801561028057600080fd5b506101e361028f366004613a3e565b610920565b6102a76102a2366004613ce1565b6109f9565b6040516101f1939291906146e8565b3480156102c257600080fd5b506102476102d1366004613f8e565b610c79565b3480156102e257600080fd5b506102a76102f1366004613b63565b610d82565b34801561030257600080fd5b50610247610311366004613f8e565b610e9d565b34801561032257600080fd5b5061021a610331366004613c4b565b610fc9565b34801561034257600080fd5b506101bc610351366004613f8e565b6110b6565b34801561036257600080fd5b506101bc610371366004613f8e565b611311565b610247610384366004613e4f565b61153e565b34801561039557600080fd5b5061021a6103a4366004613fff565b611825565b3480156103b557600080fd5b506102476103c4366004613f8e565b611832565b3480156103d557600080fd5b506103de6118e9565b6040516101f19190614046565b3480156103f757600080fd5b5061021a610406366004613fff565b61190d565b34801561041757600080fd5b5061021a610426366004613bee565b61191a565b6101bc610439366004613e4f565b611a81565b34801561044a57600080fd5b506101e36104593660046139cd565b611d9a565b34801561046a57600080fd5b506103de611f7d565b34801561047f57600080fd5b5061024761048e366004613eb4565b611fa1565b34801561049f57600080fd5b506101e36104ae366004613c4b565b611fce565b3480156104bf57600080fd5b506102a76104ce366004613ae8565b6120c1565b6102a76104e1366004613bee565b6121d1565b6102476104f4366004613e4f565b612441565b60008082428110156105265760405162461bcd60e51b815260040161051d906141d7565b60405180910390fd5b610555897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611d9a565b9093509150610565898685612757565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906105b1908590600401614681565b600060405180830381600087803b1580156105cb57600080fd5b505af11580156105df573d6000803e3d6000fd5b505050506105ed8583612845565b50965096945050505050565b60006106068484846128d7565b949350505050565b606081428110156106315760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061066b57fe5b9050602002016020810190610680919061398e565b6001600160a01b0316146106a65760405162461bcd60e51b815260040161051d90614378565b6107047f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061071757fe5b6020026020010151101561073d5760405162461bcd60e51b815260040161051d90614570565b6107ea8686600081811061074d57fe5b9050602002016020810190610762919061398e565b336107d07f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061079457fe5b90506020020160208101906107a9919061398e565b8b8b60018181106107b657fe5b90506020020160208101906107cb919061398e565b612aa0565b856000815181106107dd57fe5b6020026020010151612b3c565b61082982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612c2d915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061086857fe5b60200260200101516040518263ffffffff1660e01b815260040161088c9190614681565b600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b505050506108df84836001855103815181106108d257fe5b6020026020010151612845565b509695505050505050565b60606109177f00000000000000000000000000000000000000000000000000000000000000008484612ded565b90505b92915050565b60008060006109507f00000000000000000000000000000000000000000000000000000000000000008f8f612aa0565b905060008761095f578c610963565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061099e903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b505050506109df8f8f8f8f8f8f8f611d9a565b809450819550505050509b509b9950505050505050505050565b60008060008442811015610a1f5760405162461bcd60e51b815260040161051d906141d7565b610a5c8b7f00000000000000000000000000000000000000000000000000000000000000008c348d8d610a57368d90038d018d613d6c565b612ef0565b90945092506000610aae7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b9050610abc8c338388612b3c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250610b7e915084908890600401614114565b602060405180830381600087803b158015610b9857600080fd5b505af1158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190613d50565b610bd657fe5b6040516335313c2160e11b81526001600160a01b03821690636a62784290610c02908b90600401614046565b602060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190613e37565b925083341115610c6a57610c6a33853403612845565b50509750975097945050505050565b60608142811015610c9c5760405162461bcd60e51b815260040161051d906141d7565b610cfa7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b91508682600184510381518110610d0d57fe5b60200260200101511015610d335760405162461bcd60e51b815260040161051d90614570565b610d438686600081811061074d57fe5b6108df82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b60008060008442811015610da85760405162461bcd60e51b815260040161051d906141d7565b610dc08d8d8d8d8d8d610a57368d90038d018d613d6c565b90945092506000610df27f00000000000000000000000000000000000000000000000000000000000000008f8f612aa0565b9050610e008e338388612b3c565b610e0c8d338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a62784290610e38908b90600401614046565b602060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190613e37565b9250505099509950999650505050505050565b60608142811015610ec05760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610efa57fe5b9050602002016020810190610f0f919061398e565b6001600160a01b031614610f355760405162461bcd60e51b815260040161051d90614378565b610f937f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b91508682600081518110610fa357fe5b6020026020010151111561073d5760405162461bcd60e51b815260040161051d906144a0565b6000806110177f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b9050600086611026578b61102a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611065903390309086908e908d908d908d9060040161405a565b600060405180830381600087803b15801561107f57600080fd5b505af1158015611093573d6000803e3d6000fd5b505050506110a58d8d8d8d8d8d61191a565b9d9c50505050505050505050505050565b80428110156110d75760405162461bcd60e51b815260040161051d906141d7565b611156858560008181106110e757fe5b90506020020160208101906110fc919061398e565b336111507f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b9050602002016020810190611143919061398e565b8a8a60018181106107b657fe5b8a612b3c565b60008585600019810181811061116857fe5b905060200201602081019061117d919061398e565b6001600160a01b03166370a08231856040518263ffffffff1660e01b81526004016111a89190614046565b60206040518083038186803b1580156111c057600080fd5b505afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f89190613e37565b9050611238868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613178915050565b866112e9828888600019810181811061124d57fe5b9050602002016020810190611262919061398e565b6001600160a01b03166370a08231886040518263ffffffff1660e01b815260040161128d9190614046565b60206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190613e37565b9063ffffffff6133ee16565b10156113075760405162461bcd60e51b815260040161051d90614570565b5050505050505050565b80428110156113325760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061136c57fe5b9050602002016020810190611381919061398e565b6001600160a01b0316146113a75760405162461bcd60e51b815260040161051d90614378565b6113b7858560008181106110e757fe5b6113f5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613178915050565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190611444903090600401614046565b60206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114949190613e37565b9050868110156114b65760405162461bcd60e51b815260040161051d90614570565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611502908490600401614681565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b505050506113078482612845565b606081428110156115615760405162461bcd60e51b815260040161051d906141d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061159857fe5b90506020020160208101906115ad919061398e565b6001600160a01b0316146115d35760405162461bcd60e51b815260040161051d90614378565b6116317f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061164457fe5b6020026020010151101561166a5760405162461bcd60e51b815260040161051d90614570565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106116a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6117527f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b8460008151811061175f57fe5b60200260200101516040518363ffffffff1660e01b8152600401611784929190614114565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190613d50565b6117dc57fe5b61181b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b5095945050505050565b6000610606848484613411565b606081428110156118555760405162461bcd60e51b815260040161051d906141d7565b6118b37f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b915086826000815181106118c357fe5b60200260200101511115610d335760405162461bcd60e51b815260040161051d906144a0565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006106068484846134b9565b6000814281101561193d5760405162461bcd60e51b815260040161051d906141d7565b61196c887f00000000000000000000000000000000000000000000000000000000000000008989893089611d9a565b6040516370a0823160e01b81529093506119f99150899086906001600160a01b038316906370a08231906119a4903090600401614046565b60206040518083038186803b1580156119bc57600080fd5b505afa1580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190613e37565b612757565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611a45908590600401614681565b600060405180830381600087803b158015611a5f57600080fd5b505af1158015611a73573d6000803e3d6000fd5b505050506108df8483612845565b8042811015611aa25760405162461bcd60e51b815260040161051d906141d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611ad957fe5b9050602002016020810190611aee919061398e565b6001600160a01b031614611b145760405162461bcd60e51b815260040161051d90614378565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611bed7f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b836040518363ffffffff1660e01b8152600401611c0b929190614114565b602060405180830381600087803b158015611c2557600080fd5b505af1158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d9190613d50565b611c6357fe5b600086866000198101818110611c7557fe5b9050602002016020810190611c8a919061398e565b6001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401611cb59190614046565b60206040518083038186803b158015611ccd57600080fd5b505afa158015611ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d059190613e37565b9050611d45878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613178915050565b876112e98289896000198101818110611d5a57fe5b9050602002016020810190611d6f919061398e565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161128d9190614046565b6000808242811015611dbe5760405162461bcd60e51b815260040161051d906141d7565b6000611deb7f00000000000000000000000000000000000000000000000000000000000000008c8c612aa0565b6040516323b872dd60e01b81529091506001600160a01b038216906323b872dd90611e1e90339085908e9060040161409b565b602060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e709190613d50565b50600080826001600160a01b03166389afcb44896040518263ffffffff1660e01b8152600401611ea09190614046565b6040805180830381600087803b158015611eb957600080fd5b505af1158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190613f6b565b915091506000611f018e8e613527565b509050806001600160a01b03168e6001600160a01b031614611f24578183611f27565b82825b90975095508a871015611f4c5760405162461bcd60e51b815260040161051d906144e7565b89861015611f6c5760405162461bcd60e51b815260040161051d90614332565b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606109177f00000000000000000000000000000000000000000000000000000000000000008484612989565b600080600061201e7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b905060008761202d578c612031565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061206c903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505050506120ac8e8e8e8e8e8e6104f9565b909f909e509c50505050505050505050505050565b600080600083428110156120e75760405162461bcd60e51b815260040161051d906141d7565b6120f58c8c8c8c8c8c6135b1565b909450925060006121277f00000000000000000000000000000000000000000000000000000000000000008e8e612aa0565b90506121358d338388612b3c565b6121418c338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a6278429061216d908a90600401614046565b602060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190613e37565b92505050985098509895505050505050565b600080600083428110156121f75760405162461bcd60e51b815260040161051d906141d7565b6122258a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6135b1565b909450925060006122777f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b90506122858b338388612b3c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250612347915084908890600401614114565b602060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123999190613d50565b61239f57fe5b6040516335313c2160e11b81526001600160a01b03821690636a627842906123cb908a90600401614046565b602060405180830381600087803b1580156123e557600080fd5b505af11580156123f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241d9190613e37565b9250833411156124335761243333853403612845565b505096509650969350505050565b606081428110156124645760405162461bcd60e51b815260040161051d906141d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061249b57fe5b90506020020160208101906124b0919061398e565b6001600160a01b0316146124d65760405162461bcd60e51b815260040161051d90614378565b6125347f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b9150348260008151811061254457fe5b6020026020010151111561256a5760405162461bcd60e51b815260040161051d906144a0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106125a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125d957600080fd5b505af11580156125ed573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6126527f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b8460008151811061265f57fe5b60200260200101516040518363ffffffff1660e01b8152600401612684929190614114565b602060405180830381600087803b15801561269e57600080fd5b505af11580156126b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d69190613d50565b6126dc57fe5b61271b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b8160008151811061272857fe5b602002602001015134111561181b5761181b338360008151811061274857fe5b60200260200101513403612845565b60006060846001600160a01b031663a9059cbb858560405160240161277d929190614114565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127b6919061402a565b6000604051808303816000865af19150503d80600081146127f3576040519150601f19603f3d011682016040523d82523d6000602084013e6127f8565b606091505b50915091508180156128225750805115806128225750808060200190518101906128229190613d50565b61283e5760405162461bcd60e51b815260040161051d906141a0565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161286f919061402a565b60006040518083038185875af1925050503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b50509050806128d25760405162461bcd60e51b815260040161051d9061452d565b505050565b60008084116128f85760405162461bcd60e51b815260040161051d90614636565b6000831180156129085750600082115b6129245760405162461bcd60e51b815260040161051d906143e6565b6000612938856126ec63ffffffff6137e616565b9050600061294c828563ffffffff6137e616565b90506000612972836129668861271063ffffffff6137e616565b9063ffffffff61381d16565b905080828161297d57fe5b04979650505050505050565b60606002825110156129ad5760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff811180156129c557600080fd5b506040519080825280602002602001820160405280156129ef578160200160208202803683370190505b5090508281600081518110612a0057fe5b60200260200101818152505060005b6001835103811015612a9857600080612a5287868581518110612a2e57fe5b6020026020010151878660010181518110612a4557fe5b6020026020010151613840565b91509150612a74848481518110612a6557fe5b602002602001015183836128d7565b848460010181518110612a8357fe5b60209081029190910101525050600101612a0f565b509392505050565b6000806000612aaf8585613527565b60405163e6a4390560e01b815291935091506001600160a01b0387169063e6a4390590612ae290859085906004016140bf565b60206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3291906139b1565b9695505050505050565b60006060856001600160a01b03166323b872dd868686604051602401612b649392919061409b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612b9d919061402a565b6000604051808303816000865af19150503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5091509150818015612c09575080511580612c09575080806020019051810190612c099190613d50565b612c255760405162461bcd60e51b815260040161051d906145f2565b505050505050565b60005b6001835103811015612de757600080848381518110612c4b57fe5b6020026020010151858460010181518110612c6257fe5b6020026020010151915091506000612c7a8383613527565b5090506000878560010181518110612c8e57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612cbc57826000612cc0565b6000835b91509150600060028a51038810612cd75788612d18565b612d187f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110612d0b57fe5b6020026020010151612aa0565b9050612d457f00000000000000000000000000000000000000000000000000000000000000008888612aa0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612d82576020820181803683370190505b506040518563ffffffff1660e01b8152600401612da29493929190614698565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505060019099019850612c30975050505050505050565b50505050565b6060600282511015612e115760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff81118015612e2957600080fd5b50604051908082528060200260200182016040528015612e53578160200160208202803683370190505b5090508281600183510381518110612e6757fe5b60209081029190910101528151600019015b8015612a9857600080612ea987866001860381518110612e9557fe5b6020026020010151878681518110612a4557fe5b91509150612ecb848481518110612ebc57fe5b60200260200101518383613411565b846001850381518110612eda57fe5b6020908102919091010152505060001901612e79565b60405163e6a4390560e01b8152600090819081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e6a4390590612f45908d908d906004016140bf565b60206040518083038186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9591906139b1565b6001600160a01b03161415613079578251612fc25760405162461bcd60e51b815260040161051d9061423c565b602083015160408085015160608601519151630c5dcfd360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016936331773f4c93613021938f938f9392906004016140d9565b602060405180830381600087803b15801561303b57600080fd5b505af115801561304f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307391906139b1565b50613098565b8251156130985760405162461bcd60e51b815260040161051d9061442e565b6000806130c67f00000000000000000000000000000000000000000000000000000000000000008c8c613840565b915091508160001480156130d8575080155b156130e85788935087925061316a565b60006130f58a84846134b9565b9050888111613129578681101561311e5760405162461bcd60e51b815260040161051d90614332565b899450925082613168565b60006131368a84866134b9565b90508a81111561314257fe5b888110156131625760405162461bcd60e51b815260040161051d906144e7565b94508893505b505b505097509795505050505050565b60005b60018351038110156128d25760008084838151811061319657fe5b60200260200101518584600101815181106131ad57fe5b60200260200101519150915060006131c58383613527565b50905060006131f57f00000000000000000000000000000000000000000000000000000000000000008585612aa0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326e9190613de3565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146132a85782846132ab565b83835b915091506132df828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040161128d9190614046565b95506132ec8683836128d7565b945050505050600080856001600160a01b0316886001600160a01b0316146133165782600061331a565b6000835b91509150600060028c51038a10613331578a613365565b6133657f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110612d0b57fe5b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906133a79086908690869060248101614698565b600060405180830381600087803b1580156133c157600080fd5b505af11580156133d5573d6000803e3d6000fd5b50506001909b019a5061317b9950505050505050505050565b8082038281111561091a5760405162461bcd60e51b815260040161051d90614171565b60008084116134325760405162461bcd60e51b815260040161051d90614273565b6000831180156134425750600082115b61345e5760405162461bcd60e51b815260040161051d906143e6565b6000613482612710613476868863ffffffff6137e616565b9063ffffffff6137e616565b9050600061349c6126ec613476868963ffffffff6133ee16565b9050612b3260018284816134ac57fe5b049063ffffffff61381d16565b60008084116134da5760405162461bcd60e51b815260040161051d9061445b565b6000831180156134ea5750600082115b6135065760405162461bcd60e51b815260040161051d906143e6565b82613517858463ffffffff6137e616565b8161351e57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561355c5760405162461bcd60e51b815260040161051d906142ed565b826001600160a01b0316846001600160a01b03161061357c57828461357f565b83835b90925090506001600160a01b0382166135aa5760405162461bcd60e51b815260040161051d906145bb565b9250929050565b60405163e6a4390560e01b8152600090819081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e6a4390590613606908c908c906004016140bf565b60206040518083038186803b15801561361e57600080fd5b505afa158015613632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365691906139b1565b6001600160a01b03161415613707576040516364e329cb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906136b3908b908b906004016140bf565b602060405180830381600087803b1580156136cd57600080fd5b505af11580156136e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370591906139b1565b505b6000806137357f00000000000000000000000000000000000000000000000000000000000000008b8b613840565b91509150816000148015613747575080155b15613757578793508692506137d9565b60006137648984846134b9565b9050878111613798578581101561378d5760405162461bcd60e51b815260040161051d90614332565b8894509250826137d7565b60006137a58984866134b9565b9050898111156137b157fe5b878110156137d15760405162461bcd60e51b815260040161051d906144e7565b94508793505b505b5050965096945050505050565b6000811580613801575050808202828282816137fe57fe5b04145b61091a5760405162461bcd60e51b815260040161051d9061420e565b8082018281101561091a5760405162461bcd60e51b815260040161051d906142bf565b600080600061384f8585613527565b509050600080613860888888612aa0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561389857600080fd5b505afa1580156138ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d09190613de3565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461390757808261390a565b81815b90999098509650505050505050565b803561091a81614751565b60008083601f840112613935578182fd5b50813567ffffffffffffffff81111561394c578182fd5b60208301915083602080830285010111156135aa57600080fd5b600060808284031215613977578081fd5b50919050565b803560ff8116811461091a57600080fd5b60006020828403121561399f578081fd5b81356139aa81614751565b9392505050565b6000602082840312156139c2578081fd5b81516139aa81614751565b600080600080600080600060e0888a0312156139e7578283fd5b87356139f281614751565b96506020880135613a0281614751565b955060408801359450606088013593506080880135925060a0880135613a2781614751565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215613a5f578384fd5b8b35613a6a81614751565b9a5060208c0135613a7a81614751565b995060408c0135985060608c0135975060808c0135965060a08c0135613a9f81614751565b955060c08c0135945060e08c0135613ab681614769565b9350613ac68d6101008e0161397d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215613b04578384fd5b8835613b0f81614751565b97506020890135613b1f81614751565b965060408901359550606089013594506080890135935060a0890135925060c0890135613b4b81614751565b8092505060e089013590509295985092959890939650565b60008060008060008060008060006101808a8c031215613b81578283fd5b8935613b8c81614751565b985060208a0135613b9c81614751565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135613bc881614751565b925060e08a01359150613bdf8b6101008c01613966565b90509295985092959850929598565b60008060008060008060c08789031215613c06578384fd5b8635613c1181614751565b95506020870135945060408701359350606087013592506080870135613c3681614751565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215613c6a578384fd5b8a35613c7581614751565b995060208b0135985060408b0135975060608b0135965060808b0135613c9a81614751565b955060a08b0135945060c08b0135613cb181614769565b9350613cc08c60e08d0161397d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b6000806000806000806000610140888a031215613cfc578081fd5b8735613d0781614751565b96506020880135955060408801359450606088013593506080880135613d2c81614751565b925060a08801359150613d428960c08a01613966565b905092959891949750929550565b600060208284031215613d61578081fd5b81516139aa81614769565b600060808284031215613d7d578081fd5b613d8760806146fe565b8235613d9281614769565b81526020830135613da281614769565b6020820152604083013561ffff81168114613dbb578283fd5b6040820152606083013564ffffffffff81168114613dd7578283fd5b60608201529392505050565b600080600060608486031215613df7578081fd5b8351613e0281614777565b6020850151909350613e1381614777565b604085015190925063ffffffff81168114613e2c578182fd5b809150509250925092565b600060208284031215613e48578081fd5b5051919050565b600080600080600060808688031215613e66578283fd5b85359450602086013567ffffffffffffffff811115613e83578384fd5b613e8f88828901613924565b9095509350506040860135613ea381614751565b949793965091946060013592915050565b60008060408385031215613ec6578182fd5b8235915060208084013567ffffffffffffffff80821115613ee5578384fd5b81860187601f820112613ef6578485fd5b8035925081831115613f06578485fd5b8383029150613f168483016146fe565b8381528481019082860184840187018b1015613f30578788fd5b8794505b85851015613f5a57613f468b82613919565b835260019490940193918601918601613f34565b508096505050505050509250929050565b60008060408385031215613f7d578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215613fa6578384fd5b8635955060208701359450604087013567ffffffffffffffff811115613fca578485fd5b613fd689828a01613924565b9095509350506060870135613fea81614751565b80925050608087013590509295509295509295565b600080600060608486031215614013578081fd5b505081359360208301359350604090920135919050565b6000825161403c818460208701614725565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039586168152939094166020840152901515604083015261ffff16606082015264ffffffffff909116608082015260a00190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561416557835183529284019291840191600101614149565b50909695505050505050565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526018908201527f556e69737761705632526f757465723a20455850495245440000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526017908201527f63616e2774206465706c6f792061206e657720706f6f6c000000000000000000604082015260600190565b6020808252602c908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b6020808252601d908201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604082015260600190565b6020808252601e908201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b602080825260139082015272706f6f6c20616c72656164792065786973747360681b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f416040820152641353d5539560da1b606082015260800190565b60208082526027908201527f556e69737761705632526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252602b908201527f556e69737761705632526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b90815260200190565b918252602082015260400190565b600085825284602083015260018060a01b03841660408301526080606083015282518060808401526146d18160a0850160208701614725565b601f01601f19169190910160a00195945050505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561471d57600080fd5b604052919050565b60005b83811015614740578181015183820152602001614728565b83811115612de75750506000910152565b6001600160a01b038116811461476657600080fd5b50565b801515811461476657600080fd5b6001600160701b038116811461476657600080fdfea264697066735822122019de977653d2888829ef01f0706abaab007587b253c64104375796d806b2464b64736f6c63430006060033000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106101855760003560e01c806385f8c259116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610493578063e8e33700146104b3578063f305d719146104d3578063fb3bdb41146104e6576101be565b8063baa2abde1461043e578063c45a01551461045e578063d06ca61f14610473576101be565b806385f8c259146103895780638803dbee146103a9578063ad5c4648146103c9578063ad615dec146103eb578063af2979eb1461040b578063b6f9de951461042b576101be565b806338ed17391161013e5780635b0d5984116101185780635b0d5984146103165780635c11d79514610336578063791ac947146103565780637ff36ab514610376576101be565b806338ed1739146102b65780633d529f7b146102d65780634a25d94a146102f6576101be565b806302751cec146101c3578063054d50d4146101fa57806318cbafe5146102275780631f00ca74146102545780632195995c1461027457806332e1144514610294576101be565b366101be57336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101bc57fe5b005b600080fd5b3480156101cf57600080fd5b506101e36101de366004613bee565b6104f9565b6040516101f192919061468a565b60405180910390f35b34801561020657600080fd5b5061021a610215366004613fff565b6105f9565b6040516101f19190614681565b34801561023357600080fd5b50610247610242366004613f8e565b61060e565b6040516101f1919061412d565b34801561026057600080fd5b5061024761026f366004613eb4565b6108ea565b34801561028057600080fd5b506101e361028f366004613a3e565b610920565b6102a76102a2366004613ce1565b6109f9565b6040516101f1939291906146e8565b3480156102c257600080fd5b506102476102d1366004613f8e565b610c79565b3480156102e257600080fd5b506102a76102f1366004613b63565b610d82565b34801561030257600080fd5b50610247610311366004613f8e565b610e9d565b34801561032257600080fd5b5061021a610331366004613c4b565b610fc9565b34801561034257600080fd5b506101bc610351366004613f8e565b6110b6565b34801561036257600080fd5b506101bc610371366004613f8e565b611311565b610247610384366004613e4f565b61153e565b34801561039557600080fd5b5061021a6103a4366004613fff565b611825565b3480156103b557600080fd5b506102476103c4366004613f8e565b611832565b3480156103d557600080fd5b506103de6118e9565b6040516101f19190614046565b3480156103f757600080fd5b5061021a610406366004613fff565b61190d565b34801561041757600080fd5b5061021a610426366004613bee565b61191a565b6101bc610439366004613e4f565b611a81565b34801561044a57600080fd5b506101e36104593660046139cd565b611d9a565b34801561046a57600080fd5b506103de611f7d565b34801561047f57600080fd5b5061024761048e366004613eb4565b611fa1565b34801561049f57600080fd5b506101e36104ae366004613c4b565b611fce565b3480156104bf57600080fd5b506102a76104ce366004613ae8565b6120c1565b6102a76104e1366004613bee565b6121d1565b6102476104f4366004613e4f565b612441565b60008082428110156105265760405162461bcd60e51b815260040161051d906141d7565b60405180910390fd5b610555897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a611d9a565b9093509150610565898685612757565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d906105b1908590600401614681565b600060405180830381600087803b1580156105cb57600080fd5b505af11580156105df573d6000803e3d6000fd5b505050506105ed8583612845565b50965096945050505050565b60006106068484846128d7565b949350505050565b606081428110156106315760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686600019810181811061066b57fe5b9050602002016020810190610680919061398e565b6001600160a01b0316146106a65760405162461bcd60e51b815260040161051d90614378565b6107047f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061071757fe5b6020026020010151101561073d5760405162461bcd60e51b815260040161051d90614570565b6107ea8686600081811061074d57fe5b9050602002016020810190610762919061398e565b336107d07f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158a8a600081811061079457fe5b90506020020160208101906107a9919061398e565b8b8b60018181106107b657fe5b90506020020160208101906107cb919061398e565b612aa0565b856000815181106107dd57fe5b6020026020010151612b3c565b61082982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612c2d915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551038151811061086857fe5b60200260200101516040518263ffffffff1660e01b815260040161088c9190614681565b600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b505050506108df84836001855103815181106108d257fe5b6020026020010151612845565b509695505050505050565b60606109177f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158484612ded565b90505b92915050565b60008060006109507f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158f8f612aa0565b905060008761095f578c610963565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061099e903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b505050506109df8f8f8f8f8f8f8f611d9a565b809450819550505050509b509b9950505050505050505050565b60008060008442811015610a1f5760405162461bcd60e51b815260040161051d906141d7565b610a5c8b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c348d8d610a57368d90038d018d613d6c565b612ef0565b90945092506000610aae7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b9050610abc8c338388612b3c565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb9250610b7e915084908890600401614114565b602060405180830381600087803b158015610b9857600080fd5b505af1158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190613d50565b610bd657fe5b6040516335313c2160e11b81526001600160a01b03821690636a62784290610c02908b90600401614046565b602060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190613e37565b925083341115610c6a57610c6a33853403612845565b50509750975097945050505050565b60608142811015610c9c5760405162461bcd60e51b815260040161051d906141d7565b610cfa7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b91508682600184510381518110610d0d57fe5b60200260200101511015610d335760405162461bcd60e51b815260040161051d90614570565b610d438686600081811061074d57fe5b6108df82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b60008060008442811015610da85760405162461bcd60e51b815260040161051d906141d7565b610dc08d8d8d8d8d8d610a57368d90038d018d613d6c565b90945092506000610df27f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158f8f612aa0565b9050610e008e338388612b3c565b610e0c8d338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a62784290610e38908b90600401614046565b602060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190613e37565b9250505099509950999650505050505050565b60608142811015610ec05760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866000198101818110610efa57fe5b9050602002016020810190610f0f919061398e565b6001600160a01b031614610f355760405162461bcd60e51b815260040161051d90614378565b610f937f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1589888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b91508682600081518110610fa357fe5b6020026020010151111561073d5760405162461bcd60e51b815260040161051d906144a0565b6000806110177f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b9050600086611026578b61102a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611065903390309086908e908d908d908d9060040161405a565b600060405180830381600087803b15801561107f57600080fd5b505af1158015611093573d6000803e3d6000fd5b505050506110a58d8d8d8d8d8d61191a565b9d9c50505050505050505050505050565b80428110156110d75760405162461bcd60e51b815260040161051d906141d7565b611156858560008181106110e757fe5b90506020020160208101906110fc919061398e565b336111507f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b9050602002016020810190611143919061398e565b8a8a60018181106107b657fe5b8a612b3c565b60008585600019810181811061116857fe5b905060200201602081019061117d919061398e565b6001600160a01b03166370a08231856040518263ffffffff1660e01b81526004016111a89190614046565b60206040518083038186803b1580156111c057600080fd5b505afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f89190613e37565b9050611238868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613178915050565b866112e9828888600019810181811061124d57fe5b9050602002016020810190611262919061398e565b6001600160a01b03166370a08231886040518263ffffffff1660e01b815260040161128d9190614046565b60206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190613e37565b9063ffffffff6133ee16565b10156113075760405162461bcd60e51b815260040161051d90614570565b5050505050505050565b80428110156113325760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168585600019810181811061136c57fe5b9050602002016020810190611381919061398e565b6001600160a01b0316146113a75760405162461bcd60e51b815260040161051d90614378565b6113b7858560008181106110e757fe5b6113f5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613178915050565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190611444903090600401614046565b60206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114949190613e37565b9050868110156114b65760405162461bcd60e51b815260040161051d90614570565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d90611502908490600401614681565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b505050506113078482612845565b606081428110156115615760405162461bcd60e51b815260040161051d906141d7565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061159857fe5b90506020020160208101906115ad919061398e565b6001600160a01b0316146115d35760405162461bcd60e51b815260040161051d90614378565b6116317f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f153488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061164457fe5b6020026020010151101561166a5760405162461bcd60e51b815260040161051d90614570565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106116a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6117527f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b8460008151811061175f57fe5b60200260200101516040518363ffffffff1660e01b8152600401611784929190614114565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190613d50565b6117dc57fe5b61181b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b5095945050505050565b6000610606848484613411565b606081428110156118555760405162461bcd60e51b815260040161051d906141d7565b6118b37f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1589888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b915086826000815181106118c357fe5b60200260200101511115610d335760405162461bcd60e51b815260040161051d906144a0565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60006106068484846134b9565b6000814281101561193d5760405162461bcd60e51b815260040161051d906141d7565b61196c887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28989893089611d9a565b6040516370a0823160e01b81529093506119f99150899086906001600160a01b038316906370a08231906119a4903090600401614046565b60206040518083038186803b1580156119bc57600080fd5b505afa1580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190613e37565b612757565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d90611a45908590600401614681565b600060405180830381600087803b158015611a5f57600080fd5b505af1158015611a73573d6000803e3d6000fd5b505050506108df8483612845565b8042811015611aa25760405162461bcd60e51b815260040161051d906141d7565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031685856000818110611ad957fe5b9050602002016020810190611aee919061398e565b6001600160a01b031614611b145760405162461bcd60e51b815260040161051d90614378565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb611bed7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b836040518363ffffffff1660e01b8152600401611c0b929190614114565b602060405180830381600087803b158015611c2557600080fd5b505af1158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d9190613d50565b611c6357fe5b600086866000198101818110611c7557fe5b9050602002016020810190611c8a919061398e565b6001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401611cb59190614046565b60206040518083038186803b158015611ccd57600080fd5b505afa158015611ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d059190613e37565b9050611d45878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613178915050565b876112e98289896000198101818110611d5a57fe5b9050602002016020810190611d6f919061398e565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161128d9190614046565b6000808242811015611dbe5760405162461bcd60e51b815260040161051d906141d7565b6000611deb7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158c8c612aa0565b6040516323b872dd60e01b81529091506001600160a01b038216906323b872dd90611e1e90339085908e9060040161409b565b602060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e709190613d50565b50600080826001600160a01b03166389afcb44896040518263ffffffff1660e01b8152600401611ea09190614046565b6040805180830381600087803b158015611eb957600080fd5b505af1158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190613f6b565b915091506000611f018e8e613527565b509050806001600160a01b03168e6001600160a01b031614611f24578183611f27565b82825b90975095508a871015611f4c5760405162461bcd60e51b815260040161051d906144e7565b89861015611f6c5760405162461bcd60e51b815260040161051d90614332565b505050505097509795505050505050565b7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1581565b60606109177f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158484612989565b600080600061201e7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b905060008761202d578c612031565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061206c903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505050506120ac8e8e8e8e8e8e6104f9565b909f909e509c50505050505050505050505050565b600080600083428110156120e75760405162461bcd60e51b815260040161051d906141d7565b6120f58c8c8c8c8c8c6135b1565b909450925060006121277f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158e8e612aa0565b90506121358d338388612b3c565b6121418c338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a6278429061216d908a90600401614046565b602060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190613e37565b92505050985098509895505050505050565b600080600083428110156121f75760405162461bcd60e51b815260040161051d906141d7565b6122258a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c6135b1565b909450925060006122777f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b90506122858b338388612b3c565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb9250612347915084908890600401614114565b602060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123999190613d50565b61239f57fe5b6040516335313c2160e11b81526001600160a01b03821690636a627842906123cb908a90600401614046565b602060405180830381600087803b1580156123e557600080fd5b505af11580156123f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241d9190613e37565b9250833411156124335761243333853403612845565b505096509650969350505050565b606081428110156124645760405162461bcd60e51b815260040161051d906141d7565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061249b57fe5b90506020020160208101906124b0919061398e565b6001600160a01b0316146124d65760405162461bcd60e51b815260040161051d90614378565b6125347f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1588888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b9150348260008151811061254457fe5b6020026020010151111561256a5760405162461bcd60e51b815260040161051d906144a0565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106125a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125d957600080fd5b505af11580156125ed573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6126527f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b8460008151811061265f57fe5b60200260200101516040518363ffffffff1660e01b8152600401612684929190614114565b602060405180830381600087803b15801561269e57600080fd5b505af11580156126b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d69190613d50565b6126dc57fe5b61271b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b8160008151811061272857fe5b602002602001015134111561181b5761181b338360008151811061274857fe5b60200260200101513403612845565b60006060846001600160a01b031663a9059cbb858560405160240161277d929190614114565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127b6919061402a565b6000604051808303816000865af19150503d80600081146127f3576040519150601f19603f3d011682016040523d82523d6000602084013e6127f8565b606091505b50915091508180156128225750805115806128225750808060200190518101906128229190613d50565b61283e5760405162461bcd60e51b815260040161051d906141a0565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161286f919061402a565b60006040518083038185875af1925050503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b50509050806128d25760405162461bcd60e51b815260040161051d9061452d565b505050565b60008084116128f85760405162461bcd60e51b815260040161051d90614636565b6000831180156129085750600082115b6129245760405162461bcd60e51b815260040161051d906143e6565b6000612938856126ec63ffffffff6137e616565b9050600061294c828563ffffffff6137e616565b90506000612972836129668861271063ffffffff6137e616565b9063ffffffff61381d16565b905080828161297d57fe5b04979650505050505050565b60606002825110156129ad5760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff811180156129c557600080fd5b506040519080825280602002602001820160405280156129ef578160200160208202803683370190505b5090508281600081518110612a0057fe5b60200260200101818152505060005b6001835103811015612a9857600080612a5287868581518110612a2e57fe5b6020026020010151878660010181518110612a4557fe5b6020026020010151613840565b91509150612a74848481518110612a6557fe5b602002602001015183836128d7565b848460010181518110612a8357fe5b60209081029190910101525050600101612a0f565b509392505050565b6000806000612aaf8585613527565b60405163e6a4390560e01b815291935091506001600160a01b0387169063e6a4390590612ae290859085906004016140bf565b60206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3291906139b1565b9695505050505050565b60006060856001600160a01b03166323b872dd868686604051602401612b649392919061409b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612b9d919061402a565b6000604051808303816000865af19150503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5091509150818015612c09575080511580612c09575080806020019051810190612c099190613d50565b612c255760405162461bcd60e51b815260040161051d906145f2565b505050505050565b60005b6001835103811015612de757600080848381518110612c4b57fe5b6020026020010151858460010181518110612c6257fe5b6020026020010151915091506000612c7a8383613527565b5090506000878560010181518110612c8e57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612cbc57826000612cc0565b6000835b91509150600060028a51038810612cd75788612d18565b612d187f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15878c8b60020181518110612d0b57fe5b6020026020010151612aa0565b9050612d457f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158888612aa0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612d82576020820181803683370190505b506040518563ffffffff1660e01b8152600401612da29493929190614698565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505060019099019850612c30975050505050505050565b50505050565b6060600282511015612e115760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff81118015612e2957600080fd5b50604051908082528060200260200182016040528015612e53578160200160208202803683370190505b5090508281600183510381518110612e6757fe5b60209081029190910101528151600019015b8015612a9857600080612ea987866001860381518110612e9557fe5b6020026020010151878681518110612a4557fe5b91509150612ecb848481518110612ebc57fe5b60200260200101518383613411565b846001850381518110612eda57fe5b6020908102919091010152505060001901612e79565b60405163e6a4390560e01b8152600090819081907f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f156001600160a01b03169063e6a4390590612f45908d908d906004016140bf565b60206040518083038186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9591906139b1565b6001600160a01b03161415613079578251612fc25760405162461bcd60e51b815260040161051d9061423c565b602083015160408085015160608601519151630c5dcfd360e21b81526001600160a01b037f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1516936331773f4c93613021938f938f9392906004016140d9565b602060405180830381600087803b15801561303b57600080fd5b505af115801561304f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307391906139b1565b50613098565b8251156130985760405162461bcd60e51b815260040161051d9061442e565b6000806130c67f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158c8c613840565b915091508160001480156130d8575080155b156130e85788935087925061316a565b60006130f58a84846134b9565b9050888111613129578681101561311e5760405162461bcd60e51b815260040161051d90614332565b899450925082613168565b60006131368a84866134b9565b90508a81111561314257fe5b888110156131625760405162461bcd60e51b815260040161051d906144e7565b94508893505b505b505097509795505050505050565b60005b60018351038110156128d25760008084838151811061319657fe5b60200260200101518584600101815181106131ad57fe5b60200260200101519150915060006131c58383613527565b50905060006131f57f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158585612aa0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326e9190613de3565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146132a85782846132ab565b83835b915091506132df828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040161128d9190614046565b95506132ec8683836128d7565b945050505050600080856001600160a01b0316886001600160a01b0316146133165782600061331a565b6000835b91509150600060028c51038a10613331578a613365565b6133657f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15898e8d60020181518110612d0b57fe5b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906133a79086908690869060248101614698565b600060405180830381600087803b1580156133c157600080fd5b505af11580156133d5573d6000803e3d6000fd5b50506001909b019a5061317b9950505050505050505050565b8082038281111561091a5760405162461bcd60e51b815260040161051d90614171565b60008084116134325760405162461bcd60e51b815260040161051d90614273565b6000831180156134425750600082115b61345e5760405162461bcd60e51b815260040161051d906143e6565b6000613482612710613476868863ffffffff6137e616565b9063ffffffff6137e616565b9050600061349c6126ec613476868963ffffffff6133ee16565b9050612b3260018284816134ac57fe5b049063ffffffff61381d16565b60008084116134da5760405162461bcd60e51b815260040161051d9061445b565b6000831180156134ea5750600082115b6135065760405162461bcd60e51b815260040161051d906143e6565b82613517858463ffffffff6137e616565b8161351e57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561355c5760405162461bcd60e51b815260040161051d906142ed565b826001600160a01b0316846001600160a01b03161061357c57828461357f565b83835b90925090506001600160a01b0382166135aa5760405162461bcd60e51b815260040161051d906145bb565b9250929050565b60405163e6a4390560e01b8152600090819081907f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f156001600160a01b03169063e6a4390590613606908c908c906004016140bf565b60206040518083038186803b15801561361e57600080fd5b505afa158015613632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365691906139b1565b6001600160a01b03161415613707576040516364e329cb60e11b81526001600160a01b037f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15169063c9c65396906136b3908b908b906004016140bf565b602060405180830381600087803b1580156136cd57600080fd5b505af11580156136e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370591906139b1565b505b6000806137357f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158b8b613840565b91509150816000148015613747575080155b15613757578793508692506137d9565b60006137648984846134b9565b9050878111613798578581101561378d5760405162461bcd60e51b815260040161051d90614332565b8894509250826137d7565b60006137a58984866134b9565b9050898111156137b157fe5b878110156137d15760405162461bcd60e51b815260040161051d906144e7565b94508793505b505b5050965096945050505050565b6000811580613801575050808202828282816137fe57fe5b04145b61091a5760405162461bcd60e51b815260040161051d9061420e565b8082018281101561091a5760405162461bcd60e51b815260040161051d906142bf565b600080600061384f8585613527565b509050600080613860888888612aa0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561389857600080fd5b505afa1580156138ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d09190613de3565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461390757808261390a565b81815b90999098509650505050505050565b803561091a81614751565b60008083601f840112613935578182fd5b50813567ffffffffffffffff81111561394c578182fd5b60208301915083602080830285010111156135aa57600080fd5b600060808284031215613977578081fd5b50919050565b803560ff8116811461091a57600080fd5b60006020828403121561399f578081fd5b81356139aa81614751565b9392505050565b6000602082840312156139c2578081fd5b81516139aa81614751565b600080600080600080600060e0888a0312156139e7578283fd5b87356139f281614751565b96506020880135613a0281614751565b955060408801359450606088013593506080880135925060a0880135613a2781614751565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215613a5f578384fd5b8b35613a6a81614751565b9a5060208c0135613a7a81614751565b995060408c0135985060608c0135975060808c0135965060a08c0135613a9f81614751565b955060c08c0135945060e08c0135613ab681614769565b9350613ac68d6101008e0161397d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215613b04578384fd5b8835613b0f81614751565b97506020890135613b1f81614751565b965060408901359550606089013594506080890135935060a0890135925060c0890135613b4b81614751565b8092505060e089013590509295985092959890939650565b60008060008060008060008060006101808a8c031215613b81578283fd5b8935613b8c81614751565b985060208a0135613b9c81614751565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135613bc881614751565b925060e08a01359150613bdf8b6101008c01613966565b90509295985092959850929598565b60008060008060008060c08789031215613c06578384fd5b8635613c1181614751565b95506020870135945060408701359350606087013592506080870135613c3681614751565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215613c6a578384fd5b8a35613c7581614751565b995060208b0135985060408b0135975060608b0135965060808b0135613c9a81614751565b955060a08b0135945060c08b0135613cb181614769565b9350613cc08c60e08d0161397d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b6000806000806000806000610140888a031215613cfc578081fd5b8735613d0781614751565b96506020880135955060408801359450606088013593506080880135613d2c81614751565b925060a08801359150613d428960c08a01613966565b905092959891949750929550565b600060208284031215613d61578081fd5b81516139aa81614769565b600060808284031215613d7d578081fd5b613d8760806146fe565b8235613d9281614769565b81526020830135613da281614769565b6020820152604083013561ffff81168114613dbb578283fd5b6040820152606083013564ffffffffff81168114613dd7578283fd5b60608201529392505050565b600080600060608486031215613df7578081fd5b8351613e0281614777565b6020850151909350613e1381614777565b604085015190925063ffffffff81168114613e2c578182fd5b809150509250925092565b600060208284031215613e48578081fd5b5051919050565b600080600080600060808688031215613e66578283fd5b85359450602086013567ffffffffffffffff811115613e83578384fd5b613e8f88828901613924565b9095509350506040860135613ea381614751565b949793965091946060013592915050565b60008060408385031215613ec6578182fd5b8235915060208084013567ffffffffffffffff80821115613ee5578384fd5b81860187601f820112613ef6578485fd5b8035925081831115613f06578485fd5b8383029150613f168483016146fe565b8381528481019082860184840187018b1015613f30578788fd5b8794505b85851015613f5a57613f468b82613919565b835260019490940193918601918601613f34565b508096505050505050509250929050565b60008060408385031215613f7d578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215613fa6578384fd5b8635955060208701359450604087013567ffffffffffffffff811115613fca578485fd5b613fd689828a01613924565b9095509350506060870135613fea81614751565b80925050608087013590509295509295509295565b600080600060608486031215614013578081fd5b505081359360208301359350604090920135919050565b6000825161403c818460208701614725565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039586168152939094166020840152901515604083015261ffff16606082015264ffffffffff909116608082015260a00190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561416557835183529284019291840191600101614149565b50909695505050505050565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526018908201527f556e69737761705632526f757465723a20455850495245440000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526017908201527f63616e2774206465706c6f792061206e657720706f6f6c000000000000000000604082015260600190565b6020808252602c908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b6020808252601d908201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604082015260600190565b6020808252601e908201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b602080825260139082015272706f6f6c20616c72656164792065786973747360681b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f416040820152641353d5539560da1b606082015260800190565b60208082526027908201527f556e69737761705632526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252602b908201527f556e69737761705632526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b90815260200190565b918252602082015260400190565b600085825284602083015260018060a01b03841660408301526080606083015282518060808401526146d18160a0850160208701614725565b601f01601f19169190910160a00195945050505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561471d57600080fd5b604052919050565b60005b83811015614740578181015183820152602001614728565b83811115612de75750506000910152565b6001600160a01b038116811461476657600080fd5b50565b801515811461476657600080fd5b6001600160701b038116811461476657600080fdfea264697066735822122019de977653d2888829ef01f0706abaab007587b253c64104375796d806b2464b64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : factory (address): 0xdBcb35859C27DadE56256C62D547405402a08F15
Arg [1] : WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.