Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 7 from a total of 7 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw ATF | 23374642 | 154 days ago | IN | 0 ETH | 0.00002588 | ||||
| Swap ETH For Exa... | 23309612 | 163 days ago | IN | 0.00234418 ETH | 0.00032675 | ||||
| Swap ETH For Exa... | 23301969 | 164 days ago | IN | 0.02382331 ETH | 0.00037404 | ||||
| Swap ETH For Exa... | 23301963 | 164 days ago | IN | 0.0232825 ETH | 0.00032462 | ||||
| Swap Exact ETH F... | 23301389 | 164 days ago | IN | 0.01 ETH | 0.00008403 | ||||
| Swap ETH For Exa... | 23300066 | 165 days ago | IN | 0.00459726 ETH | 0.00005369 | ||||
| Deposit ATF | 23299997 | 165 days ago | IN | 0 ETH | 0.00001665 |
Latest 13 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23309612 | 163 days ago | 0.00001166 ETH | ||||
| Transfer | 23309612 | 163 days ago | 0.00001166 ETH | ||||
| Deposit | 23309612 | 163 days ago | 0.00234418 ETH | ||||
| Transfer | 23301969 | 164 days ago | 0.00011852 ETH | ||||
| Transfer | 23301969 | 164 days ago | 0.00011852 ETH | ||||
| Deposit | 23301969 | 164 days ago | 0.02382331 ETH | ||||
| Transfer | 23301963 | 164 days ago | 0.00011583 ETH | ||||
| Transfer | 23301963 | 164 days ago | 0.00011583 ETH | ||||
| Deposit | 23301963 | 164 days ago | 0.0232825 ETH | ||||
| Deposit | 23301389 | 164 days ago | 0.01 ETH | ||||
| Transfer | 23300066 | 165 days ago | 0.00002287 ETH | ||||
| Transfer | 23300066 | 165 days ago | 0.00002287 ETH | ||||
| Deposit | 23300066 | 165 days ago | 0.00459726 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Router
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "./interfaces/IWETH.sol";
import "./interfaces/IRouter.sol";
import "./interfaces/IFactory.sol";
import "./interfaces/IPair.sol";
/// @title Router is used to swap on Antfarm Protocol without having to own ATF tokens
/// @notice This Version only supports ETH swaps and relies on the ATF/ETH Oracle
contract Router is IRouter {
address public immutable factory;
address public immutable antfarmToken;
address public immutable weth;
address public immutable oraclePair;
mapping(address => uint256) public userDeposits;
uint256 public totalDeposits;
constructor(address _factory, address _weth) {
factory = _factory;
antfarmToken = IFactory(factory).protocolToken();
weth = _weth;
oraclePair = IFactory(factory).getPair(antfarmToken, weth, uint16(10));
}
modifier ensure(uint256 deadline) {
if (deadline < block.timestamp) revert Router__Expired();
_;
}
receive() external payable {}
/// @inheritdoc IRouter
function swapExactETHForTokens(
address _output,
uint16 _fee,
address _to,
uint256 _deadline,
uint256 _amountOutMin
) external payable ensure(_deadline) returns (uint256 _amountOut) {
IWETH(weth).deposit{value: msg.value}();
uint256[] memory amounts = getAmountsOut(msg.value, weth, _output, _fee);
address pair = IFactory(factory).getPair(weth, _output, _fee);
(,, uint256 feeToPay) = _getFeeToPay(amounts, weth, _output, pair);
// Use 'amounts' to store the required WETH to swap for fee ATF tokens
amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
amounts = getAmountsOut(
(msg.value * msg.value) / (msg.value + amounts[0]),
weth,
_output,
_fee
);
// Checks that the intermediary calculation is already enough
if (amounts[1] < _amountOutMin) {
revert Router__InsufficientOutputAmount();
}
(uint256 amount0Out, uint256 amount1Out, uint256 finalFeeToPay) =
_getFeeToPay(amounts, weth, _output, pair);
_amountOut = amount0Out + amount1Out;
IERC20(weth).transfer(oraclePair, msg.value - amounts[0]);
IPair(oraclePair).swap(finalFeeToPay, 0, pair);
IERC20(weth).transfer(pair, amounts[0]);
IPair(pair).swap(amount0Out, amount1Out, _to);
emit SwapExecuted(_to, weth, _output, msg.value, _amountOut);
}
/// @inheritdoc IRouter
function swapExactTokensForETH(
address _input,
uint16 _fee,
address _to,
uint256 _deadline,
uint256 _amountIn,
uint256 _amountOutMin
) external ensure(_deadline) returns (uint256 _amountOut) {
uint256[] memory amounts = getAmountsOut(_amountIn, _input, weth, _fee);
uint256 standardAmountOut = amounts[1];
address pair = IFactory(factory).getPair(_input, weth, _fee);
(uint256 amount0Out, uint256 amount1Out, uint256 feeToPay) =
_getFeeToPay(amounts, _input, weth, pair);
if (feeToPay > totalDeposits) {
revert Router__InsufficientATFBalance();
}
amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
if (standardAmountOut - amounts[0] < _amountOutMin) {
revert Router__InsufficientOutputAmount();
}
IERC20(antfarmToken).transfer(pair, feeToPay);
IERC20(_input).transferFrom(msg.sender, pair, _amountIn);
IPair(pair).swap(amount0Out, amount1Out, address(this));
_amountOut = standardAmountOut - amounts[0];
IERC20(weth).transfer(oraclePair, amounts[0]);
IPair(oraclePair).swap(feeToPay, 0, address(this));
IWETH(weth).withdraw(standardAmountOut - amounts[0]);
_safeTransferETH(_to, standardAmountOut - amounts[0]);
emit SwapExecuted(_to, _input, weth, _amountIn, _amountOut);
}
/// @inheritdoc IRouter
function swapETHForExactTokens(
address _output,
uint16 _fee,
address _to,
uint256 _deadline,
uint256 _amountOut
) external payable ensure(_deadline) returns (uint256 _amountIn) {
// Wrap all received ETH into WETH.
IWETH(weth).deposit{value: msg.value}();
uint256[] memory amounts =
_getAmountsIn(_amountOut, weth, _output, _fee);
address pair = IFactory(factory).getPair(weth, _output, _fee);
(uint256 amount0Out, uint256 amount1Out, uint256 feeToPay) =
_getFeeToPay(amounts, weth, _output, pair);
_amountIn = amounts[0]; // Temporary storage for the amount of WETH used for main swap
amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
if (_amountIn + amounts[0] > msg.value) {
revert Router__InsufficientInputAmount();
}
IERC20(weth).transfer(oraclePair, amounts[0]);
IPair(oraclePair).swap(feeToPay, 0, pair);
IERC20(weth).transfer(pair, _amountIn);
IPair(pair).swap(amount0Out, amount1Out, _to);
_amountIn += amounts[0];
uint256 refund = msg.value - _amountIn;
if (refund > 0) {
IWETH(weth).withdraw(refund);
_safeTransferETH(msg.sender, refund);
}
emit SwapExecuted(_to, weth, _output, _amountIn, _amountOut);
}
/// @inheritdoc IRouter
function estimateExactETHForTokens(
address _output,
uint16 _fee,
uint256 _amountIn
) external view returns (uint256 estimatedOut) {
uint256[] memory amounts = getAmountsOut(_amountIn, weth, _output, _fee);
address pair = IFactory(factory).getPair(weth, _output, _fee);
(,, uint256 feeToPay) = _getFeeToPay(amounts, weth, _output, pair);
uint256[] memory feeInAmounts =
_getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
feeInAmounts = getAmountsOut(
(_amountIn * _amountIn) / (_amountIn + feeInAmounts[0]),
weth,
_output,
_fee
);
return feeInAmounts[1];
}
/// @inheritdoc IRouter
function estimateExactTokensForETH(
address _input,
uint16 _fee,
uint256 _amountIn
) external view returns (uint256 estimatedOut) {
uint256[] memory amounts = getAmountsOut(_amountIn, _input, weth, _fee);
uint256 standardAmountOut = amounts[1];
address pair = IFactory(factory).getPair(_input, weth, _fee);
(,, uint256 feeToPay) = _getFeeToPay(amounts, _input, weth, pair);
amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
return standardAmountOut - amounts[0];
}
/// @inheritdoc IRouter
function estimateETHForExactTokens(
address _output,
uint16 _fee,
uint256 _amountOut
) external view returns (uint256 estimatedIn) {
uint256[] memory amounts =
_getAmountsIn(_amountOut, weth, _output, _fee);
address pair = IFactory(factory).getPair(weth, _output, _fee);
(,, uint256 feeToPay) = _getFeeToPay(amounts, weth, _output, pair);
// Calculate WETH needed to pay for ATF fees
uint256[] memory feeInAmounts =
_getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
// Total ETH needed is the amount for the swap plus the amount needed for fees
return amounts[0] + feeInAmounts[0];
}
function getAmountsOut(
uint256 amountIn,
address tokenIn,
address tokenOut,
uint16 fee
) internal view returns (uint256[] memory) {
uint256[] memory amounts = new uint256[](2);
amounts[0] = amountIn;
(uint256 reserveIn, uint256 reserveOut) =
_getReserves(tokenIn, tokenOut, fee);
if (tokenIn == antfarmToken) {
amounts[1] = _getAmountOut(
(amountIn * 1000) / (1000 + 10), reserveIn, reserveOut
);
} else if (tokenOut == antfarmToken) {
amounts[1] = (_getAmountOut(amountIn, reserveIn, reserveOut) * 1000)
/ (1000 + 10);
} else {
amounts[1] = _getAmountOut(amountIn, reserveIn, reserveOut);
}
return amounts;
}
function _getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256) {
if (amountIn == 0) revert Router__InsufficientInputAmount();
if (reserveIn == 0 || reserveOut == 0) {
revert Router__InsufficientLiquidity();
}
uint256 numerator = amountIn * reserveOut;
uint256 denominator = reserveIn + amountIn;
return numerator / denominator;
}
function _getAmountsIn(
uint256 amountOut,
address tokenIn,
address tokenOut,
uint16 fee
) internal view returns (uint256[] memory) {
uint256[] memory amounts = new uint256[](2);
amounts[1] = amountOut;
(uint256 reserveIn, uint256 reserveOut) =
_getReserves(tokenIn, tokenOut, fee);
if (tokenIn == antfarmToken) {
amounts[0] = (
_getAmountIn(amountOut, reserveIn, reserveOut) * (1000 + 10)
) / 1000;
} else if (tokenOut == antfarmToken) {
amounts[0] = _getAmountIn(
(amountOut * (1000 + 10)) / 1000, reserveIn, reserveOut
);
} else {
amounts[0] = _getAmountIn(amountOut, reserveIn, reserveOut);
}
return amounts;
}
function _getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256) {
if (amountOut == 0) revert Router__InsufficientOutputAmount();
if (reserveIn == 0 || reserveOut == 0 || amountOut >= reserveOut) {
revert Router__InsufficientLiquidity();
}
uint256 numerator = reserveIn * amountOut;
uint256 denominator = reserveOut - amountOut;
return (numerator / denominator) + 1;
}
function _getFeeToPay(
uint256[] memory amounts,
address tokenIn,
address tokenOut,
address pair
)
internal
view
returns (uint256 amount0Out, uint256 amount1Out, uint256 feeToPay)
{
// Original fee calculation for non-ATF pairs
(address token0,) = _sortTokens(tokenIn, tokenOut);
(amount0Out, amount1Out) = tokenIn == token0
? (uint256(0), amounts[1])
: (amounts[1], uint256(0));
uint256 amountIn = amounts[0];
feeToPay = IPair(pair).getFees(
amount0Out,
tokenIn == token0 ? amountIn : uint256(0),
amount1Out,
tokenIn == token0 ? uint256(0) : amountIn
);
}
function _getReserves(address tokenA, address tokenB, uint16 fee)
internal
view
returns (uint256 reserveA, uint256 reserveB)
{
(address token0,) = _sortTokens(tokenA, tokenB);
(uint256 reserve0, uint256 reserve1,) =
IPair(IFactory(factory).getPair(tokenA, tokenB, fee)).getReserves();
(reserveA, reserveB) =
tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
function _sortTokens(address tokenA, address tokenB)
internal
view
returns (address token0, address token1)
{
if (tokenA == tokenB) revert Router__IdenticalAddresses();
if (tokenA == antfarmToken || tokenB == antfarmToken) {
(token0, token1) = tokenA == antfarmToken
? (antfarmToken, tokenB)
: (antfarmToken, tokenA);
if (token1 == address(0)) revert Router__AddressZero();
} else {
(token0, token1) =
tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
if (token0 == address(0)) revert Router__AddressZero();
}
}
function _safeTransferETH(address to, uint256 value) internal {
(bool success,) = to.call{value: value}("");
if (!success) revert Router__ETHTransferFailed();
}
function depositATF(uint256 amount) external {
if (amount == 0) revert Router__ZeroAmount();
userDeposits[msg.sender] += amount;
totalDeposits += amount;
if (
!IERC20(antfarmToken).transferFrom(msg.sender, address(this), amount)
) {
revert Router__TransferFailed();
}
}
function withdrawATF(uint256 amount) external {
if (amount == 0) revert Router__ZeroAmount();
if (amount > userDeposits[msg.sender]) {
revert Router__InsufficientBalance();
}
userDeposits[msg.sender] -= amount;
totalDeposits -= amount;
if (!IERC20(antfarmToken).transfer(msg.sender, amount)) {
revert Router__TransferFailed();
}
}
function getDeposit(address user) external view returns (uint256) {
return userDeposits[user];
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IWETH {
// ERC20-like functions
function deposit() external payable;
function withdraw(uint256) external;
// Standard ERC20 functions
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount)
external
returns (bool);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount)
external
returns (bool);
// Events
event Deposit(address indexed dst, uint256 wad);
event Withdrawal(address indexed src, uint256 wad);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner, address indexed spender, uint256 value
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/// @title Router Interface for Antfarm Protocol
/// @notice Interface for handling token swaps with ETH on Antfarm Protocol
/// @dev Implements core swap functionality and estimation methods
interface IRouter {
error Router__Expired();
error Router__IdenticalAddresses();
error Router__AddressZero();
error Router__ZeroAmount();
error Router__InsufficientLiquidity();
error Router__InsufficientInputAmount();
error Router__InsufficientOutputAmount();
error Router__ETHTransferFailed();
error Router__InsufficientBalance();
error Router__InsufficientATFBalance();
error Router__TransferFailed();
event SwapExecuted(
address indexed sender,
address indexed tokenIn,
address indexed tokenOut,
uint256 amountIn,
uint256 amountOut
);
/// @notice Returns the factory contract address
/// @return Address of the factory contract
function factory() external view returns (address);
/// @notice Returns the Antfarm token address
/// @return Address of the Antfarm token
function antfarmToken() external view returns (address);
/// @notice Returns the WETH token address
/// @return Address of the WETH token
function weth() external view returns (address);
/// @notice Returns the oracle pair address
/// @return Address of the oracle pair
function oraclePair() external view returns (address);
/// @notice Allows the contract to receive ETH
receive() external payable;
/// @notice Swaps an exact amount of ETH for tokens
/// @param _output The token address to receive
/// @param _fee The fee tier of the pool
/// @param _to The recipient address for the output tokens
/// @param _deadline The timestamp by which the transaction must be executed
/// @param _amountOutMin The minimum amount of output tokens to receive
/// @return _amountOut The actual amount of output tokens received
function swapExactETHForTokens(
address _output,
uint16 _fee,
address _to,
uint256 _deadline,
uint256 _amountOutMin
) external payable returns (uint256 _amountOut);
/// @notice Swaps an exact amount of tokens for ETH
/// @param _input The token address to spend
/// @param _fee The fee tier of the pool
/// @param _to The recipient address for the ETH
/// @param _deadline The timestamp by which the transaction must be executed
/// @param _amountIn The amount of input tokens to spend
/// @param _amountOutMin The minimum amount of ETH to receive
/// @return _amountOut The actual amount of ETH received
function swapExactTokensForETH(
address _input,
uint16 _fee,
address _to,
uint256 _deadline,
uint256 _amountIn,
uint256 _amountOutMin
) external returns (uint256 _amountOut);
/// @notice Swaps ETH for an exact amount of tokens
/// @dev Refunds excess ETH if too much is sent
/// @param _output The token address to receive
/// @param _fee The fee tier of the pool
/// @param _to The recipient address for the tokens
/// @param _deadline The timestamp by which the transaction must be executed
/// @param _amountOut The exact amount of output tokens to receive
/// @return _amountIn The amount of ETH spent
function swapETHForExactTokens(
address _output,
uint16 _fee,
address _to,
uint256 _deadline,
uint256 _amountOut
) external payable returns (uint256 _amountIn);
/// @notice Estimates the output amount of tokens for an exact ETH input
/// @param _output The token address to receive
/// @param _fee The fee tier of the pool
/// @param _amountIn The amount of ETH to swap
/// @return estimatedOut The estimated amount of output tokens
function estimateExactETHForTokens(
address _output,
uint16 _fee,
uint256 _amountIn
) external view returns (uint256 estimatedOut);
/// @notice Estimates the output amount of ETH for an exact token input
/// @param _input The token address to spend
/// @param _fee The fee tier of the pool
/// @param _amountIn The amount of input tokens
/// @return estimatedOut The estimated amount of ETH
function estimateExactTokensForETH(
address _input,
uint16 _fee,
uint256 _amountIn
) external view returns (uint256 estimatedOut);
/// @notice Estimates the input amount of ETH needed for an exact token output
/// @param _output The token address to receive
/// @param _fee The fee tier of the pool
/// @param _amountOut The exact amount of output tokens desired
/// @return estimatedIn The estimated amount of ETH needed
function estimateETHForExactTokens(
address _output,
uint16 _fee,
uint256 _amountOut
) external view returns (uint256 estimatedIn);
/// @notice Deposits ATF tokens
/// @param amount The amount of ATF tokens to deposit
function depositATF(uint256 amount) external;
/// @notice Withdraws ATF tokens
/// @param amount The amount of ATF tokens to withdraw
function withdrawATF(uint256 amount) external;
/// @notice Gets the deposit amount for a user
/// @param user The address of the user
/// @return The deposit amount for the user
function getDeposit(address user) external view returns (uint256);
/// @notice Returns the deposit amount for a user
/// @param user The address of the user
/// @return The deposit amount for the user
function userDeposits(address user) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IFactory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint16 fee,
uint256 allPairsLength
);
function possibleFees(uint256) external view returns (uint16);
function allPairs(uint256) external view returns (address);
function protocolToken() external view returns (address);
function getPairs(uint256 startIndex, uint256 numOfPairs)
external
view
returns (address[] memory, uint256);
function getPair(address tokenA, address tokenB, uint16 fee)
external
view
returns (address pair);
function feesForPair(address tokenA, address tokenB, uint256)
external
view
returns (uint16);
function getFeesForPair(address tokenA, address tokenB)
external
view
returns (uint16[8] memory fees);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB, uint16 fee)
external
returns (address pair);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IPair {
error BalanceOverflow();
error InsufficientFee();
error InsufficientInputAmount();
error InsufficientLiquidity();
error InsufficientLiquidityBurned();
error InsufficientLiquidityMinted();
error InsufficientOutputAmount();
error InvalidReceiver();
error K();
error NoBetterOracle();
error NoOracleFound();
error SenderNotFactory();
error SwapAmountTooLow();
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function antfarmOracle() external view returns (address);
function antfarmToken() external view returns (address);
function antfarmTokenReserve() external view returns (uint256);
function burn(address to, uint256 positionId, uint256 liquidity)
external
returns (uint256, uint256);
function claimDividend(address to, uint256 positionId)
external
returns (uint256 claimAmount);
function claimableDividends(address operator, uint256 positionId)
external
view
returns (uint256 amount);
function factory() external view returns (address);
function fee() external view returns (uint16);
function getFees(
uint256 amount0Out,
uint256 amount0In,
uint256 amount1Out,
uint256 amount1In
) external view returns (uint256 feeToPay);
function getPositionLP(address operator, uint256 positionId)
external
view
returns (uint128);
function getReserves()
external
view
returns (
uint112 _reserve0,
uint112 _reserve1,
uint32 _blockTimestampLast
);
function initialize(
address _token0,
address _token1,
uint16 _fee,
address _antfarmToken
) external;
function mint(address to, uint256 positionId) external returns (uint256);
function positions(address, uint256)
external
view
returns (uint128 lp, uint256 dividend, uint256 lastDividendPoints);
function scanOracles(uint112 maxReserve)
external
view
returns (address bestOracle);
function skim(address to) external;
function swap(uint256 amount0Out, uint256 amount1Out, address to)
external;
function sync() external;
function token0() external view returns (address);
function token1() external view returns (address);
function totalSupply() external view returns (uint256);
function updateOracle() external;
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Router__AddressZero","type":"error"},{"inputs":[],"name":"Router__ETHTransferFailed","type":"error"},{"inputs":[],"name":"Router__Expired","type":"error"},{"inputs":[],"name":"Router__IdenticalAddresses","type":"error"},{"inputs":[],"name":"Router__InsufficientATFBalance","type":"error"},{"inputs":[],"name":"Router__InsufficientBalance","type":"error"},{"inputs":[],"name":"Router__InsufficientInputAmount","type":"error"},{"inputs":[],"name":"Router__InsufficientLiquidity","type":"error"},{"inputs":[],"name":"Router__InsufficientOutputAmount","type":"error"},{"inputs":[],"name":"Router__TransferFailed","type":"error"},{"inputs":[],"name":"Router__ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwapExecuted","type":"event"},{"inputs":[],"name":"antfarmToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositATF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"name":"estimateETHForExactTokens","outputs":[{"internalType":"uint256","name":"estimatedIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"estimateExactETHForTokens","outputs":[{"internalType":"uint256","name":"estimatedOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"estimateExactTokensForETH","outputs":[{"internalType":"uint256","name":"estimatedOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oraclePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawATF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
61010060405234801562000011575f80fd5b5060405162003b3a38038062003b3a83398181016040528101906200003791906200026c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff16631a465fe16040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000dd9190620002b1565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff166309175fa760a05160c051600a6040518463ffffffff1660e01b81526004016200018a9392919062000310565b602060405180830381865afa158015620001a6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001cc9190620002b1565b73ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050506200034b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000236826200020b565b9050919050565b62000248816200022a565b811462000253575f80fd5b50565b5f8151905062000266816200023d565b92915050565b5f806040838503121562000285576200028462000207565b5b5f620002948582860162000256565b9250506020620002a78582860162000256565b9150509250929050565b5f60208284031215620002c957620002c862000207565b5b5f620002d88482850162000256565b91505092915050565b620002ec816200022a565b82525050565b5f61ffff82169050919050565b6200030a81620002f2565b82525050565b5f606082019050620003255f830186620002e1565b620003346020830185620002e1565b620003436040830184620002ff565b949350505050565b60805160a05160c05160e0516135d1620005695f395f818161098601528181610a2b015281816112930152818161132d015281816115400152818161184701526118e101525f81816103f601528181610420015281816104870152818161050e0152818161053f015281816105c90152818161065e015281816106e001528181610747015281816107ce015281816107fe015281816108880152818161090e0152818161094a01528181610ab501528181610bec01528181610c8a01528181610d1001528181610d9701528181610dc601528181610e8601528181610f0c01528181610f950152818161100101528181611257015281816113b701528181611491015281816115a0015281816116220152818161168901528181611712015281816117610152818161180b0152818161196b01528181611ab001528181611b5801528181611fa30152818161200a0152818161209101526120c201525f81816105600152818161081f01528181610de701528181611022015281816110ab0152818161178201528181611bef01528181611cda01528181611ec9015281816120e30152818161221f015281816122bc015281816125bf0152818161265b01528181612a7e01528181612ad301528181612b2801528181612b7b0152612ba201525f818161044b0152818161070b01528181610cd301528181610ecf0152818161164d01528181611c1301528181611fce01526127e701526135d15ff3fe6080604052600436106100eb575f3560e01c8063adc244ac11610089578063cc03f31711610058578063cc03f31714610318578063d0eac51814610340578063d6cd913714610368578063e1254fba146103a4576100f2565b8063adc244ac1461026a578063b638b1eb14610294578063c12a00a8146102c4578063c45a0155146102ee576100f2565b80637d882097116100c55780637d882097146101985780638e7eed47146101c25780639cb3823a146101f2578063a22e2a091461022e576100f2565b80630ba36dcd146100f65780633fc8cef3146101325780637306efbf1461015c576100f2565b366100f257005b5f80fd5b348015610101575f80fd5b5061011c60048036038101906101179190612e0f565b6103e0565b6040516101299190612e52565b60405180910390f35b34801561013d575f80fd5b506101466103f4565b6040516101539190612e7a565b60405180910390f35b348015610167575f80fd5b50610182600480360381019061017d9190612ef4565b610418565b60405161018f9190612e52565b60405180910390f35b3480156101a3575f80fd5b506101ac61061a565b6040516101b99190612e52565b60405180910390f35b6101dc60048036038101906101d79190612f44565b610620565b6040516101e99190612e52565b60405180910390f35b3480156101fd575f80fd5b5061021860048036038101906102139190612ef4565b610c81565b6040516102259190612e52565b60405180910390f35b348015610239575f80fd5b50610254600480360381019061024f9190612fbb565b610e42565b6040516102619190612e52565b60405180910390f35b348015610275575f80fd5b5061027e61153e565b60405161028b9190612e7a565b60405180910390f35b6102ae60048036038101906102a99190612f44565b611562565b6040516102bb9190612e52565b60405180910390f35b3480156102cf575f80fd5b506102d8611bed565b6040516102e59190612e7a565b60405180910390f35b3480156102f9575f80fd5b50610302611c11565b60405161030f9190612e7a565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190613044565b611c35565b005b34801561034b575f80fd5b5061036660048036038101906103619190613044565b611dae565b005b348015610373575f80fd5b5061038e60048036038101906103899190612ef4565b611f9b565b60405161039b9190612e52565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c59190612e0f565b612158565b6040516103d79190612e52565b60405180910390f35b5f602052805f5260405f205f915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80610446837f0000000000000000000000000000000000000000000000000000000000000000878761219d565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000000000000000000000000000000000000000000088886040518463ffffffff1660e01b81526004016104c69392919061307e565b602060405180830381865afa1580156104e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050591906130c7565b90505f610534837f00000000000000000000000000000000000000000000000000000000000000008985612392565b925050505f610586827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b90506105ef815f8151811061059e5761059d6130f2565b5b6020026020010151876105b1919061314c565b87886105bd919061317f565b6105c791906131ed565b7f00000000000000000000000000000000000000000000000000000000000000008a8a61219d565b905080600181518110610605576106046130f2565b5b60200260200101519450505050509392505050565b60015481565b5f824281101561065c576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156106c2575f80fd5b505af11580156106d4573d5f803e3d5ffd5b50505050505f610706347f00000000000000000000000000000000000000000000000000000000000000008a8a61219d565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f00000000000000000000000000000000000000000000000000000000000000008b8b6040518463ffffffff1660e01b81526004016107869392919061307e565b602060405180830381865afa1580156107a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c591906130c7565b90505f6107f4837f00000000000000000000000000000000000000000000000000000000000000008c85612392565b92505050610845817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b92506108ae835f8151811061085d5761085c6130f2565b5b602002602001015134610870919061314c565b343461087c919061317f565b61088691906131ed565b7f00000000000000000000000000000000000000000000000000000000000000008c8c61219d565b925085836001815181106108c5576108c46130f2565b5b60200260200101511015610905576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f610934867f00000000000000000000000000000000000000000000000000000000000000008f88612392565b9250925092508183610946919061314c565b97507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000885f815181106109b8576109b76130f2565b5b6020026020010151346109cb919061321d565b6040518363ffffffff1660e01b81526004016109e8929190613250565b6020604051808303815f875af1158015610a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2891906132ac565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f886040518463ffffffff1660e01b8152600401610a8693929190613319565b5f604051808303815f87803b158015610a9d575f80fd5b505af1158015610aaf573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86885f81518110610b0357610b026130f2565b5b60200260200101516040518363ffffffff1660e01b8152600401610b28929190613250565b6020604051808303815f875af1158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6891906132ac565b508473ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848e6040518463ffffffff1660e01b8152600401610ba69392919061334e565b5f604051808303815f87803b158015610bbd575f80fd5b505af1158015610bcf573d5f803e3d5ffd5b505050508c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f1348c604051610c69929190613383565b60405180910390a45050505050505095945050505050565b5f80610caf83867f00000000000000000000000000000000000000000000000000000000000000008761219d565b90505f81600181518110610cc657610cc56130f2565b5b602002602001015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa7887f0000000000000000000000000000000000000000000000000000000000000000896040518463ffffffff1660e01b8152600401610d4e9392919061307e565b602060405180830381865afa158015610d69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8d91906130c7565b90505f610dbc84897f000000000000000000000000000000000000000000000000000000000000000085612392565b92505050610e0d817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b9350835f81518110610e2257610e216130f2565b5b602002602001015183610e35919061321d565b9450505050509392505050565b5f8342811015610e7e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610eab858a7f00000000000000000000000000000000000000000000000000000000000000008b61219d565b90505f81600181518110610ec257610ec16130f2565b5b602002602001015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa78c7f00000000000000000000000000000000000000000000000000000000000000008d6040518463ffffffff1660e01b8152600401610f4a9392919061307e565b602060405180830381865afa158015610f65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8991906130c7565b90505f805f610fba868f7f000000000000000000000000000000000000000000000000000000000000000087612392565b925092509250600154811115610ffb576040517ea4ac7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611048817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b955088865f8151811061105e5761105d6130f2565b5b602002602001015186611071919061321d565b10156110a9576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611104929190613250565b6020604051808303815f875af1158015611120573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114491906132ac565b508d73ffffffffffffffffffffffffffffffffffffffff166323b872dd33868d6040518463ffffffff1660e01b8152600401611182939291906133aa565b6020604051808303815f875af115801561119e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c291906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484306040518463ffffffff1660e01b81526004016112009392919061334e565b5f604051808303815f87803b158015611217575f80fd5b505af1158015611229573d5f803e3d5ffd5b50505050855f815181106112405761123f6130f2565b5b602002602001015185611253919061321d565b97507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000885f815181106112c5576112c46130f2565b5b60200260200101516040518363ffffffff1660e01b81526004016112ea929190613250565b6020604051808303815f875af1158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906132ac565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f306040518463ffffffff1660e01b815260040161138893929190613319565b5f604051808303815f87803b15801561139f575f80fd5b505af11580156113b1573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d875f81518110611404576114036130f2565b5b602002602001015187611417919061321d565b6040518263ffffffff1660e01b81526004016114339190612e52565b5f604051808303815f87803b15801561144a575f80fd5b505af115801561145c573d5f803e3d5ffd5b5050505061148f8c875f81518110611477576114766130f2565b5b60200260200101518761148a919061321d565b61272f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18d8c604051611525929190613383565b60405180910390a4505050505050509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f824281101561159e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611604575f80fd5b505af1158015611616573d5f803e3d5ffd5b50505050505f611648847f00000000000000000000000000000000000000000000000000000000000000008a8a61253c565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f00000000000000000000000000000000000000000000000000000000000000008b8b6040518463ffffffff1660e01b81526004016116c89392919061307e565b602060405180830381865afa1580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170791906130c7565b90505f805f611738857f00000000000000000000000000000000000000000000000000000000000000008e87612392565b925092509250845f81518110611751576117506130f2565b5b602002602001015196506117a8817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b945034855f815181106117be576117bd6130f2565b5b6020026020010151886117d1919061314c565b1115611809576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000875f81518110611879576118786130f2565b5b60200260200101516040518363ffffffff1660e01b815260040161189e929190613250565b6020604051808303815f875af11580156118ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118de91906132ac565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f876040518463ffffffff1660e01b815260040161193c93929190613319565b5f604051808303815f87803b158015611953575f80fd5b505af1158015611965573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85896040518363ffffffff1660e01b81526004016119c4929190613250565b6020604051808303815f875af11580156119e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0491906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848d6040518463ffffffff1660e01b8152600401611a429392919061334e565b5f604051808303815f87803b158015611a59575f80fd5b505af1158015611a6b573d5f803e3d5ffd5b50505050845f81518110611a8257611a816130f2565b5b602002602001015187611a95919061314c565b96505f8734611aa4919061321d565b90505f811115611b3f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611b079190612e52565b5f604051808303815f87803b158015611b1e575f80fd5b505af1158015611b30573d5f803e3d5ffd5b50505050611b3e338261272f565b5b8c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18b8d604051611bd5929190613383565b60405180910390a45050505050505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8103611c6e576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611cb9919061314c565b925050819055508060015f828254611cd1919061314c565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d35939291906133aa565b6020604051808303815f875af1158015611d51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7591906132ac565b611dab576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f8103611de7576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611e5d576040517f2424d0ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ea8919061321d565b925050819055508060015f828254611ec0919061321d565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f22929190613250565b6020604051808303815f875af1158015611f3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f6291906132ac565b611f98576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f80611fc9837f0000000000000000000000000000000000000000000000000000000000000000878761253c565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000000000000000000000000000000000000000000088886040518463ffffffff1660e01b81526004016120499392919061307e565b602060405180830381865afa158015612064573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208891906130c7565b90505f6120b7837f00000000000000000000000000000000000000000000000000000000000000008985612392565b925050505f612109827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b9050805f8151811061211e5761211d6130f2565b5b6020026020010151845f81518110612139576121386130f2565b5b602002602001015161214b919061314c565b9450505050509392505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60605f600267ffffffffffffffff8111156121bb576121ba6133df565b5b6040519080825280602002602001820160405280156121e95781602001602082028036833780820191505090505b50905085815f81518110612200576121ff6130f2565b5b6020026020010181815250505f806122198787876127d3565b915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036122ba576122956103f26103e88a612284919061317f565b61228e91906131ed565b8383612962565b836001815181106122a9576122a86130f2565b5b602002602001018181525050612384565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612357576103f26103e861231e8a8585612962565b612328919061317f565b61233291906131ed565b83600181518110612346576123456130f2565b5b602002602001018181525050612383565b612362888383612962565b83600181518110612376576123756130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f805f806123a08787612a15565b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146123f857876001815181106123ea576123e96130f2565b5b60200260200101515f612416565b5f8860018151811061240d5761240c6130f2565b5b60200260200101515b80945081955050505f885f81518110612432576124316130f2565b5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff16632f725638868473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612492575f612494565b835b878673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146124ce57856124d0565b5f5b6040518563ffffffff1660e01b81526004016124ef949392919061340c565b602060405180830381865afa15801561250a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252e9190613463565b925050509450945094915050565b60605f600267ffffffffffffffff81111561255a576125596133df565b5b6040519080825280602002602001820160405280156125885781602001602082028036833780820191505090505b50905085816001815181106125a05761259f6130f2565b5b6020026020010181815250505f806125b98787876127d3565b915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612659576103e86103f26126218a8585612ce7565b61262b919061317f565b61263591906131ed565b835f81518110612648576126476130f2565b5b602002602001018181525050612721565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036126f5576126d16103e86103f28a6126c0919061317f565b6126ca91906131ed565b8383612ce7565b835f815181106126e4576126e36130f2565b5b602002602001018181525050612720565b612700888383612ce7565b835f81518110612713576127126130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051612754906134bb565b5f6040518083038185875af1925050503d805f811461278e576040519150601f19603f3d011682016040523d82523d5f602084013e612793565b606091505b50509050806127ce576040517f72e99d2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f805f6127e08686612a15565b5090505f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa78989896040518463ffffffff1660e01b81526004016128429392919061307e565b602060405180830381865afa15801561285d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288191906130c7565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156128c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ed919061354b565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461294c57808261294f565b81815b8095508196505050505050935093915050565b5f80840361299c576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8314806129a957505f82145b156129e0576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82856129ed919061317f565b90505f85856129fc919061314c565b90508082612a0a91906131ed565b925050509392505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7c576040517f88fa1f7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b2157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612c35577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ba0577f000000000000000000000000000000000000000000000000000000000000000084612bc3565b7f0000000000000000000000000000000000000000000000000000000000000000835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c30576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610612c6f578284612c72565b83835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cdf576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b9250929050565b5f808403612d21576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f831480612d2e57505f82145b80612d395750818410155b15612d70576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8484612d7d919061317f565b90505f8584612d8c919061321d565b905060018183612d9c91906131ed565b612da6919061314c565b925050509392505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612dde82612db5565b9050919050565b612dee81612dd4565b8114612df8575f80fd5b50565b5f81359050612e0981612de5565b92915050565b5f60208284031215612e2457612e23612db1565b5b5f612e3184828501612dfb565b91505092915050565b5f819050919050565b612e4c81612e3a565b82525050565b5f602082019050612e655f830184612e43565b92915050565b612e7481612dd4565b82525050565b5f602082019050612e8d5f830184612e6b565b92915050565b5f61ffff82169050919050565b612ea981612e93565b8114612eb3575f80fd5b50565b5f81359050612ec481612ea0565b92915050565b612ed381612e3a565b8114612edd575f80fd5b50565b5f81359050612eee81612eca565b92915050565b5f805f60608486031215612f0b57612f0a612db1565b5b5f612f1886828701612dfb565b9350506020612f2986828701612eb6565b9250506040612f3a86828701612ee0565b9150509250925092565b5f805f805f60a08688031215612f5d57612f5c612db1565b5b5f612f6a88828901612dfb565b9550506020612f7b88828901612eb6565b9450506040612f8c88828901612dfb565b9350506060612f9d88828901612ee0565b9250506080612fae88828901612ee0565b9150509295509295909350565b5f805f805f8060c08789031215612fd557612fd4612db1565b5b5f612fe289828a01612dfb565b9650506020612ff389828a01612eb6565b955050604061300489828a01612dfb565b945050606061301589828a01612ee0565b935050608061302689828a01612ee0565b92505060a061303789828a01612ee0565b9150509295509295509295565b5f6020828403121561305957613058612db1565b5b5f61306684828501612ee0565b91505092915050565b61307881612e93565b82525050565b5f6060820190506130915f830186612e6b565b61309e6020830185612e6b565b6130ab604083018461306f565b949350505050565b5f815190506130c181612de5565b92915050565b5f602082840312156130dc576130db612db1565b5b5f6130e9848285016130b3565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61315682612e3a565b915061316183612e3a565b92508282019050808211156131795761317861311f565b5b92915050565b5f61318982612e3a565b915061319483612e3a565b92508282026131a281612e3a565b915082820484148315176131b9576131b861311f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131f782612e3a565b915061320283612e3a565b925082613212576132116131c0565b5b828204905092915050565b5f61322782612e3a565b915061323283612e3a565b925082820390508181111561324a5761324961311f565b5b92915050565b5f6040820190506132635f830185612e6b565b6132706020830184612e43565b9392505050565b5f8115159050919050565b61328b81613277565b8114613295575f80fd5b50565b5f815190506132a681613282565b92915050565b5f602082840312156132c1576132c0612db1565b5b5f6132ce84828501613298565b91505092915050565b5f819050919050565b5f819050919050565b5f6133036132fe6132f9846132d7565b6132e0565b612e3a565b9050919050565b613313816132e9565b82525050565b5f60608201905061332c5f830186612e43565b613339602083018561330a565b6133466040830184612e6b565b949350505050565b5f6060820190506133615f830186612e43565b61336e6020830185612e43565b61337b6040830184612e6b565b949350505050565b5f6040820190506133965f830185612e43565b6133a36020830184612e43565b9392505050565b5f6060820190506133bd5f830186612e6b565b6133ca6020830185612e6b565b6133d76040830184612e43565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60808201905061341f5f830187612e43565b61342c6020830186612e43565b6134396040830185612e43565b6134466060830184612e43565b95945050505050565b5f8151905061345d81612eca565b92915050565b5f6020828403121561347857613477612db1565b5b5f6134858482850161344f565b91505092915050565b5f81905092915050565b50565b5f6134a65f8361348e565b91506134b182613498565b5f82019050919050565b5f6134c58261349b565b9150819050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6134f1816134cf565b81146134fb575f80fd5b50565b5f8151905061350c816134e8565b92915050565b5f63ffffffff82169050919050565b61352a81613512565b8114613534575f80fd5b50565b5f8151905061354581613521565b92915050565b5f805f6060848603121561356257613561612db1565b5b5f61356f868287016134fe565b9350506020613580868287016134fe565b925050604061359186828701613537565b915050925092509256fea26469706673582212208411fb682160852b8e24395a85c09dabf6d058b4bfde500c6d219f7c3c2ecff464736f6c63430008140033000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106100eb575f3560e01c8063adc244ac11610089578063cc03f31711610058578063cc03f31714610318578063d0eac51814610340578063d6cd913714610368578063e1254fba146103a4576100f2565b8063adc244ac1461026a578063b638b1eb14610294578063c12a00a8146102c4578063c45a0155146102ee576100f2565b80637d882097116100c55780637d882097146101985780638e7eed47146101c25780639cb3823a146101f2578063a22e2a091461022e576100f2565b80630ba36dcd146100f65780633fc8cef3146101325780637306efbf1461015c576100f2565b366100f257005b5f80fd5b348015610101575f80fd5b5061011c60048036038101906101179190612e0f565b6103e0565b6040516101299190612e52565b60405180910390f35b34801561013d575f80fd5b506101466103f4565b6040516101539190612e7a565b60405180910390f35b348015610167575f80fd5b50610182600480360381019061017d9190612ef4565b610418565b60405161018f9190612e52565b60405180910390f35b3480156101a3575f80fd5b506101ac61061a565b6040516101b99190612e52565b60405180910390f35b6101dc60048036038101906101d79190612f44565b610620565b6040516101e99190612e52565b60405180910390f35b3480156101fd575f80fd5b5061021860048036038101906102139190612ef4565b610c81565b6040516102259190612e52565b60405180910390f35b348015610239575f80fd5b50610254600480360381019061024f9190612fbb565b610e42565b6040516102619190612e52565b60405180910390f35b348015610275575f80fd5b5061027e61153e565b60405161028b9190612e7a565b60405180910390f35b6102ae60048036038101906102a99190612f44565b611562565b6040516102bb9190612e52565b60405180910390f35b3480156102cf575f80fd5b506102d8611bed565b6040516102e59190612e7a565b60405180910390f35b3480156102f9575f80fd5b50610302611c11565b60405161030f9190612e7a565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190613044565b611c35565b005b34801561034b575f80fd5b5061036660048036038101906103619190613044565b611dae565b005b348015610373575f80fd5b5061038e60048036038101906103899190612ef4565b611f9b565b60405161039b9190612e52565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c59190612e0f565b612158565b6040516103d79190612e52565b60405180910390f35b5f602052805f5260405f205f915090505481565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b5f80610446837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2878761219d565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288886040518463ffffffff1660e01b81526004016104c69392919061307e565b602060405180830381865afa1580156104e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050591906130c7565b90505f610534837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28985612392565b925050505f610586827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b90506105ef815f8151811061059e5761059d6130f2565b5b6020026020010151876105b1919061314c565b87886105bd919061317f565b6105c791906131ed565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a61219d565b905080600181518110610605576106046130f2565b5b60200260200101519450505050509392505050565b60015481565b5f824281101561065c576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156106c2575f80fd5b505af11580156106d4573d5f803e3d5ffd5b50505050505f610706347f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a61219d565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b8b6040518463ffffffff1660e01b81526004016107869392919061307e565b602060405180830381865afa1580156107a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c591906130c7565b90505f6107f4837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c85612392565b92505050610845817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b92506108ae835f8151811061085d5761085c6130f2565b5b602002602001015134610870919061314c565b343461087c919061317f565b61088691906131ed565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c8c61219d565b925085836001815181106108c5576108c46130f2565b5b60200260200101511015610905576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f610934867f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28f88612392565b9250925092508183610946919061314c565b97507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb885f815181106109b8576109b76130f2565b5b6020026020010151346109cb919061321d565b6040518363ffffffff1660e01b81526004016109e8929190613250565b6020604051808303815f875af1158015610a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2891906132ac565b507f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb73ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f886040518463ffffffff1660e01b8152600401610a8693929190613319565b5f604051808303815f87803b158015610a9d575f80fd5b505af1158015610aaf573d5f803e3d5ffd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86885f81518110610b0357610b026130f2565b5b60200260200101516040518363ffffffff1660e01b8152600401610b28929190613250565b6020604051808303815f875af1158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6891906132ac565b508473ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848e6040518463ffffffff1660e01b8152600401610ba69392919061334e565b5f604051808303815f87803b158015610bbd575f80fd5b505af1158015610bcf573d5f803e3d5ffd5b505050508c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f1348c604051610c69929190613383565b60405180910390a45050505050505095945050505050565b5f80610caf83867f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28761219d565b90505f81600181518110610cc657610cc56130f2565b5b602002602001015190505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa7887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2896040518463ffffffff1660e01b8152600401610d4e9392919061307e565b602060405180830381865afa158015610d69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8d91906130c7565b90505f610dbc84897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc285612392565b92505050610e0d817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b9350835f81518110610e2257610e216130f2565b5b602002602001015183610e35919061321d565b9450505050509392505050565b5f8342811015610e7e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610eab858a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b61219d565b90505f81600181518110610ec257610ec16130f2565b5b602002602001015190505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa78c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28d6040518463ffffffff1660e01b8152600401610f4a9392919061307e565b602060405180830381865afa158015610f65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8991906130c7565b90505f805f610fba868f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc287612392565b925092509250600154811115610ffb576040517ea4ac7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611048817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b955088865f8151811061105e5761105d6130f2565b5b602002602001015186611071919061321d565b10156110a9576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611104929190613250565b6020604051808303815f875af1158015611120573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114491906132ac565b508d73ffffffffffffffffffffffffffffffffffffffff166323b872dd33868d6040518463ffffffff1660e01b8152600401611182939291906133aa565b6020604051808303815f875af115801561119e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c291906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484306040518463ffffffff1660e01b81526004016112009392919061334e565b5f604051808303815f87803b158015611217575f80fd5b505af1158015611229573d5f803e3d5ffd5b50505050855f815181106112405761123f6130f2565b5b602002602001015185611253919061321d565b97507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb885f815181106112c5576112c46130f2565b5b60200260200101516040518363ffffffff1660e01b81526004016112ea929190613250565b6020604051808303815f875af1158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906132ac565b507f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb73ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f306040518463ffffffff1660e01b815260040161138893929190613319565b5f604051808303815f87803b15801561139f575f80fd5b505af11580156113b1573d5f803e3d5ffd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d875f81518110611404576114036130f2565b5b602002602001015187611417919061321d565b6040518263ffffffff1660e01b81526004016114339190612e52565b5f604051808303815f87803b15801561144a575f80fd5b505af115801561145c573d5f803e3d5ffd5b5050505061148f8c875f81518110611477576114766130f2565b5b60200260200101518761148a919061321d565b61272f565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18d8c604051611525929190613383565b60405180910390a4505050505050509695505050505050565b7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb81565b5f824281101561159e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611604575f80fd5b505af1158015611616573d5f803e3d5ffd5b50505050505f611648847f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a61253c565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b8b6040518463ffffffff1660e01b81526004016116c89392919061307e565b602060405180830381865afa1580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170791906130c7565b90505f805f611738857f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28e87612392565b925092509250845f81518110611751576117506130f2565b5b602002602001015196506117a8817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b945034855f815181106117be576117bd6130f2565b5b6020026020010151886117d1919061314c565b1115611809576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb875f81518110611879576118786130f2565b5b60200260200101516040518363ffffffff1660e01b815260040161189e929190613250565b6020604051808303815f875af11580156118ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118de91906132ac565b507f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb73ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f876040518463ffffffff1660e01b815260040161193c93929190613319565b5f604051808303815f87803b158015611953575f80fd5b505af1158015611965573d5f803e3d5ffd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85896040518363ffffffff1660e01b81526004016119c4929190613250565b6020604051808303815f875af11580156119e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0491906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848d6040518463ffffffff1660e01b8152600401611a429392919061334e565b5f604051808303815f87803b158015611a59575f80fd5b505af1158015611a6b573d5f803e3d5ffd5b50505050845f81518110611a8257611a816130f2565b5b602002602001015187611a95919061314c565b96505f8734611aa4919061321d565b90505f811115611b3f577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611b079190612e52565b5f604051808303815f87803b158015611b1e575f80fd5b505af1158015611b30573d5f803e3d5ffd5b50505050611b3e338261272f565b5b8c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18b8d604051611bd5929190613383565b60405180910390a45050505050505095945050505050565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8681565b7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d281565b5f8103611c6e576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611cb9919061314c565b925050819055508060015f828254611cd1919061314c565b925050819055507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d35939291906133aa565b6020604051808303815f875af1158015611d51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7591906132ac565b611dab576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f8103611de7576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611e5d576040517f2424d0ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ea8919061321d565b925050819055508060015f828254611ec0919061321d565b925050819055507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f22929190613250565b6020604051808303815f875af1158015611f3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f6291906132ac565b611f98576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f80611fc9837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2878761253c565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288886040518463ffffffff1660e01b81526004016120499392919061307e565b602060405180830381865afa158015612064573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208891906130c7565b90505f6120b7837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28985612392565b925050505f612109827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b9050805f8151811061211e5761211d6130f2565b5b6020026020010151845f81518110612139576121386130f2565b5b602002602001015161214b919061314c565b9450505050509392505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60605f600267ffffffffffffffff8111156121bb576121ba6133df565b5b6040519080825280602002602001820160405280156121e95781602001602082028036833780820191505090505b50905085815f81518110612200576121ff6130f2565b5b6020026020010181815250505f806122198787876127d3565b915091507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036122ba576122956103f26103e88a612284919061317f565b61228e91906131ed565b8383612962565b836001815181106122a9576122a86130f2565b5b602002602001018181525050612384565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612357576103f26103e861231e8a8585612962565b612328919061317f565b61233291906131ed565b83600181518110612346576123456130f2565b5b602002602001018181525050612383565b612362888383612962565b83600181518110612376576123756130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f805f806123a08787612a15565b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146123f857876001815181106123ea576123e96130f2565b5b60200260200101515f612416565b5f8860018151811061240d5761240c6130f2565b5b60200260200101515b80945081955050505f885f81518110612432576124316130f2565b5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff16632f725638868473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612492575f612494565b835b878673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146124ce57856124d0565b5f5b6040518563ffffffff1660e01b81526004016124ef949392919061340c565b602060405180830381865afa15801561250a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252e9190613463565b925050509450945094915050565b60605f600267ffffffffffffffff81111561255a576125596133df565b5b6040519080825280602002602001820160405280156125885781602001602082028036833780820191505090505b50905085816001815181106125a05761259f6130f2565b5b6020026020010181815250505f806125b98787876127d3565b915091507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612659576103e86103f26126218a8585612ce7565b61262b919061317f565b61263591906131ed565b835f81518110612648576126476130f2565b5b602002602001018181525050612721565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036126f5576126d16103e86103f28a6126c0919061317f565b6126ca91906131ed565b8383612ce7565b835f815181106126e4576126e36130f2565b5b602002602001018181525050612720565b612700888383612ce7565b835f81518110612713576127126130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051612754906134bb565b5f6040518083038185875af1925050503d805f811461278e576040519150601f19603f3d011682016040523d82523d5f602084013e612793565b606091505b50509050806127ce576040517f72e99d2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f805f6127e08686612a15565b5090505f807f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa78989896040518463ffffffff1660e01b81526004016128429392919061307e565b602060405180830381865afa15801561285d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288191906130c7565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156128c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ed919061354b565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461294c57808261294f565b81815b8095508196505050505050935093915050565b5f80840361299c576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8314806129a957505f82145b156129e0576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82856129ed919061317f565b90505f85856129fc919061314c565b90508082612a0a91906131ed565b925050509392505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7c576040517f88fa1f7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b2157507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612c35577f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ba0577f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8684612bc3565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c30576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610612c6f578284612c72565b83835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cdf576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b9250929050565b5f808403612d21576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f831480612d2e57505f82145b80612d395750818410155b15612d70576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8484612d7d919061317f565b90505f8584612d8c919061321d565b905060018183612d9c91906131ed565b612da6919061314c565b925050509392505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612dde82612db5565b9050919050565b612dee81612dd4565b8114612df8575f80fd5b50565b5f81359050612e0981612de5565b92915050565b5f60208284031215612e2457612e23612db1565b5b5f612e3184828501612dfb565b91505092915050565b5f819050919050565b612e4c81612e3a565b82525050565b5f602082019050612e655f830184612e43565b92915050565b612e7481612dd4565b82525050565b5f602082019050612e8d5f830184612e6b565b92915050565b5f61ffff82169050919050565b612ea981612e93565b8114612eb3575f80fd5b50565b5f81359050612ec481612ea0565b92915050565b612ed381612e3a565b8114612edd575f80fd5b50565b5f81359050612eee81612eca565b92915050565b5f805f60608486031215612f0b57612f0a612db1565b5b5f612f1886828701612dfb565b9350506020612f2986828701612eb6565b9250506040612f3a86828701612ee0565b9150509250925092565b5f805f805f60a08688031215612f5d57612f5c612db1565b5b5f612f6a88828901612dfb565b9550506020612f7b88828901612eb6565b9450506040612f8c88828901612dfb565b9350506060612f9d88828901612ee0565b9250506080612fae88828901612ee0565b9150509295509295909350565b5f805f805f8060c08789031215612fd557612fd4612db1565b5b5f612fe289828a01612dfb565b9650506020612ff389828a01612eb6565b955050604061300489828a01612dfb565b945050606061301589828a01612ee0565b935050608061302689828a01612ee0565b92505060a061303789828a01612ee0565b9150509295509295509295565b5f6020828403121561305957613058612db1565b5b5f61306684828501612ee0565b91505092915050565b61307881612e93565b82525050565b5f6060820190506130915f830186612e6b565b61309e6020830185612e6b565b6130ab604083018461306f565b949350505050565b5f815190506130c181612de5565b92915050565b5f602082840312156130dc576130db612db1565b5b5f6130e9848285016130b3565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61315682612e3a565b915061316183612e3a565b92508282019050808211156131795761317861311f565b5b92915050565b5f61318982612e3a565b915061319483612e3a565b92508282026131a281612e3a565b915082820484148315176131b9576131b861311f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131f782612e3a565b915061320283612e3a565b925082613212576132116131c0565b5b828204905092915050565b5f61322782612e3a565b915061323283612e3a565b925082820390508181111561324a5761324961311f565b5b92915050565b5f6040820190506132635f830185612e6b565b6132706020830184612e43565b9392505050565b5f8115159050919050565b61328b81613277565b8114613295575f80fd5b50565b5f815190506132a681613282565b92915050565b5f602082840312156132c1576132c0612db1565b5b5f6132ce84828501613298565b91505092915050565b5f819050919050565b5f819050919050565b5f6133036132fe6132f9846132d7565b6132e0565b612e3a565b9050919050565b613313816132e9565b82525050565b5f60608201905061332c5f830186612e43565b613339602083018561330a565b6133466040830184612e6b565b949350505050565b5f6060820190506133615f830186612e43565b61336e6020830185612e43565b61337b6040830184612e6b565b949350505050565b5f6040820190506133965f830185612e43565b6133a36020830184612e43565b9392505050565b5f6060820190506133bd5f830186612e6b565b6133ca6020830185612e6b565b6133d76040830184612e43565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60808201905061341f5f830187612e43565b61342c6020830186612e43565b6134396040830185612e43565b6134466060830184612e43565b95945050505050565b5f8151905061345d81612eca565b92915050565b5f6020828403121561347857613477612db1565b5b5f6134858482850161344f565b91505092915050565b5f81905092915050565b50565b5f6134a65f8361348e565b91506134b182613498565b5f82019050919050565b5f6134c58261349b565b9150819050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6134f1816134cf565b81146134fb575f80fd5b50565b5f8151905061350c816134e8565b92915050565b5f63ffffffff82169050919050565b61352a81613512565b8114613534575f80fd5b50565b5f8151905061354581613521565b92915050565b5f805f6060848603121561356257613561612db1565b5b5f61356f868287016134fe565b9350506020613580868287016134fe565b925050604061359186828701613537565b915050925092509256fea26469706673582212208411fb682160852b8e24395a85c09dabf6d058b4bfde500c6d219f7c3c2ecff464736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0xAcff9eee0a5522000E7141b77107359A6462E8d2
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d2
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.