Source Code
Latest 23 from a total of 23 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Tokens For ... | 38421843 | 62 days ago | IN | 0 MON | 0.0370165 | ||||
| Swap ETH For Tok... | 38372406 | 62 days ago | IN | 5 MON | 0.03465859 | ||||
| Swap Tokens For ... | 38334948 | 63 days ago | IN | 0 MON | 0.03666068 | ||||
| Swap Tokens For ... | 38178266 | 63 days ago | IN | 0 MON | 0.03686194 | ||||
| Swap Tokens For ... | 38178057 | 63 days ago | IN | 0 MON | 0.05084551 | ||||
| Swap Tokens For ... | 38175668 | 63 days ago | IN | 0 MON | 0.03592039 | ||||
| Swap ETH For Tok... | 38164086 | 63 days ago | IN | 2 MON | 0.0487512 | ||||
| Swap ETH For Tok... | 38159755 | 63 days ago | IN | 1 MON | 0.02803343 | ||||
| Swap Tokens For ... | 37998314 | 64 days ago | IN | 0 MON | 0.0352424 | ||||
| Swap ETH For Tok... | 37992384 | 64 days ago | IN | 10 MON | 0.03836837 | ||||
| Swap Tokens For ... | 37963256 | 64 days ago | IN | 0 MON | 0.04563327 | ||||
| Swap Tokens For ... | 37931545 | 64 days ago | IN | 0 MON | 0.04975861 | ||||
| Swap Tokens For ... | 37905229 | 65 days ago | IN | 0 MON | 0.03735836 | ||||
| Swap Tokens For ... | 37905096 | 65 days ago | IN | 0 MON | 0.05340327 | ||||
| Swap Tokens For ... | 37856507 | 65 days ago | IN | 0 MON | 0.03563915 | ||||
| Swap Tokens For ... | 37855250 | 65 days ago | IN | 0 MON | 0.03480496 | ||||
| Swap Tokens For ... | 37758820 | 65 days ago | IN | 0 MON | 0.03666068 | ||||
| Swap Tokens For ... | 37758203 | 65 days ago | IN | 0 MON | 0.04642022 | ||||
| Swap Tokens For ... | 37756859 | 65 days ago | IN | 0 MON | 0.03531178 | ||||
| Swap Tokens For ... | 37749870 | 65 days ago | IN | 0 MON | 0.03396102 | ||||
| Swap Tokens For ... | 37748596 | 65 days ago | IN | 0 MON | 0.04018765 | ||||
| Swap Tokens For ... | 37722751 | 65 days ago | IN | 0 MON | 0.06891791 | ||||
| Swap ETH For Tok... | 37722670 | 65 days ago | IN | 22.52716894 MON | 0.04478611 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 38421843 | 62 days ago | 4.90050323 MON | ||||
| 38421843 | 62 days ago | 4.90050323 MON | ||||
| 38372406 | 62 days ago | 5 MON | ||||
| 38334948 | 63 days ago | 9.80101295 MON | ||||
| 38334948 | 63 days ago | 9.80101295 MON | ||||
| 38178266 | 63 days ago | 1.96020103 MON | ||||
| 38178266 | 63 days ago | 1.96020103 MON | ||||
| 38178057 | 63 days ago | 5.35685955 MON | ||||
| 38178057 | 63 days ago | 5.35685955 MON | ||||
| 38175668 | 63 days ago | 5.95788798 MON | ||||
| 38175668 | 63 days ago | 5.95788798 MON | ||||
| 38164086 | 63 days ago | 2 MON | ||||
| 38159755 | 63 days ago | 1 MON | ||||
| 37998314 | 64 days ago | 9.80101295 MON | ||||
| 37998314 | 64 days ago | 9.80101295 MON | ||||
| 37992384 | 64 days ago | 10 MON | ||||
| 37963256 | 64 days ago | 53.90589166 MON | ||||
| 37963256 | 64 days ago | 53.90589166 MON | ||||
| 37931545 | 64 days ago | 0.72969546 MON | ||||
| 37931545 | 64 days ago | 0.72969546 MON | ||||
| 37905229 | 65 days ago | 4.90050323 MON | ||||
| 37905229 | 65 days ago | 4.90050323 MON | ||||
| 37905096 | 65 days ago | 4.90050323 MON | ||||
| 37905096 | 65 days ago | 4.90050323 MON | ||||
| 37856507 | 65 days ago | 73.0153377 MON |
Loading...
Loading
Contract Name:
DexTrader
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
interface IUniswapV3Pool {
function token0() external view returns (address);
function token1() external view returns (address);
function fee() external view returns (uint24);
function slot0() external view returns (
uint160 sqrtPriceX96,
int24 tick,
uint16 observationIndex,
uint16 observationCardinality,
uint16 observationCardinalityNext,
uint8 feeProtocol,
bool unlocked
);
}
interface IUniswapV3Factory {
function getPool(address tokenA, address tokenB, uint24 fee) external view returns (address pool);
}
interface IUniversalRouter {
function execute(
bytes calldata commands,
bytes[] calldata inputs,
uint256 deadline
) external payable;
}
interface IQuoter {
function quoteExactInputSingle(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountIn,
uint160 sqrtPriceLimitX96
) external returns (uint256 amountOut);
function quoteExactOutputSingle(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountOut,
uint160 sqrtPriceLimitX96
) external returns (uint256 amountIn);
}
interface IWETH {
function deposit() external payable;
function withdraw(uint256) external;
function approve(address, uint256) external returns (bool);
function transfer(address, uint256) external returns (bool);
function balanceOf(address) external view returns (uint256);
}
/**
* @title DexTrader
* @notice A DEX aggregator contract using Uniswap Universal Router for swaps and quotes
*/
contract DexTrader is Ownable, ReentrancyGuard {
address public immutable universalRouter;
IQuoter public immutable quoter;
IUniswapV3Factory public immutable factory;
IWETH public immutable WETH;
// Protocol fee in basis points (100 = 1%)
uint256 public protocolFeeBps = 0;
address public feeRecipient;
// Common Uniswap V3 fee tiers
uint24 public constant FEE_LOWEST = 100; // 0.01%
uint24 public constant FEE_LOW = 500; // 0.05%
uint24 public constant FEE_MEDIUM = 3000; // 0.3%
uint24 public constant FEE_HIGH = 10000; // 1%
// Universal Router Commands
bytes1 constant V3_SWAP_EXACT_IN = 0x00;
event Swap(
address indexed user,
address indexed tokenIn,
address indexed tokenOut,
uint256 amountIn,
uint256 amountOut,
uint24 fee
);
event ProtocolFeeUpdated(uint256 oldFee, uint256 newFee);
event FeeRecipientUpdated(address oldRecipient, address newRecipient);
error InvalidAddress();
error InsufficientAmount();
error SlippageExceeded();
error TransferFailed();
error PoolNotFound();
constructor(
address _universalRouter,
address _quoter,
address _factory,
address _weth,
address _feeRecipient
) Ownable(msg.sender) {
if (_universalRouter == address(0) || _quoter == address(0) ||
_factory == address(0) || _weth == address(0)) revert InvalidAddress();
universalRouter = _universalRouter;
quoter = IQuoter(_quoter);
factory = IUniswapV3Factory(_factory);
WETH = IWETH(_weth);
feeRecipient = _feeRecipient;
}
/**
* @notice Get quote for exact input swap
* @param tokenIn Input token address
* @param tokenOut Output token address
* @param amountIn Amount of input tokens
* @param fee Pool fee tier
* @return amountOut Expected output amount
*/
function getQuoteExactInput(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint24 fee
) external returns (uint256 amountOut) {
if (amountIn == 0) revert InsufficientAmount();
// Verify pool exists
address pool = factory.getPool(tokenIn, tokenOut, fee);
if (pool == address(0)) revert PoolNotFound();
return quoter.quoteExactInputSingle(tokenIn, tokenOut, fee, amountIn, 0);
}
/**
* @notice Get quote for exact output swap
* @param tokenIn Input token address
* @param tokenOut Output token address
* @param amountOut Desired output amount
* @param fee Pool fee tier
* @return amountIn Required input amount
*/
function getQuoteExactOutput(
address tokenIn,
address tokenOut,
uint256 amountOut,
uint24 fee
) external returns (uint256 amountIn) {
if (amountOut == 0) revert InsufficientAmount();
// Verify pool exists
address pool = factory.getPool(tokenIn, tokenOut, fee);
if (pool == address(0)) revert PoolNotFound();
return quoter.quoteExactOutputSingle(tokenIn, tokenOut, fee, amountOut, 0);
}
/**
* @notice Get best quote across all fee tiers
* @param tokenIn Input token address
* @param tokenOut Output token address
* @param amountIn Amount of input tokens
* @return bestAmountOut Best output amount
* @return bestFee Best fee tier
*/
function getBestQuote(
address tokenIn,
address tokenOut,
uint256 amountIn
) external returns (uint256 bestAmountOut, uint24 bestFee) {
if (amountIn == 0) revert InsufficientAmount();
uint24[4] memory fees = [FEE_LOWEST, FEE_LOW, FEE_MEDIUM, FEE_HIGH];
for (uint256 i = 0; i < fees.length; i++) {
address pool = factory.getPool(tokenIn, tokenOut, fees[i]);
if (pool == address(0)) continue;
try quoter.quoteExactInputSingle(tokenIn, tokenOut, fees[i], amountIn, 0) returns (uint256 amountOut) {
if (amountOut > bestAmountOut) {
bestAmountOut = amountOut;
bestFee = fees[i];
}
} catch {
continue;
}
}
if (bestAmountOut == 0) revert PoolNotFound();
}
/**
* @notice Swap exact input tokens for output tokens
* @param tokenIn Input token address
* @param tokenOut Output token address
* @param amountIn Amount of input tokens
* @param amountOutMinimum Minimum output amount (slippage protection)
* @param fee Pool fee tier
* @return amountOut Actual output amount
*/
function swapExactInput(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 amountOutMinimum,
uint24 fee
) external nonReentrant returns (uint256 amountOut) {
if (amountIn == 0) revert InsufficientAmount();
// Take protocol fee if set
uint256 actualAmountIn = amountIn;
if (protocolFeeBps > 0 && feeRecipient != address(0)) {
uint256 protocolFee = (amountIn * protocolFeeBps) / 10000;
actualAmountIn = amountIn - protocolFee;
IERC20(tokenIn).transferFrom(msg.sender, feeRecipient, protocolFee);
}
// Transfer tokens from user to this contract
IERC20(tokenIn).transferFrom(msg.sender, address(this), actualAmountIn);
// Record balance before swap
uint256 balanceBefore = IERC20(tokenOut).balanceOf(msg.sender);
// Execute V3 swap via Universal Router
_executeV3Swap(tokenIn, tokenOut, fee, actualAmountIn, msg.sender, amountOutMinimum);
// Calculate actual output
amountOut = IERC20(tokenOut).balanceOf(msg.sender) - balanceBefore;
if (amountOut < amountOutMinimum) revert SlippageExceeded();
emit Swap(msg.sender, tokenIn, tokenOut, actualAmountIn, amountOut, fee);
}
/**
* @notice Swap tokens for exact output tokens
* @param tokenIn Input token address
* @param tokenOut Output token address
* @param amountOut Desired output amount
* @param amountInMaximum Maximum input amount (slippage protection)
* @param fee Pool fee tier
* @return amountIn Actual input amount
*/
function swapExactOutput(
address tokenIn,
address tokenOut,
uint256 amountOut,
uint256 amountInMaximum,
uint24 fee
) external nonReentrant returns (uint256 amountIn) {
if (amountOut == 0) revert InsufficientAmount();
// Transfer tokens from user to this contract
IERC20(tokenIn).transferFrom(msg.sender, address(this), amountInMaximum);
// Record balance before swap
uint256 balanceInBefore = IERC20(tokenIn).balanceOf(address(this));
// Execute V3 swap via Universal Router
_executeV3Swap(tokenIn, tokenOut, fee, amountInMaximum, msg.sender, 0);
// Calculate actual input used
uint256 balanceInAfter = IERC20(tokenIn).balanceOf(address(this));
amountIn = balanceInBefore - balanceInAfter;
// Refund excess tokens
if (balanceInAfter > 0) {
uint256 refund = balanceInAfter;
// Take protocol fee from used amount
if (protocolFeeBps > 0 && feeRecipient != address(0)) {
uint256 protocolFee = (amountIn * protocolFeeBps) / 10000;
if (protocolFee < refund) {
IERC20(tokenIn).transfer(feeRecipient, protocolFee);
refund -= protocolFee;
}
}
IERC20(tokenIn).transfer(msg.sender, refund);
}
emit Swap(msg.sender, tokenIn, tokenOut, amountIn, amountOut, fee);
}
/**
* @notice Swap ETH for tokens
* @param tokenOut Output token address
* @param amountOutMinimum Minimum output amount
* @param fee Pool fee tier
* @return amountOut Actual output amount
*/
function swapETHForTokens(
address tokenOut,
uint256 amountOutMinimum,
uint24 fee
) external payable nonReentrant returns (uint256 amountOut) {
if (msg.value == 0) revert InsufficientAmount();
uint256 actualAmountIn = msg.value;
// Take protocol fee if set
if (protocolFeeBps > 0 && feeRecipient != address(0)) {
uint256 protocolFee = (msg.value * protocolFeeBps) / 10000;
actualAmountIn = msg.value - protocolFee;
(bool success, ) = feeRecipient.call{value: protocolFee}("");
if (!success) revert TransferFailed();
}
// Wrap ETH to WETH
WETH.deposit{value: actualAmountIn}();
// Record balance before swap
uint256 balanceBefore = IERC20(tokenOut).balanceOf(msg.sender);
// Execute V3 swap via Universal Router
_executeV3Swap(address(WETH), tokenOut, fee, actualAmountIn, msg.sender, amountOutMinimum);
// Calculate actual output
amountOut = IERC20(tokenOut).balanceOf(msg.sender) - balanceBefore;
if (amountOut < amountOutMinimum) revert SlippageExceeded();
emit Swap(msg.sender, address(WETH), tokenOut, actualAmountIn, amountOut, fee);
}
/**
* @notice Swap tokens for ETH
* @param tokenIn Input token address
* @param amountIn Amount of input tokens
* @param amountOutMinimum Minimum ETH output
* @param fee Pool fee tier
* @return amountOut Actual ETH output
*/
function swapTokensForETH(
address tokenIn,
uint256 amountIn,
uint256 amountOutMinimum,
uint24 fee
) external nonReentrant returns (uint256 amountOut) {
if (amountIn == 0) revert InsufficientAmount();
uint256 actualAmountIn = amountIn;
// Take protocol fee if set
if (protocolFeeBps > 0 && feeRecipient != address(0)) {
uint256 protocolFee = (amountIn * protocolFeeBps) / 10000;
actualAmountIn = amountIn - protocolFee;
IERC20(tokenIn).transferFrom(msg.sender, feeRecipient, protocolFee);
}
// Transfer tokens from user to this contract
IERC20(tokenIn).transferFrom(msg.sender, address(this), actualAmountIn);
// Execute V3 swap to get WETH via Universal Router
_executeV3Swap(tokenIn, address(WETH), fee, actualAmountIn, address(this), amountOutMinimum);
// Get WETH balance and unwrap
uint256 wethAmount = WETH.balanceOf(address(this));
WETH.withdraw(wethAmount);
// Send ETH to user
(bool success, ) = msg.sender.call{value: wethAmount}("");
if (!success) revert TransferFailed();
amountOut = wethAmount;
if (amountOut < amountOutMinimum) revert SlippageExceeded();
emit Swap(msg.sender, tokenIn, address(WETH), actualAmountIn, amountOut, fee);
}
/**
* @notice Internal function to execute V3 swap via Universal Router
* @param tokenIn Input token address
* @param tokenOut Output token address
* @param fee Pool fee tier
* @param amountIn Input amount
* @param recipient Recipient address
* @param amountOutMin Minimum output amount
*/
function _executeV3Swap(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountIn,
address recipient,
uint256 amountOutMin
) internal {
// Transfer tokens to Universal Router (required for payerIsUser=false)
IERC20(tokenIn).transfer(universalRouter, amountIn);
// Encode V3 swap path: tokenIn (20 bytes) + fee (3 bytes) + tokenOut (20 bytes)
bytes memory path = abi.encodePacked(tokenIn, fee, tokenOut);
// Command: V3_SWAP_EXACT_IN
bytes memory commands = abi.encodePacked(V3_SWAP_EXACT_IN);
// Input: (recipient, amountIn, amountOutMin, path, payerIsUser)
bytes[] memory inputs = new bytes[](1);
inputs[0] = abi.encode(recipient, amountIn, amountOutMin, path, false);
// Execute swap via Universal Router
IUniversalRouter(universalRouter).execute(commands, inputs, block.timestamp);
}
/**
* @notice Get pool information
* @param tokenA First token address
* @param tokenB Second token address
* @param fee Pool fee tier
* @return pool Pool address
* @return sqrtPriceX96 Current sqrt price
* @return tick Current tick
*/
function getPoolInfo(
address tokenA,
address tokenB,
uint24 fee
) external view returns (
address pool,
uint160 sqrtPriceX96,
int24 tick
) {
pool = factory.getPool(tokenA, tokenB, fee);
if (pool == address(0)) revert PoolNotFound();
(sqrtPriceX96, tick, , , , , ) = IUniswapV3Pool(pool).slot0();
}
/**
* @notice Check if a pool exists for given tokens and fee
* @param tokenA First token address
* @param tokenB Second token address
* @param fee Pool fee tier
* @return exists Whether the pool exists
*/
function poolExists(
address tokenA,
address tokenB,
uint24 fee
) external view returns (bool exists) {
address pool = factory.getPool(tokenA, tokenB, fee);
return pool != address(0);
}
/**
* @notice Update protocol fee
* @param newFeeBps New fee in basis points
*/
function setProtocolFee(uint256 newFeeBps) external onlyOwner {
require(newFeeBps <= 500, "Fee too high"); // Max 5%
uint256 oldFee = protocolFeeBps;
protocolFeeBps = newFeeBps;
emit ProtocolFeeUpdated(oldFee, newFeeBps);
}
/**
* @notice Update fee recipient
* @param newRecipient New fee recipient address
*/
function setFeeRecipient(address newRecipient) external onlyOwner {
if (newRecipient == address(0)) revert InvalidAddress();
address oldRecipient = feeRecipient;
feeRecipient = newRecipient;
emit FeeRecipientUpdated(oldRecipient, newRecipient);
}
/**
* @notice Withdraw stuck tokens
* @param token Token address
* @param amount Amount to withdraw
*/
function withdrawToken(address token, uint256 amount) external onlyOwner {
IERC20(token).transfer(msg.sender, amount);
}
/**
* @notice Withdraw stuck ETH
*/
function withdrawETH() external onlyOwner {
(bool success, ) = msg.sender.call{value: address(this).balance}("");
if (!success) revert TransferFailed();
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @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
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}{
"optimizer": {
"enabled": true,
"runs": 1,
"details": {
"yul": true,
"yulDetails": {
"stackAllocation": true,
"optimizerSteps": "dhfoDgvulfnTUtnIf"
}
}
},
"viaIR": true,
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": false
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris"
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_universalRouter","type":"address"},{"internalType":"address","name":"_quoter","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_feeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientAmount","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PoolNotFound","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SlippageExceeded","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"FeeRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"ProtocolFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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"},{"indexed":false,"internalType":"uint24","name":"fee","type":"uint24"}],"name":"Swap","type":"event"},{"inputs":[],"name":"FEE_HIGH","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_LOW","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_LOWEST","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MEDIUM","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV3Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getBestQuote","outputs":[{"internalType":"uint256","name":"bestAmountOut","type":"uint256"},{"internalType":"uint24","name":"bestFee","type":"uint24"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"getQuoteExactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"getQuoteExactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"poolExists","outputs":[{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"contract IQuoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"swapETHForTokens","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"swapExactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"swapExactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"swapTokensForETH","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"universalRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
610100604052346100a05761001e61001561016f565b9392909261022e565b6040516124b6610406823960805181818161039b0152612249015260a0518181816107b701528181611001015281816111b60152611f35015260c05181818161077e01528181610f66015281816111370152818161132901528181611afb0152611eb6015260e05181818161073d0152818161153d01526118ef01526124b690f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176100dc57604052565b6100a5565b906100f56100ee60405190565b92836100bb565b565b6001600160a01b031690565b90565b61010f816100f7565b036100a057565b905051906100f582610106565b919060a0838203126100a0576101398184610116565b926101478260208301610116565b926101036101588460408501610116565b9360806101688260608701610116565b9401610116565b61018d6128bc80380380610182816100e1565b928339810190610123565b9091929394565b90600019905b9181191691161790565b6101036101036101039290565b906101c16101036101c8926101a4565b8254610194565b9055565b6100f76101036101039290565b610103906101cc565b610103906100f7906001600160a01b031682565b610103906101e2565b610103906101f6565b906001600160a01b039061019a565b906102276101036101c8926101ff565b8254610208565b6102373361031d565b60006102448160026101b1565b61024d816101d9565b610256816100f7565b61025f846100f7565b149081156102f8575b81156102dd575b81156102c3575b506102af57506102a5926102956100f596959361029d936080526101ff565b60a0526101ff565b60c0526101ff565b60e0526003610217565b63e6c4247b60e01b815280600481015b0390fd5b6102cd91506100f7565b6102d6866100f7565b1438610276565b90506102e8816100f7565b6102f1866100f7565b149061026f565b9050610303816100f7565b61030c856100f7565b1490610268565b61010360016101a4565b61032690610355565b6100f5610331610313565b60016101b1565b610341906100f7565b9052565b6020810192916100f59190610338565b6000610360816101d9565b610369816100f7565b610372846100f7565b146103825750506100f5906103ae565b631e4fbdf760e01b825281906102bf9060048301610345565b610103906100f7565b610103905461039b565b6103d46103ce6103be60006103a4565b6103c9846000610217565b6101ff565b916101ff565b907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06103ff60405190565b600090a356fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80631bce6889146101bb578063228c04b8146101b657806335659fb8146101b157806335a9e4df146101ac5780633add5c05146101a75780634516d410146101a2578063469048401461019d5780634a277c62146101985780635288839f1461019357806363075eb91461018e578063715018a614610189578063787dce3d1461018457806379dc9b321461017f5780637d2f8b311461017a578063806eacf8146101755780638da5cb5b146101705780639e281a981461016b578063ad5c464814610166578063c45a015514610161578063c6bbd5a71461015c578063ca21624714610157578063ca8b63ed14610152578063e086e5ec1461014d578063e74b981b14610148578063f2fde38b146101435763f60a28800361000e57610884565b61086c565b610854565b610828565b610809565b6107ee565b6107a2565b610769565b610728565b6106d5565b61069e565b610670565b610659565b610615565b6105eb565b6105ba565b61059f565b61056d565b61051d565b61049d565b610455565b6103ef565b610386565b610352565b6102f6565b610277565b6001600160a01b031690565b6101d5906101c0565b90565b6101e1816101cc565b036101e857565b600080fd5b905035906101fa826101d8565b565b806101e1565b905035906101fa826101fc565b62ffffff81166101e1565b905035906101fa8261020f565b919060a0838203126101e85761023d81846101ed565b9261024b82602083016101ed565b926101d561025c8460408501610202565b93608061026c8260608701610202565b940161021a565b9052565b346101e8576102a661029661028d366004610227565b93929092610dc3565b6040519182918290815260200190565b0390f35b90916060828403126101e8576101d56102c384846101ed565b9360406102d382602087016101ed565b9401610202565b9081526040810192916101fa916020905b019062ffffff169052565b346101e85761030f6103093660046102aa565b91610ecc565b906102a661031c60405190565b928392836102da565b60009103126101e857565b6101d5916008021c81565b906101d59154610330565b6101d56000600261033b565b346101e857610362366004610325565b6102a6610296610346565b610273906101cc565b6020810192916101fa919061036d565b346101e857610396366004610325565b6102a67f00000000000000000000000000000000000000000000000000000000000000005b60405191829182610376565b6103d46101d56101d59290565b62ffffff1690565b6101d56101f46103c7565b6101d56103dc565b346101e8576103ff366004610325565b6102a661040a6103e7565b6040519182918262ffffff909116815260200190565b6080818303126101e85761043482826101ed565b926101d561044584602085016101ed565b93606061026c8260408701610202565b346101e8576102a661029661046b366004610420565b9291909161111f565b6101d5916008021c6101c0565b6101c0565b906101d59154610474565b6101d560006003610486565b346101e8576104ad366004610325565b6102a66103bb610491565b90916060828403126101e8576101d56104d184846101ed565b93604061026c82602087016101ed565b610273906101c0565b6040906105146101fa949695939661050a6060840198600085019061036d565b60208301906104e1565b019060020b9052565b346101e8576102a66105396105333660046104b8565b91611312565b604051919391938493846104ea565b6080818303126101e85761055c82826101ed565b926101d56104458460208501610202565b346101e8576102a6610296610583366004610548565b92919091611774565b6101d56127106103c7565b6101d561058c565b346101e8576105af366004610325565b6102a661040a610597565b346101e8576105ca366004610325565b6105d261179f565b604051005b906020828203126101e8576101d591610202565b346101e8576105d26105fe3660046105d7565b611898565b6101d560646103c7565b6101d5610603565b346101e857610625366004610325565b6102a661040a61060d565b90916060828403126101e8576101d561064984846101ed565b93604061026c8260208701610202565b6102a661029661066a366004610630565b91611ad8565b346101e8576102a661068c6106863660046104b8565b91611ae5565b60405191829182901515815260200190565b346101e8576106ae366004610325565b6102a66103bb611b71565b91906040838203126101e8576101d59060206102d382866101ed565b346101e8576105d26106e83660046106b9565b90611bd2565b6104816101d56101d5926101c0565b6101d5906106ee565b6101d5906106fd565b61027390610706565b6020810192916101fa919061070f565b346101e857610738366004610325565b6102a67f00000000000000000000000000000000000000000000000000000000000000005b60405191829182610718565b346101e857610779366004610325565b6102a67f000000000000000000000000000000000000000000000000000000000000000061075d565b346101e8576107b2366004610325565b6102a67f000000000000000000000000000000000000000000000000000000000000000061075d565b6101d5610bb86103c7565b6101d56107db565b346101e8576107fe366004610325565b6102a661040a6107e6565b346101e8576102a661029661081f366004610227565b93929092611d05565b346101e857610838366004610325565b6105d2611d61565b906020828203126101e8576101d5916101ed565b346101e8576105d2610867366004610840565b611e3a565b346101e8576105d261087f366004610840565b611e95565b346101e8576102a661029661089a366004610420565b92919091611e9e565b906108b995949392916108b4611fa4565b610a63565b906101fa611fe4565b6101d56101d56101d59290565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761090657604052565b6108cf565b8015156101e1565b905051906101fa8261090b565b906020828203126101e8576101d591610913565b60409061095e6101fa94969593966109546060840198600085019061036d565b602083019061036d565b0152565b6040513d6000823e3d90fd5b905051906101fa826101fc565b906020828203126101e8576101d59161096e565b634e487b7160e01b600052601160045260246000fd5b919082039182116109b257565b61098f565b6101d59081565b6101d590546109b7565b6101d590546101cc565b6104816101d56101d59290565b6101d5906109d2565b818102929181159184041417156109b257565b634e487b7160e01b600052601260045260246000fd5b90610a1b565b9190565b908115610a26570490565b6109fb565b9160206101fa92949361095e6040820196600083019061036d565b9081526060810193926101fa9290916040916102eb906020830152565b50929493929091600090610a76826108c2565b8114610dae57610a8d610a8884610706565b610706565b610a9630610706565b92610aa060405190565b6323b872dd60e01b815260208180610abd8d893360048501610934565b038185875af18015610c5b57610d91575b506370a08231610add60405190565b610ae78260e01b90565b815260208180610afa8960048301610376565b0381875afa918215610c5b5784918493610d70575b50610b19846108c2565b9b8c33610b28928d8d8d612233565b6040518097610b38829360e01b90565b8252610b479060048301610376565b03815a93602094fa948515610c5b578295610d3b575b5084610b68916109a5565b91829980610b738790565b11610bbd575b50505060008051602061248a8339815191529250610bb8610ba5610b9f610b9f33610706565b96610706565b96610baf60405190565b93849384610a46565b0390a4565b85839691610bce6101d560026109be565b1180610d0f575b610c60575b50602091610c0791610beb60405190565b948593849283919063a9059cbb60e01b83523360048401610a2b565b03925af18015610c5b5760008051602061248a8339815191529450610c2e575b8080610b79565b610c4f9060203d602011610c54575b610c4781836108e5565b810190610920565b610c27565b503d610c3d565b610962565b610c87610c76610c7060026109be565b876109e8565b610c816127106108c2565b90610a11565b90808210610c96575b50610bda565b92909350610cc79150602084610cac60036109c8565b604051948592839263a9059cbb60e01b845260048401610a2b565b03818a855af18015610c5b578794602094610c0794610ceb93610cf4575b506109a5565b91819350610c90565b610d0a90873d8911610c5457610c4781836108e5565b610ce5565b50610d1a60036109c8565b610d34610d2e610d29876109df565b6101cc565b916101cc565b1415610bd5565b610b68919550610d629060203d602011610d69575b610d5a81836108e5565b81019061097b565b9490610b5d565b503d610d50565b610d8a91935060203d602011610d6957610d5a81836108e5565b9138610b0f565b610da99060203d602011610c5457610c4781836108e5565b610ace565b50632ca2f52b60e11b815280600481015b0390fd5b6101d5949392919060006108a3565b906101fa610ddf60405190565b92836108e5565b6001600160401b0381116109065760200290565b610e066101d591610de6565b610dd2565b634e487b7160e01b600052603260045260246000fd5b906004811015610e32576020020190565b610e0b565b905051906101fa826101d8565b906020828203126101e8576101d591610e37565b6040906102eb6101fa94969593966109546060840198600085019061036d565b610273906109d2565b909594926101fa94610ebe610ec592610eb2608096610ea860a088019c600089019061036d565b602087019061036d565b62ffffff166040850152565b6060830152565b0190610e78565b929160008092600090610ede826108c2565b8414610dae57610eee6004610dfa565b94610f05610efa610603565b62ffffff1687850152565b610f1c610f106103dc565b62ffffff166020880152565b610f33610f276107db565b62ffffff166040880152565b610f4a610f3e61058c565b62ffffff166060880152565b610f53836108c2565b60048110156110f557610fc76020610f8a7f0000000000000000000000000000000000000000000000000000000000000000610706565b610fa0610f97858c610e21565b5162ffffff1690565b90868d610fac60405190565b95869485938493630b4c774160e11b5b855260048501610e58565b03915afa908115610c5b5785916110c7575b50610fe9610d2e610d29876109df565b146110bf578560208a89868861102b610f97886110257f0000000000000000000000000000000000000000000000000000000000000000610706565b95610e21565b936110548261103960405190565b9889978896879563f7729d4360e01b5b875260048701610e81565b03925af185918161109f575b506110735750600101610f53565b610f53565b858111611084575b50600101610f53565b9450905061106e611098610f978389610e21565b919061107b565b6110b891925060203d8111610d6957610d5a81836108e5565b9038611060565b600101610f53565b6110e8915060203d81116110ee575b6110e081836108e5565b810190610e44565b38610fd9565b503d6110d6565b509594505091509350611107816108c2565b84146111105750565b6301dbb3ff60e61b8152600490fd5b6000939161112c856108c2565b84146112435761115b7f0000000000000000000000000000000000000000000000000000000000000000610706565b602061116660405190565b918290630b4c774160e11b8252818061118489888a60048501610e58565b03915afa908115610c5b578691611224575b506111a6610d2e610d29886109df565b14611215579060209291856111da7f0000000000000000000000000000000000000000000000000000000000000000610706565b926111e88261103960405190565b03925af1918215610c5b57916111fc575090565b6101d5915060203d602011610d6957610d5a81836108e5565b6301dbb3ff60e61b8552600485fd5b61123d915060203d6020116110ee576110e081836108e5565b38611196565b632ca2f52b60e11b8552600485fd5b6101e1816101c0565b905051906101fa82611252565b6101e18160020b90565b905051906101fa82611268565b61ffff81166101e1565b905051906101fa8261127f565b60ff81166101e1565b905051906101fa82611296565b60e0818303126101e8576112c0828261125b565b926112ce8360208401611272565b926112dc8160408501611289565b926112ea8260608301611289565b926101d56112fb8460808501611289565b9360c061130b8260a0870161129f565b9401610913565b9161136b9392602092611323600090565b5061134d7f0000000000000000000000000000000000000000000000000000000000000000610706565b9161135760405190565b96879485938493630b4c774160e11b610fbc565b03915afa918215610c5b5760009261141e575b5060008261138e610d29836109df565b611397826101cc565b1461140e57610a886113a891610706565b9060e06113b460405190565b633850c7bd60e01b815292839060049082905afa918215610c5b5781926113da57509091565b90506113fe915060e03d60e011611407575b6113f681836108e5565b8101906112ac565b50505050509091565b503d6113ec565b506301dbb3ff60e61b8152600490fd5b61143891925060203d6020116110ee576110e081836108e5565b903861137e565b906108b99493929161144f611fa4565b6114a5565b0190565b6001600160401b03811161090657602090601f01601f19160190565b90611481610e0683611458565b918252565b3d156114a0576114953d611474565b903d6000602084013e565b606090565b94939294506000916114b6836108c2565b811461176557806114c760026109be565b6114d3610a17866108c2565b1180611744575b6116b0575b506114ec610a8883610706565b906114f630610706565b93602061150260405190565b9384906323b872dd60e01b8252818481611521888c3360048501610934565b03925af1928315610c5b5761158c93611693575b5060206115617f0000000000000000000000000000000000000000000000000000000000000000610706565b956115708a82868b8b8b612233565b6040519485918291906370a0823160e01b835260048301610376565b0381885afa928315610c5b578193611672575b50843b156101e857604051632e1a7d4d60e01b8152600481018490528181602481838a5af18015610c5b57611646575b506115f281806115de60405190565b60009087335af16115ed611486565b501590565b611637576115fe839890565b831061162857509060008051602061248a83398151915291610bb8610ba5610b9f610b9f33610706565b638199f5f360e01b8152600490fd5b6312171d8360e31b8152600490fd5b61166590823d841161166b575b61165d81836108e5565b810190610325565b386115cf565b503d611653565b61168c91935060203d602011610d6957610d5a81836108e5565b913861159f565b6116ab9060203d602011610c5457610c4781836108e5565b611535565b905061171860206116d76116d0610c766116ca60026109be565b866109e8565b80946109a5565b926116e4610a8886610706565b6116ee60036109c8565b876116f860405190565b80968195829461170c6323b872dd60e01b90565b84523360048501610934565b03925af18015610c5b57156114df5761173f9060203d602011610c5457610c4781836108e5565b6114df565b5061174f60036109c8565b61175e610d2e610d29876109df565b14156114da565b632ca2f52b60e11b8352600483fd5b6101d593929190600061143f565b61178a612400565b6101fa6101fa61179a60006109df565b612437565b6101fa611782565b6101fa906117b3612400565b611831565b156117bf57565b60405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606490fd5b90600019905b9181191691161790565b906118136101d561181a926108c2565b82546117f3565b9055565b9081526040810192916101fa9160200152565b7fb404cac19fb1cbeff98d325795b08886e3cd8fe8cb1a2f193aac66f13fb239c3906118696118616101f46108c2565b8211156117b8565b61187360026109be565b61187e826002611803565b61189361188a60405190565b9283928361181e565b0390a1565b6101fa906117a7565b906108b99392916118b0611fa4565b939291935060006118c0816108c2565b3414611ac95734906118d260026109be565b6118de610a17836108c2565b1180611aa8575b611a48575b6119137f0000000000000000000000000000000000000000000000000000000000000000610706565b9163d0e30db0833b156101e85761193361192c60405190565b9160e01b90565b8152828160048185885af18015610c5b57611a2c575b50611956610a8885610706565b6370a082319061196560405190565b916119708160e01b90565b8352602083806119833360048301610376565b0381855afa908115610c5b576119b9938692611a0c575b50602091926119ad8c33888d8d8d612233565b60405194859260e01b90565b825281806119ca3360048301610376565b03915afa8015610c5b576119e49285916119ed57506109a5565b916115fe839890565b611a06915060203d602011610d6957610d5a81836108e5565b38610ce5565b60209250611a2690833d8511610d6957610d5a81836108e5565b9161199a565b611a4290833d851161166b5761165d81836108e5565b38611949565b9050611a60610c76611a5a60026109be565b346109e8565b90611a948180611a7085346109a5565b94611a7b60036109c8565b90611a8560405190565b90818003925af16115ed611486565b156118ea576312171d8360e31b8152600490fd5b50611ab360036109c8565b611ac2610d2e610d29846109df565b14156118e5565b632ca2f52b60e11b8152600490fd5b6101d592919060006118a1565b91611b2992602092611af5600090565b50611b1f7f0000000000000000000000000000000000000000000000000000000000000000610706565b91610fac60405190565b03915afa908115610c5b57600091611b52575b50611b4d610d2e610d2960006109df565b141590565b611b6b915060203d6020116110ee576110e081836108e5565b38611b3c565b6101d560006109c8565b906101fa91611b88612400565b611ba6600092611b9c610a88602094610706565b90610beb60405190565b03925af18015610c5b57611bb75750565b611bcf9060203d602011610c5457610c4781836108e5565b50565b906101fa91611b7b565b906108b99594939291611bed611fa4565b50929493929091600090611c00826108c2565b8114610dae5780611c1160026109be565b611c1d610a17856108c2565b1180611ce4575b611c87575b50611c4f602082611c3c610a8887610706565b611c4530610706565b866116f860405190565b03925af18015610c5b57611c6a5750611956610a8885610706565b611c829060203d602011610c5457610c4781836108e5565b611949565b9050611cb86020611ca16116d0610c766116ca60026109be565b92611cae610a8887610706565b611c4560036109c8565b03925af18015610c5b5715611c2957611cdf9060203d602011610c5457610c4781836108e5565b611c29565b50611cef60036109c8565b611cfe610d2e610d29866109df565b1415611c24565b6101d594939291906000611bdc565b611d1c612400565b6101fa611d46600080611d2e30610706565b31611d3860405190565b600091335af16115ed611486565b611d4c57565b6312171d8360e31b600090815260045b036000fd5b6101fa611d14565b6101fa90611d75612400565b611dc2565b906001600160a01b03906117f9565b90611d996101d561181a92610706565b8254611d7a565b9160206101fa929493611dbb6040820196600083019061036d565b019061036d565b6000611dd0610d29826109df565b611dd9836101cc565b14611e2b57507faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d390611e0b60036109c8565b611e16826003611d89565b611893611e2260405190565b92839283611da0565b63e6c4247b60e01b8152600490fd5b6101fa90611d69565b6101fa90611e4f612400565b6000611e5a816109df565b611e63816101cc565b611e6c846101cc565b14611e7c5750506101fa90612437565b631e4fbdf760e01b82528190610dbf9060048301610376565b6101fa90611e43565b60009391611eab856108c2565b841461124357611eda7f0000000000000000000000000000000000000000000000000000000000000000610706565b6020611ee560405190565b918290630b4c774160e11b82528180611f0389888a60048501610e58565b03915afa908115610c5b578691611f7b575b50611f25610d2e610d29886109df565b1461121557906020929185611f597f0000000000000000000000000000000000000000000000000000000000000000610706565b926111e882611f6760405190565b988997889687956330d07f2160e01b611049565b611f94915060203d6020116110ee576110e081836108e5565b38611f15565b6101d560026108c2565b611fae60016109be565b611fb6611f9a565b908114611fc8576101fa906001611803565b633ee5aeb560e01b6000908152600490fd5b6101d560016108c2565b6101fa611fef611fda565b6001611803565b612002610273916101cc565b60601b90565b6102739062ffffff1660e81b90565b60149392612037858361202f60039561145497611ff6565b018092612008565b018092611ff6565b61205261204c6101d59290565b60f81b90565b6001600160f81b03191690565b6101d5600061203f565b6001600160401b0381116109065760208091020190565b90611481610e0683612069565b60005b82811061209c57505050565b606082820152602001612090565b906101fa6120c06120ba84612080565b93612069565b601f19016020840161208d565b60005b8381106120e05750506000910152565b81810151838201526020016120d0565b61211161211a60209361145493612105815190565b80835293849260200190565b958691016120cd565b601f01601f191690565b6101fa946121588298979561215160809661214a61216597600060a0890198019061036d565b60208c0152565b60408a0152565b87820360608901526120f0565b94019015159052565b90612177825190565b811015610e32576020809102010190565b906101d5916120f0565b906121a861219e835190565b8083529160200190565b90816121ba6020830284019460200190565b926000915b8383106121ce57505050505090565b909192939460206121f16121ea83856001950387528951612188565b9760200190565b93019301919392906121bf565b93929061222e6101fa93612220604093606089019089820360008b01526120f0565b908782036020890152612192565b940152565b91949094939293612246610a8884610706565b917f000000000000000000000000000000000000000000000000000000000000000091602061227460405190565b94859063a9059cbb60e01b8252816000816122938d8a60048401610a2b565b03925af1908115610c5b5761238295610a88956122d6936123e3575b506122ca6122bc60405190565b9a8b93602085019384612017565b908103825203886108e5565b6123576122e161205f565b9661231a6122ee60405190565b809961230e602083019182611454816001936001600160f81b0319169052565b908103825203896108e5565b61232c61232760016108c2565b6120aa565b9661234b6000809b61233d60405190565b968795602087019586612124565b908103825203826108e5565b612369612363886108c2565b8661216e565b5261237c612376876108c2565b8561216e565b50610706565b91823b156101e8576123bb9284928361239a60405190565b8096819582946123ae633593564c60e01b90565b84524291600485016121fe565b03925af18015610c5b576123cd575050565b816101fa92903d1061166b5761165d81836108e5565b6123fb9060203d602011610c5457610c4781836108e5565b6122af565b612408611b71565b3390612416610d2e836101cc565b0361241e5750565b63118cdaa760e01b600090815290611d5c906004610376565b61245861245261244760006109c8565b610a88846000611d89565b91610706565b907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e061248360405190565b600090a356feefe840f9ad39a31189edbe2e23d9eb0e7a26b3f02930d967355a81f398310c0ba164736f6c634300081c000a0000000000000000000000000d97dc33264bfc1c226207428a79b26757fb9dc3000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d000000000000000000000000204faca1764b154221e35c0d20abb3c5257104980000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a000000000000000000000000eaf75b465f791b24c3b3e17a2f4793a67e3941fd
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80631bce6889146101bb578063228c04b8146101b657806335659fb8146101b157806335a9e4df146101ac5780633add5c05146101a75780634516d410146101a2578063469048401461019d5780634a277c62146101985780635288839f1461019357806363075eb91461018e578063715018a614610189578063787dce3d1461018457806379dc9b321461017f5780637d2f8b311461017a578063806eacf8146101755780638da5cb5b146101705780639e281a981461016b578063ad5c464814610166578063c45a015514610161578063c6bbd5a71461015c578063ca21624714610157578063ca8b63ed14610152578063e086e5ec1461014d578063e74b981b14610148578063f2fde38b146101435763f60a28800361000e57610884565b61086c565b610854565b610828565b610809565b6107ee565b6107a2565b610769565b610728565b6106d5565b61069e565b610670565b610659565b610615565b6105eb565b6105ba565b61059f565b61056d565b61051d565b61049d565b610455565b6103ef565b610386565b610352565b6102f6565b610277565b6001600160a01b031690565b6101d5906101c0565b90565b6101e1816101cc565b036101e857565b600080fd5b905035906101fa826101d8565b565b806101e1565b905035906101fa826101fc565b62ffffff81166101e1565b905035906101fa8261020f565b919060a0838203126101e85761023d81846101ed565b9261024b82602083016101ed565b926101d561025c8460408501610202565b93608061026c8260608701610202565b940161021a565b9052565b346101e8576102a661029661028d366004610227565b93929092610dc3565b6040519182918290815260200190565b0390f35b90916060828403126101e8576101d56102c384846101ed565b9360406102d382602087016101ed565b9401610202565b9081526040810192916101fa916020905b019062ffffff169052565b346101e85761030f6103093660046102aa565b91610ecc565b906102a661031c60405190565b928392836102da565b60009103126101e857565b6101d5916008021c81565b906101d59154610330565b6101d56000600261033b565b346101e857610362366004610325565b6102a6610296610346565b610273906101cc565b6020810192916101fa919061036d565b346101e857610396366004610325565b6102a67f0000000000000000000000000d97dc33264bfc1c226207428a79b26757fb9dc35b60405191829182610376565b6103d46101d56101d59290565b62ffffff1690565b6101d56101f46103c7565b6101d56103dc565b346101e8576103ff366004610325565b6102a661040a6103e7565b6040519182918262ffffff909116815260200190565b6080818303126101e85761043482826101ed565b926101d561044584602085016101ed565b93606061026c8260408701610202565b346101e8576102a661029661046b366004610420565b9291909161111f565b6101d5916008021c6101c0565b6101c0565b906101d59154610474565b6101d560006003610486565b346101e8576104ad366004610325565b6102a66103bb610491565b90916060828403126101e8576101d56104d184846101ed565b93604061026c82602087016101ed565b610273906101c0565b6040906105146101fa949695939661050a6060840198600085019061036d565b60208301906104e1565b019060020b9052565b346101e8576102a66105396105333660046104b8565b91611312565b604051919391938493846104ea565b6080818303126101e85761055c82826101ed565b926101d56104458460208501610202565b346101e8576102a6610296610583366004610548565b92919091611774565b6101d56127106103c7565b6101d561058c565b346101e8576105af366004610325565b6102a661040a610597565b346101e8576105ca366004610325565b6105d261179f565b604051005b906020828203126101e8576101d591610202565b346101e8576105d26105fe3660046105d7565b611898565b6101d560646103c7565b6101d5610603565b346101e857610625366004610325565b6102a661040a61060d565b90916060828403126101e8576101d561064984846101ed565b93604061026c8260208701610202565b6102a661029661066a366004610630565b91611ad8565b346101e8576102a661068c6106863660046104b8565b91611ae5565b60405191829182901515815260200190565b346101e8576106ae366004610325565b6102a66103bb611b71565b91906040838203126101e8576101d59060206102d382866101ed565b346101e8576105d26106e83660046106b9565b90611bd2565b6104816101d56101d5926101c0565b6101d5906106ee565b6101d5906106fd565b61027390610706565b6020810192916101fa919061070f565b346101e857610738366004610325565b6102a67f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a5b60405191829182610718565b346101e857610779366004610325565b6102a67f000000000000000000000000204faca1764b154221e35c0d20abb3c52571049861075d565b346101e8576107b2366004610325565b6102a67f000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d61075d565b6101d5610bb86103c7565b6101d56107db565b346101e8576107fe366004610325565b6102a661040a6107e6565b346101e8576102a661029661081f366004610227565b93929092611d05565b346101e857610838366004610325565b6105d2611d61565b906020828203126101e8576101d5916101ed565b346101e8576105d2610867366004610840565b611e3a565b346101e8576105d261087f366004610840565b611e95565b346101e8576102a661029661089a366004610420565b92919091611e9e565b906108b995949392916108b4611fa4565b610a63565b906101fa611fe4565b6101d56101d56101d59290565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761090657604052565b6108cf565b8015156101e1565b905051906101fa8261090b565b906020828203126101e8576101d591610913565b60409061095e6101fa94969593966109546060840198600085019061036d565b602083019061036d565b0152565b6040513d6000823e3d90fd5b905051906101fa826101fc565b906020828203126101e8576101d59161096e565b634e487b7160e01b600052601160045260246000fd5b919082039182116109b257565b61098f565b6101d59081565b6101d590546109b7565b6101d590546101cc565b6104816101d56101d59290565b6101d5906109d2565b818102929181159184041417156109b257565b634e487b7160e01b600052601260045260246000fd5b90610a1b565b9190565b908115610a26570490565b6109fb565b9160206101fa92949361095e6040820196600083019061036d565b9081526060810193926101fa9290916040916102eb906020830152565b50929493929091600090610a76826108c2565b8114610dae57610a8d610a8884610706565b610706565b610a9630610706565b92610aa060405190565b6323b872dd60e01b815260208180610abd8d893360048501610934565b038185875af18015610c5b57610d91575b506370a08231610add60405190565b610ae78260e01b90565b815260208180610afa8960048301610376565b0381875afa918215610c5b5784918493610d70575b50610b19846108c2565b9b8c33610b28928d8d8d612233565b6040518097610b38829360e01b90565b8252610b479060048301610376565b03815a93602094fa948515610c5b578295610d3b575b5084610b68916109a5565b91829980610b738790565b11610bbd575b50505060008051602061248a8339815191529250610bb8610ba5610b9f610b9f33610706565b96610706565b96610baf60405190565b93849384610a46565b0390a4565b85839691610bce6101d560026109be565b1180610d0f575b610c60575b50602091610c0791610beb60405190565b948593849283919063a9059cbb60e01b83523360048401610a2b565b03925af18015610c5b5760008051602061248a8339815191529450610c2e575b8080610b79565b610c4f9060203d602011610c54575b610c4781836108e5565b810190610920565b610c27565b503d610c3d565b610962565b610c87610c76610c7060026109be565b876109e8565b610c816127106108c2565b90610a11565b90808210610c96575b50610bda565b92909350610cc79150602084610cac60036109c8565b604051948592839263a9059cbb60e01b845260048401610a2b565b03818a855af18015610c5b578794602094610c0794610ceb93610cf4575b506109a5565b91819350610c90565b610d0a90873d8911610c5457610c4781836108e5565b610ce5565b50610d1a60036109c8565b610d34610d2e610d29876109df565b6101cc565b916101cc565b1415610bd5565b610b68919550610d629060203d602011610d69575b610d5a81836108e5565b81019061097b565b9490610b5d565b503d610d50565b610d8a91935060203d602011610d6957610d5a81836108e5565b9138610b0f565b610da99060203d602011610c5457610c4781836108e5565b610ace565b50632ca2f52b60e11b815280600481015b0390fd5b6101d5949392919060006108a3565b906101fa610ddf60405190565b92836108e5565b6001600160401b0381116109065760200290565b610e066101d591610de6565b610dd2565b634e487b7160e01b600052603260045260246000fd5b906004811015610e32576020020190565b610e0b565b905051906101fa826101d8565b906020828203126101e8576101d591610e37565b6040906102eb6101fa94969593966109546060840198600085019061036d565b610273906109d2565b909594926101fa94610ebe610ec592610eb2608096610ea860a088019c600089019061036d565b602087019061036d565b62ffffff166040850152565b6060830152565b0190610e78565b929160008092600090610ede826108c2565b8414610dae57610eee6004610dfa565b94610f05610efa610603565b62ffffff1687850152565b610f1c610f106103dc565b62ffffff166020880152565b610f33610f276107db565b62ffffff166040880152565b610f4a610f3e61058c565b62ffffff166060880152565b610f53836108c2565b60048110156110f557610fc76020610f8a7f000000000000000000000000204faca1764b154221e35c0d20abb3c525710498610706565b610fa0610f97858c610e21565b5162ffffff1690565b90868d610fac60405190565b95869485938493630b4c774160e11b5b855260048501610e58565b03915afa908115610c5b5785916110c7575b50610fe9610d2e610d29876109df565b146110bf578560208a89868861102b610f97886110257f000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d610706565b95610e21565b936110548261103960405190565b9889978896879563f7729d4360e01b5b875260048701610e81565b03925af185918161109f575b506110735750600101610f53565b610f53565b858111611084575b50600101610f53565b9450905061106e611098610f978389610e21565b919061107b565b6110b891925060203d8111610d6957610d5a81836108e5565b9038611060565b600101610f53565b6110e8915060203d81116110ee575b6110e081836108e5565b810190610e44565b38610fd9565b503d6110d6565b509594505091509350611107816108c2565b84146111105750565b6301dbb3ff60e61b8152600490fd5b6000939161112c856108c2565b84146112435761115b7f000000000000000000000000204faca1764b154221e35c0d20abb3c525710498610706565b602061116660405190565b918290630b4c774160e11b8252818061118489888a60048501610e58565b03915afa908115610c5b578691611224575b506111a6610d2e610d29886109df565b14611215579060209291856111da7f000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d610706565b926111e88261103960405190565b03925af1918215610c5b57916111fc575090565b6101d5915060203d602011610d6957610d5a81836108e5565b6301dbb3ff60e61b8552600485fd5b61123d915060203d6020116110ee576110e081836108e5565b38611196565b632ca2f52b60e11b8552600485fd5b6101e1816101c0565b905051906101fa82611252565b6101e18160020b90565b905051906101fa82611268565b61ffff81166101e1565b905051906101fa8261127f565b60ff81166101e1565b905051906101fa82611296565b60e0818303126101e8576112c0828261125b565b926112ce8360208401611272565b926112dc8160408501611289565b926112ea8260608301611289565b926101d56112fb8460808501611289565b9360c061130b8260a0870161129f565b9401610913565b9161136b9392602092611323600090565b5061134d7f000000000000000000000000204faca1764b154221e35c0d20abb3c525710498610706565b9161135760405190565b96879485938493630b4c774160e11b610fbc565b03915afa918215610c5b5760009261141e575b5060008261138e610d29836109df565b611397826101cc565b1461140e57610a886113a891610706565b9060e06113b460405190565b633850c7bd60e01b815292839060049082905afa918215610c5b5781926113da57509091565b90506113fe915060e03d60e011611407575b6113f681836108e5565b8101906112ac565b50505050509091565b503d6113ec565b506301dbb3ff60e61b8152600490fd5b61143891925060203d6020116110ee576110e081836108e5565b903861137e565b906108b99493929161144f611fa4565b6114a5565b0190565b6001600160401b03811161090657602090601f01601f19160190565b90611481610e0683611458565b918252565b3d156114a0576114953d611474565b903d6000602084013e565b606090565b94939294506000916114b6836108c2565b811461176557806114c760026109be565b6114d3610a17866108c2565b1180611744575b6116b0575b506114ec610a8883610706565b906114f630610706565b93602061150260405190565b9384906323b872dd60e01b8252818481611521888c3360048501610934565b03925af1928315610c5b5761158c93611693575b5060206115617f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a610706565b956115708a82868b8b8b612233565b6040519485918291906370a0823160e01b835260048301610376565b0381885afa928315610c5b578193611672575b50843b156101e857604051632e1a7d4d60e01b8152600481018490528181602481838a5af18015610c5b57611646575b506115f281806115de60405190565b60009087335af16115ed611486565b501590565b611637576115fe839890565b831061162857509060008051602061248a83398151915291610bb8610ba5610b9f610b9f33610706565b638199f5f360e01b8152600490fd5b6312171d8360e31b8152600490fd5b61166590823d841161166b575b61165d81836108e5565b810190610325565b386115cf565b503d611653565b61168c91935060203d602011610d6957610d5a81836108e5565b913861159f565b6116ab9060203d602011610c5457610c4781836108e5565b611535565b905061171860206116d76116d0610c766116ca60026109be565b866109e8565b80946109a5565b926116e4610a8886610706565b6116ee60036109c8565b876116f860405190565b80968195829461170c6323b872dd60e01b90565b84523360048501610934565b03925af18015610c5b57156114df5761173f9060203d602011610c5457610c4781836108e5565b6114df565b5061174f60036109c8565b61175e610d2e610d29876109df565b14156114da565b632ca2f52b60e11b8352600483fd5b6101d593929190600061143f565b61178a612400565b6101fa6101fa61179a60006109df565b612437565b6101fa611782565b6101fa906117b3612400565b611831565b156117bf57565b60405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606490fd5b90600019905b9181191691161790565b906118136101d561181a926108c2565b82546117f3565b9055565b9081526040810192916101fa9160200152565b7fb404cac19fb1cbeff98d325795b08886e3cd8fe8cb1a2f193aac66f13fb239c3906118696118616101f46108c2565b8211156117b8565b61187360026109be565b61187e826002611803565b61189361188a60405190565b9283928361181e565b0390a1565b6101fa906117a7565b906108b99392916118b0611fa4565b939291935060006118c0816108c2565b3414611ac95734906118d260026109be565b6118de610a17836108c2565b1180611aa8575b611a48575b6119137f0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a610706565b9163d0e30db0833b156101e85761193361192c60405190565b9160e01b90565b8152828160048185885af18015610c5b57611a2c575b50611956610a8885610706565b6370a082319061196560405190565b916119708160e01b90565b8352602083806119833360048301610376565b0381855afa908115610c5b576119b9938692611a0c575b50602091926119ad8c33888d8d8d612233565b60405194859260e01b90565b825281806119ca3360048301610376565b03915afa8015610c5b576119e49285916119ed57506109a5565b916115fe839890565b611a06915060203d602011610d6957610d5a81836108e5565b38610ce5565b60209250611a2690833d8511610d6957610d5a81836108e5565b9161199a565b611a4290833d851161166b5761165d81836108e5565b38611949565b9050611a60610c76611a5a60026109be565b346109e8565b90611a948180611a7085346109a5565b94611a7b60036109c8565b90611a8560405190565b90818003925af16115ed611486565b156118ea576312171d8360e31b8152600490fd5b50611ab360036109c8565b611ac2610d2e610d29846109df565b14156118e5565b632ca2f52b60e11b8152600490fd5b6101d592919060006118a1565b91611b2992602092611af5600090565b50611b1f7f000000000000000000000000204faca1764b154221e35c0d20abb3c525710498610706565b91610fac60405190565b03915afa908115610c5b57600091611b52575b50611b4d610d2e610d2960006109df565b141590565b611b6b915060203d6020116110ee576110e081836108e5565b38611b3c565b6101d560006109c8565b906101fa91611b88612400565b611ba6600092611b9c610a88602094610706565b90610beb60405190565b03925af18015610c5b57611bb75750565b611bcf9060203d602011610c5457610c4781836108e5565b50565b906101fa91611b7b565b906108b99594939291611bed611fa4565b50929493929091600090611c00826108c2565b8114610dae5780611c1160026109be565b611c1d610a17856108c2565b1180611ce4575b611c87575b50611c4f602082611c3c610a8887610706565b611c4530610706565b866116f860405190565b03925af18015610c5b57611c6a5750611956610a8885610706565b611c829060203d602011610c5457610c4781836108e5565b611949565b9050611cb86020611ca16116d0610c766116ca60026109be565b92611cae610a8887610706565b611c4560036109c8565b03925af18015610c5b5715611c2957611cdf9060203d602011610c5457610c4781836108e5565b611c29565b50611cef60036109c8565b611cfe610d2e610d29866109df565b1415611c24565b6101d594939291906000611bdc565b611d1c612400565b6101fa611d46600080611d2e30610706565b31611d3860405190565b600091335af16115ed611486565b611d4c57565b6312171d8360e31b600090815260045b036000fd5b6101fa611d14565b6101fa90611d75612400565b611dc2565b906001600160a01b03906117f9565b90611d996101d561181a92610706565b8254611d7a565b9160206101fa929493611dbb6040820196600083019061036d565b019061036d565b6000611dd0610d29826109df565b611dd9836101cc565b14611e2b57507faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d390611e0b60036109c8565b611e16826003611d89565b611893611e2260405190565b92839283611da0565b63e6c4247b60e01b8152600490fd5b6101fa90611d69565b6101fa90611e4f612400565b6000611e5a816109df565b611e63816101cc565b611e6c846101cc565b14611e7c5750506101fa90612437565b631e4fbdf760e01b82528190610dbf9060048301610376565b6101fa90611e43565b60009391611eab856108c2565b841461124357611eda7f000000000000000000000000204faca1764b154221e35c0d20abb3c525710498610706565b6020611ee560405190565b918290630b4c774160e11b82528180611f0389888a60048501610e58565b03915afa908115610c5b578691611f7b575b50611f25610d2e610d29886109df565b1461121557906020929185611f597f000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d610706565b926111e882611f6760405190565b988997889687956330d07f2160e01b611049565b611f94915060203d6020116110ee576110e081836108e5565b38611f15565b6101d560026108c2565b611fae60016109be565b611fb6611f9a565b908114611fc8576101fa906001611803565b633ee5aeb560e01b6000908152600490fd5b6101d560016108c2565b6101fa611fef611fda565b6001611803565b612002610273916101cc565b60601b90565b6102739062ffffff1660e81b90565b60149392612037858361202f60039561145497611ff6565b018092612008565b018092611ff6565b61205261204c6101d59290565b60f81b90565b6001600160f81b03191690565b6101d5600061203f565b6001600160401b0381116109065760208091020190565b90611481610e0683612069565b60005b82811061209c57505050565b606082820152602001612090565b906101fa6120c06120ba84612080565b93612069565b601f19016020840161208d565b60005b8381106120e05750506000910152565b81810151838201526020016120d0565b61211161211a60209361145493612105815190565b80835293849260200190565b958691016120cd565b601f01601f191690565b6101fa946121588298979561215160809661214a61216597600060a0890198019061036d565b60208c0152565b60408a0152565b87820360608901526120f0565b94019015159052565b90612177825190565b811015610e32576020809102010190565b906101d5916120f0565b906121a861219e835190565b8083529160200190565b90816121ba6020830284019460200190565b926000915b8383106121ce57505050505090565b909192939460206121f16121ea83856001950387528951612188565b9760200190565b93019301919392906121bf565b93929061222e6101fa93612220604093606089019089820360008b01526120f0565b908782036020890152612192565b940152565b91949094939293612246610a8884610706565b917f0000000000000000000000000d97dc33264bfc1c226207428a79b26757fb9dc391602061227460405190565b94859063a9059cbb60e01b8252816000816122938d8a60048401610a2b565b03925af1908115610c5b5761238295610a88956122d6936123e3575b506122ca6122bc60405190565b9a8b93602085019384612017565b908103825203886108e5565b6123576122e161205f565b9661231a6122ee60405190565b809961230e602083019182611454816001936001600160f81b0319169052565b908103825203896108e5565b61232c61232760016108c2565b6120aa565b9661234b6000809b61233d60405190565b968795602087019586612124565b908103825203826108e5565b612369612363886108c2565b8661216e565b5261237c612376876108c2565b8561216e565b50610706565b91823b156101e8576123bb9284928361239a60405190565b8096819582946123ae633593564c60e01b90565b84524291600485016121fe565b03925af18015610c5b576123cd575050565b816101fa92903d1061166b5761165d81836108e5565b6123fb9060203d602011610c5457610c4781836108e5565b6122af565b612408611b71565b3390612416610d2e836101cc565b0361241e5750565b63118cdaa760e01b600090815290611d5c906004610376565b61245861245261244760006109c8565b610a88846000611d89565b91610706565b907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e061248360405190565b600090a356feefe840f9ad39a31189edbe2e23d9eb0e7a26b3f02930d967355a81f398310c0ba164736f6c634300081c000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000d97dc33264bfc1c226207428a79b26757fb9dc3000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d000000000000000000000000204faca1764b154221e35c0d20abb3c5257104980000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a000000000000000000000000eaf75b465f791b24c3b3e17a2f4793a67e3941fd
-----Decoded View---------------
Arg [0] : _universalRouter (address): 0x0D97Dc33264bfC1c226207428A79b26757fb9dc3
Arg [1] : _quoter (address): 0x661E93cca42AfacB172121EF892830cA3b70F08d
Arg [2] : _factory (address): 0x204FAca1764B154221e35c0d20aBb3c525710498
Arg [3] : _weth (address): 0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A
Arg [4] : _feeRecipient (address): 0xEAf75B465F791b24C3B3E17a2F4793A67e3941fD
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000d97dc33264bfc1c226207428a79b26757fb9dc3
Arg [1] : 000000000000000000000000661e93cca42afacb172121ef892830ca3b70f08d
Arg [2] : 000000000000000000000000204faca1764b154221e35c0d20abb3c525710498
Arg [3] : 0000000000000000000000003bd359c1119da7da1d913d1c4d2b7c461115433a
Arg [4] : 000000000000000000000000eaf75b465f791b24c3b3e17a2f4793a67e3941fd
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.