Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CashVerseTreasury
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract CashVerseTreasury is Ownable, ReentrancyGuard {
IUniswapV2Router02 public uniswapV2Router;
ISwapRouter public uniswapV3Router;
address public WETH;
address public profitWallet;
uint256 public totalDeposited;
uint256 public totalProfits;
uint256 public totalParticipants;
uint256 public minDeposit = 0.03 ether;
uint256 public maxParticipants = 25;
uint256 public pendingProfitWithdrawal;
struct User {
uint256 deposited;
uint256 claimableProfits;
uint256 depositIndex;
}
struct TokenInfo {
uint256 ethSpent;
uint256 tokensBought;
uint256 tokenPriceAtBuy;
uint256 tokensSold;
uint256 ethReceived;
uint256 totalProfit;
uint256 totalLoss;
}
mapping(address => User) public users;
mapping(address => TokenInfo) public tokenInfo;
address[] public userList;
event Deposited(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event TokenBought(
address indexed user,
uint256 amountSpent,
address tokenAddress,
bool withTax,
bool isV3
);
event TokenSold(
address indexed user,
uint256 amountReceived,
address tokenAddress,
bool initialSell,
bool withTax,
bool isV3
);
event ProfitDistributed(uint256 totalProfit);
event EmergencyWithdrawal(address tokenAddress, uint256 amount);
modifier onlyParticipants() {
require(users[msg.sender].deposited > 0, "Not a participant");
_;
}
constructor(
address _uniswapV2Router,
address _uniswapV3Router,
address _weth,
address _profitWallet
) {
uniswapV2Router = IUniswapV2Router02(_uniswapV2Router);
uniswapV3Router = ISwapRouter(_uniswapV3Router);
WETH = _weth;
profitWallet = _profitWallet;
}
function deposit() external payable nonReentrant {
require(msg.value >= minDeposit, "Minimum deposit not met");
require(
totalParticipants < maxParticipants,
"Participant limit reached"
);
if (users[msg.sender].deposited == 0) {
users[msg.sender].depositIndex = userList.length;
userList.push(msg.sender);
totalParticipants++;
}
users[msg.sender].deposited += msg.value;
totalDeposited += msg.value;
emit Deposited(msg.sender, msg.value);
}
function withdraw(uint256 amount) external nonReentrant onlyParticipants {
User storage user = users[msg.sender];
require(user.deposited >= amount, "Insufficient balance");
uint256 totalLoss = calculateTotalLoss();
uint256 adjustedAmount = (address(this).balance *
(user.deposited - totalLoss)) / totalDeposited;
require(adjustedAmount >= amount, "Insufficient contract balance");
user.deposited -= amount;
totalDeposited -= amount;
if (user.deposited == 0) {
uint256 index = user.depositIndex;
address lastUser = userList[userList.length - 1];
userList[index] = lastUser;
users[lastUser].depositIndex = index;
userList.pop();
totalParticipants--;
}
payable(msg.sender).transfer(amount);
emit Withdrawn(msg.sender, amount);
}
function buyToken(
address tokenAddress,
uint256 percentage,
bool withTax,
bool isV3,
uint24 fee // For Uniswap v3
) external onlyOwner nonReentrant {
require(percentage > 0 && percentage <= 100, "Invalid percentage");
uint256 ethAmount = (address(this).balance * percentage) / 100;
require(ethAmount <= address(this).balance, "Insufficient ETH balance");
uint256 tokensBought = executeBuy(
tokenAddress,
ethAmount,
withTax,
isV3,
fee
);
uint256 tokenPrice = (ethAmount * 1e18) / tokensBought;
tokenInfo[tokenAddress].ethSpent += ethAmount;
tokenInfo[tokenAddress].tokensBought += tokensBought;
tokenInfo[tokenAddress].tokenPriceAtBuy = tokenPrice;
uint256 gasSpent = tx.gasprice * gasleft();
tokenInfo[tokenAddress].totalLoss += gasSpent;
// Deduct ETH spent proportionally from users' deposits
for (uint256 i = 0; i < userList.length; i++) {
address userAddress = userList[i];
User storage user = users[userAddress];
uint256 userShare = (ethAmount * user.deposited) / totalDeposited;
user.deposited -= userShare;
}
totalDeposited -= ethAmount;
emit TokenBought(msg.sender, ethAmount, tokenAddress, withTax, isV3);
}
function sellToken(
address tokenAddress,
uint256 percentage,
bool initialSell,
bool withTax,
bool isV3,
uint24 fee // For Uniswap v3
) external onlyOwner nonReentrant {
require(percentage > 0 && percentage <= 100, "Invalid percentage");
TokenInfo storage info = tokenInfo[tokenAddress];
uint256 tokenAmount;
uint256 ethReceived;
if (initialSell) {
uint256 ethAmount = info.ethSpent;
tokenAmount = (ethAmount * 1e18) / info.tokenPriceAtBuy;
} else {
tokenAmount = (info.tokensBought * percentage) / 100;
}
require(tokenAmount > 0, "Token amount must be greater than zero");
// Ensure allowance is set
uint256 currentAllowance = IERC20(tokenAddress).allowance(
address(this),
address(uniswapV2Router)
);
if (currentAllowance < tokenAmount) {
IERC20(tokenAddress).approve(address(uniswapV2Router), tokenAmount);
}
ethReceived = executeSell(
tokenAddress,
tokenAmount,
withTax,
isV3,
fee
);
info.tokensSold += tokenAmount;
info.ethReceived += ethReceived;
uint256 gasSpent = tx.gasprice * gasleft();
info.totalLoss += gasSpent;
if (initialSell) {
totalDeposited -= ethReceived;
pendingProfitWithdrawal += ethReceived;
} else {
uint256 profit = ethReceived > info.ethSpent
? ethReceived - info.ethSpent
: 0;
uint256 loss = info.ethSpent > ethReceived
? info.ethSpent - ethReceived
: 0;
info.totalProfit += profit;
info.totalLoss += loss;
totalProfits += profit;
distributeProfits(profit);
}
emit TokenSold(
msg.sender,
ethReceived,
tokenAddress,
initialSell,
withTax,
isV3
);
}
function executeBuy(
address tokenAddress,
uint256 ethAmount,
bool withTax,
bool isV3,
uint24 fee
) internal returns (uint256) {
uint256 tokensBought;
if (isV3) {
// Uniswap v3 buy
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter
.ExactInputSingleParams({
tokenIn: WETH,
tokenOut: tokenAddress,
fee: fee,
recipient: address(this),
deadline: block.timestamp,
amountIn: ethAmount,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
tokensBought = uniswapV3Router.exactInputSingle{value: ethAmount}(
params
);
} else {
// Uniswap v2 buy
address[] memory path = new address[](2);
path[0] = uniswapV2Router.WETH();
path[1] = tokenAddress;
if (withTax) {
uniswapV2Router
.swapExactETHForTokensSupportingFeeOnTransferTokens{
value: ethAmount
}(0, path, address(this), block.timestamp);
tokensBought = IERC20(tokenAddress).balanceOf(address(this));
} else {
uint256[] memory amounts = uniswapV2Router
.swapExactETHForTokens{value: ethAmount}(
0,
path,
address(this),
block.timestamp
);
tokensBought = amounts[1];
}
}
return tokensBought;
}
function executeSell(
address tokenAddress,
uint256 tokenAmount,
bool withTax,
bool isV3,
uint24 fee
) internal returns (uint256) {
uint256 ethReceived;
if (isV3) {
// Uniswap v3 sell
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter
.ExactInputSingleParams({
tokenIn: tokenAddress,
tokenOut: WETH,
fee: fee,
recipient: address(this),
deadline: block.timestamp,
amountIn: tokenAmount,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
ethReceived = uniswapV3Router.exactInputSingle(params);
} else {
// Uniswap v2 sell
address[] memory path = new address[](2);
path[0] = tokenAddress;
path[1] = uniswapV2Router.WETH();
if (withTax) {
uniswapV2Router
.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
ethReceived = address(this).balance;
} else {
uint256[] memory amounts = uniswapV2Router
.swapExactTokensForETH(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
ethReceived = amounts[1];
}
}
return ethReceived;
}
function distributeProfits(uint256 profit) internal {
uint256 profitForDistribution = (profit * 50) / 100;
uint256 profitForContract = (profit * 10) / 100;
uint256 profitForWallet = profit -
profitForDistribution -
profitForContract;
pendingProfitWithdrawal += profitForWallet;
for (uint256 i = 0; i < userList.length; i++) {
address userAddress = userList[i];
User storage user = users[userAddress];
uint256 userShare = (profitForDistribution * user.deposited) /
totalDeposited;
user.claimableProfits += userShare;
}
totalDeposited += profitForContract;
emit ProfitDistributed(profit);
}
function claimProfits() external nonReentrant onlyParticipants {
User storage user = users[msg.sender];
uint256 claimable = user.claimableProfits;
require(claimable > 0, "No profits to claim");
user.claimableProfits = 0;
payable(msg.sender).transfer(claimable);
emit Withdrawn(msg.sender, claimable);
}
function getTokenInfo(
address tokenAddress
) external view returns (TokenInfo memory) {
return tokenInfo[tokenAddress];
}
function getMaxParticipants() external view returns (uint256) {
return maxParticipants;
}
function getRemainingParticipants() external view returns (uint256) {
return maxParticipants - totalParticipants;
}
function setMaxParticipants(uint256 _maxParticipants) external onlyOwner {
maxParticipants = _maxParticipants;
}
function setMinDeposit(uint256 _minDeposit) external onlyOwner {
minDeposit = _minDeposit;
}
function checkWithdrawableAmount()
external
view
onlyParticipants
returns (uint256)
{
User storage user = users[msg.sender];
uint256 totalLoss = calculateTotalLoss();
uint256 withdrawable = user.deposited -
(totalLoss * user.deposited) /
totalDeposited;
return withdrawable;
}
function withdrawExcessETH(
uint256 percentage
) external onlyOwner nonReentrant {
require(percentage > 0 && percentage <= 100, "Invalid percentage");
uint256 totalDepositorBalance = address(this).balance - totalDeposited;
uint256 withdrawAmount = (totalDepositorBalance * percentage) / 100;
require(withdrawAmount > 0, "No excess ETH to withdraw");
payable(owner()).transfer(withdrawAmount);
}
function emergencyWithdrawToken(address tokenAddress) external onlyOwner {
uint256 tokenBalance = IERC20(tokenAddress).balanceOf(address(this));
require(tokenBalance > 0, "No tokens to withdraw");
IERC20(tokenAddress).transfer(owner(), tokenBalance);
emit EmergencyWithdrawal(tokenAddress, tokenBalance);
}
function withdrawAllETH() external onlyOwner nonReentrant {
uint256 balance = address(this).balance;
require(balance > 0, "No ETH to withdraw");
payable(owner()).transfer(balance);
}
function withdrawPendingProfits() external onlyOwner nonReentrant {
require(pendingProfitWithdrawal > 0, "No pending profits to withdraw");
uint256 amountToWithdraw = pendingProfitWithdrawal;
pendingProfitWithdrawal = 0;
payable(profitWallet).transfer(amountToWithdraw);
}
function calculateTotalLoss() internal view returns (uint256) {
uint256 totalLoss = 0;
for (uint256 i = 0; i < userList.length; i++) {
address userAddress = userList[i];
totalLoss +=
users[userAddress].deposited *
tokenInfo[userAddress].totalLoss;
}
return totalLoss;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../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.
*
* By default, the owner account will be the one that deploys the contract. 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;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @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 {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @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 {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_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 v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @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 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;
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
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @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;
}
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
/// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
/// @dev In the implementation you must pay the pool tokens owed for the swap.
/// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
/// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
/// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
/// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
/// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
function uniswapV3SwapCallback(
int256 amount0Delta,
int256 amount1Delta,
bytes calldata data
) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;
import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol';
/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"},{"internalType":"address","name":"_uniswapV3Router","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_profitWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawal","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":"totalProfit","type":"uint256"}],"name":"ProfitDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSpent","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"withTax","type":"bool"},{"indexed":false,"internalType":"bool","name":"isV3","type":"bool"}],"name":"TokenBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"initialSell","type":"bool"},{"indexed":false,"internalType":"bool","name":"withTax","type":"bool"},{"indexed":false,"internalType":"bool","name":"isV3","type":"bool"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"bool","name":"withTax","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkWithdrawableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimProfits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"emergencyWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMaxParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenInfo","outputs":[{"components":[{"internalType":"uint256","name":"ethSpent","type":"uint256"},{"internalType":"uint256","name":"tokensBought","type":"uint256"},{"internalType":"uint256","name":"tokenPriceAtBuy","type":"uint256"},{"internalType":"uint256","name":"tokensSold","type":"uint256"},{"internalType":"uint256","name":"ethReceived","type":"uint256"},{"internalType":"uint256","name":"totalProfit","type":"uint256"},{"internalType":"uint256","name":"totalLoss","type":"uint256"}],"internalType":"struct CashVerseTreasury.TokenInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingProfitWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"bool","name":"initialSell","type":"bool"},{"internalType":"bool","name":"withTax","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"sellToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxParticipants","type":"uint256"}],"name":"setMaxParticipants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minDeposit","type":"uint256"}],"name":"setMinDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenInfo","outputs":[{"internalType":"uint256","name":"ethSpent","type":"uint256"},{"internalType":"uint256","name":"tokensBought","type":"uint256"},{"internalType":"uint256","name":"tokenPriceAtBuy","type":"uint256"},{"internalType":"uint256","name":"tokensSold","type":"uint256"},{"internalType":"uint256","name":"ethReceived","type":"uint256"},{"internalType":"uint256","name":"totalProfit","type":"uint256"},{"internalType":"uint256","name":"totalLoss","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalProfits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV3Router","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"claimableProfits","type":"uint256"},{"internalType":"uint256","name":"depositIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"withdrawExcessETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPendingProfits","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052666a94d74f4300006009556019600a553480156200002157600080fd5b50604051620044d1380380620044d18339818101604052810190620000479190620002b2565b620000676200005b6200017c60201b60201c565b6200018460201b60201c565b6001808190555083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000324565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200027a826200024d565b9050919050565b6200028c816200026d565b81146200029857600080fd5b50565b600081519050620002ac8162000281565b92915050565b60008060008060808587031215620002cf57620002ce62000248565b5b6000620002df878288016200029b565b9450506020620002f2878288016200029b565b935050604062000305878288016200029b565b925050606062000318878288016200029b565b91505092959194509250565b61419d80620003346000396000f3fe6080604052600436106101d85760003560e01c80638fcc9cfb11610102578063ad5c464811610095578063e1637e7711610064578063e1637e771461061f578063f2fde38b1461064a578063f5dab71114610673578063ff50abdc146106b6576101d8565b8063ad5c464814610594578063b9216247146105bf578063bd998cb3146105ea578063d0e30db014610615576101d8565b80639df51b89116100d15780639df51b89146104d65780639f4216e8146104ed578063a26dbf261461052a578063a87430ba14610555576101d8565b80638fcc9cfb1461045457806390386bbf1461047d57806390ea1557146104945780639a12c6ec146104ab576101d8565b80632bf7299b1161017a57806342e29d321161014957806342e29d32146103be5780636a02209c146103e7578063715018a6146104125780638da5cb5b14610429576101d8565b80632bf7299b146103165780632c76d7a61461033f5780632e1a7d4d1461036a57806341b3d18514610393576101d8565b80631b70e79c116101b65780631b70e79c1461025a5780631f69565f146102835780632301d775146102c057806324924bf7146102eb576101d8565b806313a9d2ba146101dd5780631694505e146102065780631af0320314610231575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612e62565b6106e1565b005b34801561021257600080fd5b5061021b610a9f565b6040516102289190612f3c565b60405180910390f35b34801561023d57600080fd5b5061025860048036038101906102539190612f57565b610ac5565b005b34801561026657600080fd5b50610281600480360381019061027c9190612f84565b610c51565b005b34801561028f57600080fd5b506102aa60048036038101906102a59190612f57565b610d7d565b6040516102b7919061304e565b60405180910390f35b3480156102cc57600080fd5b506102d5610e1c565b6040516102e29190613078565b60405180910390f35b3480156102f757600080fd5b50610300610e42565b60405161030d91906130a2565b60405180910390f35b34801561032257600080fd5b5061033d60048036038101906103389190612f84565b610e48565b005b34801561034b57600080fd5b50610354610e5a565b60405161036191906130de565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190612f84565b610e80565b005b34801561039f57600080fd5b506103a8611258565b6040516103b591906130a2565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e091906130f9565b61125e565b005b3480156103f357600080fd5b506103fc6116ad565b60405161040991906130a2565b60405180910390f35b34801561041e57600080fd5b506104276116b7565b005b34801561043557600080fd5b5061043e6116cb565b60405161044b9190613078565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190612f84565b6116f4565b005b34801561048957600080fd5b50610492611706565b005b3480156104a057600080fd5b506104a96117b7565b005b3480156104b757600080fd5b506104c061188f565b6040516104cd91906130a2565b60405180910390f35b3480156104e257600080fd5b506104eb6118a6565b005b3480156104f957600080fd5b50610514600480360381019061050f9190612f84565b611a6d565b6040516105219190613078565b60405180910390f35b34801561053657600080fd5b5061053f611aac565b60405161054c91906130a2565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190612f57565b611ab2565b60405161058b93929190613186565b60405180910390f35b3480156105a057600080fd5b506105a9611adc565b6040516105b69190613078565b60405180910390f35b3480156105cb57600080fd5b506105d4611b02565b6040516105e191906130a2565b60405180910390f35b3480156105f657600080fd5b506105ff611b08565b60405161060c91906130a2565b60405180910390f35b61061d611b0e565b005b34801561062b57600080fd5b50610634611d7d565b60405161064191906130a2565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612f57565b611e8b565b005b34801561067f57600080fd5b5061069a60048036038101906106959190612f57565b611f0e565b6040516106ad97969594939291906131bd565b60405180910390f35b3480156106c257600080fd5b506106cb611f50565b6040516106d891906130a2565b60405180910390f35b6106e9611f56565b6106f1611fd4565b600084118015610702575060648411155b610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073890613289565b60405180910390fd5b60006064854761075191906132d8565b61075b9190613361565b9050478111156107a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610797906133de565b60405180910390fd5b60006107af8783878787612023565b9050600081670de0b6b3a7640000846107c891906132d8565b6107d29190613361565b905082600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461082691906133fe565b9250508190555081600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082825461087f91906133fe565b9250508190555080600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555060005a3a6108db91906132d8565b905080600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601600082825461092f91906133fe565b9250508190555060005b600e80549050811015610a1e576000600e828154811061095c5761095b613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006006548260000154896109e191906132d8565b6109eb9190613361565b905080826000016000828254610a019190613483565b925050819055505050508080610a16906134b7565b915050610939565b508360066000828254610a319190613483565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fb2a4dec379f9aee4c050c269e9e2c8b04d5906da2d8b51aeb1f695fde65eca79858b8a8a604051610a84949392919061350e565b60405180910390a250505050610a98612508565b5050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610acd611f56565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b089190613078565b602060405180830381865afa158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190613568565b905060008111610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906135e1565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610bb26116cb565b836040518363ffffffff1660e01b8152600401610bd0929190613601565b6020604051808303816000875af1158015610bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c13919061363f565b507f23d6711a1d031134a36921253c75aa59e967d38e369ac625992824315e204f208282604051610c45929190613601565b60405180910390a15050565b610c59611f56565b610c61611fd4565b600081118015610c72575060648111155b610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890613289565b60405180910390fd5b600060065447610cc19190613483565b9050600060648383610cd391906132d8565b610cdd9190613361565b905060008111610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d19906136b8565b60405180910390fd5b610d2a6116cb565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d6f573d6000803e3d6000fd5b505050610d7a612508565b50565b610d85612d0a565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b610e50611f56565b80600a8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e88611fd4565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613724565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001541015610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e90613790565b60405180910390fd5b6000610fa1612511565b90506000600654828460000154610fb89190613483565b47610fc391906132d8565b610fcd9190613361565b905083811015611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906137fc565b60405180910390fd5b838360000160008282546110269190613483565b92505081905550836006600082825461103f9190613483565b9250508190555060008360000154036111b5576000836002015490506000600e6001600e805490506110719190613483565b8154811061108257611081613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600e83815481106110c4576110c3613454565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600e8054806111655761116461381c565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600860008154809291906111ad9061384b565b919050555050505b3373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f193505050501580156111fb573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161124291906130a2565b60405180910390a2505050611255612508565b50565b60095481565b611266611f56565b61126e611fd4565b60008511801561127f575060648511155b6112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590613289565b60405180910390fd5b6000600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080861561133e576000836000015490508360020154670de0b6b3a76400008261132c91906132d8565b6113369190613361565b92505061135d565b606488846001015461135091906132d8565b61135a9190613361565b91505b600082116113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906138e6565b60405180910390fd5b60008973ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016113ff929190613906565b602060405180830381865afa15801561141c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114409190613568565b9050828110156114ec578973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016114a7929190613601565b6020604051808303816000875af11580156114c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ea919061363f565b505b6114f98a84898989612624565b91508284600301600082825461150f91906133fe565b925050819055508184600401600082825461152a91906133fe565b9250508190555060005a3a61153f91906132d8565b90508085600601600082825461155591906133fe565b9250508190555088156115995782600660008282546115749190613483565b9250508190555082600b600082825461158d91906133fe565b92505081905550611642565b6000856000015484116115ad5760006115be565b8560000154846115bd9190613483565b5b90506000848760000154116115d45760006115e5565b8487600001546115e49190613483565b5b9050818760050160008282546115fb91906133fe565b925050819055508087600601600082825461161691906133fe565b92505081905550816007600082825461162f91906133fe565b9250508190555061163f82612a91565b50505b3373ffffffffffffffffffffffffffffffffffffffff167f5263062975d922fe4bfa70ea59a9890d992250eb653977de833455cf41f40577848d8c8c8c60405161169095949392919061392f565b60405180910390a250505050506116a5612508565b505050505050565b6000600a54905090565b6116bf611f56565b6116c96000612c3e565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116fc611f56565b8060098190555050565b61170e611f56565b611716611fd4565b60004790506000811161175e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611755906139ce565b60405180910390fd5b6117666116cb565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117ab573d6000803e3d6000fd5b50506117b5612508565b565b6117bf611f56565b6117c7611fd4565b6000600b541161180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613a3a565b60405180910390fd5b6000600b5490506000600b81905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611883573d6000803e3d6000fd5b505061188d612508565b565b6000600854600a546118a19190613483565b905090565b6118ae611fd4565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90613724565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600101549050600081116119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990613aa6565b60405180910390fd5b600082600101819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611a12573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051611a5991906130a2565b60405180910390a25050611a6b612508565b565b600e8181548110611a7d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600c6020528060005260406000206000915090508060000154908060010154908060020154905083565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60075481565b611b16611fd4565b600954341015611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613b12565b60405180910390fd5b600a5460085410611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613b7e565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611cb357600e80549050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600e339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060086000815480929190611cad906134b7565b91905055505b34600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611d0591906133fe565b925050819055503460066000828254611d1e91906133fe565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c434604051611d6b91906130a2565b60405180910390a2611d7b612508565b565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa90613724565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000611e50612511565b90506000600654836000015483611e6791906132d8565b611e719190613361565b8360000154611e809190613483565b905080935050505090565b611e93611f56565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef990613c10565b60405180910390fd5b611f0b81612c3e565b50565b600d6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60065481565b611f5e612d02565b73ffffffffffffffffffffffffffffffffffffffff16611f7c6116cb565b73ffffffffffffffffffffffffffffffffffffffff1614611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc990613c7c565b60405180910390fd5b565b600260015403612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201090613ce8565b60405180910390fd5b6002600181905550565b6000808315612192576000604051806101000160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018562ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200142815260200188815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf38988836040518363ffffffff1660e01b81526004016121479190613dd7565b60206040518083038185885af1158015612165573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061218a9190613568565b9150506124fb565b6000600267ffffffffffffffff8111156121af576121ae613df3565b5b6040519080825280602002602001820160405280156121dd5781602001602082028036833780820191505090505b509050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122719190613e37565b8160008151811061228557612284613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816001815181106122d4576122d3613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050851561242a57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958860008430426040518663ffffffff1660e01b81526004016123779493929190613f4e565b6000604051808303818588803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b50505050508773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123e29190613078565b602060405180830381865afa1580156123ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124239190613568565b91506124f9565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab58960008530426040518663ffffffff1660e01b815260040161248f9493929190613f4e565b60006040518083038185885af11580156124ad573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906124d791906140c4565b9050806001815181106124ed576124ec613454565b5b60200260200101519250505b505b8091505095945050505050565b60018081905550565b6000806000905060005b600e8054905081101561261c576000600e828154811061253e5761253d613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060154600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546125fb91906132d8565b8361260691906133fe565b9250508080612614906134b7565b91505061251b565b508091505090565b60008083156127925760006040518061010001604052808973ffffffffffffffffffffffffffffffffffffffff168152602001600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018562ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200142815260200188815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b81526004016127479190613dd7565b6020604051808303816000875af1158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a9190613568565b915050612a84565b6000600267ffffffffffffffff8111156127af576127ae613df3565b5b6040519080825280602002602001820160405280156127dd5781602001602082028036833780820191505090505b50905087816000815181106127f5576127f4613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561289c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c09190613e37565b816001815181106128d4576128d3613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085156129b257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478860008430426040518663ffffffff1660e01b815260040161297895949392919061410d565b600060405180830381600087803b15801561299257600080fd5b505af11580156129a6573d6000803e3d6000fd5b50505050479150612a82565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58960008530426040518663ffffffff1660e01b8152600401612a1895949392919061410d565b6000604051808303816000875af1158015612a37573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612a6091906140c4565b905080600181518110612a7657612a75613454565b5b60200260200101519250505b505b8091505095945050505050565b60006064603283612aa291906132d8565b612aac9190613361565b905060006064600a84612abf91906132d8565b612ac99190613361565b90506000818385612ada9190613483565b612ae49190613483565b905080600b6000828254612af891906133fe565b9250508190555060005b600e80549050811015612be7576000600e8281548110612b2557612b24613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600654826000015488612baa91906132d8565b612bb49190613361565b905080826001016000828254612bca91906133fe565b925050819055505050508080612bdf906134b7565b915050612b02565b508160066000828254612bfa91906133fe565b925050819055507f939df96a3b47dbfb83da233006cef1eb233fc5cba50ea94fecdebea4d99423e684604051612c3091906130a2565b60405180910390a150505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d8682612d5b565b9050919050565b612d9681612d7b565b8114612da157600080fd5b50565b600081359050612db381612d8d565b92915050565b6000819050919050565b612dcc81612db9565b8114612dd757600080fd5b50565b600081359050612de981612dc3565b92915050565b60008115159050919050565b612e0481612def565b8114612e0f57600080fd5b50565b600081359050612e2181612dfb565b92915050565b600062ffffff82169050919050565b612e3f81612e27565b8114612e4a57600080fd5b50565b600081359050612e5c81612e36565b92915050565b600080600080600060a08688031215612e7e57612e7d612d51565b5b6000612e8c88828901612da4565b9550506020612e9d88828901612dda565b9450506040612eae88828901612e12565b9350506060612ebf88828901612e12565b9250506080612ed088828901612e4d565b9150509295509295909350565b6000819050919050565b6000612f02612efd612ef884612d5b565b612edd565b612d5b565b9050919050565b6000612f1482612ee7565b9050919050565b6000612f2682612f09565b9050919050565b612f3681612f1b565b82525050565b6000602082019050612f516000830184612f2d565b92915050565b600060208284031215612f6d57612f6c612d51565b5b6000612f7b84828501612da4565b91505092915050565b600060208284031215612f9a57612f99612d51565b5b6000612fa884828501612dda565b91505092915050565b612fba81612db9565b82525050565b60e082016000820151612fd66000850182612fb1565b506020820151612fe96020850182612fb1565b506040820151612ffc6040850182612fb1565b50606082015161300f6060850182612fb1565b5060808201516130226080850182612fb1565b5060a082015161303560a0850182612fb1565b5060c082015161304860c0850182612fb1565b50505050565b600060e0820190506130636000830184612fc0565b92915050565b61307281612d7b565b82525050565b600060208201905061308d6000830184613069565b92915050565b61309c81612db9565b82525050565b60006020820190506130b76000830184613093565b92915050565b60006130c882612f09565b9050919050565b6130d8816130bd565b82525050565b60006020820190506130f360008301846130cf565b92915050565b60008060008060008060c0878903121561311657613115612d51565b5b600061312489828a01612da4565b965050602061313589828a01612dda565b955050604061314689828a01612e12565b945050606061315789828a01612e12565b935050608061316889828a01612e12565b92505060a061317989828a01612e4d565b9150509295509295509295565b600060608201905061319b6000830186613093565b6131a86020830185613093565b6131b56040830184613093565b949350505050565b600060e0820190506131d2600083018a613093565b6131df6020830189613093565b6131ec6040830188613093565b6131f96060830187613093565b6132066080830186613093565b61321360a0830185613093565b61322060c0830184613093565b98975050505050505050565b600082825260208201905092915050565b7f496e76616c69642070657263656e746167650000000000000000000000000000600082015250565b600061327360128361322c565b915061327e8261323d565b602082019050919050565b600060208201905081810360008301526132a281613266565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132e382612db9565b91506132ee83612db9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613327576133266132a9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061336c82612db9565b915061337783612db9565b92508261338757613386613332565b5b828204905092915050565b7f496e73756666696369656e74204554482062616c616e63650000000000000000600082015250565b60006133c860188361322c565b91506133d382613392565b602082019050919050565b600060208201905081810360008301526133f7816133bb565b9050919050565b600061340982612db9565b915061341483612db9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613449576134486132a9565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061348e82612db9565b915061349983612db9565b9250828210156134ac576134ab6132a9565b5b828203905092915050565b60006134c282612db9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134f4576134f36132a9565b5b600182019050919050565b61350881612def565b82525050565b60006080820190506135236000830187613093565b6135306020830186613069565b61353d60408301856134ff565b61354a60608301846134ff565b95945050505050565b60008151905061356281612dc3565b92915050565b60006020828403121561357e5761357d612d51565b5b600061358c84828501613553565b91505092915050565b7f4e6f20746f6b656e7320746f2077697468647261770000000000000000000000600082015250565b60006135cb60158361322c565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b60006040820190506136166000830185613069565b6136236020830184613093565b9392505050565b60008151905061363981612dfb565b92915050565b60006020828403121561365557613654612d51565b5b60006136638482850161362a565b91505092915050565b7f4e6f206578636573732045544820746f20776974686472617700000000000000600082015250565b60006136a260198361322c565b91506136ad8261366c565b602082019050919050565b600060208201905081810360008301526136d181613695565b9050919050565b7f4e6f742061207061727469636970616e74000000000000000000000000000000600082015250565b600061370e60118361322c565b9150613719826136d8565b602082019050919050565b6000602082019050818103600083015261373d81613701565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b600061377a60148361322c565b915061378582613744565b602082019050919050565b600060208201905081810360008301526137a98161376d565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e6365000000600082015250565b60006137e6601d8361322c565b91506137f1826137b0565b602082019050919050565b60006020820190508181036000830152613815816137d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600061385682612db9565b915060008203613869576138686132a9565b5b600182039050919050565b7f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160008201527f6e207a65726f0000000000000000000000000000000000000000000000000000602082015250565b60006138d060268361322c565b91506138db82613874565b604082019050919050565b600060208201905081810360008301526138ff816138c3565b9050919050565b600060408201905061391b6000830185613069565b6139286020830184613069565b9392505050565b600060a0820190506139446000830188613093565b6139516020830187613069565b61395e60408301866134ff565b61396b60608301856134ff565b61397860808301846134ff565b9695505050505050565b7f4e6f2045544820746f2077697468647261770000000000000000000000000000600082015250565b60006139b860128361322c565b91506139c382613982565b602082019050919050565b600060208201905081810360008301526139e7816139ab565b9050919050565b7f4e6f2070656e64696e672070726f6669747320746f2077697468647261770000600082015250565b6000613a24601e8361322c565b9150613a2f826139ee565b602082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b7f4e6f2070726f6669747320746f20636c61696d00000000000000000000000000600082015250565b6000613a9060138361322c565b9150613a9b82613a5a565b602082019050919050565b60006020820190508181036000830152613abf81613a83565b9050919050565b7f4d696e696d756d206465706f736974206e6f74206d6574000000000000000000600082015250565b6000613afc60178361322c565b9150613b0782613ac6565b602082019050919050565b60006020820190508181036000830152613b2b81613aef565b9050919050565b7f5061727469636970616e74206c696d6974207265616368656400000000000000600082015250565b6000613b6860198361322c565b9150613b7382613b32565b602082019050919050565b60006020820190508181036000830152613b9781613b5b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bfa60268361322c565b9150613c0582613b9e565b604082019050919050565b60006020820190508181036000830152613c2981613bed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c6660208361322c565b9150613c7182613c30565b602082019050919050565b60006020820190508181036000830152613c9581613c59565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cd2601f8361322c565b9150613cdd82613c9c565b602082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b613d1181612d7b565b82525050565b613d2081612e27565b82525050565b613d2f81612d5b565b82525050565b61010082016000820151613d4c6000850182613d08565b506020820151613d5f6020850182613d08565b506040820151613d726040850182613d17565b506060820151613d856060850182613d08565b506080820151613d986080850182612fb1565b5060a0820151613dab60a0850182612fb1565b5060c0820151613dbe60c0850182612fb1565b5060e0820151613dd160e0850182613d26565b50505050565b600061010082019050613ded6000830184613d35565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050613e3181612d8d565b92915050565b600060208284031215613e4d57613e4c612d51565b5b6000613e5b84828501613e22565b91505092915050565b6000819050919050565b6000613e89613e84613e7f84613e64565b612edd565b612db9565b9050919050565b613e9981613e6e565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613ed78383613d08565b60208301905092915050565b6000602082019050919050565b6000613efb82613e9f565b613f058185613eaa565b9350613f1083613ebb565b8060005b83811015613f41578151613f288882613ecb565b9750613f3383613ee3565b925050600181019050613f14565b5085935050505092915050565b6000608082019050613f636000830187613e90565b8181036020830152613f758186613ef0565b9050613f846040830185613069565b613f916060830184613093565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b613fb982613f9f565b810181811067ffffffffffffffff82111715613fd857613fd7613df3565b5b80604052505050565b6000613feb612d47565b9050613ff78282613fb0565b919050565b600067ffffffffffffffff82111561401757614016613df3565b5b602082029050602081019050919050565b600080fd5b600061404061403b84613ffc565b613fe1565b9050808382526020820190506020840283018581111561406357614062614028565b5b835b8181101561408c57806140788882613553565b845260208401935050602081019050614065565b5050509392505050565b600082601f8301126140ab576140aa613f9a565b5b81516140bb84826020860161402d565b91505092915050565b6000602082840312156140da576140d9612d51565b5b600082015167ffffffffffffffff8111156140f8576140f7612d56565b5b61410484828501614096565b91505092915050565b600060a0820190506141226000830188613093565b61412f6020830187613e90565b81810360408301526141418186613ef0565b90506141506060830185613069565b61415d6080830184613093565b969550505050505056fea264697066735822122078434a4e9d8f622d137a6536db6360541f1816264c8db45c372743d2b48880e464736f6c634300080d00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006f84e53b9c3749d5cb34cb0036f600ff0f9753a0
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80638fcc9cfb11610102578063ad5c464811610095578063e1637e7711610064578063e1637e771461061f578063f2fde38b1461064a578063f5dab71114610673578063ff50abdc146106b6576101d8565b8063ad5c464814610594578063b9216247146105bf578063bd998cb3146105ea578063d0e30db014610615576101d8565b80639df51b89116100d15780639df51b89146104d65780639f4216e8146104ed578063a26dbf261461052a578063a87430ba14610555576101d8565b80638fcc9cfb1461045457806390386bbf1461047d57806390ea1557146104945780639a12c6ec146104ab576101d8565b80632bf7299b1161017a57806342e29d321161014957806342e29d32146103be5780636a02209c146103e7578063715018a6146104125780638da5cb5b14610429576101d8565b80632bf7299b146103165780632c76d7a61461033f5780632e1a7d4d1461036a57806341b3d18514610393576101d8565b80631b70e79c116101b65780631b70e79c1461025a5780631f69565f146102835780632301d775146102c057806324924bf7146102eb576101d8565b806313a9d2ba146101dd5780631694505e146102065780631af0320314610231575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612e62565b6106e1565b005b34801561021257600080fd5b5061021b610a9f565b6040516102289190612f3c565b60405180910390f35b34801561023d57600080fd5b5061025860048036038101906102539190612f57565b610ac5565b005b34801561026657600080fd5b50610281600480360381019061027c9190612f84565b610c51565b005b34801561028f57600080fd5b506102aa60048036038101906102a59190612f57565b610d7d565b6040516102b7919061304e565b60405180910390f35b3480156102cc57600080fd5b506102d5610e1c565b6040516102e29190613078565b60405180910390f35b3480156102f757600080fd5b50610300610e42565b60405161030d91906130a2565b60405180910390f35b34801561032257600080fd5b5061033d60048036038101906103389190612f84565b610e48565b005b34801561034b57600080fd5b50610354610e5a565b60405161036191906130de565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190612f84565b610e80565b005b34801561039f57600080fd5b506103a8611258565b6040516103b591906130a2565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e091906130f9565b61125e565b005b3480156103f357600080fd5b506103fc6116ad565b60405161040991906130a2565b60405180910390f35b34801561041e57600080fd5b506104276116b7565b005b34801561043557600080fd5b5061043e6116cb565b60405161044b9190613078565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190612f84565b6116f4565b005b34801561048957600080fd5b50610492611706565b005b3480156104a057600080fd5b506104a96117b7565b005b3480156104b757600080fd5b506104c061188f565b6040516104cd91906130a2565b60405180910390f35b3480156104e257600080fd5b506104eb6118a6565b005b3480156104f957600080fd5b50610514600480360381019061050f9190612f84565b611a6d565b6040516105219190613078565b60405180910390f35b34801561053657600080fd5b5061053f611aac565b60405161054c91906130a2565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190612f57565b611ab2565b60405161058b93929190613186565b60405180910390f35b3480156105a057600080fd5b506105a9611adc565b6040516105b69190613078565b60405180910390f35b3480156105cb57600080fd5b506105d4611b02565b6040516105e191906130a2565b60405180910390f35b3480156105f657600080fd5b506105ff611b08565b60405161060c91906130a2565b60405180910390f35b61061d611b0e565b005b34801561062b57600080fd5b50610634611d7d565b60405161064191906130a2565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612f57565b611e8b565b005b34801561067f57600080fd5b5061069a60048036038101906106959190612f57565b611f0e565b6040516106ad97969594939291906131bd565b60405180910390f35b3480156106c257600080fd5b506106cb611f50565b6040516106d891906130a2565b60405180910390f35b6106e9611f56565b6106f1611fd4565b600084118015610702575060648411155b610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073890613289565b60405180910390fd5b60006064854761075191906132d8565b61075b9190613361565b9050478111156107a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610797906133de565b60405180910390fd5b60006107af8783878787612023565b9050600081670de0b6b3a7640000846107c891906132d8565b6107d29190613361565b905082600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461082691906133fe565b9250508190555081600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082825461087f91906133fe565b9250508190555080600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555060005a3a6108db91906132d8565b905080600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601600082825461092f91906133fe565b9250508190555060005b600e80549050811015610a1e576000600e828154811061095c5761095b613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006006548260000154896109e191906132d8565b6109eb9190613361565b905080826000016000828254610a019190613483565b925050819055505050508080610a16906134b7565b915050610939565b508360066000828254610a319190613483565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fb2a4dec379f9aee4c050c269e9e2c8b04d5906da2d8b51aeb1f695fde65eca79858b8a8a604051610a84949392919061350e565b60405180910390a250505050610a98612508565b5050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610acd611f56565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b089190613078565b602060405180830381865afa158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190613568565b905060008111610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906135e1565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610bb26116cb565b836040518363ffffffff1660e01b8152600401610bd0929190613601565b6020604051808303816000875af1158015610bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c13919061363f565b507f23d6711a1d031134a36921253c75aa59e967d38e369ac625992824315e204f208282604051610c45929190613601565b60405180910390a15050565b610c59611f56565b610c61611fd4565b600081118015610c72575060648111155b610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890613289565b60405180910390fd5b600060065447610cc19190613483565b9050600060648383610cd391906132d8565b610cdd9190613361565b905060008111610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d19906136b8565b60405180910390fd5b610d2a6116cb565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d6f573d6000803e3d6000fd5b505050610d7a612508565b50565b610d85612d0a565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b610e50611f56565b80600a8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e88611fd4565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613724565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001541015610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e90613790565b60405180910390fd5b6000610fa1612511565b90506000600654828460000154610fb89190613483565b47610fc391906132d8565b610fcd9190613361565b905083811015611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906137fc565b60405180910390fd5b838360000160008282546110269190613483565b92505081905550836006600082825461103f9190613483565b9250508190555060008360000154036111b5576000836002015490506000600e6001600e805490506110719190613483565b8154811061108257611081613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600e83815481106110c4576110c3613454565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600e8054806111655761116461381c565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600860008154809291906111ad9061384b565b919050555050505b3373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f193505050501580156111fb573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161124291906130a2565b60405180910390a2505050611255612508565b50565b60095481565b611266611f56565b61126e611fd4565b60008511801561127f575060648511155b6112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590613289565b60405180910390fd5b6000600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080861561133e576000836000015490508360020154670de0b6b3a76400008261132c91906132d8565b6113369190613361565b92505061135d565b606488846001015461135091906132d8565b61135a9190613361565b91505b600082116113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906138e6565b60405180910390fd5b60008973ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016113ff929190613906565b602060405180830381865afa15801561141c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114409190613568565b9050828110156114ec578973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016114a7929190613601565b6020604051808303816000875af11580156114c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ea919061363f565b505b6114f98a84898989612624565b91508284600301600082825461150f91906133fe565b925050819055508184600401600082825461152a91906133fe565b9250508190555060005a3a61153f91906132d8565b90508085600601600082825461155591906133fe565b9250508190555088156115995782600660008282546115749190613483565b9250508190555082600b600082825461158d91906133fe565b92505081905550611642565b6000856000015484116115ad5760006115be565b8560000154846115bd9190613483565b5b90506000848760000154116115d45760006115e5565b8487600001546115e49190613483565b5b9050818760050160008282546115fb91906133fe565b925050819055508087600601600082825461161691906133fe565b92505081905550816007600082825461162f91906133fe565b9250508190555061163f82612a91565b50505b3373ffffffffffffffffffffffffffffffffffffffff167f5263062975d922fe4bfa70ea59a9890d992250eb653977de833455cf41f40577848d8c8c8c60405161169095949392919061392f565b60405180910390a250505050506116a5612508565b505050505050565b6000600a54905090565b6116bf611f56565b6116c96000612c3e565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116fc611f56565b8060098190555050565b61170e611f56565b611716611fd4565b60004790506000811161175e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611755906139ce565b60405180910390fd5b6117666116cb565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117ab573d6000803e3d6000fd5b50506117b5612508565b565b6117bf611f56565b6117c7611fd4565b6000600b541161180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613a3a565b60405180910390fd5b6000600b5490506000600b81905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611883573d6000803e3d6000fd5b505061188d612508565b565b6000600854600a546118a19190613483565b905090565b6118ae611fd4565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90613724565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600101549050600081116119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990613aa6565b60405180910390fd5b600082600101819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611a12573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051611a5991906130a2565b60405180910390a25050611a6b612508565b565b600e8181548110611a7d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600c6020528060005260406000206000915090508060000154908060010154908060020154905083565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60075481565b611b16611fd4565b600954341015611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613b12565b60405180910390fd5b600a5460085410611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613b7e565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611cb357600e80549050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600e339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060086000815480929190611cad906134b7565b91905055505b34600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611d0591906133fe565b925050819055503460066000828254611d1e91906133fe565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c434604051611d6b91906130a2565b60405180910390a2611d7b612508565b565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa90613724565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000611e50612511565b90506000600654836000015483611e6791906132d8565b611e719190613361565b8360000154611e809190613483565b905080935050505090565b611e93611f56565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef990613c10565b60405180910390fd5b611f0b81612c3e565b50565b600d6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60065481565b611f5e612d02565b73ffffffffffffffffffffffffffffffffffffffff16611f7c6116cb565b73ffffffffffffffffffffffffffffffffffffffff1614611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc990613c7c565b60405180910390fd5b565b600260015403612019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201090613ce8565b60405180910390fd5b6002600181905550565b6000808315612192576000604051806101000160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018562ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200142815260200188815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf38988836040518363ffffffff1660e01b81526004016121479190613dd7565b60206040518083038185885af1158015612165573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061218a9190613568565b9150506124fb565b6000600267ffffffffffffffff8111156121af576121ae613df3565b5b6040519080825280602002602001820160405280156121dd5781602001602082028036833780820191505090505b509050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122719190613e37565b8160008151811061228557612284613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087816001815181106122d4576122d3613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050851561242a57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958860008430426040518663ffffffff1660e01b81526004016123779493929190613f4e565b6000604051808303818588803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b50505050508773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123e29190613078565b602060405180830381865afa1580156123ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124239190613568565b91506124f9565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab58960008530426040518663ffffffff1660e01b815260040161248f9493929190613f4e565b60006040518083038185885af11580156124ad573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906124d791906140c4565b9050806001815181106124ed576124ec613454565b5b60200260200101519250505b505b8091505095945050505050565b60018081905550565b6000806000905060005b600e8054905081101561261c576000600e828154811061253e5761253d613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060154600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546125fb91906132d8565b8361260691906133fe565b9250508080612614906134b7565b91505061251b565b508091505090565b60008083156127925760006040518061010001604052808973ffffffffffffffffffffffffffffffffffffffff168152602001600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018562ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200142815260200188815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b81526004016127479190613dd7565b6020604051808303816000875af1158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a9190613568565b915050612a84565b6000600267ffffffffffffffff8111156127af576127ae613df3565b5b6040519080825280602002602001820160405280156127dd5781602001602082028036833780820191505090505b50905087816000815181106127f5576127f4613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561289c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c09190613e37565b816001815181106128d4576128d3613454565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085156129b257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478860008430426040518663ffffffff1660e01b815260040161297895949392919061410d565b600060405180830381600087803b15801561299257600080fd5b505af11580156129a6573d6000803e3d6000fd5b50505050479150612a82565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58960008530426040518663ffffffff1660e01b8152600401612a1895949392919061410d565b6000604051808303816000875af1158015612a37573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612a6091906140c4565b905080600181518110612a7657612a75613454565b5b60200260200101519250505b505b8091505095945050505050565b60006064603283612aa291906132d8565b612aac9190613361565b905060006064600a84612abf91906132d8565b612ac99190613361565b90506000818385612ada9190613483565b612ae49190613483565b905080600b6000828254612af891906133fe565b9250508190555060005b600e80549050811015612be7576000600e8281548110612b2557612b24613454565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600654826000015488612baa91906132d8565b612bb49190613361565b905080826001016000828254612bca91906133fe565b925050819055505050508080612bdf906134b7565b915050612b02565b508160066000828254612bfa91906133fe565b925050819055507f939df96a3b47dbfb83da233006cef1eb233fc5cba50ea94fecdebea4d99423e684604051612c3091906130a2565b60405180910390a150505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d8682612d5b565b9050919050565b612d9681612d7b565b8114612da157600080fd5b50565b600081359050612db381612d8d565b92915050565b6000819050919050565b612dcc81612db9565b8114612dd757600080fd5b50565b600081359050612de981612dc3565b92915050565b60008115159050919050565b612e0481612def565b8114612e0f57600080fd5b50565b600081359050612e2181612dfb565b92915050565b600062ffffff82169050919050565b612e3f81612e27565b8114612e4a57600080fd5b50565b600081359050612e5c81612e36565b92915050565b600080600080600060a08688031215612e7e57612e7d612d51565b5b6000612e8c88828901612da4565b9550506020612e9d88828901612dda565b9450506040612eae88828901612e12565b9350506060612ebf88828901612e12565b9250506080612ed088828901612e4d565b9150509295509295909350565b6000819050919050565b6000612f02612efd612ef884612d5b565b612edd565b612d5b565b9050919050565b6000612f1482612ee7565b9050919050565b6000612f2682612f09565b9050919050565b612f3681612f1b565b82525050565b6000602082019050612f516000830184612f2d565b92915050565b600060208284031215612f6d57612f6c612d51565b5b6000612f7b84828501612da4565b91505092915050565b600060208284031215612f9a57612f99612d51565b5b6000612fa884828501612dda565b91505092915050565b612fba81612db9565b82525050565b60e082016000820151612fd66000850182612fb1565b506020820151612fe96020850182612fb1565b506040820151612ffc6040850182612fb1565b50606082015161300f6060850182612fb1565b5060808201516130226080850182612fb1565b5060a082015161303560a0850182612fb1565b5060c082015161304860c0850182612fb1565b50505050565b600060e0820190506130636000830184612fc0565b92915050565b61307281612d7b565b82525050565b600060208201905061308d6000830184613069565b92915050565b61309c81612db9565b82525050565b60006020820190506130b76000830184613093565b92915050565b60006130c882612f09565b9050919050565b6130d8816130bd565b82525050565b60006020820190506130f360008301846130cf565b92915050565b60008060008060008060c0878903121561311657613115612d51565b5b600061312489828a01612da4565b965050602061313589828a01612dda565b955050604061314689828a01612e12565b945050606061315789828a01612e12565b935050608061316889828a01612e12565b92505060a061317989828a01612e4d565b9150509295509295509295565b600060608201905061319b6000830186613093565b6131a86020830185613093565b6131b56040830184613093565b949350505050565b600060e0820190506131d2600083018a613093565b6131df6020830189613093565b6131ec6040830188613093565b6131f96060830187613093565b6132066080830186613093565b61321360a0830185613093565b61322060c0830184613093565b98975050505050505050565b600082825260208201905092915050565b7f496e76616c69642070657263656e746167650000000000000000000000000000600082015250565b600061327360128361322c565b915061327e8261323d565b602082019050919050565b600060208201905081810360008301526132a281613266565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132e382612db9565b91506132ee83612db9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613327576133266132a9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061336c82612db9565b915061337783612db9565b92508261338757613386613332565b5b828204905092915050565b7f496e73756666696369656e74204554482062616c616e63650000000000000000600082015250565b60006133c860188361322c565b91506133d382613392565b602082019050919050565b600060208201905081810360008301526133f7816133bb565b9050919050565b600061340982612db9565b915061341483612db9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613449576134486132a9565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061348e82612db9565b915061349983612db9565b9250828210156134ac576134ab6132a9565b5b828203905092915050565b60006134c282612db9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134f4576134f36132a9565b5b600182019050919050565b61350881612def565b82525050565b60006080820190506135236000830187613093565b6135306020830186613069565b61353d60408301856134ff565b61354a60608301846134ff565b95945050505050565b60008151905061356281612dc3565b92915050565b60006020828403121561357e5761357d612d51565b5b600061358c84828501613553565b91505092915050565b7f4e6f20746f6b656e7320746f2077697468647261770000000000000000000000600082015250565b60006135cb60158361322c565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b60006040820190506136166000830185613069565b6136236020830184613093565b9392505050565b60008151905061363981612dfb565b92915050565b60006020828403121561365557613654612d51565b5b60006136638482850161362a565b91505092915050565b7f4e6f206578636573732045544820746f20776974686472617700000000000000600082015250565b60006136a260198361322c565b91506136ad8261366c565b602082019050919050565b600060208201905081810360008301526136d181613695565b9050919050565b7f4e6f742061207061727469636970616e74000000000000000000000000000000600082015250565b600061370e60118361322c565b9150613719826136d8565b602082019050919050565b6000602082019050818103600083015261373d81613701565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b600061377a60148361322c565b915061378582613744565b602082019050919050565b600060208201905081810360008301526137a98161376d565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e6365000000600082015250565b60006137e6601d8361322c565b91506137f1826137b0565b602082019050919050565b60006020820190508181036000830152613815816137d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600061385682612db9565b915060008203613869576138686132a9565b5b600182039050919050565b7f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160008201527f6e207a65726f0000000000000000000000000000000000000000000000000000602082015250565b60006138d060268361322c565b91506138db82613874565b604082019050919050565b600060208201905081810360008301526138ff816138c3565b9050919050565b600060408201905061391b6000830185613069565b6139286020830184613069565b9392505050565b600060a0820190506139446000830188613093565b6139516020830187613069565b61395e60408301866134ff565b61396b60608301856134ff565b61397860808301846134ff565b9695505050505050565b7f4e6f2045544820746f2077697468647261770000000000000000000000000000600082015250565b60006139b860128361322c565b91506139c382613982565b602082019050919050565b600060208201905081810360008301526139e7816139ab565b9050919050565b7f4e6f2070656e64696e672070726f6669747320746f2077697468647261770000600082015250565b6000613a24601e8361322c565b9150613a2f826139ee565b602082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b7f4e6f2070726f6669747320746f20636c61696d00000000000000000000000000600082015250565b6000613a9060138361322c565b9150613a9b82613a5a565b602082019050919050565b60006020820190508181036000830152613abf81613a83565b9050919050565b7f4d696e696d756d206465706f736974206e6f74206d6574000000000000000000600082015250565b6000613afc60178361322c565b9150613b0782613ac6565b602082019050919050565b60006020820190508181036000830152613b2b81613aef565b9050919050565b7f5061727469636970616e74206c696d6974207265616368656400000000000000600082015250565b6000613b6860198361322c565b9150613b7382613b32565b602082019050919050565b60006020820190508181036000830152613b9781613b5b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bfa60268361322c565b9150613c0582613b9e565b604082019050919050565b60006020820190508181036000830152613c2981613bed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c6660208361322c565b9150613c7182613c30565b602082019050919050565b60006020820190508181036000830152613c9581613c59565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cd2601f8361322c565b9150613cdd82613c9c565b602082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b613d1181612d7b565b82525050565b613d2081612e27565b82525050565b613d2f81612d5b565b82525050565b61010082016000820151613d4c6000850182613d08565b506020820151613d5f6020850182613d08565b506040820151613d726040850182613d17565b506060820151613d856060850182613d08565b506080820151613d986080850182612fb1565b5060a0820151613dab60a0850182612fb1565b5060c0820151613dbe60c0850182612fb1565b5060e0820151613dd160e0850182613d26565b50505050565b600061010082019050613ded6000830184613d35565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050613e3181612d8d565b92915050565b600060208284031215613e4d57613e4c612d51565b5b6000613e5b84828501613e22565b91505092915050565b6000819050919050565b6000613e89613e84613e7f84613e64565b612edd565b612db9565b9050919050565b613e9981613e6e565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613ed78383613d08565b60208301905092915050565b6000602082019050919050565b6000613efb82613e9f565b613f058185613eaa565b9350613f1083613ebb565b8060005b83811015613f41578151613f288882613ecb565b9750613f3383613ee3565b925050600181019050613f14565b5085935050505092915050565b6000608082019050613f636000830187613e90565b8181036020830152613f758186613ef0565b9050613f846040830185613069565b613f916060830184613093565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b613fb982613f9f565b810181811067ffffffffffffffff82111715613fd857613fd7613df3565b5b80604052505050565b6000613feb612d47565b9050613ff78282613fb0565b919050565b600067ffffffffffffffff82111561401757614016613df3565b5b602082029050602081019050919050565b600080fd5b600061404061403b84613ffc565b613fe1565b9050808382526020820190506020840283018581111561406357614062614028565b5b835b8181101561408c57806140788882613553565b845260208401935050602081019050614065565b5050509392505050565b600082601f8301126140ab576140aa613f9a565b5b81516140bb84826020860161402d565b91505092915050565b6000602082840312156140da576140d9612d51565b5b600082015167ffffffffffffffff8111156140f8576140f7612d56565b5b61410484828501614096565b91505092915050565b600060a0820190506141226000830188613093565b61412f6020830187613e90565b81810360408301526141418186613ef0565b90506141506060830185613069565b61415d6080830184613093565b969550505050505056fea264697066735822122078434a4e9d8f622d137a6536db6360541f1816264c8db45c372743d2b48880e464736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006f84e53b9c3749d5cb34cb0036f600ff0f9753a0
-----Decoded View---------------
Arg [0] : _uniswapV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _uniswapV3Router (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [2] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _profitWallet (address): 0x6f84E53b9c3749D5cB34CB0036F600Ff0F9753a0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000006f84e53b9c3749d5cb34cb0036f600ff0f9753a0
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.