Source Code
Overview
XDC Balance
XDC Value
$0.00Latest 25 from a total of 374,358 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact Token... | 97074344 | 1 min ago | IN | 0 XDC | 0.0017354 | ||||
| Swap Exact ETH F... | 97074341 | 1 min ago | IN | 0.90873461 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074339 | 1 min ago | IN | 0 XDC | 0.0017354 | ||||
| Swap Exact ETH F... | 97074338 | 1 min ago | IN | 0.89383572 XDC | 0.00148785 | ||||
| Swap Exact Token... | 97074336 | 1 min ago | IN | 0 XDC | 0.0017354 | ||||
| Swap Exact ETH F... | 97074334 | 1 min ago | IN | 0.92362854 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074244 | 4 mins ago | IN | 0 XDC | 0.0017354 | ||||
| Swap Exact ETH F... | 97074241 | 4 mins ago | IN | 0.96831836 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074240 | 4 mins ago | IN | 0 XDC | 0.00049083 | ||||
| Swap Exact ETH F... | 97074238 | 4 mins ago | IN | 0.9980441 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074236 | 4 mins ago | IN | 0 XDC | 0.0017362 | ||||
| Swap Exact ETH F... | 97074235 | 4 mins ago | IN | 0.93845761 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074150 | 7 mins ago | IN | 0 XDC | 0.0017354 | ||||
| Swap Exact ETH F... | 97074145 | 7 mins ago | IN | 0.95335194 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074144 | 7 mins ago | IN | 0 XDC | 0.0017362 | ||||
| Swap Exact ETH F... | 97074142 | 7 mins ago | IN | 0.93845405 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074140 | 7 mins ago | IN | 0 XDC | 0.0017362 | ||||
| Swap Exact ETH F... | 97074137 | 8 mins ago | IN | 0.96824436 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074058 | 11 mins ago | IN | 0 XDC | 0.00049083 | ||||
| Swap Exact ETH F... | 97074057 | 11 mins ago | IN | 0.9830738 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97074055 | 11 mins ago | IN | 0 XDC | 0.0017362 | ||||
| Swap Exact ETH F... | 97074052 | 11 mins ago | IN | 0.89370185 XDC | 0.00148785 | ||||
| Swap Exact Token... | 97074051 | 11 mins ago | IN | 0 XDC | 0.0017354 | ||||
| Swap Exact ETH F... | 97074048 | 11 mins ago | IN | 0.99796507 XDC | 0.00148865 | ||||
| Swap Exact Token... | 97073971 | 14 mins ago | IN | 0 XDC | 0.00049083 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 97074344 | 1 min ago | 0.87964821 XDC | ||||
| 97074344 | 1 min ago | 0.87964821 XDC | ||||
| 97074341 | 1 min ago | 0.90873461 XDC | ||||
| 97074339 | 1 min ago | 0.86522574 XDC | ||||
| 97074339 | 1 min ago | 0.86522574 XDC | ||||
| 97074338 | 1 min ago | 0.89383572 XDC | ||||
| 97074336 | 1 min ago | 0.89406588 XDC | ||||
| 97074336 | 1 min ago | 0.89406588 XDC | ||||
| 97074334 | 1 min ago | 0.92362854 XDC | ||||
| 97074244 | 4 mins ago | 0.93732681 XDC | ||||
| 97074244 | 4 mins ago | 0.93732681 XDC | ||||
| 97074241 | 4 mins ago | 0.96831836 XDC | ||||
| 97074238 | 4 mins ago | 0.9980441 XDC | ||||
| 97074236 | 4 mins ago | 0.9084208 XDC | ||||
| 97074236 | 4 mins ago | 0.9084208 XDC | ||||
| 97074235 | 4 mins ago | 0.93845761 XDC | ||||
| 97074150 | 7 mins ago | 0.92283891 XDC | ||||
| 97074150 | 7 mins ago | 0.92283891 XDC | ||||
| 97074145 | 7 mins ago | 0.95335194 XDC | ||||
| 97074144 | 7 mins ago | 0.90841736 XDC | ||||
| 97074144 | 7 mins ago | 0.90841736 XDC | ||||
| 97074142 | 7 mins ago | 0.93845405 XDC | ||||
| 97074140 | 7 mins ago | 0.93725517 XDC | ||||
| 97074140 | 7 mins ago | 0.93725517 XDC | ||||
| 97074137 | 8 mins ago | 0.96824436 XDC |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NexusRouter
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
import "./NexusSwap/Interfaces/INexusSwapRouter02.sol";
import "./NexusSwap/Interfaces/INexusSwapFactory.sol";
import "./Mocks/IWETH.sol";
import "./Uniswap/Interfaces/IERC20Uniswap.sol";
import "./Libraries/SafeMathUniswap.sol";
import "./Libraries/NexusSwapLibrary.sol";
import "./Libraries/TransferHelper.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract NexusRouter is INexusSwapRouter02 {
using SafeMathUniswap for uint;
address public immutable factory;
address public immutable WETH;
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, "NexusRouter: EXPIRED");
_;
}
constructor(address _factory, address _WETH) {
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 (INexusSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
INexusSwapFactory(factory).createPair(tokenA, tokenB);
}
(uint reserveA, uint reserveB) = NexusSwapLibrary.getReserves(
factory,
tokenA,
tokenB
);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = NexusSwapLibrary.quote(
amountADesired,
reserveA,
reserveB
);
if (amountBOptimal <= amountBDesired) {
require(
amountBOptimal >= amountBMin,
"NexusRouter: INSUFFICIENT_B_AMOUNT"
);
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = NexusSwapLibrary.quote(
amountBDesired,
reserveB,
reserveA
);
assert(amountAOptimal <= amountADesired);
require(
amountAOptimal >= amountAMin,
"NexusRouter: 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 = NexusSwapLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = INexusSwapPair(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 = NexusSwapLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value: amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = INexusSwapPair(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 = NexusSwapLibrary.pairFor(factory, tokenA, tokenB);
INexusSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint amount0, uint amount1) = INexusSwapPair(pair).burn(to);
(address token0, ) = NexusSwapLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0
? (amount0, amount1)
: (amount1, amount0);
require(amountA >= amountAMin, "NexusRouter: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "NexusRouter: 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 = NexusSwapLibrary.pairFor(factory, tokenA, tokenB);
uint value = approveMax ? type(uint).max : liquidity;
INexusSwapPair(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 = NexusSwapLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint).max : liquidity;
INexusSwapPair(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,
IERC20Uniswap(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 = NexusSwapLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint).max : liquidity;
INexusSwapPair(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, ) = NexusSwapLibrary.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
? NexusSwapLibrary.pairFor(factory, output, path[i + 2])
: _to;
INexusSwapPair(NexusSwapLibrary.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 = NexusSwapLibrary.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"NexusRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
NexusSwapLibrary.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 = NexusSwapLibrary.getAmountsIn(factory, amountOut, path);
require(
amounts[0] <= amountInMax,
"NexusRouter: EXCESSIVE_INPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
NexusSwapLibrary.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, "NexusRouter: INVALID_PATH");
amounts = NexusSwapLibrary.getAmountsOut(factory, msg.value, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"NexusRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWETH(WETH).deposit{value: amounts[0]}();
assert(
IWETH(WETH).transfer(
NexusSwapLibrary.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, "NexusRouter: INVALID_PATH");
amounts = NexusSwapLibrary.getAmountsIn(factory, amountOut, path);
require(
amounts[0] <= amountInMax,
"NexusRouter: EXCESSIVE_INPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
NexusSwapLibrary.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, "NexusRouter: INVALID_PATH");
amounts = NexusSwapLibrary.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"NexusRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
NexusSwapLibrary.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, "NexusRouter: INVALID_PATH");
amounts = NexusSwapLibrary.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= msg.value, "NexusRouter: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{value: amounts[0]}();
assert(
IWETH(WETH).transfer(
NexusSwapLibrary.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, ) = NexusSwapLibrary.sortTokens(input, output);
INexusSwapPair pair = INexusSwapPair(
NexusSwapLibrary.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 = IERC20Uniswap(input).balanceOf(address(pair)).sub(
reserveInput
);
amountOutput = NexusSwapLibrary.getAmountOut(
amountInput,
reserveInput,
reserveOutput
);
}
(uint amount0Out, uint amount1Out) = input == token0
? (uint(0), amountOutput)
: (amountOutput, uint(0));
address to = i < path.length - 2
? NexusSwapLibrary.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,
NexusSwapLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(
balanceBefore
) >= amountOutMin,
"NexusRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) {
require(path[0] == WETH, "NexusRouter: INVALID_PATH");
uint amountIn = msg.value;
IWETH(WETH).deposit{value: amountIn}();
assert(
IWETH(WETH).transfer(
NexusSwapLibrary.pairFor(factory, path[0], path[1]),
amountIn
)
);
uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(
balanceBefore
) >= amountOutMin,
"NexusRouter: 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, "NexusRouter: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
NexusSwapLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
require(
amountOut >= amountOutMin,
"NexusRouter: 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 NexusSwapLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) public pure virtual override returns (uint amountOut) {
return NexusSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
}
function getAmountIn(
uint amountOut,
uint reserveIn,
uint reserveOut
) public pure virtual override returns (uint amountIn) {
return NexusSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
}
function getAmountsOut(
uint amountIn,
address[] memory path
) public view virtual override returns (uint[] memory amounts) {
return NexusSwapLibrary.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(
uint amountOut,
address[] memory path
) public view virtual override returns (uint[] memory amounts) {
return NexusSwapLibrary.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: MIT
pragma solidity ^0.8.12;
import "./SafeMathUniswap.sol";
import "../NexusSwap/Interfaces/INexusSwapPair.sol";
library NexusSwapLibrary {
using SafeMathUniswap 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, "NexusLibrary: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB
? (tokenA, tokenB)
: (tokenB, tokenA);
require(token0 != address(0), "NexusLibrary: ZERO_ADDRESS");
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(
address factory,
address tokenA,
address tokenB
) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(
uint160(
uint256(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
hex"69f87219435c6fe01b08d421b51fe0866c422f9b32e9e714e1f24068c99274fd" // 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, ) = INexusSwapPair(
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, "NexusLibrary: INSUFFICIENT_AMOUNT");
require(
reserveA > 0 && reserveB > 0,
"NexusLibrary: 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, "NexusLibrary: INSUFFICIENT_INPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"NexusLibrary: 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, "NexusLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"NexusLibrary: 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, "NexusLibrary: 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, "NexusLibrary: 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: MIT
pragma solidity ^0.8.12;
library SafeMathUniswap {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
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: MIT
pragma solidity ^0.8.12;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
import "../../Uniswap/Interfaces/IUniswapV2Factory.sol";
interface INexusSwapFactory is IUniswapV2Factory {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
import "../../Uniswap/Interfaces/IUniswapV2Pair.sol";
interface INexusSwapPair is IUniswapV2Pair {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;
interface INexusSwapRouter01 {
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: MIT
pragma solidity ^0.8.12;
import "./INexusSwapRouter01.sol";
interface INexusSwapRouter02 is INexusSwapRouter01 {
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: MIT
pragma solidity ^0.8.12;
interface IERC20Uniswap {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(
address owner,
address spender
) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(
address from,
address to,
uint value
) external returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function migrator() external view returns (address);
function getPair(
address tokenA,
address tokenB
) external view returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
function setMigrator(address) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(
address to
) external returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200432438038062004324833981016040819052620000349162000069565b6001600160a01b039182166080521660a052620000a1565b80516001600160a01b03811681146200006457600080fd5b919050565b600080604083850312156200007d57600080fd5b62000088836200004c565b915062000098602084016200004c565b90509250929050565b60805160a0516140f1620002336000396000818161015f0152818161036d01528181610522015281816105710152818161062d0152818161085001528181610b8901528181610cc401528181611014015281816110f7015281816111a20152818161123501528181611353015281816113e101528181611629015281816116e101528181611772015281816117ef0152818161186301528181611caa01528181611e9b01528181611ef101528181611f2501528181611fba015281816120f301528181612205015261229301526000818161042c015281816106a90152818161077b015281816109360152818161096f01528181610a6601528181610c0501528181610ca201528181610dd9015281816112b0015281816114130152818161155e0152818161189501528181611ab401528181611c5801528181611c8801528181611db101528181611ecf0152818161216e015281816122c501528181612b5701528181612ba701528181612e7201528181612fda0152818161337f01528181613422015261349901526140f16000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a01551461041a578063d06ca61f1461044e578063ded9382a1461046e578063e8e337001461048e578063f305d719146104c9578063fb3bdb41146104dc57600080fd5b80638803dbee1461033b578063ad5c46481461035b578063ad615dec146103a7578063af2979eb146103c7578063b6f9de95146103e7578063baa2abde146103fa57600080fd5b80634a25d94a116101085780634a25d94a146102885780635b0d5984146102a85780635c11d795146102c8578063791ac947146102e85780637ff36ab51461030857806385f8c2591461031b57600080fd5b806302751cec14610193578063054d50d4146101cd57806318cbafe5146101fb5780631f00ca74146102285780632195995c1461024857806338ed17391461026857600080fd5b3661018e57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018c5761018c6136fc565b005b600080fd5b34801561019f57600080fd5b506101b36101ae36600461373a565b6104ef565b604080519283526020830191909152015b60405180910390f35b3480156101d957600080fd5b506101ed6101e8366004613798565b6105eb565b6040519081526020016101c4565b34801561020757600080fd5b5061021b610216366004613809565b610600565b6040516101c4919061387c565b34801561023457600080fd5b5061021b6102433660046138d6565b61092f565b34801561025457600080fd5b506101b36102633660046139c6565b610965565b34801561027457600080fd5b5061021b610283366004613809565b610a3e565b34801561029457600080fd5b5061021b6102a3366004613809565b610b5c565b3480156102b457600080fd5b506101ed6102c3366004613a70565b610c9a565b3480156102d457600080fd5b5061018c6102e3366004613809565b610d87565b3480156102f457600080fd5b5061018c610303366004613809565b610fe9565b61021b610316366004613b06565b611210565b34801561032757600080fd5b506101ed610336366004613798565b611529565b34801561034757600080fd5b5061021b610356366004613809565b611536565b34801561036757600080fd5b5061038f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c4565b3480156103b357600080fd5b506101ed6103c2366004613798565b6115f3565b3480156103d357600080fd5b506101ed6103e236600461373a565b611600565b61018c6103f5366004613b06565b61174f565b34801561040657600080fd5b506101b3610415366004613b6d565b611a89565b34801561042657600080fd5b5061038f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561045a57600080fd5b5061021b6104693660046138d6565b611c51565b34801561047a57600080fd5b506101b3610489366004613a70565b611c7e565b34801561049a57600080fd5b506104ae6104a9366004613bdf565b611d71565b604080519384526020840192909252908201526060016101c4565b6104ae6104d736600461373a565b611e6f565b61021b6104ea366004613b06565b6120ce565b600080824281101561051c5760405162461bcd60e51b815260040161051390613c5b565b60405180910390fd5b61054b897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611a89565b909350915061055b89868561241d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156105bd57600080fd5b505af11580156105d1573d6000803e3d6000fd5b505050506105df8583612538565b50965096945050505050565b60006105f8848484612606565b949350505050565b606081428110156106235760405162461bcd60e51b815260040161051390613c5b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661065a600182613c9f565b81811061066957610669613cb6565b905060200201602081019061067e9190613ccc565b6001600160a01b0316146106a45760405162461bcd60e51b815260040161051390613cf0565b6107027f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126e092505050565b91508682600184516107149190613c9f565b8151811061072457610724613cb6565b6020026020010151101561074a5760405162461bcd60e51b815260040161051390613d27565b61080f8686600081811061076057610760613cb6565b90506020020160208101906107759190613ccc565b336107ef7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106107ad576107ad613cb6565b90506020020160208101906107c29190613ccc565b8b8b60018181106107d5576107d5613cb6565b90506020020160208101906107ea9190613ccc565b61286b565b8560008151811061080257610802613cb6565b6020026020010151612944565b61084e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612a74915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855161088c9190613c9f565b8151811061089c5761089c613cb6565b60200260200101516040518263ffffffff1660e01b81526004016108c291815260200190565b600060405180830381600087803b1580156108dc57600080fd5b505af11580156108f0573d6000803e3d6000fd5b505050506109248483600185516109079190613c9f565b8151811061091757610917613cb6565b6020026020010151612538565b509695505050505050565b606061095c7f00000000000000000000000000000000000000000000000000000000000000008484612c7c565b90505b92915050565b60008060006109957f00000000000000000000000000000000000000000000000000000000000000008f8f61286b565b90506000876109a4578c6109a8565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906109e3903390309086908f908e908e908e90600401613d6e565b600060405180830381600087803b1580156109fd57600080fd5b505af1158015610a11573d6000803e3d6000fd5b50505050610a248f8f8f8f8f8f8f611a89565b809450819550505050509b509b9950505050505050505050565b60608142811015610a615760405162461bcd60e51b815260040161051390613c5b565b610abf7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126e092505050565b9150868260018451610ad19190613c9f565b81518110610ae157610ae1613cb6565b60200260200101511015610b075760405162461bcd60e51b815260040161051390613d27565b610b1d8686600081811061076057610760613cb6565b61092482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612a74915050565b60608142811015610b7f5760405162461bcd60e51b815260040161051390613c5b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610bb6600182613c9f565b818110610bc557610bc5613cb6565b9050602002016020810190610bda9190613ccc565b6001600160a01b031614610c005760405162461bcd60e51b815260040161051390613cf0565b610c5e7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7c92505050565b91508682600081518110610c7457610c74613cb6565b6020026020010151111561074a5760405162461bcd60e51b815260040161051390613daf565b600080610ce87f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061286b565b9050600086610cf7578b610cfb565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610d36903390309086908e908d908d908d90600401613d6e565b600060405180830381600087803b158015610d5057600080fd5b505af1158015610d64573d6000803e3d6000fd5b50505050610d768d8d8d8d8d8d611600565b9d9c50505050505050505050505050565b8042811015610da85760405162461bcd60e51b815260040161051390613c5b565b610e3985856000818110610dbe57610dbe613cb6565b9050602002016020810190610dd39190613ccc565b33610e337f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0b57610e0b613cb6565b9050602002016020810190610e209190613ccc565b8a8a60018181106107d5576107d5613cb6565b8a612944565b60008585610e48600182613c9f565b818110610e5757610e57613cb6565b9050602002016020810190610e6c9190613ccc565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed89190613df2565b9050610f18868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612dfd915050565b86610fc1828888610f2a600182613c9f565b818110610f3957610f39613cb6565b9050602002016020810190610f4e9190613ccc565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190613df2565b90613096565b1015610fdf5760405162461bcd60e51b815260040161051390613d27565b5050505050505050565b804281101561100a5760405162461bcd60e51b815260040161051390613c5b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611041600182613c9f565b81811061105057611050613cb6565b90506020020160208101906110659190613ccc565b6001600160a01b03161461108b5760405162461bcd60e51b815260040161051390613cf0565b6110a185856000818110610dbe57610dbe613cb6565b6110df858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612dfd915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190613df2565b90508681101561118c5760405162461bcd60e51b815260040161051390613d27565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b50505050610fdf8482612538565b606081428110156112335760405162461bcd60e51b815260040161051390613c5b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061127057611270613cb6565b90506020020160208101906112859190613ccc565b6001600160a01b0316146112ab5760405162461bcd60e51b815260040161051390613cf0565b6113097f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126e092505050565b915086826001845161131b9190613c9f565b8151811061132b5761132b613cb6565b602002602001015110156113515760405162461bcd60e51b815260040161051390613d27565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061139357611393613cb6565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6114457f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0b57610e0b613cb6565b8460008151811061145857611458613cb6565b60200260200101516040518363ffffffff1660e01b81526004016114919291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190613e0b565b6114e0576114e06136fc565b61151f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612a74915050565b5095945050505050565b60006105f88484846130ec565b606081428110156115595760405162461bcd60e51b815260040161051390613c5b565b6115b77f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7c92505050565b915086826000815181106115cd576115cd613cb6565b60200260200101511115610b075760405162461bcd60e51b815260040161051390613daf565b60006105f88484846131c1565b600081428110156116235760405162461bcd60e51b815260040161051390613c5b565b611652887f00000000000000000000000000000000000000000000000000000000000000008989893089611a89565b6040516370a0823160e01b81523060048201529093506116cb9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa1580156116a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c69190613df2565b61241d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561172d57600080fd5b505af1158015611741573d6000803e3d6000fd5b505050506109248483612538565b80428110156117705760405162461bcd60e51b815260040161051390613c5b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106117ad576117ad613cb6565b90506020020160208101906117c29190613ccc565b6001600160a01b0316146117e85760405162461bcd60e51b815260040161051390613cf0565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118c77f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0b57610e0b613cb6565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611914573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119389190613e0b565b611944576119446136fc565b60008686611953600182613c9f565b81811061196257611962613cb6565b90506020020160208101906119779190613ccc565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156119bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e39190613df2565b9050611a23878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dfd915050565b87610fc1828989611a35600182613c9f565b818110611a4457611a44613cb6565b9050602002016020810190611a599190613ccc565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a0823190602401610f7a565b6000808242811015611aad5760405162461bcd60e51b815260040161051390613c5b565b6000611ada7f00000000000000000000000000000000000000000000000000000000000000008c8c61286b565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b549190613e0b565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613e28565b915091506000611bd58e8e61325d565b509050806001600160a01b03168e6001600160a01b031614611bf8578183611bfb565b82825b90975095508a871015611c205760405162461bcd60e51b815260040161051390613e4c565b89861015611c405760405162461bcd60e51b815260040161051390613e8e565b505050505097509795505050505050565b606061095c7f000000000000000000000000000000000000000000000000000000000000000084846126e0565b6000806000611cce7f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061286b565b9050600087611cdd578c611ce1565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d1c903390309086908f908e908e908e90600401613d6e565b600060405180830381600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b50505050611d5c8e8e8e8e8e8e6104ef565b909f909e509c50505050505050505050505050565b60008060008342811015611d975760405162461bcd60e51b815260040161051390613c5b565b611da58c8c8c8c8c8c613351565b90945092506000611dd77f00000000000000000000000000000000000000000000000000000000000000008e8e61286b565b9050611de58d338388612944565b611df18c338387612944565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613df2565b92505050985098509895505050505050565b60008060008342811015611e955760405162461bcd60e51b815260040161051390613c5b565b611ec38a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613351565b90945092506000611f157f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061286b565b9050611f238b338388612944565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7e57600080fd5b505af1158015611f92573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b9190613e0b565b612037576120376136fc565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561207f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a39190613df2565b9250833411156120c0576120c0336120bb8634613c9f565b612538565b505096509650969350505050565b606081428110156120f15760405162461bcd60e51b815260040161051390613c5b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061212e5761212e613cb6565b90506020020160208101906121439190613ccc565b6001600160a01b0316146121695760405162461bcd60e51b815260040161051390613cf0565b6121c77f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7c92505050565b915034826000815181106121dd576121dd613cb6565b602002602001015111156122035760405162461bcd60e51b815260040161051390613daf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061224557612245613cb6565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561227857600080fd5b505af115801561228c573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122f77f000000000000000000000000000000000000000000000000000000000000000089896000818110610e0b57610e0b613cb6565b8460008151811061230a5761230a613cb6565b60200260200101516040518363ffffffff1660e01b81526004016123439291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123869190613e0b565b612392576123926136fc565b6123d182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612a74915050565b816000815181106123e4576123e4613cb6565b602002602001015134111561151f5761151f338360008151811061240a5761240a613cb6565b6020026020010151346120bb9190613c9f565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916124799190613efc565b6000604051808303816000865af19150503d80600081146124b6576040519150601f19603f3d011682016040523d82523d6000602084013e6124bb565b606091505b50915091508180156124e55750805115806124e55750808060200190518101906124e59190613e0b565b6125315760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610513565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516125629190613efc565b60006040518083038185875af1925050503d806000811461259f576040519150601f19603f3d011682016040523d82523d6000602084013e6125a4565b606091505b50509050806126015760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610513565b505050565b60008084116126675760405162461bcd60e51b815260206004820152602760248201527f4e657875734c6962726172793a20494e53554646494349454e545f494e50555460448201526617d05353d5539560ca1b6064820152608401610513565b6000831180156126775750600082115b6126935760405162461bcd60e51b815260040161051390613f18565b60006126a1856103e5613576565b905060006126af8285613576565b905060006126c9836126c3886103e8613576565b906135dd565b90506126d58183613f5c565b979650505050505050565b60606002825110156127345760405162461bcd60e51b815260206004820152601a60248201527f4e657875734c6962726172793a20494e56414c49445f504154480000000000006044820152606401610513565b815167ffffffffffffffff81111561274e5761274e6138c0565b604051908082528060200260200182016040528015612777578160200160208202803683370190505b509050828160008151811061278e5761278e613cb6565b60200260200101818152505060005b600183516127ab9190613c9f565b811015612863576000806127fe878685815181106127cb576127cb613cb6565b6020026020010151878660016127e19190613f7e565b815181106127f1576127f1613cb6565b6020026020010151613632565b9150915061282684848151811061281757612817613cb6565b60200260200101518383612606565b84612832856001613f7e565b8151811061284257612842613cb6565b6020026020010181815250505050808061285b90613f96565b91505061279d565b509392505050565b600080600061287a858561325d565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016129229291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f69f87219435c6fe01b08d421b51fe0866c422f9b32e9e714e1f24068c99274fd603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916129a89190613efc565b6000604051808303816000865af19150503d80600081146129e5576040519150601f19603f3d011682016040523d82523d6000602084013e6129ea565b606091505b5091509150818015612a14575080511580612a14575080806020019051810190612a149190613e0b565b612a6c5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610513565b505050505050565b60005b60018351612a859190613c9f565b811015612c7657600080848381518110612aa157612aa1613cb6565b602002602001015185846001612ab79190613f7e565b81518110612ac757612ac7613cb6565b6020026020010151915091506000612adf838361325d565b509050600087612af0866001613f7e565b81518110612b0057612b00613cb6565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612b2e57826000612b32565b6000835b91509150600060028a51612b469190613c9f565b8810612b525788612ba0565b612ba07f0000000000000000000000000000000000000000000000000000000000000000878c612b838c6002613f7e565b81518110612b9357612b93613cb6565b602002602001015161286b565b9050612bcd7f0000000000000000000000000000000000000000000000000000000000000000888861286b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612c0a576020820181803683370190505b506040518563ffffffff1660e01b8152600401612c2a9493929190613fb1565b600060405180830381600087803b158015612c4457600080fd5b505af1158015612c58573d6000803e3d6000fd5b50505050505050505050508080612c6e90613f96565b915050612a77565b50505050565b6060600282511015612cd05760405162461bcd60e51b815260206004820152601a60248201527f4e657875734c6962726172793a20494e56414c49445f504154480000000000006044820152606401610513565b815167ffffffffffffffff811115612cea57612cea6138c0565b604051908082528060200260200182016040528015612d13578160200160208202803683370190505b509050828160018351612d269190613c9f565b81518110612d3657612d36613cb6565b602002602001018181525050600060018351612d529190613c9f565b90505b801561286357600080612d988786612d6e600187613c9f565b81518110612d7e57612d7e613cb6565b60200260200101518786815181106127f1576127f1613cb6565b91509150612dc0848481518110612db157612db1613cb6565b602002602001015183836130ec565b84612dcc600186613c9f565b81518110612ddc57612ddc613cb6565b60200260200101818152505050508080612df590614001565b915050612d55565b60005b60018351612e0e9190613c9f565b81101561260157600080848381518110612e2a57612e2a613cb6565b602002602001015185846001612e409190613f7e565b81518110612e5057612e50613cb6565b6020026020010151915091506000612e68838361325d565b5090506000612e987f0000000000000000000000000000000000000000000000000000000000000000858561286b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612ede573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f02919061402f565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614612f3c578284612f3f565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250612f7a918491908d16906370a0823190602401610f7a565b9550612f87868383612606565b945050505050600080856001600160a01b0316886001600160a01b031614612fb157826000612fb5565b6000835b91509150600060028c51612fc99190613c9f565b8a10612fd5578a613006565b6130067f0000000000000000000000000000000000000000000000000000000000000000898e612b838e6002613f7e565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906130489086908690869060248101613fb1565b600060405180830381600087803b15801561306257600080fd5b505af1158015613076573d6000803e3d6000fd5b50505050505050505050505050808061308e90613f96565b915050612e00565b6000826130a38382613c9f565b915081111561095f5760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610513565b600080841161314e5760405162461bcd60e51b815260206004820152602860248201527f4e657875734c6962726172793a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610513565b60008311801561315e5750600082115b61317a5760405162461bcd60e51b815260040161051390613f18565b60006131926103e861318c8688613576565b90613576565b905060006131a66103e561318c8689613096565b90506131b760016126c38385613f5c565b9695505050505050565b600080841161321c5760405162461bcd60e51b815260206004820152602160248201527f4e657875734c6962726172793a20494e53554646494349454e545f414d4f554e6044820152601560fa1b6064820152608401610513565b60008311801561322c5750600082115b6132485760405162461bcd60e51b815260040161051390613f18565b826132538584613576565b6105f89190613f5c565b600080826001600160a01b0316846001600160a01b031614156132cc5760405162461bcd60e51b815260206004820152602160248201527f4e657875734c6962726172793a204944454e544943414c5f41444452455353456044820152605360f81b6064820152608401610513565b826001600160a01b0316846001600160a01b0316106132ec5782846132ef565b83835b90925090506001600160a01b03821661334a5760405162461bcd60e51b815260206004820152601a60248201527f4e657875734c6962726172793a205a45524f5f414444524553530000000000006044820152606401610513565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa1580156133c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ec919061407f565b6001600160a01b03161415613491576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af115801561346b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348f919061407f565b505b6000806134bf7f00000000000000000000000000000000000000000000000000000000000000008b8b613632565b915091508160001480156134d1575080155b156134e157879350869250613569565b60006134ee8984846131c1565b905087811161352257858110156135175760405162461bcd60e51b815260040161051390613e8e565b889450925082613567565b600061352f8984866131c1565b905089811115613541576135416136fc565b878110156135615760405162461bcd60e51b815260040161051390613e4c565b94508793505b505b5050965096945050505050565b600081158061359a5750828261358c818361409c565b92506135989083613f5c565b145b61095f5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610513565b6000826135ea8382613f7e565b915081101561095f5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610513565b6000806000613641858561325d565b50905060008061365288888861286b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561368f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b3919061402f565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146136ea5780826136ed565b81815b90999098509650505050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461372757600080fd5b50565b803561373581613712565b919050565b60008060008060008060c0878903121561375357600080fd5b863561375e81613712565b9550602087013594506040870135935060608701359250608087013561378381613712565b8092505060a087013590509295509295509295565b6000806000606084860312156137ad57600080fd5b505081359360208301359350604090920135919050565b60008083601f8401126137d657600080fd5b50813567ffffffffffffffff8111156137ee57600080fd5b6020830191508360208260051b850101111561334a57600080fd5b60008060008060008060a0878903121561382257600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561384757600080fd5b61385389828a016137c4565b909550935050606087013561386781613712565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138b457835183529284019291840191600101613898565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156138e957600080fd5b8235915060208084013567ffffffffffffffff8082111561390957600080fd5b818601915086601f83011261391d57600080fd5b81358181111561392f5761392f6138c0565b8060051b604051601f19603f83011681018181108582111715613954576139546138c0565b60405291825284820192508381018501918983111561397257600080fd5b938501935b82851015613997576139888561372a565b84529385019392850192613977565b8096505050505050509250929050565b801515811461372757600080fd5b803560ff8116811461373557600080fd5b60008060008060008060008060008060006101608c8e0312156139e857600080fd5b8b356139f381613712565b9a5060208c0135613a0381613712565b995060408c0135985060608c0135975060808c0135965060a08c0135613a2881613712565b955060c08c0135945060e08c0135613a3f816139a7565b9350613a4e6101008d016139b5565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215613a9057600080fd5b8a35613a9b81613712565b995060208b0135985060408b0135975060608b0135965060808b0135613ac081613712565b955060a08b0135945060c08b0135613ad7816139a7565b9350613ae560e08c016139b5565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215613b1e57600080fd5b85359450602086013567ffffffffffffffff811115613b3c57600080fd5b613b48888289016137c4565b9095509350506040860135613b5c81613712565b949793965091946060013592915050565b600080600080600080600060e0888a031215613b8857600080fd5b8735613b9381613712565b96506020880135613ba381613712565b955060408801359450606088013593506080880135925060a0880135613bc881613712565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613bfc57600080fd5b8835613c0781613712565b97506020890135613c1781613712565b965060408901359550606089013594506080890135935060a0890135925060c0890135613c4381613712565b8092505060e089013590509295985092959890939650565b60208082526014908201527313995e1d5cd49bdd5d195c8e881156141254915160621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613cb157613cb1613c89565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613cde57600080fd5b8135613ce981613712565b9392505050565b60208082526019908201527f4e65787573526f757465723a20494e56414c49445f5041544800000000000000604082015260600190565b60208082526027908201527f4e65787573526f757465723a20494e53554646494349454e545f4f555450555460408201526617d05353d5539560ca1b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526023908201527f4e65787573526f757465723a204558434553534956455f494e5055545f414d4f60408201526215539560ea1b606082015260800190565b600060208284031215613e0457600080fd5b5051919050565b600060208284031215613e1d57600080fd5b8151613ce9816139a7565b60008060408385031215613e3b57600080fd5b505080516020909101519092909150565b60208082526022908201527f4e65787573526f757465723a20494e53554646494349454e545f415f414d4f55604082015261139560f21b606082015260800190565b60208082526022908201527f4e65787573526f757465723a20494e53554646494349454e545f425f414d4f55604082015261139560f21b606082015260800190565b60005b83811015613eeb578181015183820152602001613ed3565b83811115612c765750506000910152565b60008251613f0e818460208701613ed0565b9190910192915050565b60208082526024908201527f4e657875734c6962726172793a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b600082613f7957634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613f9157613f91613c89565b500190565b6000600019821415613faa57613faa613c89565b5060010190565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613fea8160a0850160208701613ed0565b601f01601f19169190910160a00195945050505050565b60008161401057614010613c89565b506000190190565b80516001600160701b038116811461373557600080fd5b60008060006060848603121561404457600080fd5b61404d84614018565b925061405b60208501614018565b9150604084015163ffffffff8116811461407457600080fd5b809150509250925092565b60006020828403121561409157600080fd5b8151613ce981613712565b60008160001904831182151516156140b6576140b6613c89565b50029056fea2646970667358221220b0ca4cbfbbff696540c2820cfffb79e88507d596d3d374328c52c3ab9f8f2ccc64736f6c634300080c0033000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c42
Deployed Bytecode
0x60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a01551461041a578063d06ca61f1461044e578063ded9382a1461046e578063e8e337001461048e578063f305d719146104c9578063fb3bdb41146104dc57600080fd5b80638803dbee1461033b578063ad5c46481461035b578063ad615dec146103a7578063af2979eb146103c7578063b6f9de95146103e7578063baa2abde146103fa57600080fd5b80634a25d94a116101085780634a25d94a146102885780635b0d5984146102a85780635c11d795146102c8578063791ac947146102e85780637ff36ab51461030857806385f8c2591461031b57600080fd5b806302751cec14610193578063054d50d4146101cd57806318cbafe5146101fb5780631f00ca74146102285780632195995c1461024857806338ed17391461026857600080fd5b3661018e57336001600160a01b037f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c42161461018c5761018c6136fc565b005b600080fd5b34801561019f57600080fd5b506101b36101ae36600461373a565b6104ef565b604080519283526020830191909152015b60405180910390f35b3480156101d957600080fd5b506101ed6101e8366004613798565b6105eb565b6040519081526020016101c4565b34801561020757600080fd5b5061021b610216366004613809565b610600565b6040516101c4919061387c565b34801561023457600080fd5b5061021b6102433660046138d6565b61092f565b34801561025457600080fd5b506101b36102633660046139c6565b610965565b34801561027457600080fd5b5061021b610283366004613809565b610a3e565b34801561029457600080fd5b5061021b6102a3366004613809565b610b5c565b3480156102b457600080fd5b506101ed6102c3366004613a70565b610c9a565b3480156102d457600080fd5b5061018c6102e3366004613809565b610d87565b3480156102f457600080fd5b5061018c610303366004613809565b610fe9565b61021b610316366004613b06565b611210565b34801561032757600080fd5b506101ed610336366004613798565b611529565b34801561034757600080fd5b5061021b610356366004613809565b611536565b34801561036757600080fd5b5061038f7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c4281565b6040516001600160a01b0390911681526020016101c4565b3480156103b357600080fd5b506101ed6103c2366004613798565b6115f3565b3480156103d357600080fd5b506101ed6103e236600461373a565b611600565b61018c6103f5366004613b06565b61174f565b34801561040657600080fd5b506101b3610415366004613b6d565b611a89565b34801561042657600080fd5b5061038f7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3181565b34801561045a57600080fd5b5061021b6104693660046138d6565b611c51565b34801561047a57600080fd5b506101b3610489366004613a70565b611c7e565b34801561049a57600080fd5b506104ae6104a9366004613bdf565b611d71565b604080519384526020840192909252908201526060016101c4565b6104ae6104d736600461373a565b611e6f565b61021b6104ea366004613b06565b6120ce565b600080824281101561051c5760405162461bcd60e51b815260040161051390613c5b565b60405180910390fd5b61054b897f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c428a8a8a308a611a89565b909350915061055b89868561241d565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156105bd57600080fd5b505af11580156105d1573d6000803e3d6000fd5b505050506105df8583612538565b50965096945050505050565b60006105f8848484612606565b949350505050565b606081428110156106235760405162461bcd60e51b815260040161051390613c5b565b6001600160a01b037f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c4216868661065a600182613c9f565b81811061066957610669613cb6565b905060200201602081019061067e9190613ccc565b6001600160a01b0316146106a45760405162461bcd60e51b815260040161051390613cf0565b6107027f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126e092505050565b91508682600184516107149190613c9f565b8151811061072457610724613cb6565b6020026020010151101561074a5760405162461bcd60e51b815260040161051390613d27565b61080f8686600081811061076057610760613cb6565b90506020020160208101906107759190613ccc565b336107ef7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318a8a60008181106107ad576107ad613cb6565b90506020020160208101906107c29190613ccc565b8b8b60018181106107d5576107d5613cb6565b90506020020160208101906107ea9190613ccc565b61286b565b8560008151811061080257610802613cb6565b6020026020010151612944565b61084e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612a74915050565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b0316632e1a7d4d836001855161088c9190613c9f565b8151811061089c5761089c613cb6565b60200260200101516040518263ffffffff1660e01b81526004016108c291815260200190565b600060405180830381600087803b1580156108dc57600080fd5b505af11580156108f0573d6000803e3d6000fd5b505050506109248483600185516109079190613c9f565b8151811061091757610917613cb6565b6020026020010151612538565b509695505050505050565b606061095c7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318484612c7c565b90505b92915050565b60008060006109957f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318f8f61286b565b90506000876109a4578c6109a8565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906109e3903390309086908f908e908e908e90600401613d6e565b600060405180830381600087803b1580156109fd57600080fd5b505af1158015610a11573d6000803e3d6000fd5b50505050610a248f8f8f8f8f8f8f611a89565b809450819550505050509b509b9950505050505050505050565b60608142811015610a615760405162461bcd60e51b815260040161051390613c5b565b610abf7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126e092505050565b9150868260018451610ad19190613c9f565b81518110610ae157610ae1613cb6565b60200260200101511015610b075760405162461bcd60e51b815260040161051390613d27565b610b1d8686600081811061076057610760613cb6565b61092482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612a74915050565b60608142811015610b7f5760405162461bcd60e51b815260040161051390613c5b565b6001600160a01b037f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c42168686610bb6600182613c9f565b818110610bc557610bc5613cb6565b9050602002016020810190610bda9190613ccc565b6001600160a01b031614610c005760405162461bcd60e51b815260040161051390613cf0565b610c5e7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3189888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7c92505050565b91508682600081518110610c7457610c74613cb6565b6020026020010151111561074a5760405162461bcd60e51b815260040161051390613daf565b600080610ce87f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318d7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c4261286b565b9050600086610cf7578b610cfb565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610d36903390309086908e908d908d908d90600401613d6e565b600060405180830381600087803b158015610d5057600080fd5b505af1158015610d64573d6000803e3d6000fd5b50505050610d768d8d8d8d8d8d611600565b9d9c50505050505050505050505050565b8042811015610da85760405162461bcd60e51b815260040161051390613c5b565b610e3985856000818110610dbe57610dbe613cb6565b9050602002016020810190610dd39190613ccc565b33610e337f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3189896000818110610e0b57610e0b613cb6565b9050602002016020810190610e209190613ccc565b8a8a60018181106107d5576107d5613cb6565b8a612944565b60008585610e48600182613c9f565b818110610e5757610e57613cb6565b9050602002016020810190610e6c9190613ccc565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed89190613df2565b9050610f18868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612dfd915050565b86610fc1828888610f2a600182613c9f565b818110610f3957610f39613cb6565b9050602002016020810190610f4e9190613ccc565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190613df2565b90613096565b1015610fdf5760405162461bcd60e51b815260040161051390613d27565b5050505050505050565b804281101561100a5760405162461bcd60e51b815260040161051390613c5b565b6001600160a01b037f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c42168585611041600182613c9f565b81811061105057611050613cb6565b90506020020160208101906110659190613ccc565b6001600160a01b03161461108b5760405162461bcd60e51b815260040161051390613cf0565b6110a185856000818110610dbe57610dbe613cb6565b6110df858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612dfd915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b0316906370a0823190602401602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190613df2565b90508681101561118c5760405162461bcd60e51b815260040161051390613d27565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b50505050610fdf8482612538565b606081428110156112335760405162461bcd60e51b815260040161051390613c5b565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b03168686600081811061127057611270613cb6565b90506020020160208101906112859190613ccc565b6001600160a01b0316146112ab5760405162461bcd60e51b815260040161051390613cf0565b6113097f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126e092505050565b915086826001845161131b9190613c9f565b8151811061132b5761132b613cb6565b602002602001015110156113515760405162461bcd60e51b815260040161051390613d27565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663d0e30db08360008151811061139357611393613cb6565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050507f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663a9059cbb6114457f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3189896000818110610e0b57610e0b613cb6565b8460008151811061145857611458613cb6565b60200260200101516040518363ffffffff1660e01b81526004016114919291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190613e0b565b6114e0576114e06136fc565b61151f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612a74915050565b5095945050505050565b60006105f88484846130ec565b606081428110156115595760405162461bcd60e51b815260040161051390613c5b565b6115b77f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3189888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7c92505050565b915086826000815181106115cd576115cd613cb6565b60200260200101511115610b075760405162461bcd60e51b815260040161051390613daf565b60006105f88484846131c1565b600081428110156116235760405162461bcd60e51b815260040161051390613c5b565b611652887f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c428989893089611a89565b6040516370a0823160e01b81523060048201529093506116cb9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa1580156116a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c69190613df2565b61241d565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561172d57600080fd5b505af1158015611741573d6000803e3d6000fd5b505050506109248483612538565b80428110156117705760405162461bcd60e51b815260040161051390613c5b565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b0316858560008181106117ad576117ad613cb6565b90506020020160208101906117c29190613ccc565b6001600160a01b0316146117e85760405162461bcd60e51b815260040161051390613cf0565b60003490507f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050507f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663a9059cbb6118c77f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3189896000818110610e0b57610e0b613cb6565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611914573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119389190613e0b565b611944576119446136fc565b60008686611953600182613c9f565b81811061196257611962613cb6565b90506020020160208101906119779190613ccc565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156119bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e39190613df2565b9050611a23878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612dfd915050565b87610fc1828989611a35600182613c9f565b818110611a4457611a44613cb6565b9050602002016020810190611a599190613ccc565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a0823190602401610f7a565b6000808242811015611aad5760405162461bcd60e51b815260040161051390613c5b565b6000611ada7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318c8c61286b565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b549190613e0b565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613e28565b915091506000611bd58e8e61325d565b509050806001600160a01b03168e6001600160a01b031614611bf8578183611bfb565b82825b90975095508a871015611c205760405162461bcd60e51b815260040161051390613e4c565b89861015611c405760405162461bcd60e51b815260040161051390613e8e565b505050505097509795505050505050565b606061095c7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3184846126e0565b6000806000611cce7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318e7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c4261286b565b9050600087611cdd578c611ce1565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d1c903390309086908f908e908e908e90600401613d6e565b600060405180830381600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b50505050611d5c8e8e8e8e8e8e6104ef565b909f909e509c50505050505050505050505050565b60008060008342811015611d975760405162461bcd60e51b815260040161051390613c5b565b611da58c8c8c8c8c8c613351565b90945092506000611dd77f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318e8e61286b565b9050611de58d338388612944565b611df18c338387612944565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613df2565b92505050985098509895505050505050565b60008060008342811015611e955760405162461bcd60e51b815260040161051390613c5b565b611ec38a7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c428b348c8c613351565b90945092506000611f157f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318c7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c4261286b565b9050611f238b338388612944565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7e57600080fd5b505af1158015611f92573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c4216935063a9059cbb925060440190506020604051808303816000875af1158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b9190613e0b565b612037576120376136fc565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561207f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a39190613df2565b9250833411156120c0576120c0336120bb8634613c9f565b612538565b505096509650969350505050565b606081428110156120f15760405162461bcd60e51b815260040161051390613c5b565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b03168686600081811061212e5761212e613cb6565b90506020020160208101906121439190613ccc565b6001600160a01b0316146121695760405162461bcd60e51b815260040161051390613cf0565b6121c77f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3188888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c7c92505050565b915034826000815181106121dd576121dd613cb6565b602002602001015111156122035760405162461bcd60e51b815260040161051390613daf565b7f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663d0e30db08360008151811061224557612245613cb6565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561227857600080fd5b505af115801561228c573d6000803e3d6000fd5b50505050507f000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c426001600160a01b031663a9059cbb6122f77f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd3189896000818110610e0b57610e0b613cb6565b8460008151811061230a5761230a613cb6565b60200260200101516040518363ffffffff1660e01b81526004016123439291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123869190613e0b565b612392576123926136fc565b6123d182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612a74915050565b816000815181106123e4576123e4613cb6565b602002602001015134111561151f5761151f338360008151811061240a5761240a613cb6565b6020026020010151346120bb9190613c9f565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916124799190613efc565b6000604051808303816000865af19150503d80600081146124b6576040519150601f19603f3d011682016040523d82523d6000602084013e6124bb565b606091505b50915091508180156124e55750805115806124e55750808060200190518101906124e59190613e0b565b6125315760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610513565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516125629190613efc565b60006040518083038185875af1925050503d806000811461259f576040519150601f19603f3d011682016040523d82523d6000602084013e6125a4565b606091505b50509050806126015760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610513565b505050565b60008084116126675760405162461bcd60e51b815260206004820152602760248201527f4e657875734c6962726172793a20494e53554646494349454e545f494e50555460448201526617d05353d5539560ca1b6064820152608401610513565b6000831180156126775750600082115b6126935760405162461bcd60e51b815260040161051390613f18565b60006126a1856103e5613576565b905060006126af8285613576565b905060006126c9836126c3886103e8613576565b906135dd565b90506126d58183613f5c565b979650505050505050565b60606002825110156127345760405162461bcd60e51b815260206004820152601a60248201527f4e657875734c6962726172793a20494e56414c49445f504154480000000000006044820152606401610513565b815167ffffffffffffffff81111561274e5761274e6138c0565b604051908082528060200260200182016040528015612777578160200160208202803683370190505b509050828160008151811061278e5761278e613cb6565b60200260200101818152505060005b600183516127ab9190613c9f565b811015612863576000806127fe878685815181106127cb576127cb613cb6565b6020026020010151878660016127e19190613f7e565b815181106127f1576127f1613cb6565b6020026020010151613632565b9150915061282684848151811061281757612817613cb6565b60200260200101518383612606565b84612832856001613f7e565b8151811061284257612842613cb6565b6020026020010181815250505050808061285b90613f96565b91505061279d565b509392505050565b600080600061287a858561325d565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016129229291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f69f87219435c6fe01b08d421b51fe0866c422f9b32e9e714e1f24068c99274fd603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916129a89190613efc565b6000604051808303816000865af19150503d80600081146129e5576040519150601f19603f3d011682016040523d82523d6000602084013e6129ea565b606091505b5091509150818015612a14575080511580612a14575080806020019051810190612a149190613e0b565b612a6c5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610513565b505050505050565b60005b60018351612a859190613c9f565b811015612c7657600080848381518110612aa157612aa1613cb6565b602002602001015185846001612ab79190613f7e565b81518110612ac757612ac7613cb6565b6020026020010151915091506000612adf838361325d565b509050600087612af0866001613f7e565b81518110612b0057612b00613cb6565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612b2e57826000612b32565b6000835b91509150600060028a51612b469190613c9f565b8810612b525788612ba0565b612ba07f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31878c612b838c6002613f7e565b81518110612b9357612b93613cb6565b602002602001015161286b565b9050612bcd7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31888861286b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612c0a576020820181803683370190505b506040518563ffffffff1660e01b8152600401612c2a9493929190613fb1565b600060405180830381600087803b158015612c4457600080fd5b505af1158015612c58573d6000803e3d6000fd5b50505050505050505050508080612c6e90613f96565b915050612a77565b50505050565b6060600282511015612cd05760405162461bcd60e51b815260206004820152601a60248201527f4e657875734c6962726172793a20494e56414c49445f504154480000000000006044820152606401610513565b815167ffffffffffffffff811115612cea57612cea6138c0565b604051908082528060200260200182016040528015612d13578160200160208202803683370190505b509050828160018351612d269190613c9f565b81518110612d3657612d36613cb6565b602002602001018181525050600060018351612d529190613c9f565b90505b801561286357600080612d988786612d6e600187613c9f565b81518110612d7e57612d7e613cb6565b60200260200101518786815181106127f1576127f1613cb6565b91509150612dc0848481518110612db157612db1613cb6565b602002602001015183836130ec565b84612dcc600186613c9f565b81518110612ddc57612ddc613cb6565b60200260200101818152505050508080612df590614001565b915050612d55565b60005b60018351612e0e9190613c9f565b81101561260157600080848381518110612e2a57612e2a613cb6565b602002602001015185846001612e409190613f7e565b81518110612e5057612e50613cb6565b6020026020010151915091506000612e68838361325d565b5090506000612e987f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31858561286b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612ede573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f02919061402f565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614612f3c578284612f3f565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250612f7a918491908d16906370a0823190602401610f7a565b9550612f87868383612606565b945050505050600080856001600160a01b0316886001600160a01b031614612fb157826000612fb5565b6000835b91509150600060028c51612fc99190613c9f565b8a10612fd5578a613006565b6130067f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31898e612b838e6002613f7e565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906130489086908690869060248101613fb1565b600060405180830381600087803b15801561306257600080fd5b505af1158015613076573d6000803e3d6000fd5b50505050505050505050505050808061308e90613f96565b915050612e00565b6000826130a38382613c9f565b915081111561095f5760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610513565b600080841161314e5760405162461bcd60e51b815260206004820152602860248201527f4e657875734c6962726172793a20494e53554646494349454e545f4f555450556044820152671517d05353d5539560c21b6064820152608401610513565b60008311801561315e5750600082115b61317a5760405162461bcd60e51b815260040161051390613f18565b60006131926103e861318c8688613576565b90613576565b905060006131a66103e561318c8689613096565b90506131b760016126c38385613f5c565b9695505050505050565b600080841161321c5760405162461bcd60e51b815260206004820152602160248201527f4e657875734c6962726172793a20494e53554646494349454e545f414d4f554e6044820152601560fa1b6064820152608401610513565b60008311801561322c5750600082115b6132485760405162461bcd60e51b815260040161051390613f18565b826132538584613576565b6105f89190613f5c565b600080826001600160a01b0316846001600160a01b031614156132cc5760405162461bcd60e51b815260206004820152602160248201527f4e657875734c6962726172793a204944454e544943414c5f41444452455353456044820152605360f81b6064820152608401610513565b826001600160a01b0316846001600160a01b0316106132ec5782846132ef565b83835b90925090506001600160a01b03821661334a5760405162461bcd60e51b815260206004820152601a60248201527f4e657875734c6962726172793a205a45524f5f414444524553530000000000006044820152606401610513565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd319091169063e6a4390590604401602060405180830381865afa1580156133c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ec919061407f565b6001600160a01b03161415613491576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31169063c9c65396906044016020604051808303816000875af115801561346b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348f919061407f565b505b6000806134bf7f000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd318b8b613632565b915091508160001480156134d1575080155b156134e157879350869250613569565b60006134ee8984846131c1565b905087811161352257858110156135175760405162461bcd60e51b815260040161051390613e8e565b889450925082613567565b600061352f8984866131c1565b905089811115613541576135416136fc565b878110156135615760405162461bcd60e51b815260040161051390613e4c565b94508793505b505b5050965096945050505050565b600081158061359a5750828261358c818361409c565b92506135989083613f5c565b145b61095f5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610513565b6000826135ea8382613f7e565b915081101561095f5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610513565b6000806000613641858561325d565b50905060008061365288888861286b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561368f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b3919061402f565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146136ea5780826136ed565b81815b90999098509650505050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461372757600080fd5b50565b803561373581613712565b919050565b60008060008060008060c0878903121561375357600080fd5b863561375e81613712565b9550602087013594506040870135935060608701359250608087013561378381613712565b8092505060a087013590509295509295509295565b6000806000606084860312156137ad57600080fd5b505081359360208301359350604090920135919050565b60008083601f8401126137d657600080fd5b50813567ffffffffffffffff8111156137ee57600080fd5b6020830191508360208260051b850101111561334a57600080fd5b60008060008060008060a0878903121561382257600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561384757600080fd5b61385389828a016137c4565b909550935050606087013561386781613712565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138b457835183529284019291840191600101613898565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156138e957600080fd5b8235915060208084013567ffffffffffffffff8082111561390957600080fd5b818601915086601f83011261391d57600080fd5b81358181111561392f5761392f6138c0565b8060051b604051601f19603f83011681018181108582111715613954576139546138c0565b60405291825284820192508381018501918983111561397257600080fd5b938501935b82851015613997576139888561372a565b84529385019392850192613977565b8096505050505050509250929050565b801515811461372757600080fd5b803560ff8116811461373557600080fd5b60008060008060008060008060008060006101608c8e0312156139e857600080fd5b8b356139f381613712565b9a5060208c0135613a0381613712565b995060408c0135985060608c0135975060808c0135965060a08c0135613a2881613712565b955060c08c0135945060e08c0135613a3f816139a7565b9350613a4e6101008d016139b5565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215613a9057600080fd5b8a35613a9b81613712565b995060208b0135985060408b0135975060608b0135965060808b0135613ac081613712565b955060a08b0135945060c08b0135613ad7816139a7565b9350613ae560e08c016139b5565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215613b1e57600080fd5b85359450602086013567ffffffffffffffff811115613b3c57600080fd5b613b48888289016137c4565b9095509350506040860135613b5c81613712565b949793965091946060013592915050565b600080600080600080600060e0888a031215613b8857600080fd5b8735613b9381613712565b96506020880135613ba381613712565b955060408801359450606088013593506080880135925060a0880135613bc881613712565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613bfc57600080fd5b8835613c0781613712565b97506020890135613c1781613712565b965060408901359550606089013594506080890135935060a0890135925060c0890135613c4381613712565b8092505060e089013590509295985092959890939650565b60208082526014908201527313995e1d5cd49bdd5d195c8e881156141254915160621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613cb157613cb1613c89565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613cde57600080fd5b8135613ce981613712565b9392505050565b60208082526019908201527f4e65787573526f757465723a20494e56414c49445f5041544800000000000000604082015260600190565b60208082526027908201527f4e65787573526f757465723a20494e53554646494349454e545f4f555450555460408201526617d05353d5539560ca1b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526023908201527f4e65787573526f757465723a204558434553534956455f494e5055545f414d4f60408201526215539560ea1b606082015260800190565b600060208284031215613e0457600080fd5b5051919050565b600060208284031215613e1d57600080fd5b8151613ce9816139a7565b60008060408385031215613e3b57600080fd5b505080516020909101519092909150565b60208082526022908201527f4e65787573526f757465723a20494e53554646494349454e545f415f414d4f55604082015261139560f21b606082015260800190565b60208082526022908201527f4e65787573526f757465723a20494e53554646494349454e545f425f414d4f55604082015261139560f21b606082015260800190565b60005b83811015613eeb578181015183820152602001613ed3565b83811115612c765750506000910152565b60008251613f0e818460208701613ed0565b9190910192915050565b60208082526024908201527f4e657875734c6962726172793a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b600082613f7957634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613f9157613f91613c89565b500190565b6000600019821415613faa57613faa613c89565b5060010190565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613fea8160a0850160208701613ed0565b601f01601f19169190910160a00195945050505050565b60008161401057614010613c89565b506000190190565b80516001600160701b038116811461373557600080fd5b60008060006060848603121561404457600080fd5b61404d84614018565b925061405b60208501614018565b9150604084015163ffffffff8116811461407457600080fd5b809150509250925092565b60006020828403121561409157600080fd5b8151613ce981613712565b60008160001904831182151516156140b6576140b6613c89565b50029056fea2646970667358221220b0ca4cbfbbff696540c2820cfffb79e88507d596d3d374328c52c3ab9f8f2ccc64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c42
-----Decoded View---------------
Arg [0] : _factory (address): 0xAf2977827a72e3CfE18104b0EDAF61Dd0689cd31
Arg [1] : _WETH (address): 0x951857744785E80e2De051c32EE7b25f9c458C42
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000af2977827a72e3cfe18104b0edaf61dd0689cd31
Arg [1] : 000000000000000000000000951857744785e80e2de051c32ee7b25f9c458c42
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.