Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 27,402 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Remove Liquidity... | 21350361 | 449 days ago | IN | 0 ETH | 0.00241776 | ||||
| Remove Liquidity... | 21350092 | 449 days ago | IN | 0 ETH | 0.00255323 | ||||
| Swap Exact ETH F... | 20453299 | 574 days ago | IN | 0.0015 ETH | 0.00002341 | ||||
| Swap Exact ETH F... | 20409071 | 580 days ago | IN | 0.001 ETH | 0.00002381 | ||||
| Swap Exact ETH F... | 20408357 | 581 days ago | IN | 0.001 ETH | 0.00002341 | ||||
| Swap Exact Token... | 15287969 | 1303 days ago | IN | 0 ETH | 0.00089796 | ||||
| Swap Exact Token... | 15285612 | 1304 days ago | IN | 0 ETH | 0.00150209 | ||||
| Swap Exact Token... | 15285032 | 1304 days ago | IN | 0 ETH | 0.00140627 | ||||
| Swap Exact Token... | 15281771 | 1304 days ago | IN | 0 ETH | 0.00087024 | ||||
| Swap Exact Token... | 15281729 | 1304 days ago | IN | 0 ETH | 0.00095093 | ||||
| Swap Exact Token... | 15278434 | 1305 days ago | IN | 0 ETH | 0.00150869 | ||||
| Swap Exact Token... | 15276121 | 1305 days ago | IN | 0 ETH | 0.0010568 | ||||
| Swap Exact Token... | 15275561 | 1305 days ago | IN | 0 ETH | 0.0008795 | ||||
| Swap Exact Token... | 15275524 | 1305 days ago | IN | 0 ETH | 0.00097142 | ||||
| Swap Exact Token... | 15275494 | 1305 days ago | IN | 0 ETH | 0.00092986 | ||||
| Swap Exact Token... | 15272919 | 1305 days ago | IN | 0 ETH | 0.00089268 | ||||
| Swap Exact Token... | 15272863 | 1305 days ago | IN | 0 ETH | 0.00151497 | ||||
| Swap Exact Token... | 15272720 | 1306 days ago | IN | 0 ETH | 0.00119916 | ||||
| Swap Exact Token... | 15269078 | 1306 days ago | IN | 0 ETH | 0.00177933 | ||||
| Swap Exact Token... | 15267596 | 1306 days ago | IN | 0 ETH | 0.00107389 | ||||
| Swap Exact Token... | 15267579 | 1306 days ago | IN | 0 ETH | 0.00074067 | ||||
| Swap Exact Token... | 15267416 | 1306 days ago | IN | 0 ETH | 0.00078167 | ||||
| Swap Exact Token... | 15266100 | 1307 days ago | IN | 0 ETH | 0.00086798 | ||||
| Swap Exact Token... | 15265994 | 1307 days ago | IN | 0 ETH | 0.00100684 | ||||
| Swap Exact Token... | 15262887 | 1307 days ago | IN | 0 ETH | 0.00060024 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 21350361 | 449 days ago | 0.01131555 ETH | ||||
| Transfer | 21350361 | 449 days ago | 0.01131555 ETH | ||||
| Transfer | 15240415 | 1311 days ago | 0.00017392 ETH | ||||
| Deposit | 15240415 | 1311 days ago | 0.00052607 ETH | ||||
| - | 14154059 | 1484 days ago | 0.43431731 ETH | ||||
| - | 14154059 | 1484 days ago | 0.43431731 ETH | ||||
| - | 13691096 | 1556 days ago | 0.91860914 ETH | ||||
| - | 13691096 | 1556 days ago | 0.91860914 ETH | ||||
| - | 13691087 | 1556 days ago | 0.92650795 ETH | ||||
| - | 13691087 | 1556 days ago | 0.92650795 ETH | ||||
| - | 13674079 | 1559 days ago | 0.98589045 ETH | ||||
| - | 13674079 | 1559 days ago | 0.98589045 ETH | ||||
| - | 13673593 | 1559 days ago | 1.04 ETH | ||||
| - | 13673174 | 1559 days ago | 1 ETH | ||||
| - | 13672865 | 1559 days ago | 1.12 ETH | ||||
| - | 13672605 | 1559 days ago | 1.09 ETH | ||||
| - | 13665766 | 1560 days ago | 0.98 ETH | ||||
| - | 13665253 | 1560 days ago | 0.69703112 ETH | ||||
| - | 13665253 | 1560 days ago | 0.69703112 ETH | ||||
| - | 13635971 | 1565 days ago | 1.04 ETH | ||||
| - | 13633597 | 1565 days ago | 1.085 ETH | ||||
| - | 13632775 | 1565 days ago | 1.33 ETH | ||||
| - | 13632768 | 1565 days ago | 1.31 ETH | ||||
| - | 13632746 | 1565 days ago | 1.24 ETH | ||||
| - | 13625717 | 1566 days ago | 0.79129484 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LinkswapRouter
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.6.6;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./interfaces/ILinkswapFactory.sol";
import "./interfaces/ILinkswapPair.sol";
import "./interfaces/ILinkswapRouter.sol";
import "./interfaces/IWETH.sol";
import "./libraries/LinkswapLibrary.sol";
import "./libraries/SafeMathLinkswap.sol";
import "./libraries/TransferHelper.sol";
contract LinkswapRouter is ILinkswapRouter {
using SafeMathLinkswap for uint256;
address public immutable override factory;
address public immutable override WETH;
modifier ensure(uint256 deadline) {
require(deadline >= block.timestamp, "LinkswapRouter: EXPIRED");
_;
}
constructor(address _factory, address _WETH) public {
factory = _factory;
WETH = _WETH;
}
receive() external payable {
assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
}
// **** CREATE PAIR ****
// ETH amount must cover listing fee (if listingFeeToken==ETH) and lockupTokenAmount (if lockupToken==ETH)
// approvals (for WETH, newToken, lockupToken) must be done beforehand
function createPairUsingETH(
address newToken,
uint256 newTokenAmount,
address lockupToken,
uint256 lockupTokenAmount,
uint256 lockupPeriod,
address listingFeeToken
) external payable virtual override returns (address pair) {
IWETH(WETH).deposit{value: msg.value}();
IERC20(WETH).approve(factory, msg.value);
pair = ILinkswapFactory(factory).createPair(
newToken,
newTokenAmount,
lockupToken,
lockupTokenAmount,
lockupPeriod,
listingFeeToken
);
// refund dust eth, if any
TransferHelper.safeTransfer(WETH, msg.sender, IERC20(WETH).balanceOf(address(this)));
}
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin
) internal view virtual returns (uint256 amountA, uint256 amountB) {
require(ILinkswapFactory(factory).getPair(tokenA, tokenB) != address(0), "LinkswapRouter: PAIR_NOT_CREATED");
(uint256 reserveA, uint256 reserveB) = LinkswapLibrary.getReserves(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint256 amountBOptimal = LinkswapLibrary.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, "LinkswapRouter: INSUFFICIENT_B_AMOUNT");
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint256 amountAOptimal = LinkswapLibrary.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, "LinkswapRouter: INSUFFICIENT_A_AMOUNT");
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
)
{
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = LinkswapLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = ILinkswapPair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
)
{
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = LinkswapLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value: amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = ILinkswapPair(pair).mint(to);
// refund dust eth, if any
if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}
// **** REMOVE LIQUIDITY ****
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
address pair = LinkswapLibrary.pairFor(factory, tokenA, tokenB);
IERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint256 amount0, uint256 amount1) = ILinkswapPair(pair).burn(to);
(address token0, ) = LinkswapLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, "LinkswapRouter: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "LinkswapRouter: INSUFFICIENT_B_AMOUNT");
}
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
(amountToken, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(token, to, amountToken);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountA, uint256 amountB) {
address pair = LinkswapLibrary.pairFor(factory, tokenA, tokenB);
uint256 value = approveMax ? uint256(-1) : liquidity;
ILinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
}
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountToken, uint256 amountETH) {
address pair = LinkswapLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? uint256(-1) : liquidity;
ILinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
}
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) public virtual override ensure(deadline) returns (uint256 amountETH) {
(, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountETH) {
address pair = LinkswapLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? uint256(-1) : liquidity;
ILinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
token,
liquidity,
amountTokenMin,
amountETHMin,
to,
deadline
);
}
// **** SWAP ****
// requires the initial amount to have already been sent to the first pair
function _swap(
uint256[] memory amounts,
address[] memory path,
address _to
) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = LinkswapLibrary.sortTokens(input, output);
uint256 amountOut = amounts[i + 1];
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOut)
: (amountOut, uint256(0));
address to = i < path.length - 2 ? LinkswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
ILinkswapPair(LinkswapLibrary.pairFor(factory, input, output)).swap(
amount0Out,
amount1Out,
to,
new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
amounts = LinkswapLibrary.getAmountsOut(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
LinkswapLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
amounts = LinkswapLibrary.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= amountInMax, "LinkswapRouter: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
LinkswapLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WETH, "LinkswapRouter: INVALID_PATH");
amounts = LinkswapLibrary.getAmountsOut(factory, msg.value, path);
require(amounts[amounts.length - 1] >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).deposit{value: amounts[0]}();
assert(IWETH(WETH).transfer(LinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
}
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
require(path[path.length - 1] == WETH, "LinkswapRouter: INVALID_PATH");
amounts = LinkswapLibrary.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= amountInMax, "LinkswapRouter: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
LinkswapLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
require(path[path.length - 1] == WETH, "LinkswapRouter: INVALID_PATH");
amounts = LinkswapLibrary.getAmountsOut(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
LinkswapLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WETH, "LinkswapRouter: INVALID_PATH");
amounts = LinkswapLibrary.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= msg.value, "LinkswapRouter: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{value: amounts[0]}();
assert(IWETH(WETH).transfer(LinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
// refund dust eth, if any
if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
}
// **** SWAP (supporting fee-on-transfer tokens) ****
// requires the initial amount to have already been sent to the first pair
function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = LinkswapLibrary.sortTokens(input, output);
ILinkswapPair pair = ILinkswapPair(LinkswapLibrary.pairFor(factory, input, output));
uint256 amountInput;
uint256 amountOutput;
{
// scope to avoid stack too deep errors
(uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
(uint256 reserveInput, uint256 reserveOutput) = input == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
amountOutput = LinkswapLibrary.getAmountOut(
amountInput,
reserveInput,
reserveOutput,
pair.tradingFeePercent()
);
}
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOutput)
: (amountOutput, uint256(0));
address to = i < path.length - 2 ? LinkswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
LinkswapLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
"LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual override ensure(deadline) {
require(path[0] == WETH, "LinkswapRouter: INVALID_PATH");
uint256 amountIn = msg.value;
IWETH(WETH).deposit{value: amountIn}();
assert(IWETH(WETH).transfer(LinkswapLibrary.pairFor(factory, path[0], path[1]), amountIn));
uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
"LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) {
require(path[path.length - 1] == WETH, "LinkswapRouter: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
LinkswapLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint256 amountOut = IERC20(WETH).balanceOf(address(this));
require(amountOut >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** LIBRARY FUNCTIONS ****
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) public pure virtual override returns (uint256 amountB) {
return LinkswapLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut,
uint256 tradingFeePercent
) public pure virtual override returns (uint256 amountOut) {
return LinkswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut, tradingFeePercent);
}
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut,
uint256 tradingFeePercent
) public pure virtual override returns (uint256 amountIn) {
return LinkswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut, tradingFeePercent);
}
function getAmountsOut(uint256 amountIn, address[] memory path)
public
view
virtual
override
returns (uint256[] memory amounts)
{
return LinkswapLibrary.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(uint256 amountOut, address[] memory path)
public
view
virtual
override
returns (uint256[] memory amounts)
{
return LinkswapLibrary.getAmountsIn(factory, amountOut, path);
}
}pragma solidity 0.6.6;
interface ILinkswapERC20 {
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;
}pragma solidity 0.6.6;
interface ILinkswapFactory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint256 pairNum);
function LINK() external view returns (address);
function WETH() external view returns (address);
function YFL() external view returns (address);
function governance() external view returns (address);
function treasury() external view returns (address);
function priceOracle() external view returns (address);
// USD amounts should be 8 dp precision
// frontend should approve transfer of higher amount (e.g. 1.1x) due to price fluctuations
function linkListingFeeInUsd() external view returns (uint256);
function wethListingFeeInUsd() external view returns (uint256);
function yflListingFeeInUsd() external view returns (uint256);
// need to divide share by 1,000,000 e.g. 100,000 is 10%
// the rest goes to governance
function treasuryListingFeeShare() external view returns (uint256);
function minListingLockupAmountInUsd() external view returns (uint256);
// if lockup amount is set to this or more, the lockup amount proportion of listing fee discount is fully unlocked
// if less than this amount, then lockup amount proportion of listing fee discount is linearly interpolated from the distance between min and target lockup amounts e.g. 60% towards target from min means 60% of lockup amount discount
function targetListingLockupAmountInUsd() external view returns (uint256);
// in seconds since unix epoch
// min lockup period for the listing lockup amount
function minListingLockupPeriod() external view returns (uint256);
// in seconds since unix epoch
// if lockup period is set to this or longer, the lockup time proportion of listing fee discount is fully unlocked
// if less than this period, then lockup time proportion of listing fee discount is linearly interpolated from the distance between min and target lockup times e.g. 60% towards target from min means 60% of lockup time discount
function targetListingLockupPeriod() external view returns (uint256);
// need to divide share by 1,000,000 e.g. 100,000 is 10%
// rest of listing fee discount is determined by lockup period
function lockupAmountListingFeeDiscountShare() external view returns (uint256);
// need to divide fee percents by 1,000,000 e.g. 3000 is 0.3000%
function defaultLinkTradingFeePercent() external view returns (uint256);
function defaultNonLinkTradingFeePercent() external view returns (uint256);
// need to divide share by 1,000,000 e.g. 100,000 is 10%
// the rest goes to governance
function treasuryProtocolFeeShare() external view returns (uint256);
// inverse of protocol fee fraction, then multiplied by 1000.
// e.g. if protocol fee is 3/7th of trading fee, then value = 7/3 * 1000 = 2333
// set to 0 to disable protocol fee
function protocolFeeFractionInverse() external view returns (uint256);
// need to divide by 100 e.g. 50 is 50%
function maxSlippagePercent() external view returns (uint256);
// max slippage resets after this many blocks
function maxSlippageBlocks() external view returns (uint256);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function approvedPair(address tokenA, address tokenB) external view returns (bool approved);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function approvePairViaGovernance(address tokenA, address tokenB) external;
function createPair(
address newToken,
uint256 newTokenAmount,
address lockupToken, // LINK or WETH
uint256 lockupTokenAmount,
uint256 lockupPeriod,
address listingFeeToken
) external returns (address pair);
function setPriceOracle(address) external;
function setTreasury(address) external;
function setGovernance(address) external;
function setTreasuryProtocolFeeShare(uint256) external;
function setProtocolFeeFractionInverse(uint256) external;
function setLinkListingFeeInUsd(uint256) external;
function setWethListingFeeInUsd(uint256) external;
function setYflListingFeeInUsd(uint256) external;
function setTreasuryListingFeeShare(uint256) external;
function setMinListingLockupAmountInUsd(uint256) external;
function setTargetListingLockupAmountInUsd(uint256) external;
function setMinListingLockupPeriod(uint256) external;
function setTargetListingLockupPeriod(uint256) external;
function setLockupAmountListingFeeDiscountShare(uint256) external;
function setDefaultLinkTradingFeePercent(uint256) external;
function setDefaultNonLinkTradingFeePercent(uint256) external;
function setMaxSlippagePercent(uint256) external;
function setMaxSlippageBlocks(uint256) external;
}pragma solidity 0.6.6;
import "./ILinkswapERC20.sol";
interface ILinkswapPair is ILinkswapERC20 {
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Lock(address indexed sender, uint256 lockupPeriod, uint256 liquidityLockupAmount);
event Unlock(address indexed sender, uint256 liquidityUnlocked);
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 addressToLockupExpiry(address) external view returns (uint256);
function addressToLockupAmount(address) external view 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 tradingFeePercent() external view returns (uint256);
function lastSlippageBlocks() external view returns (uint256);
function priceAtLastSlippageBlocks() external view returns (uint256);
function lastSwapPrice() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function lock(uint256 lockupPeriod, uint256 liquidityLockupAmount) external;
function unlock() external;
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 setTradingFeePercent(uint256 _tradingFeePercent) external;
// functions only callable by LinkswapFactory
function initialize(
address _token0,
address _token1,
uint256 _tradingFeePercent
) external;
function listingLock(
address lister,
uint256 lockupPeriod,
uint256 liquidityLockupAmount
) external;
}pragma solidity 0.6.6;
interface ILinkswapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function createPairUsingETH(
address newToken,
uint256 newTokenAmount,
address lockupToken,
uint256 lockupTokenAmount,
uint256 lockupPeriod,
address listingFeeToken
) external payable returns (address pair);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut,
uint256 tradingFeePercent
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut,
uint256 tradingFeePercent
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}pragma solidity 0.6.6;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
}pragma solidity 0.6.6;
import "../interfaces/ILinkswapFactory.sol";
import "../interfaces/ILinkswapPair.sol";
import "./SafeMathLinkswap.sol";
library LinkswapLibrary {
using SafeMathLinkswap for uint256;
// returns sorted token addresses, used to handle return values from pairs sorted in this order
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, "LinkswapLibrary: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), "LinkswapLibrary: ZERO_ADDRESS");
}
function pairFor(
address factory,
address tokenA,
address tokenB
) internal view returns (address pair) {
pair = ILinkswapFactory(factory).getPair(tokenA, tokenB);
}
// fetches and sorts the reserves for a pair
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint256 reserveA, uint256 reserveB) {
(address token0, ) = sortTokens(tokenA, tokenB);
(uint256 reserve0, uint256 reserve1, ) = ILinkswapPair(ILinkswapFactory(factory).getPair(tokenA, tokenB))
.getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) internal pure returns (uint256 amountB) {
require(amountA > 0, "LinkswapLibrary: INSUFFICIENT_AMOUNT");
require(reserveA > 0 && reserveB > 0, "LinkswapLibrary: INSUFFICIENT_LIQUIDITY");
amountB = amountA.mul(reserveB) / reserveA;
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut,
uint256 tradingFeePercent
) internal pure returns (uint256 amountOut) {
require(amountIn > 0, "LinkswapLibrary: INSUFFICIENT_INPUT_AMOUNT");
require(reserveIn > 0 && reserveOut > 0, "LinkswapLibrary: INSUFFICIENT_LIQUIDITY");
uint256 amountInWithFee = amountIn.mul(uint256(1e6).sub(tradingFeePercent));
uint256 numerator = amountInWithFee.mul(reserveOut);
uint256 denominator = reserveIn.mul(1e6).add(amountInWithFee);
amountOut = numerator / denominator;
}
// given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut,
uint256 tradingFeePercent
) internal pure returns (uint256 amountIn) {
require(amountOut > 0, "LinkswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
require(reserveIn > 0 && reserveOut > 0, "LinkswapLibrary: INSUFFICIENT_LIQUIDITY");
uint256 numerator = reserveIn.mul(amountOut).mul(1e6);
uint256 denominator = (reserveOut.sub(amountOut)).mul(uint256(1e6).sub(tradingFeePercent));
amountIn = (numerator / denominator).add(1);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint256 amountIn,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "LinkswapLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[0] = amountIn;
for (uint256 i; i < path.length - 1; i++) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);
amounts[i + 1] = getAmountOut(
amounts[i],
reserveIn,
reserveOut,
ILinkswapPair(ILinkswapFactory(factory).getPair(path[i], path[i + 1])).tradingFeePercent()
);
}
}
// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(
address factory,
uint256 amountOut,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "LinkswapLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint256 i = path.length - 1; i > 0; i--) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);
amounts[i - 1] = getAmountIn(
amounts[i],
reserveIn,
reserveOut,
ILinkswapPair(ILinkswapFactory(factory).getPair(path[i - 1], path[i])).tradingFeePercent()
);
}
}
}pragma solidity 0.6.6;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMathLinkswap {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
}pragma solidity 0.6.6;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes("approve(address,uint256)")));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED");
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes("transfer(address,uint256)")));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED");
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED");
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, "TransferHelper: ETH_TRANSFER_FAILED");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "istanbul",
"libraries": {
"": {}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}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":[{"internalType":"address","name":"newToken","type":"address"},{"internalType":"uint256","name":"newTokenAmount","type":"uint256"},{"internalType":"address","name":"lockupToken","type":"address"},{"internalType":"uint256","name":"lockupTokenAmount","type":"uint256"},{"internalType":"uint256","name":"lockupPeriod","type":"uint256"},{"internalType":"address","name":"listingFeeToken","type":"address"}],"name":"createPairUsingETH","outputs":[{"internalType":"address","name":"pair","type":"address"}],"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"},{"internalType":"uint256","name":"tradingFeePercent","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"},{"internalType":"uint256","name":"tradingFeePercent","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
60c060405234801561001057600080fd5b5060405162004d1638038062004d168339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614b7d62000199600039806101795280610d095280610d7d5280610f245280610ffe5280611039528061111b528061133952806116c3528061184e5280611c155280611d0f5280611dc55280611e935280611fd952806120615280612299528061231c528061239a528061246652806124fb528061256f5280612a6d5280612ce05280612d365280612d6a5280612dde5280612f7e52806130c15280613149525080610dac5280610e8e52806111a9528061128052806113ff528061143852806115735280611751528061182c528061199c5280611f26528061209352806121e952806125a152806127fa52806129f25280612a1b5280612a4b5280612bb85280612d145280613011528061317b5280613a2c5280613a6f528061408a528061423d528061457d52806146565250614b7d6000f3fe6080604052600436106101695760003560e01c80637ff36ab5116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610b48578063e8e3370014610bbb578063f305d71914610c3b578063fb3bdb4114610c81576101a2565b8063baa2abde14610a21578063c45a015514610a7e578063d06ca61f14610a93576101a2565b80637ff36ab5146107e55780638803dbee14610869578063ad5c4648146108ff578063ad615dec14610914578063af2979eb1461094a578063b6f9de951461099d576101a2565b80634a25d94a116101235780634a25d94a1461052657806352707d8c146105bc578063571fd0121461060a5780635b0d5984146106465780635c11d795146106b9578063791ac9471461074f576101a2565b80629d2793146101a757806302751cec1461020b57806318cbafe5146102775780631f00ca741461035d5780632195995c1461041257806338ed173914610490576101a2565b366101a257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a057fe5b005b600080fd5b6101ef600480360360c08110156101bd57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516610d05565b604080516001600160a01b039092168252519081900360200190f35b34801561021757600080fd5b5061025e600480360360c081101561022e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610fb1565b6040805192835260208301919091528051918290030190f35b34801561028357600080fd5b5061030d600480360360a081101561029a57600080fd5b813591602081013591810190606081016040820135600160201b8111156102c057600080fd5b8201836020820111156102d257600080fd5b803590602001918460208302840111600160201b831117156102f357600080fd5b91935091506001600160a01b0381351690602001356110cb565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610349578181015183820152602001610331565b505050509050019250505060405180910390f35b34801561036957600080fd5b5061030d6004803603604081101561038057600080fd5b81359190810190604081016020820135600160201b8111156103a157600080fd5b8201836020820111156103b357600080fd5b803590602001918460208302840111600160201b831117156103d457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113f8945050505050565b34801561041e57600080fd5b5061025e600480360361016081101561043657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561142e565b34801561049c57600080fd5b5061030d600480360360a08110156104b357600080fd5b813591602081013591810190606081016040820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460208302840111600160201b8311171561050c57600080fd5b91935091506001600160a01b038135169060200135611528565b34801561053257600080fd5b5061030d600480360360a081101561054957600080fd5b813591602081013591810190606081016040820135600160201b81111561056f57600080fd5b82018360208201111561058157600080fd5b803590602001918460208302840111600160201b831117156105a257600080fd5b91935091506001600160a01b038135169060200135611673565b3480156105c857600080fd5b506105f8600480360360808110156105df57600080fd5b50803590602081013590604081013590606001356117ff565b60408051918252519081900360200190f35b34801561061657600080fd5b506105f86004803603608081101561062d57600080fd5b5080359060208101359060408101359060600135611816565b34801561065257600080fd5b506105f8600480360361014081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611824565b3480156106c557600080fd5b506101a0600480360360a08110156106dc57600080fd5b813591602081013591810190606081016040820135600160201b81111561070257600080fd5b82018360208201111561071457600080fd5b803590602001918460208302840111600160201b8311171561073557600080fd5b91935091506001600160a01b038135169060200135611932565b34801561075b57600080fd5b506101a0600480360360a081101561077257600080fd5b813591602081013591810190606081016040820135600160201b81111561079857600080fd5b8201836020820111156107aa57600080fd5b803590602001918460208302840111600160201b831117156107cb57600080fd5b91935091506001600160a01b038135169060200135611bc7565b61030d600480360360808110156107fb57600080fd5b81359190810190604081016020820135600160201b81111561081c57600080fd5b82018360208201111561082e57600080fd5b803590602001918460208302840111600160201b8311171561084f57600080fd5b91935091506001600160a01b038135169060200135611e4b565b34801561087557600080fd5b5061030d600480360360a081101561088c57600080fd5b813591602081013591810190606081016040820135600160201b8111156108b257600080fd5b8201836020820111156108c457600080fd5b803590602001918460208302840111600160201b831117156108e557600080fd5b91935091506001600160a01b03813516906020013561219e565b34801561090b57600080fd5b506101ef612297565b34801561092057600080fd5b506105f86004803603606081101561093757600080fd5b50803590602081013590604001356122bb565b34801561095657600080fd5b506105f8600480360360c081101561096d57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356122d0565b6101a0600480360360808110156109b357600080fd5b81359190810190604081016020820135600160201b8111156109d457600080fd5b8201836020820111156109e657600080fd5b803590602001918460208302840111600160201b83111715610a0757600080fd5b91935091506001600160a01b038135169060200135612420565b348015610a2d57600080fd5b5061025e600480360360e0811015610a4457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356127ac565b348015610a8a57600080fd5b506101ef6129f0565b348015610a9f57600080fd5b5061030d60048036036040811015610ab657600080fd5b81359190810190604081016020820135600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a14945050505050565b348015610b5457600080fd5b5061025e6004803603610140811015610b6c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612a41565b348015610bc757600080fd5b50610c1d6004803603610100811015610bdf57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612b55565b60408051938452602084019290925282820152519081900360600190f35b610c1d600480360360c0811015610c5157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c91565b61030d60048036036080811015610c9757600080fd5b81359190810190604081016020820135600160201b811115610cb857600080fd5b820183602082011115610cca57600080fd5b803590602001918460208302840111600160201b83111715610ceb57600080fd5b91935091506001600160a01b038135169060200135612f36565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e1b57600080fd5b505af1158015610e2f573d6000803e3d6000fd5b505050506040513d6020811015610e4557600080fd5b505060408051631d701adb60e31b81526001600160a01b038981166004830152602482018990528781166044830152606482018790526084820186905284811660a483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163eb80d6d89160c4808201926020929091908290030181600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b505050506040513d6020811015610f0357600080fd5b5051604080516370a0823160e01b81523060048201529051919250610fa7917f00000000000000000000000000000000000000000000000000000000000000009133916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50516132b8565b9695505050505050565b6000808242811015610ff8576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b611027897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6127ac565b90935091506110378986856132b8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b505050506110bf8583613422565b50965096945050505050565b60608142811015611111576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061114b57fe5b905060200201356001600160a01b03166001600160a01b0316146111a4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6112027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b9150868260018451038151811061121557fe5b6020026020010151101561125a5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6112f88686600081811061126a57fe5b905060200201356001600160a01b0316336112de7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106112ac57fe5b905060200201356001600160a01b03168b8b60018181106112c957fe5b905060200201356001600160a01b0316613799565b856000815181106112eb57fe5b6020026020010151613820565b6113378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061397d915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061137657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156113b457600080fd5b505af11580156113c8573d6000803e3d6000fd5b505050506113ed84836001855103815181106113e057fe5b6020026020010151613422565b509695505050505050565b60606114257f00000000000000000000000000000000000000000000000000000000000000008484613bc3565b90505b92915050565b600080600061145e7f00000000000000000000000000000000000000000000000000000000000000008f8f613799565b905060008761146d578c611471565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b5050505061150e8f8f8f8f8f8f8f6127ac565b809450819550505050509b509b9950505050505050505050565b6060814281101561156e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6115cc7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b915086826001845103815181106115df57fe5b602002602001015110156116245760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6116348686600081811061126a57fe5b6113ed8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b606081428110156116b9576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106116f357fe5b905060200201356001600160a01b03166001600160a01b03161461174c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6117aa7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b915086826000815181106117ba57fe5b6020026020010151111561125a5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b600061180d85858585613e2e565b95945050505050565b600061180d85858585613f31565b6000806118727f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613799565b9050600086611881578b611885565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156118fb57600080fd5b505af115801561190f573d6000803e3d6000fd5b505050506119218d8d8d8d8d8d6122d0565b9d9c50505050505050505050505050565b8042811015611976576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6119eb8585600081811061198657fe5b905060200201356001600160a01b0316336119e57f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b905060200201356001600160a01b03168a8a60018181106112c957fe5b8a613820565b6000858560001981018181106119fd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a6257600080fd5b505afa158015611a76573d6000803e3d6000fd5b505050506040513d6020811015611a8c57600080fd5b50516040805160208881028281018201909352888252929350611ace929091899189918291850190849080828437600092019190915250889250614033915050565b86611b808288886000198101818110611ae357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6020811015611b7257600080fd5b50519063ffffffff61437216565b1015611bbd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b5050505050505050565b8042811015611c0b576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611c4557fe5b905060200201356001600160a01b03166001600160a01b031614611c9e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611cae8585600081811061198657fe5b611cec858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614033915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611d5657600080fd5b505afa158015611d6a573d6000803e3d6000fd5b505050506040513d6020811015611d8057600080fd5b5051905086811015611dc35760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b50505050611bbd8482613422565b60608142811015611e91576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611ec857fe5b905060200201356001600160a01b03166001600160a01b031614611f21576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611f7f7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b91508682600184510381518110611f9257fe5b60200260200101511015611fd75760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061201357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561204657600080fd5b505af115801561205a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120bf7f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b846000815181106120cc57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561212357600080fd5b505af1158015612137573d6000803e3d6000fd5b505050506040513d602081101561214d57600080fd5b505161215557fe5b6121948287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b5095945050505050565b606081428110156121e4576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6122427f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150868260008151811061225257fe5b602002602001015111156116245760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006122c88484846143c2565b949350505050565b60008142811015612316576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612345887f000000000000000000000000000000000000000000000000000000000000000089898930896127ac565b604080516370a0823160e01b8152306004820152905191945061239892508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610f7657600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050506113ed8483613422565b8042811015612464576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061249b57fe5b905060200201356001600160a01b03166001600160a01b0316146124f4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561255457600080fd5b505af1158015612568573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125cd7f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561261d57600080fd5b505af1158015612631573d6000803e3d6000fd5b505050506040513d602081101561264757600080fd5b505161264f57fe5b60008686600019810181811061266157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156126c657600080fd5b505afa1580156126da573d6000803e3d6000fd5b505050506040513d60208110156126f057600080fd5b505160408051602089810282810182019093528982529293506127329290918a918a918291850190849080828437600092019190915250899250614033915050565b87611b80828989600019810181811061274757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b60008082428110156127f3576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b60006128207f00000000000000000000000000000000000000000000000000000000000000008c8c613799565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561287b57600080fd5b505af115801561288f573d6000803e3d6000fd5b505050506040513d60208110156128a557600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156128f257600080fd5b505af1158015612906573d6000803e3d6000fd5b505050506040513d604081101561291c57600080fd5b508051602090910151909250905060006129368e8e61446e565b509050806001600160a01b03168e6001600160a01b03161461295957818361295c565b82825b90975095508a8710156129a05760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b898610156129df5760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606114257f0000000000000000000000000000000000000000000000000000000000000000848461351a565b6000806000612a917f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613799565b9050600087612aa0578c612aa4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612b1a57600080fd5b505af1158015612b2e573d6000803e3d6000fd5b50505050612b408e8e8e8e8e8e610fb1565b909f909e509c50505050505050505050505050565b60008060008342811015612b9e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612bac8c8c8c8c8c8c61454c565b90945092506000612bde7f00000000000000000000000000000000000000000000000000000000000000008e8e613799565b9050612bec8d338388613820565b612bf88c338387613820565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505050506040513d6020811015612c7a57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612cda576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612d088a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61454c565b90945092506000612d5a7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613799565b9050612d688b338388613820565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612dc357600080fd5b505af1158015612dd7573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e5c57600080fd5b505af1158015612e70573d6000803e3d6000fd5b505050506040513d6020811015612e8657600080fd5b5051612e8e57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051925034841015612f2857612f2833853403613422565b505096509650969350505050565b60608142811015612f7c576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612fb357fe5b905060200201356001600160a01b03166001600160a01b03161461300c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b61306a7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150348260008151811061307a57fe5b602002602001015111156130bf5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106130fb57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561312e57600080fd5b505af1158015613142573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6131a77f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b846000815181106131b457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050506040513d602081101561323557600080fd5b505161323d57fe5b61327c8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b8160008151811061328957fe5b60200260200101513411156121945761219433836000815181106132a957fe5b60200260200101513403613422565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133355780518252601f199092019160209182019101613316565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613397576040519150601f19603f3d011682016040523d82523d6000602084013e61339c565b606091505b50915091508180156133ca5750805115806133ca57508080602001905160208110156133c757600080fd5b50515b61341b576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061346e5780518252601f19909201916020918201910161344f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146134d0576040519150601f19603f3d011682016040523d82523d6000602084013e6134d5565b606091505b50509050806135155760405162461bcd60e51b8152600401808060200182810382526023815260200180614ab26023913960400191505060405180910390fd5b505050565b6060600282511015613573576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561358b57600080fd5b506040519080825280602002602001820160405280156135b5578160200160208202803683370190505b50905082816000815181106135c657fe5b60200260200101818152505060005b600183510381101561379157600080613618878685815181106135f457fe5b602002602001015187866001018151811061360b57fe5b602002602001015161476b565b9150915061376d84848151811061362b57fe5b602002602001015183838a6001600160a01b031663e6a439058a898151811061365057fe5b60200260200101518b8a6001018151811061366757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156136ce57600080fd5b505afa1580156136e2573d6000803e3d6000fd5b505050506040513d60208110156136f857600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b15801561373c57600080fd5b505afa158015613750573d6000803e3d6000fd5b505050506040513d602081101561376657600080fd5b5051613e2e565b84846001018151811061377c57fe5b602090810291909101015250506001016135d5565b509392505050565b6040805163e6a4390560e01b81526001600160a01b0384811660048301528381166024830152915160009286169163e6a43905916044808301926020929190829003018186803b1580156137ec57600080fd5b505afa158015613800573d6000803e3d6000fd5b505050506040513d602081101561381657600080fd5b5051949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138a55780518252601f199092019160209182019101613886565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613907576040519150601f19603f3d011682016040523d82523d6000602084013e61390c565b606091505b509150915081801561393a57508051158061393a575080806020019051602081101561393757600080fd5b50515b6139755760405162461bcd60e51b8152600401808060200182810382526024815260200180614b246024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613bbd5760008084838151811061399b57fe5b60200260200101518584600101815181106139b257fe5b60200260200101519150915060006139ca838361446e565b50905060008785600101815181106139de57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613a0c57826000613a10565b6000835b91509150600060028a51038810613a275788613a68565b613a687f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613a5b57fe5b6020026020010151613799565b9050613a957f00000000000000000000000000000000000000000000000000000000000000008888613799565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ad2576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b43578181015183820152602001613b2b565b50505050905090810190601f168015613b705780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b9257600080fd5b505af1158015613ba6573d6000803e3d6000fd5b505060019099019850613980975050505050505050565b50505050565b6060600282511015613c1c576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613c3457600080fd5b50604051908082528060200260200182016040528015613c5e578160200160208202803683370190505b5090508281600183510381518110613c7257fe5b60209081029190910101528151600019015b801561379157600080613cb487866001860381518110613ca057fe5b602002602001015187868151811061360b57fe5b91509150613e09848481518110613cc757fe5b602002602001015183838a6001600160a01b031663e6a439058a60018a0381518110613cef57fe5b60200260200101518b8a81518110613d0357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b158015613d6a57600080fd5b505afa158015613d7e573d6000803e3d6000fd5b505050506040513d6020811015613d9457600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b158015613dd857600080fd5b505afa158015613dec573d6000803e3d6000fd5b505050506040513d6020811015613e0257600080fd5b5051613f31565b846001850381518110613e1857fe5b6020908102919091010152505060001901613c84565b6000808511613e6e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614963602a913960400191505060405180910390fd5b600084118015613e7e5750600083115b613eb95760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613ede613ed1620f42408563ffffffff61437216565b879063ffffffff6148b016565b90506000613ef2828663ffffffff6148b016565b90506000613f1983613f0d89620f424063ffffffff6148b016565b9063ffffffff61491316565b9050808281613f2457fe5b0498975050505050505050565b6000808511613f715760405162461bcd60e51b815260040180806020018281038252602b815260200180614ad5602b913960400191505060405180910390fd5b600084118015613f815750600083115b613fbc5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613fe1620f4240613fd5878963ffffffff6148b016565b9063ffffffff6148b016565b9050600061400b613ffb620f42408663ffffffff61437216565b613fd5878a63ffffffff61437216565b9050614028600182848161401b57fe5b049063ffffffff61491316565b979650505050505050565b60005b60018351038110156135155760008084838151811061405157fe5b602002602001015185846001018151811061406857fe5b6020026020010151915091506000614080838361446e565b50905060006140b07f00000000000000000000000000000000000000000000000000000000000000008585613799565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156140f157600080fd5b505afa158015614105573d6000803e3d6000fd5b505050506040513d606081101561411b57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614614151578284614154565b83835b915091506141b2828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b95506141f38683838a6001600160a01b0316632a3240276040518163ffffffff1660e01b815260040160206040518083038186803b15801561373c57600080fd5b945050505050600080856001600160a01b0316886001600160a01b03161461421d57826000614221565b6000835b91509150600060028c51038a10614238578a61426c565b61426c7f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613a5b57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156142f65781810151838201526020016142de565b50505050905090810190601f1680156143235780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561434557600080fd5b505af1158015614359573d6000803e3d6000fd5b50506001909b019a506140369950505050505050505050565b80820382811115611428576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116144025760405162461bcd60e51b8152600401808060200182810382526024815260200180614a8e6024913960400191505060405180910390fd5b6000831180156144125750600082115b61444d5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b8261445e858463ffffffff6148b016565b8161446557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156144c25760405162461bcd60e51b8152600401808060200182810382526024815260200180614b006024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106144e25782846144e5565b83835b90925090506001600160a01b038216614545576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b1580156145c657600080fd5b505afa1580156145da573d6000803e3d6000fd5b505050506040513d60208110156145f057600080fd5b50516001600160a01b0316141561464e576040805162461bcd60e51b815260206004820181905260248201527f4c696e6b73776170526f757465723a20504149525f4e4f545f43524541544544604482015290519081900360640190fd5b60008061467c7f00000000000000000000000000000000000000000000000000000000000000008b8b61476b565b9150915081600014801561468e575080155b1561469e5787935086925061475e565b60006146ab8984846143c2565b90508781116146fe57858110156146f35760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b88945092508261475c565b600061470b8984866143c2565b90508981111561471757fe5b878110156147565760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600080600061477a858561446e565b506040805163e6a4390560e01b81526001600160a01b0388811660048301528781166024830152915192935060009283928a169163e6a43905916044808301926020929190829003018186803b1580156147d357600080fd5b505afa1580156147e7573d6000803e3d6000fd5b505050506040513d60208110156147fd57600080fd5b505160408051630240bc6b60e21b815290516001600160a01b0390921691630902f1ac91600480820192606092909190829003018186803b15801561484157600080fd5b505afa158015614855573d6000803e3d6000fd5b505050506040513d606081101561486b57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461489e5780826148a1565b81815b90999098509650505050505050565b60008115806148cb575050808202828282816148c857fe5b04145b611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe4c696e6b737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f425f414d4f554e544c696e6b73776170526f757465723a204558434553534956455f494e5055545f414d4f554e544c696e6b737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594c696e6b73776170526f757465723a20455850495245440000000000000000004c696e6b73776170526f757465723a20494e53554646494349454e545f415f414d4f554e544c696e6b73776170526f757465723a20494e56414c49445f50415448000000004c696e6b737761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444c696e6b737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220780aaf565b01feac9e5eb78e0dbf2bfb48bbdad122bbc1470f8c3a33667600c864736f6c63430006060033000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106101695760003560e01c80637ff36ab5116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610b48578063e8e3370014610bbb578063f305d71914610c3b578063fb3bdb4114610c81576101a2565b8063baa2abde14610a21578063c45a015514610a7e578063d06ca61f14610a93576101a2565b80637ff36ab5146107e55780638803dbee14610869578063ad5c4648146108ff578063ad615dec14610914578063af2979eb1461094a578063b6f9de951461099d576101a2565b80634a25d94a116101235780634a25d94a1461052657806352707d8c146105bc578063571fd0121461060a5780635b0d5984146106465780635c11d795146106b9578063791ac9471461074f576101a2565b80629d2793146101a757806302751cec1461020b57806318cbafe5146102775780631f00ca741461035d5780632195995c1461041257806338ed173914610490576101a2565b366101a257336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101a057fe5b005b600080fd5b6101ef600480360360c08110156101bd57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516610d05565b604080516001600160a01b039092168252519081900360200190f35b34801561021757600080fd5b5061025e600480360360c081101561022e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610fb1565b6040805192835260208301919091528051918290030190f35b34801561028357600080fd5b5061030d600480360360a081101561029a57600080fd5b813591602081013591810190606081016040820135600160201b8111156102c057600080fd5b8201836020820111156102d257600080fd5b803590602001918460208302840111600160201b831117156102f357600080fd5b91935091506001600160a01b0381351690602001356110cb565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610349578181015183820152602001610331565b505050509050019250505060405180910390f35b34801561036957600080fd5b5061030d6004803603604081101561038057600080fd5b81359190810190604081016020820135600160201b8111156103a157600080fd5b8201836020820111156103b357600080fd5b803590602001918460208302840111600160201b831117156103d457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113f8945050505050565b34801561041e57600080fd5b5061025e600480360361016081101561043657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561142e565b34801561049c57600080fd5b5061030d600480360360a08110156104b357600080fd5b813591602081013591810190606081016040820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460208302840111600160201b8311171561050c57600080fd5b91935091506001600160a01b038135169060200135611528565b34801561053257600080fd5b5061030d600480360360a081101561054957600080fd5b813591602081013591810190606081016040820135600160201b81111561056f57600080fd5b82018360208201111561058157600080fd5b803590602001918460208302840111600160201b831117156105a257600080fd5b91935091506001600160a01b038135169060200135611673565b3480156105c857600080fd5b506105f8600480360360808110156105df57600080fd5b50803590602081013590604081013590606001356117ff565b60408051918252519081900360200190f35b34801561061657600080fd5b506105f86004803603608081101561062d57600080fd5b5080359060208101359060408101359060600135611816565b34801561065257600080fd5b506105f8600480360361014081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611824565b3480156106c557600080fd5b506101a0600480360360a08110156106dc57600080fd5b813591602081013591810190606081016040820135600160201b81111561070257600080fd5b82018360208201111561071457600080fd5b803590602001918460208302840111600160201b8311171561073557600080fd5b91935091506001600160a01b038135169060200135611932565b34801561075b57600080fd5b506101a0600480360360a081101561077257600080fd5b813591602081013591810190606081016040820135600160201b81111561079857600080fd5b8201836020820111156107aa57600080fd5b803590602001918460208302840111600160201b831117156107cb57600080fd5b91935091506001600160a01b038135169060200135611bc7565b61030d600480360360808110156107fb57600080fd5b81359190810190604081016020820135600160201b81111561081c57600080fd5b82018360208201111561082e57600080fd5b803590602001918460208302840111600160201b8311171561084f57600080fd5b91935091506001600160a01b038135169060200135611e4b565b34801561087557600080fd5b5061030d600480360360a081101561088c57600080fd5b813591602081013591810190606081016040820135600160201b8111156108b257600080fd5b8201836020820111156108c457600080fd5b803590602001918460208302840111600160201b831117156108e557600080fd5b91935091506001600160a01b03813516906020013561219e565b34801561090b57600080fd5b506101ef612297565b34801561092057600080fd5b506105f86004803603606081101561093757600080fd5b50803590602081013590604001356122bb565b34801561095657600080fd5b506105f8600480360360c081101561096d57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356122d0565b6101a0600480360360808110156109b357600080fd5b81359190810190604081016020820135600160201b8111156109d457600080fd5b8201836020820111156109e657600080fd5b803590602001918460208302840111600160201b83111715610a0757600080fd5b91935091506001600160a01b038135169060200135612420565b348015610a2d57600080fd5b5061025e600480360360e0811015610a4457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356127ac565b348015610a8a57600080fd5b506101ef6129f0565b348015610a9f57600080fd5b5061030d60048036036040811015610ab657600080fd5b81359190810190604081016020820135600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a14945050505050565b348015610b5457600080fd5b5061025e6004803603610140811015610b6c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612a41565b348015610bc757600080fd5b50610c1d6004803603610100811015610bdf57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612b55565b60408051938452602084019290925282820152519081900360600190f35b610c1d600480360360c0811015610c5157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c91565b61030d60048036036080811015610c9757600080fd5b81359190810190604081016020820135600160201b811115610cb857600080fd5b820183602082011115610cca57600080fd5b803590602001918460208302840111600160201b83111715610ceb57600080fd5b91935091506001600160a01b038135169060200135612f36565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663095ea7b37f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e1b57600080fd5b505af1158015610e2f573d6000803e3d6000fd5b505050506040513d6020811015610e4557600080fd5b505060408051631d701adb60e31b81526001600160a01b038981166004830152602482018990528781166044830152606482018790526084820186905284811660a483015291517f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b9092169163eb80d6d89160c4808201926020929091908290030181600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b505050506040513d6020811015610f0357600080fd5b5051604080516370a0823160e01b81523060048201529051919250610fa7917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29133916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50516132b8565b9695505050505050565b6000808242811015610ff8576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b611027897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a6127ac565b90935091506110378986856132b8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b505050506110bf8583613422565b50965096945050505050565b60608142811015611111576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686600019810181811061114b57fe5b905060200201356001600160a01b03166001600160a01b0316146111a4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6112027f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b9150868260018451038151811061121557fe5b6020026020010151101561125a5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6112f88686600081811061126a57fe5b905060200201356001600160a01b0316336112de7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8a8a60008181106112ac57fe5b905060200201356001600160a01b03168b8b60018181106112c957fe5b905060200201356001600160a01b0316613799565b856000815181106112eb57fe5b6020026020010151613820565b6113378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061397d915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551038151811061137657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156113b457600080fd5b505af11580156113c8573d6000803e3d6000fd5b505050506113ed84836001855103815181106113e057fe5b6020026020010151613422565b509695505050505050565b60606114257f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8484613bc3565b90505b92915050565b600080600061145e7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8f8f613799565b905060008761146d578c611471565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b5050505061150e8f8f8f8f8f8f8f6127ac565b809450819550505050509b509b9950505050505050505050565b6060814281101561156e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6115cc7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b915086826001845103815181106115df57fe5b602002602001015110156116245760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6116348686600081811061126a57fe5b6113ed8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b606081428110156116b9576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216868660001981018181106116f357fe5b905060200201356001600160a01b03166001600160a01b03161461174c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6117aa7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b915086826000815181106117ba57fe5b6020026020010151111561125a5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b600061180d85858585613e2e565b95945050505050565b600061180d85858585613f31565b6000806118727f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613799565b9050600086611881578b611885565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156118fb57600080fd5b505af115801561190f573d6000803e3d6000fd5b505050506119218d8d8d8d8d8d6122d0565b9d9c50505050505050505050505050565b8042811015611976576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6119eb8585600081811061198657fe5b905060200201356001600160a01b0316336119e57f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b905060200201356001600160a01b03168a8a60018181106112c957fe5b8a613820565b6000858560001981018181106119fd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a6257600080fd5b505afa158015611a76573d6000803e3d6000fd5b505050506040513d6020811015611a8c57600080fd5b50516040805160208881028281018201909352888252929350611ace929091899189918291850190849080828437600092019190915250889250614033915050565b86611b808288886000198101818110611ae357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6020811015611b7257600080fd5b50519063ffffffff61437216565b1015611bbd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b5050505050505050565b8042811015611c0b576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685856000198101818110611c4557fe5b905060200201356001600160a01b03166001600160a01b031614611c9e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611cae8585600081811061198657fe5b611cec858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614033915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a0823191602480820192602092909190829003018186803b158015611d5657600080fd5b505afa158015611d6a573d6000803e3d6000fd5b505050506040513d6020811015611d8057600080fd5b5051905086811015611dc35760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b50505050611bbd8482613422565b60608142811015611e91576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110611ec857fe5b905060200201356001600160a01b03166001600160a01b031614611f21576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611f7f7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b3488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b91508682600184510381518110611f9257fe5b60200260200101511015611fd75760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08360008151811061201357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561204657600080fd5b505af115801561205a573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6120bf7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b846000815181106120cc57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561212357600080fd5b505af1158015612137573d6000803e3d6000fd5b505050506040513d602081101561214d57600080fd5b505161215557fe5b6121948287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b5095945050505050565b606081428110156121e4576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6122427f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150868260008151811061225257fe5b602002602001015111156116245760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60006122c88484846143c2565b949350505050565b60008142811015612316576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612345887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898930896127ac565b604080516370a0823160e01b8152306004820152905191945061239892508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610f7657600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050506113ed8483613422565b8042811015612464576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168585600081811061249b57fe5b905060200201356001600160a01b03166001600160a01b0316146124f4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561255457600080fd5b505af1158015612568573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6125cd7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561261d57600080fd5b505af1158015612631573d6000803e3d6000fd5b505050506040513d602081101561264757600080fd5b505161264f57fe5b60008686600019810181811061266157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156126c657600080fd5b505afa1580156126da573d6000803e3d6000fd5b505050506040513d60208110156126f057600080fd5b505160408051602089810282810182019093528982529293506127329290918a918a918291850190849080828437600092019190915250899250614033915050565b87611b80828989600019810181811061274757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b60008082428110156127f3576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b60006128207f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8c8c613799565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561287b57600080fd5b505af115801561288f573d6000803e3d6000fd5b505050506040513d60208110156128a557600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156128f257600080fd5b505af1158015612906573d6000803e3d6000fd5b505050506040513d604081101561291c57600080fd5b508051602090910151909250905060006129368e8e61446e565b509050806001600160a01b03168e6001600160a01b03161461295957818361295c565b82825b90975095508a8710156129a05760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b898610156129df5760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b81565b60606114257f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b848461351a565b6000806000612a917f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613799565b9050600087612aa0578c612aa4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612b1a57600080fd5b505af1158015612b2e573d6000803e3d6000fd5b50505050612b408e8e8e8e8e8e610fb1565b909f909e509c50505050505050505050505050565b60008060008342811015612b9e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612bac8c8c8c8c8c8c61454c565b90945092506000612bde7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8e8e613799565b9050612bec8d338388613820565b612bf88c338387613820565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505050506040513d6020811015612c7a57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612cda576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612d088a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c61454c565b90945092506000612d5a7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613799565b9050612d688b338388613820565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612dc357600080fd5b505af1158015612dd7573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e5c57600080fd5b505af1158015612e70573d6000803e3d6000fd5b505050506040513d6020811015612e8657600080fd5b5051612e8e57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051925034841015612f2857612f2833853403613422565b505096509650969350505050565b60608142811015612f7c576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110612fb357fe5b905060200201356001600160a01b03166001600160a01b03161461300c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b61306a7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b88888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150348260008151811061307a57fe5b602002602001015111156130bf5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106130fb57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561312e57600080fd5b505af1158015613142573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6131a77f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b846000815181106131b457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050506040513d602081101561323557600080fd5b505161323d57fe5b61327c8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b8160008151811061328957fe5b60200260200101513411156121945761219433836000815181106132a957fe5b60200260200101513403613422565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133355780518252601f199092019160209182019101613316565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613397576040519150601f19603f3d011682016040523d82523d6000602084013e61339c565b606091505b50915091508180156133ca5750805115806133ca57508080602001905160208110156133c757600080fd5b50515b61341b576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061346e5780518252601f19909201916020918201910161344f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146134d0576040519150601f19603f3d011682016040523d82523d6000602084013e6134d5565b606091505b50509050806135155760405162461bcd60e51b8152600401808060200182810382526023815260200180614ab26023913960400191505060405180910390fd5b505050565b6060600282511015613573576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561358b57600080fd5b506040519080825280602002602001820160405280156135b5578160200160208202803683370190505b50905082816000815181106135c657fe5b60200260200101818152505060005b600183510381101561379157600080613618878685815181106135f457fe5b602002602001015187866001018151811061360b57fe5b602002602001015161476b565b9150915061376d84848151811061362b57fe5b602002602001015183838a6001600160a01b031663e6a439058a898151811061365057fe5b60200260200101518b8a6001018151811061366757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156136ce57600080fd5b505afa1580156136e2573d6000803e3d6000fd5b505050506040513d60208110156136f857600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b15801561373c57600080fd5b505afa158015613750573d6000803e3d6000fd5b505050506040513d602081101561376657600080fd5b5051613e2e565b84846001018151811061377c57fe5b602090810291909101015250506001016135d5565b509392505050565b6040805163e6a4390560e01b81526001600160a01b0384811660048301528381166024830152915160009286169163e6a43905916044808301926020929190829003018186803b1580156137ec57600080fd5b505afa158015613800573d6000803e3d6000fd5b505050506040513d602081101561381657600080fd5b5051949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138a55780518252601f199092019160209182019101613886565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613907576040519150601f19603f3d011682016040523d82523d6000602084013e61390c565b606091505b509150915081801561393a57508051158061393a575080806020019051602081101561393757600080fd5b50515b6139755760405162461bcd60e51b8152600401808060200182810382526024815260200180614b246024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613bbd5760008084838151811061399b57fe5b60200260200101518584600101815181106139b257fe5b60200260200101519150915060006139ca838361446e565b50905060008785600101815181106139de57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613a0c57826000613a10565b6000835b91509150600060028a51038810613a275788613a68565b613a687f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b878c8b60020181518110613a5b57fe5b6020026020010151613799565b9050613a957f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8888613799565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ad2576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b43578181015183820152602001613b2b565b50505050905090810190601f168015613b705780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b9257600080fd5b505af1158015613ba6573d6000803e3d6000fd5b505060019099019850613980975050505050505050565b50505050565b6060600282511015613c1c576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613c3457600080fd5b50604051908082528060200260200182016040528015613c5e578160200160208202803683370190505b5090508281600183510381518110613c7257fe5b60209081029190910101528151600019015b801561379157600080613cb487866001860381518110613ca057fe5b602002602001015187868151811061360b57fe5b91509150613e09848481518110613cc757fe5b602002602001015183838a6001600160a01b031663e6a439058a60018a0381518110613cef57fe5b60200260200101518b8a81518110613d0357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b158015613d6a57600080fd5b505afa158015613d7e573d6000803e3d6000fd5b505050506040513d6020811015613d9457600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b158015613dd857600080fd5b505afa158015613dec573d6000803e3d6000fd5b505050506040513d6020811015613e0257600080fd5b5051613f31565b846001850381518110613e1857fe5b6020908102919091010152505060001901613c84565b6000808511613e6e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614963602a913960400191505060405180910390fd5b600084118015613e7e5750600083115b613eb95760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613ede613ed1620f42408563ffffffff61437216565b879063ffffffff6148b016565b90506000613ef2828663ffffffff6148b016565b90506000613f1983613f0d89620f424063ffffffff6148b016565b9063ffffffff61491316565b9050808281613f2457fe5b0498975050505050505050565b6000808511613f715760405162461bcd60e51b815260040180806020018281038252602b815260200180614ad5602b913960400191505060405180910390fd5b600084118015613f815750600083115b613fbc5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613fe1620f4240613fd5878963ffffffff6148b016565b9063ffffffff6148b016565b9050600061400b613ffb620f42408663ffffffff61437216565b613fd5878a63ffffffff61437216565b9050614028600182848161401b57fe5b049063ffffffff61491316565b979650505050505050565b60005b60018351038110156135155760008084838151811061405157fe5b602002602001015185846001018151811061406857fe5b6020026020010151915091506000614080838361446e565b50905060006140b07f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8585613799565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156140f157600080fd5b505afa158015614105573d6000803e3d6000fd5b505050506040513d606081101561411b57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614614151578284614154565b83835b915091506141b2828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b95506141f38683838a6001600160a01b0316632a3240276040518163ffffffff1660e01b815260040160206040518083038186803b15801561373c57600080fd5b945050505050600080856001600160a01b0316886001600160a01b03161461421d57826000614221565b6000835b91509150600060028c51038a10614238578a61426c565b61426c7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898e8d60020181518110613a5b57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156142f65781810151838201526020016142de565b50505050905090810190601f1680156143235780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561434557600080fd5b505af1158015614359573d6000803e3d6000fd5b50506001909b019a506140369950505050505050505050565b80820382811115611428576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116144025760405162461bcd60e51b8152600401808060200182810382526024815260200180614a8e6024913960400191505060405180910390fd5b6000831180156144125750600082115b61444d5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b8261445e858463ffffffff6148b016565b8161446557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156144c25760405162461bcd60e51b8152600401808060200182810382526024815260200180614b006024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106144e25782846144e5565b83835b90925090506001600160a01b038216614545576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b9092169163e6a4390591604480820192602092909190829003018186803b1580156145c657600080fd5b505afa1580156145da573d6000803e3d6000fd5b505050506040513d60208110156145f057600080fd5b50516001600160a01b0316141561464e576040805162461bcd60e51b815260206004820181905260248201527f4c696e6b73776170526f757465723a20504149525f4e4f545f43524541544544604482015290519081900360640190fd5b60008061467c7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8b8b61476b565b9150915081600014801561468e575080155b1561469e5787935086925061475e565b60006146ab8984846143c2565b90508781116146fe57858110156146f35760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b88945092508261475c565b600061470b8984866143c2565b90508981111561471757fe5b878110156147565760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600080600061477a858561446e565b506040805163e6a4390560e01b81526001600160a01b0388811660048301528781166024830152915192935060009283928a169163e6a43905916044808301926020929190829003018186803b1580156147d357600080fd5b505afa1580156147e7573d6000803e3d6000fd5b505050506040513d60208110156147fd57600080fd5b505160408051630240bc6b60e21b815290516001600160a01b0390921691630902f1ac91600480820192606092909190829003018186803b15801561484157600080fd5b505afa158015614855573d6000803e3d6000fd5b505050506040513d606081101561486b57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461489e5780826148a1565b81815b90999098509650505050505050565b60008115806148cb575050808202828282816148c857fe5b04145b611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe4c696e6b737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f425f414d4f554e544c696e6b73776170526f757465723a204558434553534956455f494e5055545f414d4f554e544c696e6b737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594c696e6b73776170526f757465723a20455850495245440000000000000000004c696e6b73776170526f757465723a20494e53554646494349454e545f415f414d4f554e544c696e6b73776170526f757465723a20494e56414c49445f50415448000000004c696e6b737761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444c696e6b737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220780aaf565b01feac9e5eb78e0dbf2bfb48bbdad122bbc1470f8c3a33667600c864736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0x696708Db871B77355d6C2bE7290B27CF0Bb9B24b
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.