Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 15,187 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 21253012 | 1 hr ago | IN | 0 ETH | 0.00110662 | ||||
Swap Exact Token... | 21249306 | 13 hrs ago | IN | 0 ETH | 0.0014233 | ||||
Swap Exact Token... | 21249304 | 13 hrs ago | IN | 0 ETH | 0.00200647 | ||||
Swap Exact Token... | 21248820 | 15 hrs ago | IN | 0 ETH | 0.00132495 | ||||
Swap Exact ETH F... | 21248818 | 15 hrs ago | IN | 0.149155 ETH | 0.00139185 | ||||
Swap Exact ETH F... | 21246697 | 22 hrs ago | IN | 0.06 ETH | 0.00166643 | ||||
Swap Exact Token... | 21245379 | 27 hrs ago | IN | 0 ETH | 0.00230862 | ||||
Swap Exact Token... | 21245369 | 27 hrs ago | IN | 0 ETH | 0.00154268 | ||||
Swap Exact Token... | 21244223 | 30 hrs ago | IN | 0 ETH | 0.00202178 | ||||
Swap Exact Token... | 21244143 | 31 hrs ago | IN | 0 ETH | 0.00205157 | ||||
Swap Exact Token... | 21244109 | 31 hrs ago | IN | 0 ETH | 0.00246758 | ||||
Swap Exact ETH F... | 21240984 | 41 hrs ago | IN | 0.1 ETH | 0.00209673 | ||||
Swap Exact Token... | 21240800 | 42 hrs ago | IN | 0 ETH | 0.00126264 | ||||
Swap Exact Token... | 21240715 | 42 hrs ago | IN | 0 ETH | 0.0010054 | ||||
Swap Exact ETH F... | 21240459 | 43 hrs ago | IN | 0.005 ETH | 0.00213194 | ||||
Swap Exact ETH F... | 21240425 | 43 hrs ago | IN | 0.006 ETH | 0.00133188 | ||||
Swap Exact ETH F... | 21237712 | 2 days ago | IN | 0.12602147 ETH | 0.0033831 | ||||
Swap Exact Token... | 21237124 | 2 days ago | IN | 0 ETH | 0.00294966 | ||||
Swap Exact ETH F... | 21237062 | 2 days ago | IN | 0.03 ETH | 0.00314682 | ||||
Swap Exact Token... | 21236594 | 2 days ago | IN | 0 ETH | 0.00365731 | ||||
Swap Exact ETH F... | 21232026 | 2 days ago | IN | 0.06003007 ETH | 0.00110919 | ||||
Swap Exact Token... | 21232013 | 2 days ago | IN | 0 ETH | 0.00108207 | ||||
Swap Exact Token... | 21232010 | 2 days ago | IN | 0 ETH | 0.00166634 | ||||
Swap Exact Token... | 21232006 | 2 days ago | IN | 0 ETH | 0.00198019 | ||||
Remove Liquidity... | 21232005 | 2 days ago | IN | 0 ETH | 0.00231938 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21249306 | 13 hrs ago | 0.00875184 ETH | ||||
21249306 | 13 hrs ago | 0.00875184 ETH | ||||
21249304 | 13 hrs ago | 0.02302549 ETH | ||||
21249304 | 13 hrs ago | 0.02302549 ETH | ||||
21248818 | 15 hrs ago | 0.149155 ETH | ||||
21246697 | 22 hrs ago | 0.06 ETH | ||||
21245379 | 27 hrs ago | 0.1187799 ETH | ||||
21245379 | 27 hrs ago | 0.1187799 ETH | ||||
21245369 | 27 hrs ago | 0.17229294 ETH | ||||
21245369 | 27 hrs ago | 0.17229294 ETH | ||||
21244223 | 30 hrs ago | 0.01351555 ETH | ||||
21244223 | 30 hrs ago | 0.01351555 ETH | ||||
21244143 | 31 hrs ago | 0.15957206 ETH | ||||
21244143 | 31 hrs ago | 0.15957206 ETH | ||||
21244109 | 31 hrs ago | 0.32559175 ETH | ||||
21244109 | 31 hrs ago | 0.32559175 ETH | ||||
21240984 | 41 hrs ago | 0.1 ETH | ||||
21240459 | 43 hrs ago | 0.005 ETH | ||||
21240425 | 43 hrs ago | 0.006 ETH | ||||
21237712 | 2 days ago | 0.12602147 ETH | ||||
21237062 | 2 days ago | 0.03 ETH | ||||
21236594 | 2 days ago | 0.35067607 ETH | ||||
21236594 | 2 days ago | 0.35067607 ETH | ||||
21232026 | 2 days ago | 0.06003007 ETH | ||||
21232000 | 2 days ago | 0.07557838 ETH |
Loading...
Loading
Contract Name:
NineInchRouter
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; import "./interfaces/INineInchRouter02.sol"; import "./interfaces/INineInchFactory.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IWETH.sol"; import "../libraries/NineInchLibrary.sol"; import "../libraries/TransferHelper.sol"; import "../libraries/SafeMath.sol"; contract NineInchRouter is INineInchRouter02 { using SafeMath for uint; address public immutable factory; address public immutable WETH; modifier ensure(uint deadline) { require(deadline >= block.timestamp, "NineInchRouter: EXPIRED"); _; } constructor(address _factory, address _WETH) { require(_factory != address(0), "NineInchRouter: FACTORY ZERO_ADDRESS"); require(_WETH != address(0), "NineInchRouter: WETH ZERO_ADDRESS"); 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 (INineInchFactory(factory).getPair(tokenA, tokenB) == address(0)) { INineInchFactory(factory).createPair(tokenA, tokenB); } (uint reserveA, uint reserveB) = NineInchLibrary.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = NineInchLibrary.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "NineInchRouter: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = NineInchLibrary.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "NineInchRouter: 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 = NineInchLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = INineInchPair(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 = NineInchLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = INineInchPair(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 = NineInchLibrary.pairFor(factory, tokenA, tokenB); INineInchPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint amount0, uint amount1) = INineInchPair(pair).burn(to); (address token0, ) = NineInchLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "NineInchRouter: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "NineInchRouter: 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 = NineInchLibrary.pairFor(factory, tokenA, tokenB); uint value = approveMax ? type(uint).max : liquidity; INineInchPair(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 = NineInchLibrary.pairFor(factory, token, WETH); uint value = approveMax ? type(uint).max : liquidity; INineInchPair(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 = NineInchLibrary.pairFor(factory, token, WETH); uint value = approveMax ? type(uint).max : liquidity; INineInchPair(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, ) = NineInchLibrary.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 ? NineInchLibrary.pairFor(factory, output, path[i + 2]) : _to; INineInchPair(NineInchLibrary.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 = NineInchLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, NineInchLibrary.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 = NineInchLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "NineInchRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, NineInchLibrary.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, "NineInchRouter: INVALID_PATH"); amounts = NineInchLibrary.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( NineInchLibrary.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, "NineInchRouter: INVALID_PATH"); amounts = NineInchLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "NineInchRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, NineInchLibrary.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, "NineInchRouter: INVALID_PATH"); amounts = NineInchLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, NineInchLibrary.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, "NineInchRouter: INVALID_PATH"); amounts = NineInchLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= msg.value, "NineInchRouter: EXCESSIVE_INPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( NineInchLibrary.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, ) = NineInchLibrary.sortTokens(input, output); INineInchPair pair = INineInchPair( NineInchLibrary.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 = NineInchLibrary.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < path.length - 2 ? NineInchLibrary.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, NineInchLibrary.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, "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "NineInchRouter: INVALID_PATH"); uint amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert( IWETH(WETH).transfer( NineInchLibrary.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, "NineInchRouter: 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, "NineInchRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, NineInchLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint amountOut = IERC20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "NineInchRouter: 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 NineInchLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) public pure virtual override returns (uint amountOut) { return NineInchLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) public pure virtual override returns (uint amountIn) { return NineInchLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint amountIn, address[] memory path ) public view virtual override returns (uint[] memory amounts) { return NineInchLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint amountOut, address[] memory path ) public view virtual override returns (uint[] memory amounts) { return NineInchLibrary.getAmountsIn(factory, amountOut, path); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; import "./SafeMath.sol"; import "../swap/interfaces/INineInchPair.sol"; library NineInchLibrary { 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, "NineInchV2Library: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "NineInchV2Library: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint160( uint( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"d2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511" // init code hash ) ) ) ) ); } // 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, ) = INineInchPair( 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, "NineInchV2Library: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "NineInchV2Library: 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, "NineInchV2Library: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "NineInchV2Library: INSUFFICIENT_LIQUIDITY" ); uint amountInWithFee = amountIn.mul(997); uint numerator = amountInWithFee.mul(reserveOut); uint denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) internal pure returns (uint amountIn) { require(amountOut > 0, "NineInchV2Library: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "NineInchV2Library: INSUFFICIENT_LIQUIDITY" ); uint numerator = reserveIn.mul(amountOut).mul(1000); uint denominator = reserveOut.sub(amountOut).mul(997); 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, "NineInchV2Library: 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, "NineInchV2Library: 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); } } }
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } }
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; // 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"); } }
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; interface INineInchFactory { 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; }
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; interface INineInchPair { 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 view 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: GPLv3 pragma solidity 0.8.19; interface INineInchRouter01 { function factory() external view returns (address); function WETH() external view 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: GPLv3 pragma solidity 0.8.19; import "./INineInchRouter01.sol"; interface INineInchRouter02 is INineInchRouter01 { 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; }
// SPDX-License-Identifier: GPLv3 pragma solidity 0.8.19; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
{ "optimizer": { "enabled": true, "runs": 999999 }, "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"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620058fe380380620058fe833981016040819052620000349162000133565b6001600160a01b0382166200009c5760405162461bcd60e51b8152602060048201526024808201527f4e696e65496e6368526f757465723a20464143544f5259205a45524f5f4144446044820152635245535360e01b60648201526084015b60405180910390fd5b6001600160a01b038116620000fe5760405162461bcd60e51b815260206004820152602160248201527f4e696e65496e6368526f757465723a2057455448205a45524f5f4144445245536044820152605360f81b606482015260840162000093565b6001600160a01b039182166080521660a0526200016b565b80516001600160a01b03811681146200012e57600080fd5b919050565b600080604083850312156200014757600080fd5b620001528362000116565b9150620001626020840162000116565b90509250929050565b60805160a051615601620002fd600039600081816101ac015281816103ba015281816105c20152818161062a0152818161074a01528181610a3401528181610ee9015281816110eb015281816115f6015281816117490152818161188a0152818161197401528181611b6601528181611c0101528181611f670152818161205e0152818161214601528181612227015281816122a8015281816128fd01528181612c0601528181612c5c01528181612c9001528181612d5801528181612f01015281816130e701526131820152600081816104860152818161081d0152818161095f01528181610b2701528181610b6001528181610cff01528181610fbc015281816110c9015281816112a801528181611a5301528181611c4001528181611de2015281816122e7015281816125c1015281816128ab015281816128db01528181612aac01528181612c3a01528181612fe0015281816131c101528181613c9401528181613ce401528181613fd6015281816141b3015281816147650152818161483a01526148b101526156016000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104e8578063f305d71914610523578063fb3bdb411461053657600080fd5b8063c45a015514610474578063d06ca61f146104a8578063ded9382a146104c857600080fd5b8063af2979eb116100b0578063af2979eb14610421578063b6f9de9514610441578063baa2abde1461045457600080fd5b80638803dbee14610388578063ad5c4648146103a8578063ad615dec1461040157600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103355780637ff36ab51461035557806385f8c2591461036857600080fd5b80634a25d94a146102d55780635b0d5984146102f55780635c11d7951461031557600080fd5b80631f00ca74116101695780631f00ca74146102755780632195995c1461029557806338ed1739146102b557600080fd5b806302751cec146101e0578063054d50d41461021a57806318cbafe51461024857600080fd5b366101db573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d9576101d9614cf2565b005b600080fd5b3480156101ec57600080fd5b506102006101fb366004614d56565b610549565b604080519283526020830191909152015b60405180910390f35b34801561022657600080fd5b5061023a610235366004614db4565b6106b1565b604051908152602001610211565b34801561025457600080fd5b50610268610263366004614e25565b6106c6565b6040516102119190614e98565b34801561028157600080fd5b50610268610290366004614f0b565b610b20565b3480156102a157600080fd5b506102006102b0366004615019565b610b56565b3480156102c157600080fd5b506102686102d0366004614e25565b610c8d565b3480156102e157600080fd5b506102686102f0366004614e25565b610e65565b34801561030157600080fd5b5061023a6103103660046150c3565b6110c1565b34801561032157600080fd5b506101d9610330366004614e25565b61120c565b34801561034157600080fd5b506101d9610350366004614e25565b611574565b610268610363366004615159565b611905565b34801561037457600080fd5b5061023a610383366004614db4565b611d63565b34801561039457600080fd5b506102686103a3366004614e25565b611d70565b3480156103b457600080fd5b506103dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561040d57600080fd5b5061023a61041c366004614db4565b611ee7565b34801561042d57600080fd5b5061023a61043c366004614d56565b611ef4565b6101d961044f366004615159565b6120d9565b34801561046057600080fd5b5061020061046f3660046151c0565b61254c565b34801561048057600080fd5b506103dc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b457600080fd5b506102686104c3366004614f0b565b6128a4565b3480156104d457600080fd5b506102006104e33660046150c3565b6128d1565b3480156104f457600080fd5b50610508610503366004615232565b612a22565b60408051938452602084019290925290820152606001610211565b610508610531366004614d56565b612b90565b610268610544366004615159565b612e92565b60008082428110156105bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064015b60405180910390fd5b6105eb897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a61254c565b90935091506105fb898685613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506106a58583613496565b50965096945050505050565b60006106be8484846135a5565b949350505050565b60608142811015610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866107776001826152dd565b818110610786576107866152f0565b905060200201602081019061079b919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6108767f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b915086826001845161088891906152dd565b81518110610898576108986152f0565b6020026020010151101561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6109f386866000818110610944576109446152f0565b9050602002016020810190610959919061531f565b336109d37f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610991576109916152f0565b90506020020160208101906109a6919061531f565b8b8b60018181106109b9576109b96152f0565b90506020020160208101906109ce919061531f565b6138c4565b856000815181106109e6576109e66152f0565b60200260200101516139f9565b610a3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b97915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610a7d91906152dd565b81518110610a8d57610a8d6152f0565b60200260200101516040518263ffffffff1660e01b8152600401610ab391815260200190565b600060405180830381600087803b158015610acd57600080fd5b505af1158015610ae1573d6000803e3d6000fd5b50505050610b15848360018551610af891906152dd565b81518110610b0857610b086152f0565b6020026020010151613496565b509695505050505050565b6060610b4d7f00000000000000000000000000000000000000000000000000000000000000008484613dc6565b90505b92915050565b6000806000610b867f00000000000000000000000000000000000000000000000000000000000000008f8f6138c4565b9050600087610b95578c610bb7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610c4c57600080fd5b505af1158015610c60573d6000803e3d6000fd5b50505050610c738f8f8f8f8f8f8f61254c565b809450819550505050509b509b9950505050505050505050565b60608142811015610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b610d587f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451610d6a91906152dd565b81518110610d7a57610d7a6152f0565b60200260200101511015610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b610e2686866000818110610944576109446152f0565b610b1582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b60608142811015610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168686610f166001826152dd565b818110610f2557610f256152f0565b9050602002016020810190610f3a919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6110157f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150868260008151811061102b5761102b6152f0565b6020026020010151111561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60008061110f7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006138c4565b905060008661111e578b611140565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156111d557600080fd5b505af11580156111e9573d6000803e3d6000fd5b505050506111fb8d8d8d8d8d8d611ef4565b9d9c50505050505050505050505050565b8042811015611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b6113088585600081811061128d5761128d6152f0565b90506020020160208101906112a2919061531f565b336113027f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b90506020020160208101906112ef919061531f565b8a8a60018181106109b9576109b96152f0565b8a6139f9565b600085856113176001826152dd565b818110611326576113266152f0565b905060200201602081019061133b919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156113a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cd919061533c565b905061140d868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613f61915050565b866114dc82888861141f6001826152dd565b81811061142e5761142e6152f0565b9050602002016020810190611443919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024015b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d6919061533c565b90614295565b101561156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b5050505050505050565b80428110156115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685856116236001826152dd565b818110611632576116326152f0565b9050602002016020810190611647919061531f565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6116da8585600081811061128d5761128d6152f0565b611718858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f61915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061533c565b90508681101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b5050505061156a8482613496565b60608142811015611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106119bc576119bc6152f0565b90506020020160208101906119d1919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b611aac7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451611abe91906152dd565b81518110611ace57611ace6152f0565b60200260200101511015611b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611bb357611bb36152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c727f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b84600081518110611c8557611c856152f0565b60200260200101516040518363ffffffff1660e01b8152600401611ccb92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0e9190615355565b611d1a57611d1a614cf2565b611d5982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b5095945050505050565b60006106be8484846142d7565b60608142811015611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611e3b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b91508682600081518110611e5157611e516152f0565b60200260200101511115610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60006106be84848461444b565b60008142811015611f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611f90887f0000000000000000000000000000000000000000000000000000000000000000898989308961254c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061202f91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a919061533c565b613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050610b158483613496565b8042811015612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061218e5761218e6152f0565b90506020020160208101906121a3919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561228d57600080fd5b505af11580156122a1573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123197f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190615355565b6123bb576123bb614cf2565b600086866123ca6001826152dd565b8181106123d9576123d96152f0565b90506020020160208101906123ee919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561245c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612480919061533c565b90506124c0878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f61915050565b876114dc8289896124d26001826152dd565b8181106124e1576124e16152f0565b90506020020160208101906124f6919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015291909116906370a0823190602401611495565b60008082428110156125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b60006125e77f00000000000000000000000000000000000000000000000000000000000000008c8c6138c4565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126879190615355565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156126fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271e9190615372565b91509150600061272e8e8e61458d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461276b57818361276e565b82825b90975095508a871015612803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b89861015612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505097509795505050505050565b6060610b4d7f0000000000000000000000000000000000000000000000000000000000000000848461371f565b60008060006129217f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006138c4565b9050600087612930578c612952565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156129e757600080fd5b505af11580156129fb573d6000803e3d6000fd5b50505050612a0d8e8e8e8e8e8e610549565b909f909e509c50505050505050505050505050565b60008060008342811015612a92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612aa08c8c8c8c8c8c614711565b90945092506000612ad27f00000000000000000000000000000000000000000000000000000000000000008e8e6138c4565b9050612ae08d3383886139f9565b612aec8c3383876139f9565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7e919061533c565b92505050985098509895505050505050565b60008060008342811015612c00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612c2e8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614711565b90945092506000612c807f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006138c4565b9050612c8e8b3383886139f9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612cf657600080fd5b505af1158015612d0a573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612da5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc99190615355565b612dd557612dd5614cf2565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e67919061533c565b925083341115612e8457612e8433612e7f86346152dd565b613496565b505096509650969350505050565b60608142811015612eff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110612f4957612f496152f0565b9050602002016020810190612f5e919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6130397f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150348260008151811061304f5761304f6152f0565b602002602001015111156130e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613134576131346152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561316757600080fd5b505af115801561317b573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6131f37f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b84600081518110613206576132066152f0565b60200260200101516040518363ffffffff1660e01b815260040161324c92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561326b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328f9190615355565b61329b5761329b614cf2565b6132da82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b816000815181106132ed576132ed6152f0565b6020026020010151341115611d5957611d593383600081518110613313576133136152f0565b602002602001015134612e7f91906152dd565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133bd91906153ba565b6000604051808303816000865af19150503d80600081146133fa576040519150601f19603f3d011682016040523d82523d6000602084013e6133ff565b606091505b50915091508180156134295750805115806134295750808060200190518101906134299190615355565b61348f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016105b3565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516134cd91906153ba565b60006040518083038185875af1925050503d806000811461350a576040519150601f19603f3d011682016040523d82523d6000602084013e61350f565b606091505b50509050806135a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c4544000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050565b6000808411613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016105b3565b6000831180156136465750600082115b6136d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b60006136e0856103e5614a6e565b905060006136ee8285614a6e565b9050600061370883613702886103e8614a6e565b90614b26565b905061371481836153d6565b979650505050505050565b606060028251101561378d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff8111156137a7576137a7614edc565b6040519080825280602002602001820160405280156137d0578160200160208202803683370190505b50905082816000815181106137e7576137e76152f0565b60200260200101818152505060005b6001835161380491906152dd565b8110156138bc5760008061385787868581518110613824576138246152f0565b60200260200101518786600161383a9190615411565b8151811061384a5761384a6152f0565b6020026020010151614b9f565b9150915061387f848481518110613870576138706152f0565b602002602001015183836135a5565b8461388b856001615411565b8151811061389b5761389b6152f0565b602002602001018181525050505080806138b490615424565b9150506137f6565b509392505050565b60008060006138d3858561458d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016139b99291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fd2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613a9891906153ba565b6000604051808303816000865af19150503d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b5091509150818015613b04575080511580613b04575080806020019051810190613b049190615355565b613b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505050565b60005b60018351613ba891906152dd565b811015613dc057600080848381518110613bc457613bc46152f0565b602002602001015185846001613bda9190615411565b81518110613bea57613bea6152f0565b6020026020010151915091506000613c02838361458d565b509050600087613c13866001615411565b81518110613c2357613c236152f0565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613c6b57826000613c6f565b6000835b91509150600060028a51613c8391906152dd565b8810613c8f5788613cdd565b613cdd7f0000000000000000000000000000000000000000000000000000000000000000878c613cc08c6002615411565b81518110613cd057613cd06152f0565b60200260200101516138c4565b9050613d0a7f000000000000000000000000000000000000000000000000000000000000000088886138c4565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b506040518563ffffffff1660e01b8152600401613d7494939291906154a6565b600060405180830381600087803b158015613d8e57600080fd5b505af1158015613da2573d6000803e3d6000fd5b50505050505050505050508080613db890615424565b915050613b9a565b50505050565b6060600282511015613e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff811115613e4e57613e4e614edc565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050828160018351613e8a91906152dd565b81518110613e9a57613e9a6152f0565b602002602001018181525050600060018351613eb691906152dd565b90505b80156138bc57600080613efc8786613ed26001876152dd565b81518110613ee257613ee26152f0565b602002602001015187868151811061384a5761384a6152f0565b91509150613f24848481518110613f1557613f156152f0565b602002602001015183836142d7565b84613f306001866152dd565b81518110613f4057613f406152f0565b60200260200101818152505050508080613f59906154e1565b915050613eb9565b60005b60018351613f7291906152dd565b8110156135a057600080848381518110613f8e57613f8e6152f0565b602002602001015185846001613fa49190615411565b81518110613fb457613fb46152f0565b6020026020010151915091506000613fcc838361458d565b5090506000613ffc7f000000000000000000000000000000000000000000000000000000000000000085856138c4565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561404f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140739190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146140d55782846140d8565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152929450909250614139918491908d16906370a0823190602401611495565b95506141468683836135a5565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461418a5782600061418e565b6000835b91509150600060028c516141a291906152dd565b8a106141ae578a6141df565b6141df7f0000000000000000000000000000000000000000000000000000000000000000898e613cc08e6002615411565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f9061424790869086908690602481016154a6565b600060405180830381600087803b15801561426157600080fd5b505af1158015614275573d6000803e3d6000fd5b50505050505050505050505050808061428d90615424565b915050613f64565b6000610b4d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614c9e565b6000808411614368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016105b3565b6000831180156143785750600082115b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b600061441c6103e86144168688614a6e565b90614a6e565b905060006144306103e56144168689614295565b9050614441600161370283856153d6565b9695505050505050565b60008084116144dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b6000831180156144ec5750600082115b614578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b826145838584614a6e565b6106be91906153d6565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361464b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a204944454e544943414c5f41444460448201527f524553534553000000000000000000000000000000000000000000000000000060648201526084016105b3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614685578284614688565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661470a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a205a45524f5f414444524553530060448201526064016105b3565b9250929050565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa1580156147ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d29190615584565b73ffffffffffffffffffffffffffffffffffffffff16036148a9576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a79190615584565b505b6000806148d77f00000000000000000000000000000000000000000000000000000000000000008b8b614b9f565b915091508160001480156148e9575080155b156148f957879350869250614a61565b600061490689848461444b565b90508781116149aa578581101561499f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b889450925082614a5f565b60006149b789848661444b565b9050898111156149c9576149c9614cf2565b87811015614a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b94508793505b505b5050965096945050505050565b600082600003614a8057506000610b50565b6000614a8c83856155a1565b905082614a9985836153d6565b14610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b600080614b338385615411565b905083811015610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105b3565b6000806000614bae858561458d565b509050600080614bbf8888886138c4565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c2d9190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614c8c578082614c8f565b81815b90999098509650505050505050565b60008184841115614cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b391906155b8565b506000614ce984866152dd565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114614d4357600080fd5b50565b8035614d5181614d21565b919050565b60008060008060008060c08789031215614d6f57600080fd5b8635614d7a81614d21565b95506020870135945060408701359350606087013592506080870135614d9f81614d21565b8092505060a087013590509295509295509295565b600080600060608486031215614dc957600080fd5b505081359360208301359350604090920135919050565b60008083601f840112614df257600080fd5b50813567ffffffffffffffff811115614e0a57600080fd5b6020830191508360208260051b850101111561470a57600080fd5b60008060008060008060a08789031215614e3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115614e6357600080fd5b614e6f89828a01614de0565b9095509350506060870135614e8381614d21565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015614ed057835183529284019291840191600101614eb4565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215614f1e57600080fd5b8235915060208084013567ffffffffffffffff80821115614f3e57600080fd5b818601915086601f830112614f5257600080fd5b813581811115614f6457614f64614edc565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614fa757614fa7614edc565b604052918252848201925083810185019189831115614fc557600080fd5b938501935b82851015614fea57614fdb85614d46565b84529385019392850192614fca565b8096505050505050509250929050565b8015158114614d4357600080fd5b803560ff81168114614d5157600080fd5b60008060008060008060008060008060006101608c8e03121561503b57600080fd5b8b3561504681614d21565b9a5060208c013561505681614d21565b995060408c0135985060608c0135975060808c0135965060a08c013561507b81614d21565b955060c08c0135945060e08c013561509281614ffa565b93506150a16101008d01615008565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d0312156150e357600080fd5b8a356150ee81614d21565b995060208b0135985060408b0135975060608b0135965060808b013561511381614d21565b955060a08b0135945060c08b013561512a81614ffa565b935061513860e08c01615008565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561517157600080fd5b85359450602086013567ffffffffffffffff81111561518f57600080fd5b61519b88828901614de0565b90955093505060408601356151af81614d21565b949793965091946060013592915050565b600080600080600080600060e0888a0312156151db57600080fd5b87356151e681614d21565b965060208801356151f681614d21565b955060408801359450606088013593506080880135925060a088013561521b81614d21565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561524f57600080fd5b883561525a81614d21565b9750602089013561526a81614d21565b965060408901359550606089013594506080890135935060a0890135925060c089013561529681614d21565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610b5057610b506152ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561533157600080fd5b8135610b4d81614d21565b60006020828403121561534e57600080fd5b5051919050565b60006020828403121561536757600080fd5b8151610b4d81614ffa565b6000806040838503121561538557600080fd5b505080516020909101519092909150565b60005b838110156153b1578181015183820152602001615399565b50506000910152565b600082516153cc818460208701615396565b9190910192915050565b60008261540c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610b5057610b506152ae565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615455576154556152ae565b5060010190565b60008151808452615474816020860160208601615396565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000614441608083018461545c565b6000816154f0576154f06152ae565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff81168114614d5157600080fd5b60008060006060848603121561554957600080fd5b61555284615516565b925061556060208501615516565b9150604084015163ffffffff8116811461557957600080fd5b809150509250925092565b60006020828403121561559657600080fd5b8151610b4d81614d21565b8082028115828204841417610b5057610b506152ae565b602081526000610b4d602083018461545c56fea2646970667358221220c637eebf349817693997ab85ef6d811295ffa1e95e8d51f88c675a02268cb15f64736f6c63430008130033000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104e8578063f305d71914610523578063fb3bdb411461053657600080fd5b8063c45a015514610474578063d06ca61f146104a8578063ded9382a146104c857600080fd5b8063af2979eb116100b0578063af2979eb14610421578063b6f9de9514610441578063baa2abde1461045457600080fd5b80638803dbee14610388578063ad5c4648146103a8578063ad615dec1461040157600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103355780637ff36ab51461035557806385f8c2591461036857600080fd5b80634a25d94a146102d55780635b0d5984146102f55780635c11d7951461031557600080fd5b80631f00ca74116101695780631f00ca74146102755780632195995c1461029557806338ed1739146102b557600080fd5b806302751cec146101e0578063054d50d41461021a57806318cbafe51461024857600080fd5b366101db573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101d9576101d9614cf2565b005b600080fd5b3480156101ec57600080fd5b506102006101fb366004614d56565b610549565b604080519283526020830191909152015b60405180910390f35b34801561022657600080fd5b5061023a610235366004614db4565b6106b1565b604051908152602001610211565b34801561025457600080fd5b50610268610263366004614e25565b6106c6565b6040516102119190614e98565b34801561028157600080fd5b50610268610290366004614f0b565b610b20565b3480156102a157600080fd5b506102006102b0366004615019565b610b56565b3480156102c157600080fd5b506102686102d0366004614e25565b610c8d565b3480156102e157600080fd5b506102686102f0366004614e25565b610e65565b34801561030157600080fd5b5061023a6103103660046150c3565b6110c1565b34801561032157600080fd5b506101d9610330366004614e25565b61120c565b34801561034157600080fd5b506101d9610350366004614e25565b611574565b610268610363366004615159565b611905565b34801561037457600080fd5b5061023a610383366004614db4565b611d63565b34801561039457600080fd5b506102686103a3366004614e25565b611d70565b3480156103b457600080fd5b506103dc7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561040d57600080fd5b5061023a61041c366004614db4565b611ee7565b34801561042d57600080fd5b5061023a61043c366004614d56565b611ef4565b6101d961044f366004615159565b6120d9565b34801561046057600080fd5b5061020061046f3660046151c0565b61254c565b34801561048057600080fd5b506103dc7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d881565b3480156104b457600080fd5b506102686104c3366004614f0b565b6128a4565b3480156104d457600080fd5b506102006104e33660046150c3565b6128d1565b3480156104f457600080fd5b50610508610503366004615232565b612a22565b60408051938452602084019290925290820152606001610211565b610508610531366004614d56565b612b90565b610268610544366004615159565b612e92565b60008082428110156105bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064015b60405180910390fd5b6105eb897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a61254c565b90935091506105fb898685613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506106a58583613496565b50965096945050505050565b60006106be8484846135a5565b949350505050565b60608142811015610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866107776001826152dd565b818110610786576107866152f0565b905060200201602081019061079b919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6108767f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b915086826001845161088891906152dd565b81518110610898576108986152f0565b6020026020010151101561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6109f386866000818110610944576109446152f0565b9050602002016020810190610959919061531f565b336109d37f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88a8a6000818110610991576109916152f0565b90506020020160208101906109a6919061531f565b8b8b60018181106109b9576109b96152f0565b90506020020160208101906109ce919061531f565b6138c4565b856000815181106109e6576109e66152f0565b60200260200101516139f9565b610a3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b97915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610a7d91906152dd565b81518110610a8d57610a8d6152f0565b60200260200101516040518263ffffffff1660e01b8152600401610ab391815260200190565b600060405180830381600087803b158015610acd57600080fd5b505af1158015610ae1573d6000803e3d6000fd5b50505050610b15848360018551610af891906152dd565b81518110610b0857610b086152f0565b6020026020010151613496565b509695505050505050565b6060610b4d7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88484613dc6565b90505b92915050565b6000806000610b867f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88f8f6138c4565b9050600087610b95578c610bb7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610c4c57600080fd5b505af1158015610c60573d6000803e3d6000fd5b50505050610c738f8f8f8f8f8f8f61254c565b809450819550505050509b509b9950505050505050505050565b60608142811015610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b610d587f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451610d6a91906152dd565b81518110610d7a57610d7a6152f0565b60200260200101511015610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b610e2686866000818110610944576109446152f0565b610b1582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b60608142811015610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686610f166001826152dd565b818110610f2557610f256152f0565b9050602002016020810190610f3a919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6110157f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d889888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150868260008151811061102b5761102b6152f0565b6020026020010151111561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60008061110f7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26138c4565b905060008661111e578b611140565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156111d557600080fd5b505af11580156111e9573d6000803e3d6000fd5b505050506111fb8d8d8d8d8d8d611ef4565b9d9c50505050505050505050505050565b8042811015611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b6113088585600081811061128d5761128d6152f0565b90506020020160208101906112a2919061531f565b336113027f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8898960008181106112da576112da6152f0565b90506020020160208101906112ef919061531f565b8a8a60018181106109b9576109b96152f0565b8a6139f9565b600085856113176001826152dd565b818110611326576113266152f0565b905060200201602081019061133b919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156113a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cd919061533c565b905061140d868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613f61915050565b866114dc82888861141f6001826152dd565b81811061142e5761142e6152f0565b9050602002016020810190611443919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024015b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d6919061533c565b90614295565b101561156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b5050505050505050565b80428110156115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685856116236001826152dd565b818110611632576116326152f0565b9050602002016020810190611647919061531f565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6116da8585600081811061128d5761128d6152f0565b611718858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f61915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061533c565b90508681101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b5050505061156a8482613496565b60608142811015611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16868660008181106119bc576119bc6152f0565b90506020020160208101906119d1919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b611aac7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d83488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451611abe91906152dd565b81518110611ace57611ace6152f0565b60200260200101511015611b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611bb357611bb36152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c727f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8898960008181106112da576112da6152f0565b84600081518110611c8557611c856152f0565b60200260200101516040518363ffffffff1660e01b8152600401611ccb92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0e9190615355565b611d1a57611d1a614cf2565b611d5982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b5095945050505050565b60006106be8484846142d7565b60608142811015611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611e3b7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d889888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b91508682600081518110611e5157611e516152f0565b60200260200101511115610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60006106be84848461444b565b60008142811015611f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611f90887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2898989308961254c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061202f91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a919061533c565b613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050610b158483613496565b8042811015612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168585600081811061218e5761218e6152f0565b90506020020160208101906121a3919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561228d57600080fd5b505af11580156122a1573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123197f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8898960008181106112da576112da6152f0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190615355565b6123bb576123bb614cf2565b600086866123ca6001826152dd565b8181106123d9576123d96152f0565b90506020020160208101906123ee919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561245c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612480919061533c565b90506124c0878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f61915050565b876114dc8289896124d26001826152dd565b8181106124e1576124e16152f0565b90506020020160208101906124f6919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015291909116906370a0823190602401611495565b60008082428110156125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b60006125e77f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88c8c6138c4565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126879190615355565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156126fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271e9190615372565b91509150600061272e8e8e61458d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461276b57818361276e565b82825b90975095508a871015612803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b89861015612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505097509795505050505050565b6060610b4d7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8848461371f565b60008060006129217f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26138c4565b9050600087612930578c612952565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156129e757600080fd5b505af11580156129fb573d6000803e3d6000fd5b50505050612a0d8e8e8e8e8e8e610549565b909f909e509c50505050505050505050505050565b60008060008342811015612a92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612aa08c8c8c8c8c8c614711565b90945092506000612ad27f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88e8e6138c4565b9050612ae08d3383886139f9565b612aec8c3383876139f9565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7e919061533c565b92505050985098509895505050505050565b60008060008342811015612c00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612c2e8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c614711565b90945092506000612c807f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26138c4565b9050612c8e8b3383886139f9565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612cf657600080fd5b505af1158015612d0a573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af1158015612da5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc99190615355565b612dd557612dd5614cf2565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e67919061533c565b925083341115612e8457612e8433612e7f86346152dd565b613496565b505096509650969350505050565b60608142811015612eff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1686866000818110612f4957612f496152f0565b9050602002016020810190612f5e919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6130397f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d888888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150348260008151811061304f5761304f6152f0565b602002602001015111156130e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613134576131346152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561316757600080fd5b505af115801561317b573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6131f37f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8898960008181106112da576112da6152f0565b84600081518110613206576132066152f0565b60200260200101516040518363ffffffff1660e01b815260040161324c92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561326b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328f9190615355565b61329b5761329b614cf2565b6132da82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b816000815181106132ed576132ed6152f0565b6020026020010151341115611d5957611d593383600081518110613313576133136152f0565b602002602001015134612e7f91906152dd565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133bd91906153ba565b6000604051808303816000865af19150503d80600081146133fa576040519150601f19603f3d011682016040523d82523d6000602084013e6133ff565b606091505b50915091508180156134295750805115806134295750808060200190518101906134299190615355565b61348f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016105b3565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516134cd91906153ba565b60006040518083038185875af1925050503d806000811461350a576040519150601f19603f3d011682016040523d82523d6000602084013e61350f565b606091505b50509050806135a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c4544000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050565b6000808411613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016105b3565b6000831180156136465750600082115b6136d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b60006136e0856103e5614a6e565b905060006136ee8285614a6e565b9050600061370883613702886103e8614a6e565b90614b26565b905061371481836153d6565b979650505050505050565b606060028251101561378d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff8111156137a7576137a7614edc565b6040519080825280602002602001820160405280156137d0578160200160208202803683370190505b50905082816000815181106137e7576137e76152f0565b60200260200101818152505060005b6001835161380491906152dd565b8110156138bc5760008061385787868581518110613824576138246152f0565b60200260200101518786600161383a9190615411565b8151811061384a5761384a6152f0565b6020026020010151614b9f565b9150915061387f848481518110613870576138706152f0565b602002602001015183836135a5565b8461388b856001615411565b8151811061389b5761389b6152f0565b602002602001018181525050505080806138b490615424565b9150506137f6565b509392505050565b60008060006138d3858561458d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016139b99291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fd2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613a9891906153ba565b6000604051808303816000865af19150503d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b5091509150818015613b04575080511580613b04575080806020019051810190613b049190615355565b613b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505050565b60005b60018351613ba891906152dd565b811015613dc057600080848381518110613bc457613bc46152f0565b602002602001015185846001613bda9190615411565b81518110613bea57613bea6152f0565b6020026020010151915091506000613c02838361458d565b509050600087613c13866001615411565b81518110613c2357613c236152f0565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613c6b57826000613c6f565b6000835b91509150600060028a51613c8391906152dd565b8810613c8f5788613cdd565b613cdd7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8878c613cc08c6002615411565b81518110613cd057613cd06152f0565b60200260200101516138c4565b9050613d0a7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d888886138c4565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b506040518563ffffffff1660e01b8152600401613d7494939291906154a6565b600060405180830381600087803b158015613d8e57600080fd5b505af1158015613da2573d6000803e3d6000fd5b50505050505050505050508080613db890615424565b915050613b9a565b50505050565b6060600282511015613e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff811115613e4e57613e4e614edc565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050828160018351613e8a91906152dd565b81518110613e9a57613e9a6152f0565b602002602001018181525050600060018351613eb691906152dd565b90505b80156138bc57600080613efc8786613ed26001876152dd565b81518110613ee257613ee26152f0565b602002602001015187868151811061384a5761384a6152f0565b91509150613f24848481518110613f1557613f156152f0565b602002602001015183836142d7565b84613f306001866152dd565b81518110613f4057613f406152f0565b60200260200101818152505050508080613f59906154e1565b915050613eb9565b60005b60018351613f7291906152dd565b8110156135a057600080848381518110613f8e57613f8e6152f0565b602002602001015185846001613fa49190615411565b81518110613fb457613fb46152f0565b6020026020010151915091506000613fcc838361458d565b5090506000613ffc7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d885856138c4565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561404f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140739190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146140d55782846140d8565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152929450909250614139918491908d16906370a0823190602401611495565b95506141468683836135a5565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461418a5782600061418e565b6000835b91509150600060028c516141a291906152dd565b8a106141ae578a6141df565b6141df7f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8898e613cc08e6002615411565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f9061424790869086908690602481016154a6565b600060405180830381600087803b15801561426157600080fd5b505af1158015614275573d6000803e3d6000fd5b50505050505050505050505050808061428d90615424565b915050613f64565b6000610b4d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614c9e565b6000808411614368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016105b3565b6000831180156143785750600082115b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b600061441c6103e86144168688614a6e565b90614a6e565b905060006144306103e56144168689614295565b9050614441600161370283856153d6565b9695505050505050565b60008084116144dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b6000831180156144ec5750600082115b614578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b826145838584614a6e565b6106be91906153d6565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361464b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a204944454e544943414c5f41444460448201527f524553534553000000000000000000000000000000000000000000000000000060648201526084016105b3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614685578284614688565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661470a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a205a45524f5f414444524553530060448201526064016105b3565b9250929050565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d89091169063e6a4390590604401602060405180830381865afa1580156147ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d29190615584565b73ffffffffffffffffffffffffffffffffffffffff16036148a9576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8169063c9c65396906044016020604051808303816000875af1158015614883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a79190615584565b505b6000806148d77f000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d88b8b614b9f565b915091508160001480156148e9575080155b156148f957879350869250614a61565b600061490689848461444b565b90508781116149aa578581101561499f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b889450925082614a5f565b60006149b789848661444b565b9050898111156149c9576149c9614cf2565b87811015614a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b94508793505b505b5050965096945050505050565b600082600003614a8057506000610b50565b6000614a8c83856155a1565b905082614a9985836153d6565b14610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b600080614b338385615411565b905083811015610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105b3565b6000806000614bae858561458d565b509050600080614bbf8888886138c4565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c2d9190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614c8c578082614c8f565b81815b90999098509650505050505050565b60008184841115614cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b391906155b8565b506000614ce984866152dd565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114614d4357600080fd5b50565b8035614d5181614d21565b919050565b60008060008060008060c08789031215614d6f57600080fd5b8635614d7a81614d21565b95506020870135945060408701359350606087013592506080870135614d9f81614d21565b8092505060a087013590509295509295509295565b600080600060608486031215614dc957600080fd5b505081359360208301359350604090920135919050565b60008083601f840112614df257600080fd5b50813567ffffffffffffffff811115614e0a57600080fd5b6020830191508360208260051b850101111561470a57600080fd5b60008060008060008060a08789031215614e3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115614e6357600080fd5b614e6f89828a01614de0565b9095509350506060870135614e8381614d21565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015614ed057835183529284019291840191600101614eb4565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215614f1e57600080fd5b8235915060208084013567ffffffffffffffff80821115614f3e57600080fd5b818601915086601f830112614f5257600080fd5b813581811115614f6457614f64614edc565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614fa757614fa7614edc565b604052918252848201925083810185019189831115614fc557600080fd5b938501935b82851015614fea57614fdb85614d46565b84529385019392850192614fca565b8096505050505050509250929050565b8015158114614d4357600080fd5b803560ff81168114614d5157600080fd5b60008060008060008060008060008060006101608c8e03121561503b57600080fd5b8b3561504681614d21565b9a5060208c013561505681614d21565b995060408c0135985060608c0135975060808c0135965060a08c013561507b81614d21565b955060c08c0135945060e08c013561509281614ffa565b93506150a16101008d01615008565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d0312156150e357600080fd5b8a356150ee81614d21565b995060208b0135985060408b0135975060608b0135965060808b013561511381614d21565b955060a08b0135945060c08b013561512a81614ffa565b935061513860e08c01615008565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561517157600080fd5b85359450602086013567ffffffffffffffff81111561518f57600080fd5b61519b88828901614de0565b90955093505060408601356151af81614d21565b949793965091946060013592915050565b600080600080600080600060e0888a0312156151db57600080fd5b87356151e681614d21565b965060208801356151f681614d21565b955060408801359450606088013593506080880135925060a088013561521b81614d21565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561524f57600080fd5b883561525a81614d21565b9750602089013561526a81614d21565b965060408901359550606089013594506080890135935060a0890135925060c089013561529681614d21565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610b5057610b506152ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561533157600080fd5b8135610b4d81614d21565b60006020828403121561534e57600080fd5b5051919050565b60006020828403121561536757600080fd5b8151610b4d81614ffa565b6000806040838503121561538557600080fd5b505080516020909101519092909150565b60005b838110156153b1578181015183820152602001615399565b50506000910152565b600082516153cc818460208701615396565b9190910192915050565b60008261540c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610b5057610b506152ae565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615455576154556152ae565b5060010190565b60008151808452615474816020860160208601615396565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000614441608083018461545c565b6000816154f0576154f06152ae565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff81168114614d5157600080fd5b60008060006060848603121561554957600080fd5b61555284615516565b925061556060208501615516565b9150604084015163ffffffff8116811461557957600080fd5b809150509250925092565b60006020828403121561559657600080fd5b8151610b4d81614d21565b8082028115828204841417610b5057610b506152ae565b602081526000610b4d602083018461545c56fea2646970667358221220c637eebf349817693997ab85ef6d811295ffa1e95e8d51f88c675a02268cb15f64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0xcBAE5C3f8259181EB7E2309BC4c72fDF02dD56D8
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000cbae5c3f8259181eb7e2309bc4c72fdf02dd56d8
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.