Latest 25 from a total of 410 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Multicall | 24429096 | 31 days ago | IN | 0 ETH | 0.00055157 | ||||
| Multicall | 24270480 | 53 days ago | IN | 0 ETH | 0.00055146 | ||||
| Multicall | 24270433 | 53 days ago | IN | 0 ETH | 0.00055809 | ||||
| Multicall | 24257041 | 55 days ago | IN | 0 ETH | 0.00000903 | ||||
| Multicall | 24236838 | 58 days ago | IN | 0 ETH | 0.00055162 | ||||
| Multicall | 24179742 | 66 days ago | IN | 0 ETH | 0.00003883 | ||||
| Multicall | 24179737 | 66 days ago | IN | 0 ETH | 0.0000403 | ||||
| Multicall | 24179725 | 66 days ago | IN | 0 ETH | 0.00004261 | ||||
| Multicall | 24034361 | 86 days ago | IN | 0.003924 ETH | 0.00036159 | ||||
| Multicall | 24033172 | 86 days ago | IN | 0.0157 ETH | 0.00049846 | ||||
| Multicall | 24033100 | 86 days ago | IN | 0.0059 ETH | 0.00043203 | ||||
| Multicall | 24027450 | 87 days ago | IN | 0.0097645 ETH | 0.00033162 | ||||
| Multicall | 23949669 | 98 days ago | IN | 0 ETH | 0.00004209 | ||||
| Multicall | 23949665 | 98 days ago | IN | 0 ETH | 0.00004012 | ||||
| Multicall | 23949661 | 98 days ago | IN | 0 ETH | 0.00004012 | ||||
| Multicall | 23949657 | 98 days ago | IN | 0 ETH | 0.00004012 | ||||
| Multicall | 23949641 | 98 days ago | IN | 0 ETH | 0.00004012 | ||||
| Multicall | 23949633 | 98 days ago | IN | 0 ETH | 0.00004009 | ||||
| Multicall | 23949624 | 98 days ago | IN | 0 ETH | 0.00003811 | ||||
| Multicall | 23948767 | 98 days ago | IN | 0 ETH | 0.00025763 | ||||
| Multicall | 23934965 | 100 days ago | IN | 0 ETH | 0.00004009 | ||||
| Multicall | 23847259 | 112 days ago | IN | 0 ETH | 0.00090718 | ||||
| Multicall | 23834440 | 114 days ago | IN | 0 ETH | 0.00086173 | ||||
| Multicall | 23830058 | 115 days ago | IN | 0 ETH | 0.00003814 | ||||
| Multicall | 23823962 | 116 days ago | IN | 0 ETH | 0.00062217 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24594768 | 8 days ago | 0.00006569 ETH | ||||
| Transfer | 24594768 | 8 days ago | 0.00006569 ETH | ||||
| Transfer | 24429096 | 31 days ago | 0.09973279 ETH | ||||
| Transfer | 24429096 | 31 days ago | 0.09973279 ETH | ||||
| Transfer | 24429096 | 31 days ago | 0.00311175 ETH | ||||
| Transfer | 24429096 | 31 days ago | 0.00311175 ETH | ||||
| Transfer | 24285917 | 51 days ago | 0.00002235 ETH | ||||
| Transfer | 24285917 | 51 days ago | 0.00002235 ETH | ||||
| Transfer | 24283627 | 51 days ago | 0.00027197 ETH | ||||
| Transfer | 24283627 | 51 days ago | 0.00027197 ETH | ||||
| Transfer | 24270480 | 53 days ago | 0.04855265 ETH | ||||
| Transfer | 24270480 | 53 days ago | 0.04855265 ETH | ||||
| Transfer | 24270480 | 53 days ago | 0.00150802 ETH | ||||
| Transfer | 24270480 | 53 days ago | 0.00150802 ETH | ||||
| Transfer | 24270433 | 53 days ago | 0.04762553 ETH | ||||
| Transfer | 24270433 | 53 days ago | 0.04762553 ETH | ||||
| Transfer | 24270433 | 53 days ago | 0.00147908 ETH | ||||
| Transfer | 24270433 | 53 days ago | 0.00147908 ETH | ||||
| Transfer | 24257041 | 55 days ago | 0.00015153 ETH | ||||
| Transfer | 24257041 | 55 days ago | 0.00015153 ETH | ||||
| Transfer | 24257041 | 55 days ago | 0.00000468 ETH | ||||
| Transfer | 24257041 | 55 days ago | 0.00000468 ETH | ||||
| Transfer | 24236838 | 58 days ago | 0.04672473 ETH | ||||
| Transfer | 24236838 | 58 days ago | 0.04672473 ETH | ||||
| Transfer | 24236838 | 58 days ago | 0.00145096 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
XchangeRouterV3
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 800 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.25;
/*
/$$ /$$ /$$$$$$$$ /$$$$$$$$ /$$
| $$ / $$|_____ $$/ | $$_____/|__/
| $$/ $$/ /$$/ | $$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$ /$$$$$$
\ $$$$/ /$$/ | $$$$$ | $$| $$__ $$ |____ $$| $$__ $$ /$$_____/ /$$__ $$
>$$ $$ /$$/ | $$__/ | $$| $$ \ $$ /$$$$$$$| $$ \ $$| $$ | $$$$$$$$
/$$/\ $$ /$$/ | $$ | $$| $$ | $$ /$$__ $$| $$ | $$| $$ | $$_____/
| $$ \ $$ /$$/ | $$ | $$| $$ | $$| $$$$$$$| $$ | $$| $$$$$$$| $$$$$$$
|__/ |__/|__/ |__/ |__/|__/ |__/ \_______/|__/ |__/ \_______/ \_______/
Contract: Uniswapv2 Fork - XchangeRouterV3
In addition to the standard Uniswap V2 Router, this contract includes functionality to remove liquidity in a failsafe manner to permit liquidation of fee liquidity in all cases.
XchangeRouterV2 contains a bugfix compared to XchangeRouter related to calculations of amount in.
XchangeRouterV3 includes the multicall functionality.
The authority to call that function is assigned via the Xchange Factory.
This contract will NOT be renounced, however it has no functions which affect the contract. The contract is "owned" solely as a formality.
*/
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address owner_) {
_transferOwnership(owner_);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == msg.sender, "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IMulticall {
function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
}
interface IMulticallExtended is IMulticall {
function multicall(uint256 deadline, bytes[] calldata data) external payable returns (bytes[] memory results);
function multicall(
bytes32 previousBlockhash,
bytes[] calldata data
) external payable returns (bytes[] memory results);
}
interface IPeripheryPayments {
function unwrapWETH9(uint256 amountMinimum, address recipient) external payable;
function refundETH() external payable;
function sweepToken(address token, uint256 amountMinimum, address recipient) external payable;
}
interface IPeripheryPaymentsExtended is IPeripheryPayments {
function unwrapWETH9(uint256 amountMinimum) external payable;
function wrapETH(uint256 value) external payable;
function sweepToken(address token, uint256 amountMinimum) external payable;
function pull(address token, uint256 value) external payable;
}
interface IXchangeFactory {
function isFailsafeLiquidator(address) external view returns (bool);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IXchangePair {
function transferFrom(address from, address to, uint value) external returns (bool);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function mustBurn(address to, uint256 gasAmount) external returns (uint256 amount0, uint256 amount1);
}
interface IXchangeRouter {
function factory() external view returns (address);
function WETH() external view returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function mustRemoveLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
uint gasAmount
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function swapTokensForExactETH(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactTokensForETH(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapETHForExactTokens(
uint amountOut,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
interface IERC20 {
function balanceOf(address owner) external view returns (uint);
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
}
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
interface IWETH9 is IERC20 {
function deposit() external payable;
function withdraw(uint256) external;
}
interface IPeripheryImmutableState {
function factory() external view returns (address);
function WETH9() external view returns (address);
}
interface IXchangeDiscountAuthority {
function fee(address) external view returns (uint256);
}
abstract contract Multicall is IMulticall {
/// @inheritdoc IMulticall
function multicall(bytes[] calldata data) public payable override returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; i++) {
(bool success, bytes memory result) = address(this).delegatecall(data[i]);
if (!success) {
if (result.length < 68) revert();
assembly {
result := add(result, 0x04)
}
revert(abi.decode(result, (string)));
}
results[i] = result;
}
}
}
abstract contract BlockTimestamp {
function _blockTimestamp() internal view virtual returns (uint256) {
return block.timestamp;
}
}
abstract contract PeripheryValidation is BlockTimestamp {
modifier checkDeadline(uint256 deadline) {
require(_blockTimestamp() <= deadline, "Transaction too old");
_;
}
}
abstract contract PeripheryValidationExtended is PeripheryValidation {
modifier checkPreviousBlockhash(bytes32 previousBlockhash) {
require(blockhash(block.number - 1) == previousBlockhash, "Blockhash");
_;
}
}
abstract contract MulticallExtended is IMulticallExtended, Multicall, PeripheryValidationExtended {
function multicall(
uint256 deadline,
bytes[] calldata data
) external payable override checkDeadline(deadline) returns (bytes[] memory) {
return multicall(data);
}
function multicall(
bytes32 previousBlockhash,
bytes[] calldata data
) external payable override checkPreviousBlockhash(previousBlockhash) returns (bytes[] memory) {
return multicall(data);
}
}
abstract contract PeripheryImmutableState is IPeripheryImmutableState {
address public immutable override factory;
address public immutable override WETH9;
constructor(address _factory, address _WETH9) {
factory = _factory;
WETH9 = _WETH9;
}
}
abstract contract PeripheryPayments is IPeripheryPayments, PeripheryImmutableState {
receive() external payable {
require(msg.sender == WETH9, "Not WETH9");
}
function unwrapWETH9(uint256 amountMinimum, address recipient) public payable override {
uint256 balanceWETH9 = IWETH9(WETH9).balanceOf(address(this));
require(balanceWETH9 >= amountMinimum, "Insufficient WETH9");
if (balanceWETH9 > 0) {
IWETH9(WETH9).withdraw(balanceWETH9);
TransferHelper.safeTransferETH(recipient, balanceWETH9);
}
}
function sweepToken(address token, uint256 amountMinimum, address recipient) public payable override {
uint256 balanceToken = IERC20(token).balanceOf(address(this));
require(balanceToken >= amountMinimum, "Insufficient token");
if (balanceToken > 0) {
TransferHelper.safeTransfer(token, recipient, balanceToken);
}
}
function refundETH() external payable override {
if (address(this).balance > 0) TransferHelper.safeTransferETH(msg.sender, address(this).balance);
}
function pay(address token, address payer, address recipient, uint256 value) internal {
if (token == WETH9 && address(this).balance >= value) {
// pay with WETH9
IWETH9(WETH9).deposit{ value: value }(); // wrap only what is needed to pay
IWETH9(WETH9).transfer(recipient, value);
} else if (payer == address(this)) {
// pay with tokens already in the contract (for the exact input multihop case)
TransferHelper.safeTransfer(token, recipient, value);
} else {
// pull payment
TransferHelper.safeTransferFrom(token, payer, recipient, value);
}
}
}
contract XchangeRouterV3 is IXchangeRouter, Ownable, MulticallExtended {
address public immutable override factory;
address public immutable override WETH;
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, "Xchange: EXPIRED");
_;
}
constructor(address _factory, address _WETH, address _owner) Ownable(_owner) {
factory = _factory;
WETH = _WETH;
}
receive() external payable {
require(msg.sender == WETH);
// only accept ETH via fallback from the WETH contract
}
function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
return XchangeLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) public pure virtual override returns (uint amountOut) {
return XchangeLibrary.getAmountOut(amountIn, reserveIn, reserveOut, 20);
}
function getAmountIn(
uint amountOut,
uint reserveIn,
uint reserveOut
) public pure virtual override returns (uint amountIn) {
return XchangeLibrary.getAmountIn(amountOut, reserveIn, reserveOut, 20);
}
function getAmountsOut(
uint amountIn,
address[] memory path
) public view virtual override returns (uint[] memory amounts) {
return XchangeLibrary.getAmountsOut(factory, amountIn, 20, path);
}
function getAmountsIn(
uint amountOut,
address[] memory path
) public view virtual override returns (uint[] memory amounts) {
return XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
}
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IXchangePair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable virtual override ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = XchangeLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{ value: amountETH }();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IXchangePair(pair).mint(to);
// refund dust eth, if any
if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}
// **** REMOVE LIQUIDITY ****
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
IXchangePair(pair).transferFrom(msg.sender, pair, liquidity);
// send liquidity to pair
(uint amount0, uint amount1) = IXchangePair(pair).burn(to);
(address token0, ) = XchangeLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, "Xchange: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "Xchange: INSUFFICIENT_B_AMOUNT");
}
function mustRemoveLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
uint gasAmount
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
require(IXchangeFactory(factory).isFailsafeLiquidator(msg.sender));
address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
// send liquidity to pair
IXchangePair(pair).transferFrom(msg.sender, pair, liquidity);
// call the modified "mustBurn" function to ensure no token behavior can
// prevent this call from succeeding
(uint amount0, uint amount1) = IXchangePair(pair).mustBurn(to, gasAmount);
(address token0, ) = XchangeLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, "Xchange: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "Xchange: INSUFFICIENT_B_AMOUNT");
}
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
(amountToken, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(token, to, amountToken);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint amountA, uint amountB) {
address pair = XchangeLibrary.pairFor(factory, tokenA, tokenB);
uint value = approveMax ? type(uint256).max : liquidity;
IXchangePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
}
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint amountToken, uint amountETH) {
address pair = XchangeLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint256).max : liquidity;
IXchangePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
}
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountETH) {
(, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint amountETH) {
address pair = XchangeLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint256).max : liquidity;
IXchangePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
token,
liquidity,
amountTokenMin,
amountETHMin,
to,
deadline
);
}
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = XchangeLibrary.getAmountsOut(factory, amountIn, 20, path);
require(amounts[amounts.length - 1] >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
XchangeLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
require(amounts[0] <= amountInMax, "Xchange: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
XchangeLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[0] == WETH, "Xchange: INVALID_PATH");
amounts = XchangeLibrary.getAmountsOut(factory, msg.value, 20, path);
require(amounts[amounts.length - 1] >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).deposit{ value: amounts[0] }();
assert(IWETH(WETH).transfer(XchangeLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
}
function swapTokensForExactETH(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[path.length - 1] == WETH, "Xchange: INVALID_PATH");
amounts = XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
require(amounts[0] <= amountInMax, "Xchange: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
XchangeLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapExactTokensForETH(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[path.length - 1] == WETH, "Xchange: INVALID_PATH");
amounts = XchangeLibrary.getAmountsOut(factory, amountIn, 20, path);
require(amounts[amounts.length - 1] >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
XchangeLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapETHForExactTokens(
uint amountOut,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[0] == WETH, "Xchange: INVALID_PATH");
amounts = XchangeLibrary.getAmountsIn(factory, amountOut, 20, path);
require(amounts[0] <= msg.value, "Xchange: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{ value: amounts[0] }();
assert(IWETH(WETH).transfer(XchangeLibrary.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]);
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
XchangeLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
"Xchange: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) {
require(path[0] == WETH, "Xchange: INVALID_PATH");
uint amountIn = msg.value;
IWETH(WETH).deposit{ value: amountIn }();
assert(IWETH(WETH).transfer(XchangeLibrary.pairFor(factory, path[0], path[1]), amountIn));
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
"Xchange: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) {
require(path[path.length - 1] == WETH, "Xchange: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
XchangeLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint amountOut = IERC20(WETH).balanceOf(address(this));
require(amountOut >= amountOutMin, "Xchange: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
) internal virtual returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
if (IXchangeFactory(factory).getPair(tokenA, tokenB) == address(0)) {
IXchangeFactory(factory).createPair(tokenA, tokenB);
}
(uint reserveA, uint reserveB) = XchangeLibrary.getReserves(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = XchangeLibrary.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, "Xchange: INSUFFICIENT_B_AMOUNT");
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = XchangeLibrary.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, "Xchange: INSUFFICIENT_A_AMOUNT");
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
// **** SWAP ****
// requires the initial amount to have already been sent to the first pair
function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
for (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = XchangeLibrary.sortTokens(input, output);
uint amountOut = amounts[i + 1];
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
address to = i < path.length - 2 ? XchangeLibrary.pairFor(factory, output, path[i + 2]) : _to;
IXchangePair(XchangeLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
}
}
// **** SWAP (supporting fee-on-transfer tokens) ****
// requires the initial amount to have already been sent to the first pair
function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
for (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = XchangeLibrary.sortTokens(input, output);
IXchangePair pair = IXchangePair(XchangeLibrary.pairFor(factory, input, output));
uint amountInput;
uint amountOutput;
{
// scope to avoid stack too deep errors
(uint reserve0, uint reserve1, ) = pair.getReserves();
(uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput;
amountOutput = XchangeLibrary.getAmountOut(amountInput, reserveInput, reserveOutput, 20);
}
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
address to = i < path.length - 2 ? XchangeLibrary.pairFor(factory, output, path[i + 2]) : _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
}
library XchangeLibrary {
// 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, "XchangeLibrary: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), "XchangeLibrary: ZERO_ADDRESS");
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(
uint160(
uint(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
hex"d75846df8bac2f946ea9ee78caa53b6812e7514197698275b8322d75e1543193" // init code hash
)
)
)
)
);
}
// fetches and sorts the reserves for a pair
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint reserveA, uint reserveB) {
(address token0, ) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1, ) = IXchangePair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, "XchangeLibrary: INSUFFICIENT_AMOUNT");
require(reserveA > 0 && reserveB > 0, "XchangeLibrary: INSUFFICIENT_LIQUIDITY");
amountB = (amountA * reserveB) / reserveA;
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut,
uint feeAmount
) internal pure returns (uint amountOut) {
require(amountIn > 0, "XchangeLibrary: INSUFFICIENT_INPUT_AMOUNT");
require(reserveIn > 0 && reserveOut > 0, "XchangeLibrary: INSUFFICIENT_LIQUIDITY");
require(feeAmount <= 20, "XchangeLibrary: EXCESSIVE_FEE");
uint amountInWithFee = amountIn * (10000 - feeAmount);
uint numerator = amountInWithFee * reserveOut;
uint denominator = (reserveIn * 10000) + amountInWithFee;
amountOut = numerator / denominator;
}
// given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountIn(
uint amountOut,
uint reserveIn,
uint reserveOut,
uint feeAmount
) internal pure returns (uint amountIn) {
require(amountOut > 0, "XchangeLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
require(reserveIn > 0 && reserveOut > 0, "XchangeLibrary: INSUFFICIENT_LIQUIDITY");
require(feeAmount <= 20, "XchangeLibrary: EXCESSIVE_FEE");
uint numerator = reserveIn * amountOut * 10000;
uint denominator = (reserveOut - amountOut) * (10000 - feeAmount);
amountIn = (numerator / denominator) + 1;
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint amountIn,
uint feeAmount,
address[] memory path
) internal view returns (uint[] memory amounts) {
require(path.length >= 2, "XchangeLibrary: INVALID_PATH");
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut, feeAmount);
}
}
// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(
address factory,
uint amountOut,
uint feeAmount,
address[] memory path
) internal view returns (uint[] memory amounts) {
require(path.length >= 2, "XchangeLibrary: INVALID_PATH");
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, feeAmount);
}
}
}
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeTransfer(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED");
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED");
}
function safeApprove(address token, address to, uint256 value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "SA");
}
function safeTransferETH(address to, uint value) internal {
(bool success, ) = to.call{ value: value }(new bytes(0));
require(success, "TransferHelper: ETH_TRANSFER_FAILED");
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": true,
"runs": 800
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
}
}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"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"previousBlockhash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","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":"uint256","name":"gasAmount","type":"uint256"}],"name":"mustRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801561001057600080fd5b5060405161528a38038061528a83398101604081905261002f916100be565b8061003981610052565b50506001600160a01b039182166080521660a052610101565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100b957600080fd5b919050565b6000806000606084860312156100d357600080fd5b6100dc846100a2565b92506100ea602085016100a2565b91506100f8604085016100a2565b90509250925092565b60805160a051614fea6102a0600039600081816101ec0152818161048401528181610680015281816106cf015281816107b001528181610a3901528181610e820152818161106a0152818161146b015281816115760152818161165d01528181611713015281816118970152818161192501528181611d3401528181611dec01528181611ea001528181611f4501528181611fb90152818161249a0152818161277b015281816127d1015281816128050152818161289a01528181612cda01528181612e460152612ed401526000818161052b015281816108540152818161096401528181610b1f01528181610bca01528181610cfe01528181610f2601528181611048015281816111bc015281816117b60152818161195701528181611ac701528181611feb015281816122420152818161244601528181612478015281816125de015281816127af01528181612a0a01528181612a8d01528181612d7d01528181612f0601528181613882015281816138d201528181613b9701528181613d50015281816142670152818161430901526143800152614fea6000f3fe6080604052600436106101dc5760003560e01c80638803dbee11610102578063c45a015511610095578063f2fde38b11610064578063f2fde38b146105c8578063f305d719146105e8578063f84b6a4c146105fb578063fb3bdb411461061b57600080fd5b8063c45a015514610519578063d06ca61f1461054d578063ded9382a1461056d578063e8e337001461058d57600080fd5b8063ad615dec116100d1578063ad615dec146104a6578063af2979eb146104c6578063b6f9de95146104e6578063baa2abde146104f957600080fd5b80638803dbee1461040d5780638da5cb5b1461042d578063ac9650d81461045f578063ad5c46481461047257600080fd5b80634a25d94a1161017a578063715018a611610149578063715018a6146103a5578063791ac947146103ba5780637ff36ab5146103da57806385f8c259146103ed57600080fd5b80634a25d94a146103325780635ae401dc146103525780635b0d5984146103655780635c11d7951461038557600080fd5b80631f00ca74116101b65780631f00ca74146102b25780631f0464d1146102d25780632195995c146102f257806338ed17391461031257600080fd5b806302751cec1461021d578063054d50d41461025757806318cbafe51461028557600080fd5b3661021857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461021657600080fd5b005b600080fd5b34801561022957600080fd5b5061023d6102383660046145aa565b61062e565b604080519283526020830191909152015b60405180910390f35b34801561026357600080fd5b50610277610272366004614608565b610749565b60405190815260200161024e565b34801561029157600080fd5b506102a56102a0366004614679565b610760565b60405161024e91906146ec565b3480156102be57600080fd5b506102a56102cd366004614777565b610b18565b6102e56102e0366004614835565b610b50565b60405161024e91906148d1565b3480156102fe57600080fd5b5061023d61030d366004614959565b610bc0565b34801561031e57600080fd5b506102a561032d366004614679565b610cb3565b34801561033e57600080fd5b506102a561034d366004614679565b610e32565b6102e5610360366004614835565b610fed565b34801561037157600080fd5b50610277610380366004614a03565b611040565b34801561039157600080fd5b506102166103a0366004614679565b611147565b3480156103b157600080fd5b50610216611409565b3480156103c657600080fd5b506102166103d5366004614679565b61141d565b6102a56103e8366004614a99565b6116cb565b3480156103f957600080fd5b50610277610408366004614608565b611a6d565b34801561041957600080fd5b506102a5610428366004614679565b611a7c565b34801561043957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161024e565b6102e561046d366004614b00565b611b8e565b34801561047e57600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b257600080fd5b506102776104c1366004614608565b611cdb565b3480156104d257600080fd5b506102776104e13660046145aa565b611ce8565b6102166104f4366004614a99565b611e5a565b34801561050557600080fd5b5061023d610514366004614b42565b6121f4565b34801561052557600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b34801561055957600080fd5b506102a5610568366004614777565b61243f565b34801561057957600080fd5b5061023d610588366004614a03565b61246e565b34801561059957600080fd5b506105ad6105a8366004614bb4565b61257b565b6040805193845260208401929092529082015260600161024e565b3480156105d457600080fd5b506102166105e3366004614c30565b61269c565b6105ad6105f63660046145aa565b61272c565b34801561060757600080fd5b5061023d610616366004614c54565b6129ae565b6102a5610629366004614a99565b612c92565b600080824281101561067a5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b60448201526064015b60405180910390fd5b6106a9897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6121f4565b90935091506106b989868561305e565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b5050505061073d858361318e565b50965096945050505050565b6000610758848484601461325c565b949350505050565b606081428110156107a65760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866107dd600182614ce4565b8181106107ec576107ec614cf7565b90506020020160208101906108019190614c30565b6001600160a01b03161461084f5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6108af7f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516108c19190614ce4565b815181106108d1576108d1614cf7565b602002602001015110156109335760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b6109f88686600081811061094957610949614cf7565b905060200201602081019061095e9190614c30565b336109d87f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061099657610996614cf7565b90506020020160208101906109ab9190614c30565b8b8b60018181106109be576109be614cf7565b90506020020160208101906109d39190614c30565b613569565b856000815181106109eb576109eb614cf7565b602002602001015161365a565b610a378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061379f915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610a759190614ce4565b81518110610a8557610a85614cf7565b60200260200101516040518263ffffffff1660e01b8152600401610aab91815260200190565b600060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b50505050610b0d848360018551610af09190614ce4565b81518110610b0057610b00614cf7565b602002602001015161318e565b509695505050505050565b6060610b477f0000000000000000000000000000000000000000000000000000000000000000846014856139a0565b90505b92915050565b60608380610b5f600143614ce4565b4014610bad5760405162461bcd60e51b815260206004820152600960248201527f426c6f636b6861736800000000000000000000000000000000000000000000006044820152606401610671565b610bb78484611b8e565b95945050505050565b6000806000610bf07f00000000000000000000000000000000000000000000000000000000000000008f8f613569565b9050600087610bff578c610c03565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610c7257600080fd5b505af1158015610c86573d6000803e3d6000fd5b50505050610c998f8f8f8f8f8f8f6121f4565b809450819550505050509b509b9950505050505050505050565b60608142811015610cf95760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b610d597f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b9150868260018451610d6b9190614ce4565b81518110610d7b57610d7b614cf7565b60200260200101511015610ddd5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b610df38686600081811061094957610949614cf7565b610b0d8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b60608142811015610e785760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610eaf600182614ce4565b818110610ebe57610ebe614cf7565b9050602002016020810190610ed39190614c30565b6001600160a01b031614610f215760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b610f817f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110610f9757610f97614cf7565b602002602001015111156109335760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608380421115610bad5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610671565b60008061108e7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613569565b905060008661109d578b6110a1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050506111368d8d8d8d8d8d611ce8565b9d9c50505050505050505050505050565b804281101561118b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b61121c858560008181106111a1576111a1614cf7565b90506020020160208101906111b69190614c30565b336112167f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b90506020020160208101906112039190614c30565b8a8a60018181106109be576109be614cf7565b8a61365a565b6000858561122b600182614ce4565b81811061123a5761123a614cf7565b905060200201602081019061124f9190614c30565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190614d0d565b90506112fb868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613b22915050565b8681878761130a600182614ce4565b81811061131957611319614cf7565b905060200201602081019061132e9190614c30565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b9190614d0d565b6113a59190614ce4565b10156113ff5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b5050505050505050565b611411613e05565b61141b6000613e6e565b565b80428110156114615760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611498600182614ce4565b8181106114a7576114a7614cf7565b90506020020160208101906114bc9190614c30565b6001600160a01b03161461150a5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b611520858560008181106111a1576111a1614cf7565b61155e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b22915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190614d0d565b9050868110156116475760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050506113ff848261318e565b606081428110156117115760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061174e5761174e614cf7565b90506020020160208101906117639190614c30565b6001600160a01b0316146117b15760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6118117f00000000000000000000000000000000000000000000000000000000000000003460148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516118239190614ce4565b8151811061183357611833614cf7565b602002602001015110156118955760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106118d7576118d7614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6119897f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b8460008151811061199c5761199c614cf7565b60200260200101516040518363ffffffff1660e01b81526004016119d59291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190614d26565b611a2457611a24614d43565b611a638287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b5095945050505050565b60006107588484846014613ed6565b60608142811015611ac25760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611b227f00000000000000000000000000000000000000000000000000000000000000008960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110611b3857611b38614cf7565b60200260200101511115610ddd5760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608167ffffffffffffffff811115611ba957611ba9614730565b604051908082528060200260200182016040528015611bdc57816020015b6060815260200190600190039081611bc75790505b50905060005b82811015611cd45760008030868685818110611c0057611c00614cf7565b9050602002810190611c129190614d59565b604051611c20929190614da0565b600060405180830381855af49150503d8060008114611c5b576040519150601f19603f3d011682016040523d82523d6000602084013e611c60565b606091505b509150915081611cac57604481511015611c7957600080fd5b60048101905080806020019051810190611c939190614db0565b60405162461bcd60e51b81526004016106719190614e3b565b80848481518110611cbf57611cbf614cf7565b60209081029190910101525050600101611be2565b5092915050565b6000610758848484614067565b60008142811015611d2e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611d5d887f000000000000000000000000000000000000000000000000000000000000000089898930896121f4565b6040516370a0823160e01b8152306004820152909350611dd69150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd19190614d0d565b61305e565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b50505050610b0d848361318e565b8042811015611e9e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611edb57611edb614cf7565b9050602002016020810190611ef09190614c30565b6001600160a01b031614611f3e5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61201d7f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190614d26565b6120b2576120b2614d43565b600086866120c1600182614ce4565b8181106120d0576120d0614cf7565b90506020020160208101906120e59190614c30565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190614d0d565b9050612191878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b22915050565b878188886121a0600182614ce4565b8181106121af576121af614cf7565b90506020020160208101906121c49190614c30565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240161135a565b600080824281101561223b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b60006122687f00000000000000000000000000000000000000000000000000000000000000008c8c613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af11580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190614d26565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190614e4e565b9150915060006123638e8e614144565b509050806001600160a01b03168e6001600160a01b031614612386578183612389565b82825b90975095508a8710156123de5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8986101561242e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b505050505097509795505050505050565b6060610b477f0000000000000000000000000000000000000000000000000000000000000000846014856133e8565b60008060006124be7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613569565b90506000876124cd578c6124d1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561254057600080fd5b505af1158015612554573d6000803e3d6000fd5b505050506125668e8e8e8e8e8e61062e565b909f909e509c50505050505050505050505050565b600080600083428110156125c45760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6125d28c8c8c8c8c8c614239565b909450925060006126047f00000000000000000000000000000000000000000000000000000000000000008e8e613569565b90506126128d33838861365a565b61261e8c33838761365a565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190614d0d565b92505050985098509895505050505050565b6126a4613e05565b6001600160a01b0381166127205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610671565b61272981613e6e565b50565b600080600083428110156127755760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6127a38a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614239565b909450925060006127f57f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613569565b90506128038b33838861365a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561285e57600080fd5b505af1158015612872573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190614d26565b61291757612917614d43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561295f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129839190614d0d565b9250833411156129a0576129a03361299b8634614ce4565b61318e565b505096509650969350505050565b60008083428110156129f55760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b604051632eb8193d60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bae064f490602401602060405180830381865afa158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190614d26565b612a8657600080fd5b6000612ab37f00000000000000000000000000000000000000000000000000000000000000008d8d613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018d90529192506323b872dd906064016020604051808303816000875af1158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190614d26565b5060405163023d845560e21b81526001600160a01b0388811660048301526024820187905260009182918416906308f611549060440160408051808303816000875af1158015612b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba59190614e4e565b915091506000612bb58f8f614144565b509050806001600160a01b03168f6001600160a01b031614612bd8578183612bdb565b82825b90975095508b871015612c305760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8a861015612c805760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b50505050509850989650505050505050565b60608142811015612cd85760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d1557612d15614cf7565b9050602002016020810190612d2a9190614c30565b6001600160a01b031614612d785760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b612dd87f00000000000000000000000000000000000000000000000000000000000000008860148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91503482600081518110612dee57612dee614cf7565b60200260200101511115612e445760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e8657612e86614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f387f0000000000000000000000000000000000000000000000000000000000000000898960008181106111ee576111ee614cf7565b84600081518110612f4b57612f4b614cf7565b60200260200101516040518363ffffffff1660e01b8152600401612f849291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc79190614d26565b612fd357612fd3614d43565b6130128287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b8160008151811061302557613025614cf7565b6020026020010151341115611a6357611a63338360008151811061304b5761304b614cf7565b60200260200101513461299b9190614ce4565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392908716916130cf9190614e72565b6000604051808303816000865af19150503d806000811461310c576040519150601f19603f3d011682016040523d82523d6000602084013e613111565b606091505b509150915081801561313b57508051158061313b57508080602001905181019061313b9190614d26565b6131875760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610671565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516131b89190614e72565b60006040518083038185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50509050806132575760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610671565b505050565b60008085116132d35760405162461bcd60e51b815260206004820152602960248201527f586368616e67654c6962726172793a20494e53554646494349454e545f494e5060448201527f55545f414d4f554e5400000000000000000000000000000000000000000000006064820152608401610671565b6000841180156132e35750600083115b61333e5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b601482111561338f5760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b600061339d83612710614ce4565b6133a79087614e8e565b905060006133b58583614e8e565b90506000826133c688612710614e8e565b6133d09190614ea5565b90506133dc8183614eb8565b98975050505050505050565b606060028251101561343c5760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff81111561345657613456614730565b60405190808252806020026020018201604052801561347f578160200160208202803683370190505b509050838160008151811061349657613496614cf7565b60200260200101818152505060005b600183516134b39190614ce4565b81101561356057600080613506888685815181106134d3576134d3614cf7565b6020026020010151878660016134e99190614ea5565b815181106134f9576134f9614cf7565b60200260200101516144bd565b9150915061352f84848151811061351f5761351f614cf7565b602002602001015183838961325c565b8461353b856001614ea5565b8151811061354b5761354b614cf7565b602090810291909101015250506001016134a5565b50949350505050565b60008060006135788585614144565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016136389291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fd75846df8bac2f946ea9ee78caa53b6812e7514197698275b8322d75e1543193603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916136d39190614e72565b6000604051808303816000865af19150503d8060008114613710576040519150601f19603f3d011682016040523d82523d6000602084013e613715565b606091505b509150915081801561373f57508051158061373f57508080602001905181019061373f9190614d26565b6137975760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610671565b505050505050565b60005b600183516137b09190614ce4565b81101561399a576000808483815181106137cc576137cc614cf7565b6020026020010151858460016137e29190614ea5565b815181106137f2576137f2614cf7565b602002602001015191509150600061380a8383614144565b50905060008761381b866001614ea5565b8151811061382b5761382b614cf7565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146138595782600061385d565b6000835b91509150600060028a516138719190614ce4565b881061387d57886138cb565b6138cb7f0000000000000000000000000000000000000000000000000000000000000000878c6138ae8c6002614ea5565b815181106138be576138be614cf7565b6020026020010151613569565b90506138f87f00000000000000000000000000000000000000000000000000000000000000008888613569565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613935576020820181803683370190505b506040518563ffffffff1660e01b81526004016139559493929190614eda565b600060405180830381600087803b15801561396f57600080fd5b505af1158015613983573d6000803e3d6000fd5b5050600190990198506137a2975050505050505050565b50505050565b60606002825110156139f45760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff811115613a0e57613a0e614730565b604051908082528060200260200182016040528015613a37578160200160208202803683370190505b509050838160018351613a4a9190614ce4565b81518110613a5a57613a5a614cf7565b602002602001018181525050600060018351613a769190614ce4565b90505b801561356057600080613abc8886613a92600187614ce4565b81518110613aa257613aa2614cf7565b60200260200101518786815181106134f9576134f9614cf7565b91509150613ae5848481518110613ad557613ad5614cf7565b6020026020010151838389613ed6565b84613af1600186614ce4565b81518110613b0157613b01614cf7565b60200260200101818152505050508080613b1a90614f12565b915050613a79565b60005b60018351613b339190614ce4565b81101561325757600080848381518110613b4f57613b4f614cf7565b602002602001015185846001613b659190614ea5565b81518110613b7557613b75614cf7565b6020026020010151915091506000613b8d8383614144565b5090506000613bbd7f00000000000000000000000000000000000000000000000000000000000000008585613569565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c279190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613c6f578284613c72565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015613cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce49190614d0d565b613cee9190614ce4565b9550613cfd868383601461325c565b945050505050600080856001600160a01b0316886001600160a01b031614613d2757826000613d2b565b6000835b91509150600060028c51613d3f9190614ce4565b8a10613d4b578a613d7c565b613d7c7f0000000000000000000000000000000000000000000000000000000000000000898e6138ae8e6002614ea5565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613dbe9086908690869060248101614eda565b600060405180830381600087803b158015613dd857600080fd5b505af1158015613dec573d6000803e3d6000fd5b50506001909b019a50613b259950505050505050505050565b33613e186000546001600160a01b031690565b6001600160a01b03161461141b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610671565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808511613f4d5760405162461bcd60e51b815260206004820152602a60248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610671565b600084118015613f5d5750600083115b613fb85760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b60148211156140095760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b60006140158686614e8e565b61402190612710614e8e565b9050600061403184612710614ce4565b61403b8887614ce4565b6140459190614e8e565b90506140518183614eb8565b61405c906001614ea5565b979650505050505050565b60008084116140c45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610671565b6000831180156140d45750600082115b61412f5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b8261413a8386614e8e565b6107589190614eb8565b600080826001600160a01b0316846001600160a01b0316036141b45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610671565b826001600160a01b0316846001600160a01b0316106141d45782846141d7565b83835b90925090506001600160a01b0382166142325760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a205a45524f5f41444452455353000000006044820152606401610671565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa1580156142b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d49190614f97565b6001600160a01b031603614378576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143769190614f97565b505b6000806143a67f00000000000000000000000000000000000000000000000000000000000000008b8b6144bd565b915091508160001480156143b8575080155b156143c8578793508692506144b0565b60006143d5898484614067565b9050878111614439578581101561442e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b8894509250826144ae565b6000614446898486614067565b90508981111561445857614458614d43565b878110156144a85760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b94508793505b505b5050965096945050505050565b60008060006144cc8585614144565b5090506000806144dd888888613569565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561451a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453e9190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b031614614583578082614586565b81815b90999098509650505050505050565b6001600160a01b038116811461272957600080fd5b60008060008060008060c087890312156145c357600080fd5b86356145ce81614595565b955060208701359450604087013593506060870135925060808701356145f381614595565b8092505060a087013590509295509295509295565b60008060006060848603121561461d57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261464657600080fd5b50813567ffffffffffffffff81111561465e57600080fd5b6020830191508360208260051b850101111561423257600080fd5b60008060008060008060a0878903121561469257600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156146b757600080fd5b6146c389828a01614634565b90955093505060608701356146d781614595565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561472457835183529284019291840191600101614708565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561476f5761476f614730565b604052919050565b6000806040838503121561478a57600080fd5b8235915060208084013567ffffffffffffffff808211156147aa57600080fd5b818601915086601f8301126147be57600080fd5b8135818111156147d0576147d0614730565b8060051b91506147e1848301614746565b81815291830184019184810190898411156147fb57600080fd5b938501935b83851015614825578435925061481583614595565b8282529385019390850190614800565b8096505050505050509250929050565b60008060006040848603121561484a57600080fd5b83359250602084013567ffffffffffffffff81111561486857600080fd5b61487486828701614634565b9497909650939450505050565b60005b8381101561489c578181015183820152602001614884565b50506000910152565b600081518084526148bd816020860160208601614881565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561492857603f198886030184526149168583516148a5565b945092850192908501906001016148fa565b5092979650505050505050565b801515811461272957600080fd5b803560ff8116811461495457600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561497b57600080fd5b8b3561498681614595565b9a5060208c013561499681614595565b995060408c0135985060608c0135975060808c0135965060a08c01356149bb81614595565b955060c08c0135945060e08c01356149d281614935565b93506149e16101008d01614943565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215614a2357600080fd5b8a35614a2e81614595565b995060208b0135985060408b0135975060608b0135965060808b0135614a5381614595565b955060a08b0135945060c08b0135614a6a81614935565b9350614a7860e08c01614943565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215614ab157600080fd5b85359450602086013567ffffffffffffffff811115614acf57600080fd5b614adb88828901614634565b9095509350506040860135614aef81614595565b949793965091946060013592915050565b60008060208385031215614b1357600080fd5b823567ffffffffffffffff811115614b2a57600080fd5b614b3685828601614634565b90969095509350505050565b600080600080600080600060e0888a031215614b5d57600080fd5b8735614b6881614595565b96506020880135614b7881614595565b955060408801359450606088013593506080880135925060a0880135614b9d81614595565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215614bd157600080fd5b8835614bdc81614595565b97506020890135614bec81614595565b965060408901359550606089013594506080890135935060a0890135925060c0890135614c1881614595565b8092505060e089013590509295985092959890939650565b600060208284031215614c4257600080fd5b8135614c4d81614595565b9392505050565b600080600080600080600080610100898b031215614c7157600080fd5b8835614c7c81614595565b97506020890135614c8c81614595565b965060408901359550606089013594506080890135935060a0890135614cb181614595565b979a969950949793969295929450505060c08201359160e0013590565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b4a57610b4a614cce565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614d1f57600080fd5b5051919050565b600060208284031215614d3857600080fd5b8151614c4d81614935565b634e487b7160e01b600052600160045260246000fd5b6000808335601e19843603018112614d7057600080fd5b83018035915067ffffffffffffffff821115614d8b57600080fd5b60200191503681900382131561423257600080fd5b8183823760009101908152919050565b600060208284031215614dc257600080fd5b815167ffffffffffffffff80821115614dda57600080fd5b818401915084601f830112614dee57600080fd5b815181811115614e0057614e00614730565b614e13601f8201601f1916602001614746565b9150808252856020828501011115614e2a57600080fd5b613560816020840160208601614881565b602081526000610b4760208301846148a5565b60008060408385031215614e6157600080fd5b505080516020909101519092909150565b60008251614e84818460208701614881565b9190910192915050565b8082028115828204841417610b4a57610b4a614cce565b80820180821115610b4a57610b4a614cce565b600082614ed557634e487b7160e01b600052601260045260246000fd5b500490565b8481528360208201526001600160a01b0383166040820152608060608201526000614f0860808301846148a5565b9695505050505050565b600081614f2157614f21614cce565b506000190190565b80516dffffffffffffffffffffffffffff8116811461495457600080fd5b600080600060608486031215614f5c57600080fd5b614f6584614f29565b9250614f7360208501614f29565b9150604084015163ffffffff81168114614f8c57600080fd5b809150509250925092565b600060208284031215614fa957600080fd5b8151614c4d8161459556fea2646970667358221220d23ee3d8868e7b0bfdaba3641ca226722f56cc412625496b8fe1db314b7f995664736f6c634300081900330000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f7c5c8bdd689767e039c631ad42482128bd54ba3
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c80638803dbee11610102578063c45a015511610095578063f2fde38b11610064578063f2fde38b146105c8578063f305d719146105e8578063f84b6a4c146105fb578063fb3bdb411461061b57600080fd5b8063c45a015514610519578063d06ca61f1461054d578063ded9382a1461056d578063e8e337001461058d57600080fd5b8063ad615dec116100d1578063ad615dec146104a6578063af2979eb146104c6578063b6f9de95146104e6578063baa2abde146104f957600080fd5b80638803dbee1461040d5780638da5cb5b1461042d578063ac9650d81461045f578063ad5c46481461047257600080fd5b80634a25d94a1161017a578063715018a611610149578063715018a6146103a5578063791ac947146103ba5780637ff36ab5146103da57806385f8c259146103ed57600080fd5b80634a25d94a146103325780635ae401dc146103525780635b0d5984146103655780635c11d7951461038557600080fd5b80631f00ca74116101b65780631f00ca74146102b25780631f0464d1146102d25780632195995c146102f257806338ed17391461031257600080fd5b806302751cec1461021d578063054d50d41461025757806318cbafe51461028557600080fd5b3661021857336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461021657600080fd5b005b600080fd5b34801561022957600080fd5b5061023d6102383660046145aa565b61062e565b604080519283526020830191909152015b60405180910390f35b34801561026357600080fd5b50610277610272366004614608565b610749565b60405190815260200161024e565b34801561029157600080fd5b506102a56102a0366004614679565b610760565b60405161024e91906146ec565b3480156102be57600080fd5b506102a56102cd366004614777565b610b18565b6102e56102e0366004614835565b610b50565b60405161024e91906148d1565b3480156102fe57600080fd5b5061023d61030d366004614959565b610bc0565b34801561031e57600080fd5b506102a561032d366004614679565b610cb3565b34801561033e57600080fd5b506102a561034d366004614679565b610e32565b6102e5610360366004614835565b610fed565b34801561037157600080fd5b50610277610380366004614a03565b611040565b34801561039157600080fd5b506102166103a0366004614679565b611147565b3480156103b157600080fd5b50610216611409565b3480156103c657600080fd5b506102166103d5366004614679565b61141d565b6102a56103e8366004614a99565b6116cb565b3480156103f957600080fd5b50610277610408366004614608565b611a6d565b34801561041957600080fd5b506102a5610428366004614679565b611a7c565b34801561043957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161024e565b6102e561046d366004614b00565b611b8e565b34801561047e57600080fd5b506104477f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156104b257600080fd5b506102776104c1366004614608565b611cdb565b3480156104d257600080fd5b506102776104e13660046145aa565b611ce8565b6102166104f4366004614a99565b611e5a565b34801561050557600080fd5b5061023d610514366004614b42565b6121f4565b34801561052557600080fd5b506104477f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c581565b34801561055957600080fd5b506102a5610568366004614777565b61243f565b34801561057957600080fd5b5061023d610588366004614a03565b61246e565b34801561059957600080fd5b506105ad6105a8366004614bb4565b61257b565b6040805193845260208401929092529082015260600161024e565b3480156105d457600080fd5b506102166105e3366004614c30565b61269c565b6105ad6105f63660046145aa565b61272c565b34801561060757600080fd5b5061023d610616366004614c54565b6129ae565b6102a5610629366004614a99565b612c92565b600080824281101561067a5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b60448201526064015b60405180910390fd5b6106a9897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a6121f4565b90935091506106b989868561305e565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b5050505061073d858361318e565b50965096945050505050565b6000610758848484601461325c565b949350505050565b606081428110156107a65760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866107dd600182614ce4565b8181106107ec576107ec614cf7565b90506020020160208101906108019190614c30565b6001600160a01b03161461084f5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6108af7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516108c19190614ce4565b815181106108d1576108d1614cf7565b602002602001015110156109335760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b6109f88686600081811061094957610949614cf7565b905060200201602081019061095e9190614c30565b336109d87f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58a8a600081811061099657610996614cf7565b90506020020160208101906109ab9190614c30565b8b8b60018181106109be576109be614cf7565b90506020020160208101906109d39190614c30565b613569565b856000815181106109eb576109eb614cf7565b602002602001015161365a565b610a378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061379f915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551610a759190614ce4565b81518110610a8557610a85614cf7565b60200260200101516040518263ffffffff1660e01b8152600401610aab91815260200190565b600060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b50505050610b0d848360018551610af09190614ce4565b81518110610b0057610b00614cf7565b602002602001015161318e565b509695505050505050565b6060610b477f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5846014856139a0565b90505b92915050565b60608380610b5f600143614ce4565b4014610bad5760405162461bcd60e51b815260206004820152600960248201527f426c6f636b6861736800000000000000000000000000000000000000000000006044820152606401610671565b610bb78484611b8e565b95945050505050565b6000806000610bf07f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58f8f613569565b9050600087610bff578c610c03565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610c7257600080fd5b505af1158015610c86573d6000803e3d6000fd5b50505050610c998f8f8f8f8f8f8f6121f4565b809450819550505050509b509b9950505050505050505050565b60608142811015610cf95760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b610d597f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b9150868260018451610d6b9190614ce4565b81518110610d7b57610d7b614cf7565b60200260200101511015610ddd5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b610df38686600081811061094957610949614cf7565b610b0d8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b60608142811015610e785760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686610eaf600182614ce4565b818110610ebe57610ebe614cf7565b9050602002016020810190610ed39190614c30565b6001600160a01b031614610f215760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b610f817f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110610f9757610f97614cf7565b602002602001015111156109335760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608380421115610bad5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610671565b60008061108e7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613569565b905060008661109d578b6110a1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b505050506111368d8d8d8d8d8d611ce8565b9d9c50505050505050505050505050565b804281101561118b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b61121c858560008181106111a1576111a1614cf7565b90506020020160208101906111b69190614c30565b336112167f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b90506020020160208101906112039190614c30565b8a8a60018181106109be576109be614cf7565b8a61365a565b6000858561122b600182614ce4565b81811061123a5761123a614cf7565b905060200201602081019061124f9190614c30565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190614d0d565b90506112fb868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613b22915050565b8681878761130a600182614ce4565b81811061131957611319614cf7565b905060200201602081019061132e9190614c30565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b9190614d0d565b6113a59190614ce4565b10156113ff5760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b5050505050505050565b611411613e05565b61141b6000613e6e565b565b80428110156114615760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168585611498600182614ce4565b8181106114a7576114a7614cf7565b90506020020160208101906114bc9190614c30565b6001600160a01b03161461150a5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b611520858560008181106111a1576111a1614cf7565b61155e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b22915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a0823190602401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190614d0d565b9050868110156116475760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050506113ff848261318e565b606081428110156117115760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061174e5761174e614cf7565b90506020020160208101906117639190614c30565b6001600160a01b0316146117b15760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b6118117f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c53460148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133e892505050565b91508682600184516118239190614ce4565b8151811061183357611833614cf7565b602002602001015110156118955760405162461bcd60e51b815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201526215539560ea1b6064820152608401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106118d7576118d7614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6119897f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b8460008151811061199c5761199c614cf7565b60200260200101516040518363ffffffff1660e01b81526004016119d59291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190614d26565b611a2457611a24614d43565b611a638287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b5095945050505050565b60006107588484846014613ed6565b60608142811015611ac25760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611b227f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58960148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91508682600081518110611b3857611b38614cf7565b60200260200101511115610ddd5760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b60608167ffffffffffffffff811115611ba957611ba9614730565b604051908082528060200260200182016040528015611bdc57816020015b6060815260200190600190039081611bc75790505b50905060005b82811015611cd45760008030868685818110611c0057611c00614cf7565b9050602002810190611c129190614d59565b604051611c20929190614da0565b600060405180830381855af49150503d8060008114611c5b576040519150601f19603f3d011682016040523d82523d6000602084013e611c60565b606091505b509150915081611cac57604481511015611c7957600080fd5b60048101905080806020019051810190611c939190614db0565b60405162461bcd60e51b81526004016106719190614e3b565b80848481518110611cbf57611cbf614cf7565b60209081029190910101525050600101611be2565b5092915050565b6000610758848484614067565b60008142811015611d2e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b611d5d887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898930896121f4565b6040516370a0823160e01b8152306004820152909350611dd69150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd19190614d0d565b61305e565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b50505050610b0d848361318e565b8042811015611e9e5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031685856000818110611edb57611edb614cf7565b9050602002016020810190611ef09190614c30565b6001600160a01b031614611f3e5760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb61201d7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190614d26565b6120b2576120b2614d43565b600086866120c1600182614ce4565b8181106120d0576120d0614cf7565b90506020020160208101906120e59190614c30565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190614d0d565b9050612191878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b22915050565b878188886121a0600182614ce4565b8181106121af576121af614cf7565b90506020020160208101906121c49190614c30565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240161135a565b600080824281101561223b5760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b60006122687f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58c8c613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af11580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190614d26565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190614e4e565b9150915060006123638e8e614144565b509050806001600160a01b03168e6001600160a01b031614612386578183612389565b82825b90975095508a8710156123de5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8986101561242e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b505050505097509795505050505050565b6060610b477f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5846014856133e8565b60008060006124be7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613569565b90506000876124cd578c6124d1565b6000195b60405163d505accf60e01b815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561254057600080fd5b505af1158015612554573d6000803e3d6000fd5b505050506125668e8e8e8e8e8e61062e565b909f909e509c50505050505050505050505050565b600080600083428110156125c45760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6125d28c8c8c8c8c8c614239565b909450925060006126047f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58e8e613569565b90506126128d33838861365a565b61261e8c33838761365a565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190614d0d565b92505050985098509895505050505050565b6126a4613e05565b6001600160a01b0381166127205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610671565b61272981613e6e565b50565b600080600083428110156127755760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b6127a38a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c614239565b909450925060006127f57f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613569565b90506128038b33838861365a565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561285e57600080fd5b505af1158015612872573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af11580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190614d26565b61291757612917614d43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561295f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129839190614d0d565b9250833411156129a0576129a03361299b8634614ce4565b61318e565b505096509650969350505050565b60008083428110156129f55760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b604051632eb8193d60e21b81523360048201527f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c56001600160a01b03169063bae064f490602401602060405180830381865afa158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190614d26565b612a8657600080fd5b6000612ab37f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58d8d613569565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018d90529192506323b872dd906064016020604051808303816000875af1158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190614d26565b5060405163023d845560e21b81526001600160a01b0388811660048301526024820187905260009182918416906308f611549060440160408051808303816000875af1158015612b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba59190614e4e565b915091506000612bb58f8f614144565b509050806001600160a01b03168f6001600160a01b031614612bd8578183612bdb565b82825b90975095508b871015612c305760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b8a861015612c805760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b50505050509850989650505050505050565b60608142811015612cd85760405162461bcd60e51b815260206004820152601060248201526f1618da185b99d94e881156141254915160821b6044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110612d1557612d15614cf7565b9050602002016020810190612d2a9190614c30565b6001600160a01b031614612d785760405162461bcd60e51b81526020600482015260156024820152740b0c6d0c2dcceca7440929cac82989288bea082a89605b1b6044820152606401610671565b612dd87f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58860148989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139a092505050565b91503482600081518110612dee57612dee614cf7565b60200260200101511115612e445760405162461bcd60e51b815260206004820152601f60248201527f586368616e67653a204558434553534956455f494e5055545f414d4f554e54006044820152606401610671565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db083600081518110612e8657612e86614cf7565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb612f387f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898960008181106111ee576111ee614cf7565b84600081518110612f4b57612f4b614cf7565b60200260200101516040518363ffffffff1660e01b8152600401612f849291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc79190614d26565b612fd357612fd3614d43565b6130128287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061379f915050565b8160008151811061302557613025614cf7565b6020026020010151341115611a6357611a63338360008151811061304b5761304b614cf7565b60200260200101513461299b9190614ce4565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392908716916130cf9190614e72565b6000604051808303816000865af19150503d806000811461310c576040519150601f19603f3d011682016040523d82523d6000602084013e613111565b606091505b509150915081801561313b57508051158061313b57508080602001905181019061313b9190614d26565b6131875760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610671565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516131b89190614e72565b60006040518083038185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50509050806132575760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610671565b505050565b60008085116132d35760405162461bcd60e51b815260206004820152602960248201527f586368616e67654c6962726172793a20494e53554646494349454e545f494e5060448201527f55545f414d4f554e5400000000000000000000000000000000000000000000006064820152608401610671565b6000841180156132e35750600083115b61333e5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b601482111561338f5760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b600061339d83612710614ce4565b6133a79087614e8e565b905060006133b58583614e8e565b90506000826133c688612710614e8e565b6133d09190614ea5565b90506133dc8183614eb8565b98975050505050505050565b606060028251101561343c5760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff81111561345657613456614730565b60405190808252806020026020018201604052801561347f578160200160208202803683370190505b509050838160008151811061349657613496614cf7565b60200260200101818152505060005b600183516134b39190614ce4565b81101561356057600080613506888685815181106134d3576134d3614cf7565b6020026020010151878660016134e99190614ea5565b815181106134f9576134f9614cf7565b60200260200101516144bd565b9150915061352f84848151811061351f5761351f614cf7565b602002602001015183838961325c565b8461353b856001614ea5565b8151811061354b5761354b614cf7565b602090810291909101015250506001016134a5565b50949350505050565b60008060006135788585614144565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016136389291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fd75846df8bac2f946ea9ee78caa53b6812e7514197698275b8322d75e1543193603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916136d39190614e72565b6000604051808303816000865af19150503d8060008114613710576040519150601f19603f3d011682016040523d82523d6000602084013e613715565b606091505b509150915081801561373f57508051158061373f57508080602001905181019061373f9190614d26565b6137975760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610671565b505050505050565b60005b600183516137b09190614ce4565b81101561399a576000808483815181106137cc576137cc614cf7565b6020026020010151858460016137e29190614ea5565b815181106137f2576137f2614cf7565b602002602001015191509150600061380a8383614144565b50905060008761381b866001614ea5565b8151811061382b5761382b614cf7565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146138595782600061385d565b6000835b91509150600060028a516138719190614ce4565b881061387d57886138cb565b6138cb7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5878c6138ae8c6002614ea5565b815181106138be576138be614cf7565b6020026020010151613569565b90506138f87f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58888613569565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613935576020820181803683370190505b506040518563ffffffff1660e01b81526004016139559493929190614eda565b600060405180830381600087803b15801561396f57600080fd5b505af1158015613983573d6000803e3d6000fd5b5050600190990198506137a2975050505050505050565b50505050565b60606002825110156139f45760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a20494e56414c49445f50415448000000006044820152606401610671565b815167ffffffffffffffff811115613a0e57613a0e614730565b604051908082528060200260200182016040528015613a37578160200160208202803683370190505b509050838160018351613a4a9190614ce4565b81518110613a5a57613a5a614cf7565b602002602001018181525050600060018351613a769190614ce4565b90505b801561356057600080613abc8886613a92600187614ce4565b81518110613aa257613aa2614cf7565b60200260200101518786815181106134f9576134f9614cf7565b91509150613ae5848481518110613ad557613ad5614cf7565b6020026020010151838389613ed6565b84613af1600186614ce4565b81518110613b0157613b01614cf7565b60200260200101818152505050508080613b1a90614f12565b915050613a79565b60005b60018351613b339190614ce4565b81101561325757600080848381518110613b4f57613b4f614cf7565b602002602001015185846001613b659190614ea5565b81518110613b7557613b75614cf7565b6020026020010151915091506000613b8d8383614144565b5090506000613bbd7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58585613569565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c279190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613c6f578284613c72565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015613cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce49190614d0d565b613cee9190614ce4565b9550613cfd868383601461325c565b945050505050600080856001600160a01b0316886001600160a01b031614613d2757826000613d2b565b6000835b91509150600060028c51613d3f9190614ce4565b8a10613d4b578a613d7c565b613d7c7f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5898e6138ae8e6002614ea5565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613dbe9086908690869060248101614eda565b600060405180830381600087803b158015613dd857600080fd5b505af1158015613dec573d6000803e3d6000fd5b50506001909b019a50613b259950505050505050505050565b33613e186000546001600160a01b031690565b6001600160a01b03161461141b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610671565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808511613f4d5760405162461bcd60e51b815260206004820152602a60248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610671565b600084118015613f5d5750600083115b613fb85760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b60148211156140095760405162461bcd60e51b815260206004820152601d60248201527f586368616e67654c6962726172793a204558434553534956455f4645450000006044820152606401610671565b60006140158686614e8e565b61402190612710614e8e565b9050600061403184612710614ce4565b61403b8887614ce4565b6140459190614e8e565b90506140518183614eb8565b61405c906001614ea5565b979650505050505050565b60008084116140c45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610671565b6000831180156140d45750600082115b61412f5760405162461bcd60e51b815260206004820152602660248201527f586368616e67654c6962726172793a20494e53554646494349454e545f4c495160448201526555494449545960d01b6064820152608401610671565b8261413a8386614e8e565b6107589190614eb8565b600080826001600160a01b0316846001600160a01b0316036141b45760405162461bcd60e51b815260206004820152602360248201527f586368616e67654c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610671565b826001600160a01b0316846001600160a01b0316106141d45782846141d7565b83835b90925090506001600160a01b0382166142325760405162461bcd60e51b815260206004820152601c60248201527f586368616e67654c6962726172793a205a45524f5f41444452455353000000006044820152606401610671565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c59091169063e6a4390590604401602060405180830381865afa1580156142b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d49190614f97565b6001600160a01b031603614378576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5169063c9c65396906044016020604051808303816000875af1158015614352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143769190614f97565b505b6000806143a67f0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c58b8b6144bd565b915091508160001480156143b8575080155b156143c8578793508692506144b0565b60006143d5898484614067565b9050878111614439578581101561442e5760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610671565b8894509250826144ae565b6000614446898486614067565b90508981111561445857614458614d43565b878110156144a85760405162461bcd60e51b815260206004820152601e60248201527f586368616e67653a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610671565b94508793505b505b5050965096945050505050565b60008060006144cc8585614144565b5090506000806144dd888888613569565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561451a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453e9190614f47565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b031614614583578082614586565b81815b90999098509650505050505050565b6001600160a01b038116811461272957600080fd5b60008060008060008060c087890312156145c357600080fd5b86356145ce81614595565b955060208701359450604087013593506060870135925060808701356145f381614595565b8092505060a087013590509295509295509295565b60008060006060848603121561461d57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261464657600080fd5b50813567ffffffffffffffff81111561465e57600080fd5b6020830191508360208260051b850101111561423257600080fd5b60008060008060008060a0878903121561469257600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156146b757600080fd5b6146c389828a01614634565b90955093505060608701356146d781614595565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561472457835183529284019291840191600101614708565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561476f5761476f614730565b604052919050565b6000806040838503121561478a57600080fd5b8235915060208084013567ffffffffffffffff808211156147aa57600080fd5b818601915086601f8301126147be57600080fd5b8135818111156147d0576147d0614730565b8060051b91506147e1848301614746565b81815291830184019184810190898411156147fb57600080fd5b938501935b83851015614825578435925061481583614595565b8282529385019390850190614800565b8096505050505050509250929050565b60008060006040848603121561484a57600080fd5b83359250602084013567ffffffffffffffff81111561486857600080fd5b61487486828701614634565b9497909650939450505050565b60005b8381101561489c578181015183820152602001614884565b50506000910152565b600081518084526148bd816020860160208601614881565b601f01601f19169290920160200192915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561492857603f198886030184526149168583516148a5565b945092850192908501906001016148fa565b5092979650505050505050565b801515811461272957600080fd5b803560ff8116811461495457600080fd5b919050565b60008060008060008060008060008060006101608c8e03121561497b57600080fd5b8b3561498681614595565b9a5060208c013561499681614595565b995060408c0135985060608c0135975060808c0135965060a08c01356149bb81614595565b955060c08c0135945060e08c01356149d281614935565b93506149e16101008d01614943565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215614a2357600080fd5b8a35614a2e81614595565b995060208b0135985060408b0135975060608b0135965060808b0135614a5381614595565b955060a08b0135945060c08b0135614a6a81614935565b9350614a7860e08c01614943565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060808688031215614ab157600080fd5b85359450602086013567ffffffffffffffff811115614acf57600080fd5b614adb88828901614634565b9095509350506040860135614aef81614595565b949793965091946060013592915050565b60008060208385031215614b1357600080fd5b823567ffffffffffffffff811115614b2a57600080fd5b614b3685828601614634565b90969095509350505050565b600080600080600080600060e0888a031215614b5d57600080fd5b8735614b6881614595565b96506020880135614b7881614595565b955060408801359450606088013593506080880135925060a0880135614b9d81614595565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215614bd157600080fd5b8835614bdc81614595565b97506020890135614bec81614595565b965060408901359550606089013594506080890135935060a0890135925060c0890135614c1881614595565b8092505060e089013590509295985092959890939650565b600060208284031215614c4257600080fd5b8135614c4d81614595565b9392505050565b600080600080600080600080610100898b031215614c7157600080fd5b8835614c7c81614595565b97506020890135614c8c81614595565b965060408901359550606089013594506080890135935060a0890135614cb181614595565b979a969950949793969295929450505060c08201359160e0013590565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b4a57610b4a614cce565b634e487b7160e01b600052603260045260246000fd5b600060208284031215614d1f57600080fd5b5051919050565b600060208284031215614d3857600080fd5b8151614c4d81614935565b634e487b7160e01b600052600160045260246000fd5b6000808335601e19843603018112614d7057600080fd5b83018035915067ffffffffffffffff821115614d8b57600080fd5b60200191503681900382131561423257600080fd5b8183823760009101908152919050565b600060208284031215614dc257600080fd5b815167ffffffffffffffff80821115614dda57600080fd5b818401915084601f830112614dee57600080fd5b815181811115614e0057614e00614730565b614e13601f8201601f1916602001614746565b9150808252856020828501011115614e2a57600080fd5b613560816020840160208601614881565b602081526000610b4760208301846148a5565b60008060408385031215614e6157600080fd5b505080516020909101519092909150565b60008251614e84818460208701614881565b9190910192915050565b8082028115828204841417610b4a57610b4a614cce565b80820180821115610b4a57610b4a614cce565b600082614ed557634e487b7160e01b600052601260045260246000fd5b500490565b8481528360208201526001600160a01b0383166040820152608060608201526000614f0860808301846148a5565b9695505050505050565b600081614f2157614f21614cce565b506000190190565b80516dffffffffffffffffffffffffffff8116811461495457600080fd5b600080600060608486031215614f5c57600080fd5b614f6584614f29565b9250614f7360208501614f29565b9150604084015163ffffffff81168114614f8c57600080fd5b809150509250925092565b600060208284031215614fa957600080fd5b8151614c4d8161459556fea2646970667358221220d23ee3d8868e7b0bfdaba3641ca226722f56cc412625496b8fe1db314b7f995664736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f7c5c8bdd689767e039c631ad42482128bd54ba3
-----Decoded View---------------
Arg [0] : _factory (address): 0x8B76C05676D205563ffC1cbd11c0A6e3d83929c5
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _owner (address): 0xf7c5c8Bdd689767e039c631Ad42482128BD54Ba3
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b76c05676d205563ffc1cbd11c0a6e3d83929c5
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000f7c5c8bdd689767e039c631ad42482128bd54ba3
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.