Source Code
Latest 25 from a total of 219 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Emergency Withdr... | 23928193 | 73 days ago | IN | 0 ETH | 0.00047784 | ||||
| Harvest ETH | 21970254 | 346 days ago | IN | 0 ETH | 0.00003929 | ||||
| Harvest | 21196732 | 455 days ago | IN | 0 ETH | 0.00297869 | ||||
| Harvest | 21018424 | 479 days ago | IN | 0 ETH | 0.00130584 | ||||
| Harvest | 20904326 | 495 days ago | IN | 0 ETH | 0.00052197 | ||||
| Rescue Tokens | 20631853 | 533 days ago | IN | 0 ETH | 0.00006195 | ||||
| Rescue Tokens | 20631851 | 533 days ago | IN | 0 ETH | 0.00007817 | ||||
| Rescue Tokens | 20631849 | 533 days ago | IN | 0 ETH | 0.00008982 | ||||
| Harvest | 20631846 | 533 days ago | IN | 0 ETH | 0.00021113 | ||||
| Harvest | 20428005 | 562 days ago | IN | 0 ETH | 0.00265527 | ||||
| Harvest | 20249346 | 587 days ago | IN | 0 ETH | 0.00035047 | ||||
| Harvest | 19695373 | 664 days ago | IN | 0 ETH | 0.00120005 | ||||
| Harvest USDC | 19509424 | 690 days ago | IN | 0 ETH | 0.00211949 | ||||
| Rescue Tokens | 19373466 | 709 days ago | IN | 0 ETH | 0.00335737 | ||||
| Harvest ETH | 19373461 | 709 days ago | IN | 0 ETH | 0.00194919 | ||||
| Buy Back | 18930223 | 772 days ago | IN | 0 ETH | 0.00503462 | ||||
| Buy Back | 18893739 | 777 days ago | IN | 0 ETH | 0.00298625 | ||||
| Buy Back | 18866476 | 781 days ago | IN | 0 ETH | 0.00241514 | ||||
| Buy Back | 18766440 | 795 days ago | IN | 0 ETH | 0.0071487 | ||||
| Buy Back | 18666587 | 809 days ago | IN | 0 ETH | 0.00518353 | ||||
| Buy Back | 18637482 | 813 days ago | IN | 0 ETH | 0.00385292 | ||||
| Buy Back | 18601104 | 818 days ago | IN | 0 ETH | 0.00365203 | ||||
| Buy Back | 18573743 | 822 days ago | IN | 0 ETH | 0.00548692 | ||||
| Buy Back | 18523212 | 829 days ago | IN | 0 ETH | 0.00504093 | ||||
| Buy Back | 18467389 | 836 days ago | IN | 0 ETH | 0.00346737 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24400605 | 7 days ago | 0.000445 ETH | ||||
| Transfer | 24334201 | 16 days ago | 0.00003957 ETH | ||||
| Transfer | 24299727 | 21 days ago | 0.000445 ETH | ||||
| Transfer | 24226638 | 31 days ago | 0.000445 ETH | ||||
| Transfer | 24071810 | 53 days ago | 0.000356 ETH | ||||
| Transfer | 23994627 | 63 days ago | 0.000356 ETH | ||||
| Transfer | 23928193 | 73 days ago | 0.01061738 ETH | ||||
| Transfer | 23883698 | 79 days ago | 0.000356 ETH | ||||
| Transfer | 23800236 | 91 days ago | 0.000356 ETH | ||||
| Transfer | 23691950 | 106 days ago | 0.000356 ETH | ||||
| Transfer | 23590836 | 120 days ago | 0.000356 ETH | ||||
| Transfer | 23493291 | 134 days ago | 0.000445 ETH | ||||
| Transfer | 23404636 | 146 days ago | 0.000445 ETH | ||||
| Transfer | 23292306 | 162 days ago | 0.000445 ETH | ||||
| Transfer | 23225807 | 171 days ago | 0.000445 ETH | ||||
| Transfer | 23099549 | 189 days ago | 0.000445 ETH | ||||
| Transfer | 22998550 | 203 days ago | 0.000445 ETH | ||||
| Transfer | 22966600 | 207 days ago | 0.00005779 ETH | ||||
| Transfer | 22957264 | 208 days ago | 0.00006825 ETH | ||||
| Transfer | 22957209 | 208 days ago | 0.00009312 ETH | ||||
| Transfer | 22957196 | 208 days ago | 0.00007421 ETH | ||||
| Transfer | 22915062 | 214 days ago | 0.000445 ETH | ||||
| Transfer | 22833852 | 226 days ago | 0.000356 ETH | ||||
| Transfer | 22732313 | 240 days ago | 0.000445 ETH | ||||
| Transfer | 22720354 | 242 days ago | 0.001335 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BrewlabsTreasury
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @author Brewlabs
* This treasury contract has been developed by brewlabs.info
*/
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./libs/IUniFactory.sol";
import "./libs/IUniRouter02.sol";
interface IStaking {
function performanceFee() external view returns (uint256);
function setServiceInfo(address _addr, uint256 _fee) external;
}
interface IFarm {
function setBuyBackWallet(address _addr) external;
}
contract BrewlabsTreasury is Ownable {
using SafeERC20 for IERC20;
bool private isInitialized;
uint256 private constant TIME_UNIT = 1 days;
uint256 private constant PERCENT_PRECISION = 10000;
IERC20 public token;
address public dividendToken;
address public pair;
address private constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
uint256 public period = 30; // 30 days
uint256 public withdrawalLimit = 500; // 5% of total supply
uint256 public liquidityWithdrawalLimit = 2000; // 20% of LP supply
uint256 public buybackRate = 9500; // 95%
uint256 public addLiquidityRate = 9400; // 94%
uint256 private startTime;
uint256 private sumWithdrawals = 0;
uint256 private sumLiquidityWithdrawals = 0;
address public uniRouterAddress;
address[] public ethToTokenPath;
address[] public ethToDividendPath;
address[] public dividendToTokenPath;
uint256 public slippageFactor = 8300; // 17%
uint256 public constant slippageFactorUL = 9950;
event Initialized(
address token,
address dividendToken,
address router,
address[] ethToTokenPath,
address[] ethToDividendPath,
address[] dividendToTokenPath
);
event TokenBuyBack(uint256 amountETH, uint256 amountToken);
event TokenBuyBackFromDividend(uint256 amount, uint256 amountToken);
event LiquidityAdded(
uint256 amountETH,
uint256 amountToken,
uint256 liquidity
);
event LiquidityWithdrawn(uint256 amount);
event Withdrawn(uint256 amount);
event Harvested(address account, uint256 amount);
event Swapped(address token, uint256 amountETH, uint256 amountToken);
event EthHarvested(address to, uint256 amount);
event EmergencyWithdrawn();
event AdminTokenRecovered(address tokenRecovered, uint256 amount);
event UsdcHarvested(address to, uint256[] amounts);
event SetSwapConfig(
address router,
uint256 slipPage,
address[] ethToTokenPath,
address[] ethToDividendPath,
address[] dividendToTokenPath
);
event TransferBuyBackWallet(address staking, address wallet);
event AddLiquidityRateUpdated(uint256 percent);
event BuybackRateUpdated(uint256 percent);
event PeriodUpdated(uint256 duration);
event LiquidityWithdrawLimitUpdated(uint256 percent);
event WithdrawLimitUpdated(uint256 percent);
constructor() {}
/**
* @notice Initialize the contract
* @param _token: token address
* @param _dividendToken: reflection token address
* @param _uniRouter: uniswap router address for swap tokens
* @param _ethToTokenPath: swap path to buy Token
* @param _ethToDividendPath: swap path to buy dividend token
* @param _dividendToTokenPath: swap path to buy Token with dividend token
*/
function initialize(
IERC20 _token,
address _dividendToken,
address _uniRouter,
address[] memory _ethToTokenPath,
address[] memory _ethToDividendPath,
address[] memory _dividendToTokenPath
) external onlyOwner {
require(!isInitialized, "Already initialized");
require(_uniRouter != address(0x0), "invalid address");
require(address(_token) != address(0x0), "invalid token address");
// Make this contract initialized
isInitialized = true;
token = _token;
dividendToken = _dividendToken;
pair = IUniV2Factory(IUniRouter02(_uniRouter).factory()).getPair(
_ethToTokenPath[0],
address(token)
);
uniRouterAddress = _uniRouter;
ethToTokenPath = _ethToTokenPath;
ethToDividendPath = _ethToDividendPath;
dividendToTokenPath = _dividendToTokenPath;
emit Initialized(
address(_token),
_dividendToken,
_uniRouter,
_ethToTokenPath,
_ethToDividendPath,
_dividendToTokenPath
);
}
/**
* @notice Buy token from ETH
*/
function buyBack() external onlyOwner {
uint256 ethAmt = address(this).balance;
ethAmt = (ethAmt * buybackRate) / PERCENT_PRECISION;
if (ethAmt > 0) {
uint256 _tokenAmt = _safeSwapEth(ethAmt, ethToTokenPath, address(this));
emit TokenBuyBack(ethAmt, _tokenAmt);
}
}
/**
* @notice Buy token from reflections
*/
function buyBackFromDividend() external onlyOwner {
if (dividendToken == address(0x0) || dividendToken == address(token)) return;
uint256 reflections = IERC20(dividendToken).balanceOf(address(this));
if (reflections > 0) {
uint256 _tokenAmt = _safeSwap(
reflections,
dividendToTokenPath,
address(this)
);
emit TokenBuyBackFromDividend(reflections, _tokenAmt);
}
}
/**
* @notice Add liquidity
*/
function addLiquidity() external onlyOwner {
uint256 ethAmt = address(this).balance;
ethAmt = (ethAmt * addLiquidityRate) / PERCENT_PRECISION / 2;
if (ethAmt > 0) {
uint256 _tokenAmt = _safeSwapEth(ethAmt, ethToTokenPath, address(this));
emit TokenBuyBack(ethAmt, _tokenAmt);
(
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
) = _addLiquidityEth(address(token), ethAmt, _tokenAmt, address(this));
emit LiquidityAdded(amountETH, amountToken, liquidity);
}
}
/**
* @notice Swap and harvest reflection for token
* @param _to: receiver address
*/
function harvest(address _to) external onlyOwner {
uint256 ethAmt = address(this).balance;
ethAmt = (ethAmt * buybackRate) / PERCENT_PRECISION;
if (dividendToken == address(0x0)) {
if (ethAmt > 0) {
payable(_to).transfer(ethAmt);
emit Harvested(_to, ethAmt);
}
} else {
if (ethAmt > 0) {
uint256 _tokenAmt = _safeSwapEth(
ethAmt,
ethToDividendPath,
address(this)
);
emit Swapped(dividendToken, ethAmt, _tokenAmt);
}
uint256 tokenAmt = IERC20(dividendToken).balanceOf(address(this));
if (tokenAmt > 0) {
IERC20(dividendToken).transfer(_to, tokenAmt);
emit Harvested(_to, tokenAmt);
}
}
}
function harvestETH(address _to) external onlyOwner {
require(_to != address(0x0), "invalid address");
uint256 ethAmt = address(this).balance;
payable(_to).transfer(ethAmt);
emit EthHarvested(_to, ethAmt);
}
function harvestUSDC(address _to) external onlyOwner {
require(_to != address(0x0), "invalid address");
uint256 ethAmt = address(this).balance;
ethAmt = (ethAmt * buybackRate) / PERCENT_PRECISION;
if (ethAmt == 0) return;
address[] memory path = new address[](2);
path[0] = IUniRouter02(uniRouterAddress).WETH();
path[1] = USDC;
uint256[] memory amounts = IUniRouter02(uniRouterAddress)
.swapExactETHForTokens{ value: ethAmt }(
0,
path,
_to,
block.timestamp + 600
);
emit UsdcHarvested(_to, amounts);
}
/**
* @notice Withdraw token as much as maximum 5% of total supply
* @param _amount: amount to withdraw
*/
function withdraw(uint256 _amount) external onlyOwner {
uint256 tokenAmt = token.balanceOf(address(this));
require(_amount > 0 && _amount <= tokenAmt, "Invalid Amount");
if (block.timestamp - startTime > period * TIME_UNIT) {
startTime = block.timestamp;
sumWithdrawals = 0;
}
uint256 limit = (withdrawalLimit * (token.totalSupply())) /
PERCENT_PRECISION;
require(
sumWithdrawals + _amount <= limit,
"exceed maximum withdrawal limit for 30 days"
);
token.safeTransfer(msg.sender, _amount);
emit Withdrawn(_amount);
}
/**
* @notice Withdraw liquidity
* @param _amount: amount to withdraw
*/
function withdrawLiquidity(uint256 _amount) external onlyOwner {
uint256 tokenAmt = IERC20(pair).balanceOf(address(this));
require(_amount > 0 && _amount <= tokenAmt, "Invalid Amount");
if (block.timestamp - startTime > period * TIME_UNIT) {
startTime = block.timestamp;
sumLiquidityWithdrawals = 0;
}
uint256 limit = (liquidityWithdrawalLimit * (IERC20(pair).totalSupply())) /
PERCENT_PRECISION;
require(
sumLiquidityWithdrawals + _amount <= limit,
"exceed maximum LP withdrawal limit for 30 days"
);
IERC20(pair).safeTransfer(msg.sender, _amount);
emit LiquidityWithdrawn(_amount);
}
/**
* @notice Withdraw tokens
* @dev Needs to be for emergency.
*/
function emergencyWithdraw() external onlyOwner {
uint256 tokenAmt = token.balanceOf(address(this));
if (tokenAmt > 0) {
token.transfer(msg.sender, tokenAmt);
}
tokenAmt = IERC20(pair).balanceOf(address(this));
if (tokenAmt > 0) {
IERC20(pair).transfer(msg.sender, tokenAmt);
}
uint256 ethAmt = address(this).balance;
if (ethAmt > 0) {
payable(msg.sender).transfer(ethAmt);
}
emit EmergencyWithdrawn();
}
/**
* @notice Set duration for withdraw limit
* @param _period: duration
*/
function setWithdrawalLimitPeriod(uint256 _period) external onlyOwner {
require(_period >= 10, "small period");
period = _period;
emit PeriodUpdated(_period);
}
/**
* @notice Set liquidity withdraw limit
* @param _percent: percentage of LP supply in point
*/
function setLiquidityWithdrawalLimit(uint256 _percent) external onlyOwner {
require(_percent < PERCENT_PRECISION, "Invalid percentage");
liquidityWithdrawalLimit = _percent;
emit LiquidityWithdrawLimitUpdated(_percent);
}
/**
* @notice Set withdraw limit
* @param _percent: percentage of total supply in point
*/
function setWithdrawalLimit(uint256 _percent) external onlyOwner {
require(_percent < PERCENT_PRECISION, "Invalid percentage");
withdrawalLimit = _percent;
emit WithdrawLimitUpdated(_percent);
}
/**
* @notice Set buyback rate
* @param _percent: percentage in point
*/
function setBuybackRate(uint256 _percent) external onlyOwner {
require(_percent < PERCENT_PRECISION, "Invalid percentage");
buybackRate = _percent;
emit BuybackRateUpdated(_percent);
}
/**
* @notice Set addliquidy rate
* @param _percent: percentage in point
*/
function setAddLiquidityRate(uint256 _percent) external onlyOwner {
require(_percent < PERCENT_PRECISION, "Invalid percentage");
addLiquidityRate = _percent;
emit AddLiquidityRateUpdated(_percent);
}
/**
* @notice Set buyback wallet of farm contract
* @param _uniRouter: dex router address
* @param _slipPage: slip page for swap
* @param _ethToTokenPath: eth-token swap path
* @param _ethToDividendPath: eth-token swap path
* @param _dividendToTokenPath: eth-token swap path
*/
function setSwapSettings(
address _uniRouter,
uint256 _slipPage,
address[] memory _ethToTokenPath,
address[] memory _ethToDividendPath,
address[] memory _dividendToTokenPath
) external onlyOwner {
require(_uniRouter != address(0x0), "invalid address");
require(_slipPage <= slippageFactorUL, "_slippage too high");
uniRouterAddress = _uniRouter;
slippageFactor = _slipPage;
ethToTokenPath = _ethToTokenPath;
ethToDividendPath = _ethToDividendPath;
dividendToTokenPath = _dividendToTokenPath;
emit SetSwapConfig(
_uniRouter,
_slipPage,
_ethToTokenPath,
_ethToDividendPath,
_dividendToTokenPath
);
}
/**
* @notice set buyback wallet of farm contract
* @param _farm: farm contract address
* @param _addr: buyback wallet address
*/
function setFarmServiceInfo(address _farm, address _addr) external onlyOwner {
require(_farm != address(0x0) && _addr != address(0x0), "Invalid Address");
IFarm(_farm).setBuyBackWallet(_addr);
emit TransferBuyBackWallet(_farm, _addr);
}
/**
* @notice set buyback wallet of staking contract
* @param _staking: staking contract address
* @param _addr: buyback wallet address
*/
function setStakingServiceInfo(address _staking, address _addr)
external
onlyOwner
{
require(
_staking != address(0x0) && _addr != address(0x0),
"Invalid Address"
);
uint256 _fee = IStaking(_staking).performanceFee();
IStaking(_staking).setServiceInfo(_addr, _fee);
emit TransferBuyBackWallet(_staking, _addr);
}
/**
* @notice It allows the admin to recover wrong tokens sent to the contract
* @param _token: the address of the token to withdraw
* @dev This function is only callable by admin.
*/
function rescueTokens(address _token) external onlyOwner {
require(
_token != address(token) && _token != dividendToken && _token != pair,
"Cannot be token & dividend token, pair"
);
uint256 _tokenAmount;
if (_token == address(0x0)) {
_tokenAmount = address(this).balance;
payable(msg.sender).transfer(_tokenAmount);
} else {
_tokenAmount = IERC20(_token).balanceOf(address(this));
IERC20(_token).safeTransfer(msg.sender, _tokenAmount);
}
emit AdminTokenRecovered(_token, _tokenAmount);
}
/************************
** Internal Methods
*************************/
/**
* @notice get token from ETH via swap.
* @param _amountIn: eth amount to swap
* @param _path: swap path
* @param _to: receiver address
*/
function _safeSwapEth(
uint256 _amountIn,
address[] memory _path,
address _to
) internal returns (uint256) {
uint256[] memory amounts = IUniRouter02(uniRouterAddress).getAmountsOut(
_amountIn,
_path
);
uint256 amountOut = amounts[amounts.length - 1];
address _token = _path[_path.length - 1];
uint256 beforeAmt = IERC20(_token).balanceOf(address(this));
IUniRouter02(uniRouterAddress)
.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: _amountIn }(
(amountOut * slippageFactor) / PERCENT_PRECISION,
_path,
_to,
block.timestamp + 600
);
uint256 afterAmt = IERC20(_token).balanceOf(address(this));
return afterAmt - beforeAmt;
}
/**
* @notice swap token based on path.
* @param _amountIn: token amount to swap
* @param _path: swap path
* @param _to: receiver address
*/
function _safeSwap(
uint256 _amountIn,
address[] memory _path,
address _to
) internal returns (uint256) {
uint256[] memory amounts = IUniRouter02(uniRouterAddress).getAmountsOut(
_amountIn,
_path
);
uint256 amountOut = amounts[amounts.length - 1];
IERC20(_path[0]).safeApprove(uniRouterAddress, _amountIn);
address _token = _path[_path.length - 1];
uint256 beforeAmt = IERC20(_token).balanceOf(address(this));
IUniRouter02(uniRouterAddress)
.swapExactTokensForTokensSupportingFeeOnTransferTokens(
_amountIn,
(amountOut * slippageFactor) / PERCENT_PRECISION,
_path,
_to,
block.timestamp + 600
);
uint256 afterAmt = IERC20(_token).balanceOf(address(this));
return afterAmt - beforeAmt;
}
/**
* @notice add token-ETH liquidity.
* @param _token: token address
* @param _ethAmt: eth amount to add liquidity
* @param _tokenAmt: token amount to add liquidity
* @param _to: receiver address
*/
function _addLiquidityEth(
address _token,
uint256 _ethAmt,
uint256 _tokenAmt,
address _to
)
internal
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
)
{
IERC20(_token).safeIncreaseAllowance(uniRouterAddress, _tokenAmt);
(amountToken, amountETH, liquidity) = IUniRouter02(uniRouterAddress)
.addLiquidityETH{ value: _ethAmt }(
address(_token),
_tokenAmt,
0,
0,
_to,
block.timestamp + 600
);
IERC20(_token).safeApprove(uniRouterAddress, uint256(0));
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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 v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniV2Factory {
function getPair(address tokenA, address tokenB)
external
view
returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IUniRouter01.sol";
interface IUniRouter02 is IUniRouter01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniRouter01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}{
"optimizer": {
"enabled": true,
"runs": 100
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"AddLiquidityRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"BuybackRateUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"EmergencyWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"dividendToken","type":"address"},{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address[]","name":"ethToTokenPath","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"ethToDividendPath","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"dividendToTokenPath","type":"address[]"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"LiquidityWithdrawLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityWithdrawn","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":"duration","type":"uint256"}],"name":"PeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"uint256","name":"slipPage","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"ethToTokenPath","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"ethToDividendPath","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"dividendToTokenPath","type":"address[]"}],"name":"SetSwapConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"Swapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"TokenBuyBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"TokenBuyBackFromDividend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staking","type":"address"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"TransferBuyBackWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"UsdcHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"WithdrawLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addLiquidityRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackFromDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dividendToTokenPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethToDividendPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethToTokenPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"harvestETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"harvestUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_dividendToken","type":"address"},{"internalType":"address","name":"_uniRouter","type":"address"},{"internalType":"address[]","name":"_ethToTokenPath","type":"address[]"},{"internalType":"address[]","name":"_ethToDividendPath","type":"address[]"},{"internalType":"address[]","name":"_dividendToTokenPath","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityWithdrawalLimit","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setAddLiquidityRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setBuybackRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_farm","type":"address"},{"internalType":"address","name":"_addr","type":"address"}],"name":"setFarmServiceInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setLiquidityWithdrawalLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"address","name":"_addr","type":"address"}],"name":"setStakingServiceInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniRouter","type":"address"},{"internalType":"uint256","name":"_slipPage","type":"uint256"},{"internalType":"address[]","name":"_ethToTokenPath","type":"address[]"},{"internalType":"address[]","name":"_ethToDividendPath","type":"address[]"},{"internalType":"address[]","name":"_dividendToTokenPath","type":"address[]"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setWithdrawalLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setWithdrawalLimitPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippageFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slippageFactorUL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052601e6004556101f46005556107d060065561251c6007556124b86008556000600a556000600b5561206c6010553480156200003e57600080fd5b506200004a3362000050565b620000a0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61378f80620000b06000396000f3fe6080604052600436106101d25760003560e01c8063887a7dc9116100f8578063db26eace11610090578063db26eace1461050c578063db2e21bc1461052c578063e8078d9414610541578063e8669da614610556578063ef78d4fd14610576578063f2fde38b1461058c578063f76024c4146105ac578063fc0c546a146105c2578063ffbd3b1f146105e257600080fd5b8063887a7dc9146104165780638a317525146104365780638d583550146104565780638da5cb5b1461046c57806392f735eb14610481578063a8aa1b31146104a1578063acdf4f18146104c1578063b67b7ec7146104d6578063b74cd242146104f657600080fd5b80633c4666cf1161016b5780633c4666cf146103165780633ca68190146103365780634d2e6d2a146103565780635a0768ce1461036b578063630f6f8b1461038b578063693a090b146103ab5780636e10f476146103cb578063715018a6146103eb5780637ddfe78d1461040057600080fd5b8062ae3bf8146101de578063045af258146102005780630a861f2a146102295780630daa6c0d146102495780630e5c011e14610269578063107ee893146102895780631582358e146102b65780632e1a7d4d146102d6578063365247fc146102f657600080fd5b366101d957005b600080fd5b3480156101ea57600080fd5b506101fe6101f9366004613006565b6105f8565b005b34801561020c57600080fd5b5061021660085481565b6040519081526020015b60405180910390f35b34801561023557600080fd5b506101fe610244366004613285565b6107e6565b34801561025557600080fd5b506101fe61026436600461303e565b610a5a565b34801561027557600080fd5b506101fe610284366004613006565b610b54565b34801561029557600080fd5b506102a96102a4366004613285565b610e28565b6040516102209190613341565b3480156102c257600080fd5b506002546102a9906001600160a01b031681565b3480156102e257600080fd5b506101fe6102f1366004613285565b610e52565b34801561030257600080fd5b506101fe610311366004613006565b6110ba565b34801561032257600080fd5b506101fe6103313660046131ca565b611334565b34801561034257600080fd5b506101fe610351366004613285565b611646565b34801561036257600080fd5b506101fe6116d2565b34801561037757600080fd5b506101fe610386366004613285565b61185b565b34801561039757600080fd5b506101fe6103a6366004613076565b6118e0565b3480156103b757600080fd5b50600c546102a9906001600160a01b031681565b3480156103d757600080fd5b506101fe6103e6366004613285565b611a1e565b3480156103f757600080fd5b506101fe611aa3565b34801561040c57600080fd5b5061021660055481565b34801561042257600080fd5b506102a9610431366004613285565b611adc565b34801561044257600080fd5b506101fe61045136600461303e565b611aec565b34801561046257600080fd5b5061021660065481565b34801561047857600080fd5b506102a9611c5e565b34801561048d57600080fd5b506101fe61049c366004613006565b611c6d565b3480156104ad57600080fd5b506003546102a9906001600160a01b031681565b3480156104cd57600080fd5b506101fe611d2c565b3480156104e257600080fd5b506102a96104f1366004613285565b611e1e565b34801561050257600080fd5b506102166126de81565b34801561051857600080fd5b506101fe610527366004613285565b611e2e565b34801561053857600080fd5b506101fe611ed2565b34801561054d57600080fd5b506101fe612181565b34801561056257600080fd5b506101fe610571366004613285565b6122e8565b34801561058257600080fd5b5061021660045481565b34801561059857600080fd5b506101fe6105a7366004613006565b61236d565b3480156105b857600080fd5b5061021660075481565b3480156105ce57600080fd5b506001546102a9906001600160a01b031681565b3480156105ee57600080fd5b5061021660105481565b33610601611c5e565b6001600160a01b0316146106305760405162461bcd60e51b815260040161062790613576565b60405180910390fd5b6001546001600160a01b0382811691161480159061065c57506002546001600160a01b03828116911614155b801561067657506003546001600160a01b03828116911614155b6106d15760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f7420626520746f6b656e2026206469766964656e6420746f6b656e60448201526516103830b4b960d11b6064820152608401610627565b60006001600160a01b03821661071757506040514790339082156108fc029083906000818181858888f19350505050158015610711573d6000803e3d6000fd5b506107a9565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610743903090600401613341565b60206040518083038186803b15801561075b57600080fd5b505afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610793919061329d565b90506107a96001600160a01b038316338361240a565b7f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b82826040516107da92919061341f565b60405180910390a15050565b336107ef611c5e565b6001600160a01b0316146108155760405162461bcd60e51b815260040161062790613576565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610846903090600401613341565b60206040518083038186803b15801561085e57600080fd5b505afa158015610872573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610896919061329d565b90506000821180156108a85750808211155b6108c45760405162461bcd60e51b815260040161062790613525565b620151806004546108d591906136b6565b6009546108e290426136d5565b11156108f257426009556000600b555b6000612710600360009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561094557600080fd5b505afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d919061329d565b60065461098a91906136b6565b6109949190613696565b90508083600b546109a5919061367e565b1115610a0a5760405162461bcd60e51b815260206004820152602e60248201527f657863656564206d6178696d756d204c50207769746864726177616c206c696d60448201526d697420666f72203330206461797360901b6064820152608401610627565b600354610a21906001600160a01b0316338561240a565b6040518381527f73ce532f480864bd2fccd1bcdbb4c8151f02cd9450c4f3e5b834ef74503abdb2906020015b60405180910390a1505050565b33610a63611c5e565b6001600160a01b031614610a895760405162461bcd60e51b815260040161062790613576565b6001600160a01b03821615801590610aa957506001600160a01b03811615155b610ac55760405162461bcd60e51b8152600401610627906135ab565b60405163523205c160e11b81526001600160a01b0383169063a4640b8290610af1908490600401613341565b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b505050507f7f78141a3bd83bf938eb2a367b5b7e1a1056d8128b3f1809535eed46891c903382826040516107da929190613355565b33610b5d611c5e565b6001600160a01b031614610b835760405162461bcd60e51b815260040161062790613576565b600754479061271090610b9690836136b6565b610ba09190613696565b6002549091506001600160a01b0316610c25578015610c21576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bef573d6000803e3d6000fd5b507f121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf82826040516107da92919061341f565b5050565b8015610ce4576000610c9282600e805480602002602001604051908101604052809291908181526020018280548015610c8757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c69575b505050505030612460565b600254604080516001600160a01b0390921682526020820185905281018290529091507f3a9a9f34f5831e9c8ecb66ab3aa308b2ff31eaca434615f6c9cadc656a9af71c9060600160405180910390a1505b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d15903090600401613341565b60206040518083038186803b158015610d2d57600080fd5b505afa158015610d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d65919061329d565b90508015610e235760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d9f908690859060040161341f565b602060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df191906131aa565b507f121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf8382604051610a4d92919061341f565b505050565b600f8181548110610e3857600080fd5b6000918252602090912001546001600160a01b0316905081565b33610e5b611c5e565b6001600160a01b031614610e815760405162461bcd60e51b815260040161062790613576565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610eb2903090600401613341565b60206040518083038186803b158015610eca57600080fd5b505afa158015610ede573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f02919061329d565b9050600082118015610f145750808211155b610f305760405162461bcd60e51b815260040161062790613525565b62015180600454610f4191906136b6565b600954610f4e90426136d5565b1115610f5e57426009556000600a555b6000612710600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe9919061329d565b600554610ff691906136b6565b6110009190613696565b90508083600a54611011919061367e565b11156110735760405162461bcd60e51b815260206004820152602b60248201527f657863656564206d6178696d756d207769746864726177616c206c696d69742060448201526a666f72203330206461797360a81b6064820152608401610627565b60015461108a906001600160a01b0316338561240a565b6040518381527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b5690602001610a4d565b336110c3611c5e565b6001600160a01b0316146110e95760405162461bcd60e51b815260040161062790613576565b6001600160a01b03811661110f5760405162461bcd60e51b81526004016106279061354d565b60075447906127109061112290836136b6565b61112c9190613696565b905080611137575050565b6040805160028082526060820183526000926020830190803683375050600c54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561119c57600080fd5b505afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d49190613022565b816000815181106111f557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061124b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600c5460009116637ff36ab58483858861127d4261025861367e565b6040518663ffffffff1660e01b815260040161129c9493929190613491565b6000604051808303818588803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526112f29190810190613117565b90507f8b20b26dcda038ac2feab95f28f3dd32b371cce650645b63e301421e62386ea084826040516113259291906133d6565b60405180910390a15050505b50565b3361133d611c5e565b6001600160a01b0316146113635760405162461bcd60e51b815260040161062790613576565b600054600160a01b900460ff16156113b35760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610627565b6001600160a01b0384166113d95760405162461bcd60e51b81526004016106279061354d565b6001600160a01b0386166114275760405162461bcd60e51b8152602060048201526015602482015274696e76616c696420746f6b656e206164647265737360581b6044820152606401610627565b6000805460ff60a01b1916600160a01b179055600180546001600160a01b038089166001600160a01b0319928316179092556002805488841692169190911790556040805163c45a015560e01b815290519186169163c45a015591600480820192602092909190829003018186803b1580156114a257600080fd5b505afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da9190613022565b6001600160a01b031663e6a439058460008151811061150957634e487b7160e01b600052603260045260246000fd5b60209081029190910101516001546040516001600160e01b031960e085901b16815261154292916001600160a01b031690600401613355565b60206040518083038186803b15801561155a57600080fd5b505afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115929190613022565b600380546001600160a01b03199081166001600160a01b0393841617909155600c805490911691861691909117905582516115d490600d906020860190612f14565b5081516115e890600e906020850190612f14565b5080516115fc90600f906020840190612f14565b507f4ae045405af58409ab59a9b3af6c2424441a8d0cc7f0d58d675d19073dec75e38686868686866040516116369695949392919061336f565b60405180910390a1505050505050565b3361164f611c5e565b6001600160a01b0316146116755760405162461bcd60e51b815260040161062790613576565b61271081106116965760405162461bcd60e51b8152600401610627906134f9565b60088190556040518181527f71e39bccc2e27c18ea159b9a4fbc08961b9d9583ea143ae3e5021cf6aefb613c906020015b60405180910390a150565b336116db611c5e565b6001600160a01b0316146117015760405162461bcd60e51b815260040161062790613576565b6002546001600160a01b0316158061172957506001546002546001600160a01b039081169116145b1561173057565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611761903090600401613341565b60206040518083038186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b1919061329d565b9050801561133157600061182082600f80548060200260200160405190810160405280929190818152602001828054801561181557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117f7575b505050505030612709565b60408051848152602081018390529192507fb578101e5d792c57de69a936b880873b1c2e9f776134e5a89f463decc7963e1c91016107da565b565b33611864611c5e565b6001600160a01b03161461188a5760405162461bcd60e51b815260040161062790613576565b61271081106118ab5760405162461bcd60e51b8152600401610627906134f9565b60058190556040518181527f0969f79b044617688492c7c9b226129947037ca88c450002a7561ed78aa549ac906020016116c7565b336118e9611c5e565b6001600160a01b03161461190f5760405162461bcd60e51b815260040161062790613576565b6001600160a01b0385166119355760405162461bcd60e51b81526004016106279061354d565b6126de84111561197c5760405162461bcd60e51b81526020600482015260126024820152710bee6d8d2e0e0c2ceca40e8dede40d0d2ced60731b6044820152606401610627565b600c80546001600160a01b0319166001600160a01b038716179055601084905582516119af90600d906020860190612f14565b5081516119c390600e906020850190612f14565b5080516119d790600f906020840190612f14565b507fac823b586c853c1953e323c1189297cec5b2cb4b1316ac35ccf979e1969dbc0f8585858585604051611a0f959493929190613438565b60405180910390a15050505050565b33611a27611c5e565b6001600160a01b031614611a4d5760405162461bcd60e51b815260040161062790613576565b6127108110611a6e5760405162461bcd60e51b8152600401610627906134f9565b60078190556040518181527fcc694eb069971c6c91f6c905b0f66a7a6322a90a42f3904b7508e7b9336a7dfe906020016116c7565b33611aac611c5e565b6001600160a01b031614611ad25760405162461bcd60e51b815260040161062790613576565b61185960006129a3565b600d8181548110610e3857600080fd5b33611af5611c5e565b6001600160a01b031614611b1b5760405162461bcd60e51b815260040161062790613576565b6001600160a01b03821615801590611b3b57506001600160a01b03811615155b611b575760405162461bcd60e51b8152600401610627906135ab565b6000826001600160a01b031663877887826040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9257600080fd5b505afa158015611ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bca919061329d565b604051631036c32960e31b81529091506001600160a01b038416906381b6194890611bfb908590859060040161341f565b600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b505050507f7f78141a3bd83bf938eb2a367b5b7e1a1056d8128b3f1809535eed46891c90338383604051610a4d929190613355565b6000546001600160a01b031690565b33611c76611c5e565b6001600160a01b031614611c9c5760405162461bcd60e51b815260040161062790613576565b6001600160a01b038116611cc25760405162461bcd60e51b81526004016106279061354d565b60405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611cfa573d6000803e3d6000fd5b507fea0c40665f6f46154fd7f8cb0bab49455cd181005581a97e76d29a474de8bfb282826040516107da92919061341f565b33611d35611c5e565b6001600160a01b031614611d5b5760405162461bcd60e51b815260040161062790613576565b600754479061271090611d6e90836136b6565b611d789190613696565b90508015611331576000611de582600d805480602002602001604051908101604052809291908181526020018280548015610c87576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610c6957505050505030612460565b60408051848152602081018390529192507f5af76d43c73e649d671103b29a6b93de2a53abb35bf2600ac3d04b13d413072d91016107da565b600e8181548110610e3857600080fd5b33611e37611c5e565b6001600160a01b031614611e5d5760405162461bcd60e51b815260040161062790613576565b600a811015611e9d5760405162461bcd60e51b815260206004820152600c60248201526b1cdb585b1b081c195c9a5bd960a21b6044820152606401610627565b60048190556040518181527f989f99d0a575dfaf67701aef35b8654442a4705a4bce243d8f81e1bb2bc4a63f906020016116c7565b33611edb611c5e565b6001600160a01b031614611f015760405162461bcd60e51b815260040161062790613576565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611f32903090600401613341565b60206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f82919061329d565b905080156120105760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611fbc903390859060040161341f565b602060405180830381600087803b158015611fd657600080fd5b505af1158015611fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200e91906131aa565b505b6003546040516370a0823160e01b81526001600160a01b03909116906370a0823190612040903090600401613341565b60206040518083038186803b15801561205857600080fd5b505afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612090919061329d565b9050801561211e5760035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906120ca903390859060040161341f565b602060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c91906131aa565b505b47801561215457604051339082156108fc029083906000818181858888f19350505050158015612152573d6000803e3d6000fd5b505b6040517fcd310f174a338d5afb2b17ebca2bda872a317a1e5ec53f6277803b93e8644eb990600090a15050565b3361218a611c5e565b6001600160a01b0316146121b05760405162461bcd60e51b815260040161062790613576565b6008544790600290612710906121c690846136b6565b6121d09190613696565b6121da9190613696565b9050801561133157600061224782600d805480602002602001604051908101604052809291908181526020018280548015610c87576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610c6957505050505030612460565b60408051848152602081018390529192507f5af76d43c73e649d671103b29a6b93de2a53abb35bf2600ac3d04b13d413072d910160405180910390a1600154600090819081906122a2906001600160a01b03168686306129f3565b604080518381526020810185905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be390606001611a0f565b336122f1611c5e565b6001600160a01b0316146123175760405162461bcd60e51b815260040161062790613576565b61271081106123385760405162461bcd60e51b8152600401610627906134f9565b60068190556040518181527f0eeb4417a0dd5e563056eaf6d3024509bedf001cfac9394bb02f37e3414fa34b906020016116c7565b33612376611c5e565b6001600160a01b03161461239c5760405162461bcd60e51b815260040161062790613576565b6001600160a01b0381166124015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610627565b611331816129a3565b610e238363a9059cbb60e01b848460405160240161242992919061341f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b06565b600c5460405163d06ca61f60e01b815260009182916001600160a01b039091169063d06ca61f9061249790889088906004016135d4565b60006040518083038186803b1580156124af57600080fd5b505afa1580156124c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124eb9190810190613117565b9050600081600183516124fe91906136d5565b8151811061251c57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000856001875161253791906136d5565b8151811061255557634e487b7160e01b600052603260045260246000fd5b602002602001015190506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161258d9190613341565b60206040518083038186803b1580156125a557600080fd5b505afa1580156125b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dd919061329d565b600c546010549192506001600160a01b03169063b6f9de95908a906127109061260690886136b6565b6126109190613696565b8a8a61261e4261025861367e565b6040518663ffffffff1660e01b815260040161263d9493929190613491565b6000604051808303818588803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b50506040516370a0823160e01b8152600093506001600160a01b03861692506370a08231915061269e903090600401613341565b60206040518083038186803b1580156126b657600080fd5b505afa1580156126ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ee919061329d565b90506126fa82826136d5565b955050505050505b9392505050565b600c5460405163d06ca61f60e01b815260009182916001600160a01b039091169063d06ca61f9061274090889088906004016135d4565b60006040518083038186803b15801561275857600080fd5b505afa15801561276c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127949190810190613117565b9050600081600183516127a791906136d5565b815181106127c557634e487b7160e01b600052603260045260246000fd5b6020026020010151905061282a600c60009054906101000a90046001600160a01b0316878760008151811061280a57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316612bd89092919063ffffffff16565b6000856001875161283b91906136d5565b8151811061285957634e487b7160e01b600052603260045260246000fd5b602002602001015190506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016128919190613341565b60206040518083038186803b1580156128a957600080fd5b505afa1580156128bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e1919061329d565b600c546010549192506001600160a01b031690635c11d795908a906127109061290a90886136b6565b6129149190613696565b8a8a6129224261025861367e565b6040518663ffffffff1660e01b81526004016129429594939291906135ed565b600060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03851691506370a082319061269e903090600401613341565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600c5460009081908190612a14906001600160a01b03898116911687612cea565b600c546001600160a01b031663f305d7198789886000808a612a384261025861367e565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ad991906132b5565b600c549295509093509150612afc906001600160a01b0389811691166000612bd8565b9450945094915050565b6000612b5b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d9c9092919063ffffffff16565b805190915015610e235780806020019051810190612b7991906131aa565b610e235760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610627565b801580612c605750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612c0e9030908690600401613355565b60206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5e919061329d565b155b612ccb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610627565b610e238363095ea7b360e01b848460405160240161242992919061341f565b600081846001600160a01b031663dd62ed3e30866040518363ffffffff1660e01b8152600401612d1b929190613355565b60206040518083038186803b158015612d3357600080fd5b505afa158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b919061329d565b612d75919061367e565b9050612d968463095ea7b360e01b858460405160240161242992919061341f565b50505050565b6060612dab8484600085612db3565b949350505050565b606082471015612e145760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610627565b843b612e625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610627565b600080866001600160a01b03168587604051612e7e9190613325565b60006040518083038185875af1925050503d8060008114612ebb576040519150601f19603f3d011682016040523d82523d6000602084013e612ec0565b606091505b5091509150612ed0828286612edb565b979650505050505050565b60608315612eea575081612702565b825115612efa5782518084602001fd5b8160405162461bcd60e51b815260040161062791906134c6565b828054828255906000526020600020908101928215612f69579160200282015b82811115612f6957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612f34565b50612f75929150612f79565b5090565b5b80821115612f755760008155600101612f7a565b600082601f830112612f9e578081fd5b81356020612fb3612fae8361365a565b613629565b80838252828201915082860187848660051b8901011115612fd2578586fd5b855b85811015612ff9578135612fe781613744565b84529284019290840190600101612fd4565b5090979650505050505050565b600060208284031215613017578081fd5b813561270281613744565b600060208284031215613033578081fd5b815161270281613744565b60008060408385031215613050578081fd5b823561305b81613744565b9150602083013561306b81613744565b809150509250929050565b600080600080600060a0868803121561308d578081fd5b853561309881613744565b945060208601359350604086013567ffffffffffffffff808211156130bb578283fd5b6130c789838a01612f8e565b945060608801359150808211156130dc578283fd5b6130e889838a01612f8e565b935060808801359150808211156130fd578283fd5b5061310a88828901612f8e565b9150509295509295909350565b60006020808385031215613129578182fd5b825167ffffffffffffffff81111561313f578283fd5b8301601f8101851361314f578283fd5b805161315d612fae8261365a565b80828252848201915084840188868560051b870101111561317c578687fd5b8694505b8385101561319e578051835260019490940193918501918501613180565b50979650505050505050565b6000602082840312156131bb578081fd5b81518015158114612702578182fd5b60008060008060008060c087890312156131e2578081fd5b86356131ed81613744565b955060208701356131fd81613744565b9450604087013561320d81613744565b9350606087013567ffffffffffffffff80821115613229578283fd5b6132358a838b01612f8e565b9450608089013591508082111561324a578283fd5b6132568a838b01612f8e565b935060a089013591508082111561326b578283fd5b5061327889828a01612f8e565b9150509295509295509295565b600060208284031215613296578081fd5b5035919050565b6000602082840312156132ae578081fd5b5051919050565b6000806000606084860312156132c9578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b8381101561331a5781516001600160a01b0316875295820195908201906001016132f5565b509495945050505050565b600082516133378184602087016136ec565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03878116825286811660208301528516604082015260c0606082018190526000906133a3908301866132e2565b82810360808401526133b581866132e2565b905082810360a08401526133c981856132e2565b9998505050505050505050565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015612ff957845183529383019391830191600101613403565b6001600160a01b03929092168252602082015260400190565b60018060a01b038616815284602082015260a06040820152600061345f60a08301866132e2565b828103606084015261347181866132e2565b9050828103608084015261348581856132e2565b98975050505050505050565b8481526080602082015260006134aa60808301866132e2565b6001600160a01b03949094166040830152506060015292915050565b60208152600082518060208401526134e58160408501602087016136ec565b601f01601f19169190910160400192915050565b602080825260129082015271496e76616c69642070657263656e7461676560701b604082015260600190565b6020808252600e908201526d125b9d985b1a5908105b5bdd5b9d60921b604082015260600190565b6020808252600f908201526e696e76616c6964206164647265737360881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201526e496e76616c6964204164647265737360881b604082015260600190565b828152604060208201526000612dab60408301846132e2565b85815284602082015260a06040820152600061360c60a08301866132e2565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156136525761365261372e565b604052919050565b600067ffffffffffffffff8211156136745761367461372e565b5060051b60200190565b6000821982111561369157613691613718565b500190565b6000826136b157634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156136d0576136d0613718565b500290565b6000828210156136e7576136e7613718565b500390565b60005b838110156137075781810151838201526020016136ef565b83811115612d965750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133157600080fdfea2646970667358221220a5eb10d61e010eea8d177e81873515da96f01fa7b9f87964645e96eaa97e4ffc64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101d25760003560e01c8063887a7dc9116100f8578063db26eace11610090578063db26eace1461050c578063db2e21bc1461052c578063e8078d9414610541578063e8669da614610556578063ef78d4fd14610576578063f2fde38b1461058c578063f76024c4146105ac578063fc0c546a146105c2578063ffbd3b1f146105e257600080fd5b8063887a7dc9146104165780638a317525146104365780638d583550146104565780638da5cb5b1461046c57806392f735eb14610481578063a8aa1b31146104a1578063acdf4f18146104c1578063b67b7ec7146104d6578063b74cd242146104f657600080fd5b80633c4666cf1161016b5780633c4666cf146103165780633ca68190146103365780634d2e6d2a146103565780635a0768ce1461036b578063630f6f8b1461038b578063693a090b146103ab5780636e10f476146103cb578063715018a6146103eb5780637ddfe78d1461040057600080fd5b8062ae3bf8146101de578063045af258146102005780630a861f2a146102295780630daa6c0d146102495780630e5c011e14610269578063107ee893146102895780631582358e146102b65780632e1a7d4d146102d6578063365247fc146102f657600080fd5b366101d957005b600080fd5b3480156101ea57600080fd5b506101fe6101f9366004613006565b6105f8565b005b34801561020c57600080fd5b5061021660085481565b6040519081526020015b60405180910390f35b34801561023557600080fd5b506101fe610244366004613285565b6107e6565b34801561025557600080fd5b506101fe61026436600461303e565b610a5a565b34801561027557600080fd5b506101fe610284366004613006565b610b54565b34801561029557600080fd5b506102a96102a4366004613285565b610e28565b6040516102209190613341565b3480156102c257600080fd5b506002546102a9906001600160a01b031681565b3480156102e257600080fd5b506101fe6102f1366004613285565b610e52565b34801561030257600080fd5b506101fe610311366004613006565b6110ba565b34801561032257600080fd5b506101fe6103313660046131ca565b611334565b34801561034257600080fd5b506101fe610351366004613285565b611646565b34801561036257600080fd5b506101fe6116d2565b34801561037757600080fd5b506101fe610386366004613285565b61185b565b34801561039757600080fd5b506101fe6103a6366004613076565b6118e0565b3480156103b757600080fd5b50600c546102a9906001600160a01b031681565b3480156103d757600080fd5b506101fe6103e6366004613285565b611a1e565b3480156103f757600080fd5b506101fe611aa3565b34801561040c57600080fd5b5061021660055481565b34801561042257600080fd5b506102a9610431366004613285565b611adc565b34801561044257600080fd5b506101fe61045136600461303e565b611aec565b34801561046257600080fd5b5061021660065481565b34801561047857600080fd5b506102a9611c5e565b34801561048d57600080fd5b506101fe61049c366004613006565b611c6d565b3480156104ad57600080fd5b506003546102a9906001600160a01b031681565b3480156104cd57600080fd5b506101fe611d2c565b3480156104e257600080fd5b506102a96104f1366004613285565b611e1e565b34801561050257600080fd5b506102166126de81565b34801561051857600080fd5b506101fe610527366004613285565b611e2e565b34801561053857600080fd5b506101fe611ed2565b34801561054d57600080fd5b506101fe612181565b34801561056257600080fd5b506101fe610571366004613285565b6122e8565b34801561058257600080fd5b5061021660045481565b34801561059857600080fd5b506101fe6105a7366004613006565b61236d565b3480156105b857600080fd5b5061021660075481565b3480156105ce57600080fd5b506001546102a9906001600160a01b031681565b3480156105ee57600080fd5b5061021660105481565b33610601611c5e565b6001600160a01b0316146106305760405162461bcd60e51b815260040161062790613576565b60405180910390fd5b6001546001600160a01b0382811691161480159061065c57506002546001600160a01b03828116911614155b801561067657506003546001600160a01b03828116911614155b6106d15760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f7420626520746f6b656e2026206469766964656e6420746f6b656e60448201526516103830b4b960d11b6064820152608401610627565b60006001600160a01b03821661071757506040514790339082156108fc029083906000818181858888f19350505050158015610711573d6000803e3d6000fd5b506107a9565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610743903090600401613341565b60206040518083038186803b15801561075b57600080fd5b505afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610793919061329d565b90506107a96001600160a01b038316338361240a565b7f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b82826040516107da92919061341f565b60405180910390a15050565b336107ef611c5e565b6001600160a01b0316146108155760405162461bcd60e51b815260040161062790613576565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610846903090600401613341565b60206040518083038186803b15801561085e57600080fd5b505afa158015610872573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610896919061329d565b90506000821180156108a85750808211155b6108c45760405162461bcd60e51b815260040161062790613525565b620151806004546108d591906136b6565b6009546108e290426136d5565b11156108f257426009556000600b555b6000612710600360009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561094557600080fd5b505afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d919061329d565b60065461098a91906136b6565b6109949190613696565b90508083600b546109a5919061367e565b1115610a0a5760405162461bcd60e51b815260206004820152602e60248201527f657863656564206d6178696d756d204c50207769746864726177616c206c696d60448201526d697420666f72203330206461797360901b6064820152608401610627565b600354610a21906001600160a01b0316338561240a565b6040518381527f73ce532f480864bd2fccd1bcdbb4c8151f02cd9450c4f3e5b834ef74503abdb2906020015b60405180910390a1505050565b33610a63611c5e565b6001600160a01b031614610a895760405162461bcd60e51b815260040161062790613576565b6001600160a01b03821615801590610aa957506001600160a01b03811615155b610ac55760405162461bcd60e51b8152600401610627906135ab565b60405163523205c160e11b81526001600160a01b0383169063a4640b8290610af1908490600401613341565b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b505050507f7f78141a3bd83bf938eb2a367b5b7e1a1056d8128b3f1809535eed46891c903382826040516107da929190613355565b33610b5d611c5e565b6001600160a01b031614610b835760405162461bcd60e51b815260040161062790613576565b600754479061271090610b9690836136b6565b610ba09190613696565b6002549091506001600160a01b0316610c25578015610c21576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bef573d6000803e3d6000fd5b507f121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf82826040516107da92919061341f565b5050565b8015610ce4576000610c9282600e805480602002602001604051908101604052809291908181526020018280548015610c8757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c69575b505050505030612460565b600254604080516001600160a01b0390921682526020820185905281018290529091507f3a9a9f34f5831e9c8ecb66ab3aa308b2ff31eaca434615f6c9cadc656a9af71c9060600160405180910390a1505b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d15903090600401613341565b60206040518083038186803b158015610d2d57600080fd5b505afa158015610d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d65919061329d565b90508015610e235760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d9f908690859060040161341f565b602060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df191906131aa565b507f121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf8382604051610a4d92919061341f565b505050565b600f8181548110610e3857600080fd5b6000918252602090912001546001600160a01b0316905081565b33610e5b611c5e565b6001600160a01b031614610e815760405162461bcd60e51b815260040161062790613576565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610eb2903090600401613341565b60206040518083038186803b158015610eca57600080fd5b505afa158015610ede573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f02919061329d565b9050600082118015610f145750808211155b610f305760405162461bcd60e51b815260040161062790613525565b62015180600454610f4191906136b6565b600954610f4e90426136d5565b1115610f5e57426009556000600a555b6000612710600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb157600080fd5b505afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe9919061329d565b600554610ff691906136b6565b6110009190613696565b90508083600a54611011919061367e565b11156110735760405162461bcd60e51b815260206004820152602b60248201527f657863656564206d6178696d756d207769746864726177616c206c696d69742060448201526a666f72203330206461797360a81b6064820152608401610627565b60015461108a906001600160a01b0316338561240a565b6040518381527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b5690602001610a4d565b336110c3611c5e565b6001600160a01b0316146110e95760405162461bcd60e51b815260040161062790613576565b6001600160a01b03811661110f5760405162461bcd60e51b81526004016106279061354d565b60075447906127109061112290836136b6565b61112c9190613696565b905080611137575050565b6040805160028082526060820183526000926020830190803683375050600c54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561119c57600080fd5b505afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d49190613022565b816000815181106111f557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061124b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600c5460009116637ff36ab58483858861127d4261025861367e565b6040518663ffffffff1660e01b815260040161129c9493929190613491565b6000604051808303818588803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526112f29190810190613117565b90507f8b20b26dcda038ac2feab95f28f3dd32b371cce650645b63e301421e62386ea084826040516113259291906133d6565b60405180910390a15050505b50565b3361133d611c5e565b6001600160a01b0316146113635760405162461bcd60e51b815260040161062790613576565b600054600160a01b900460ff16156113b35760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610627565b6001600160a01b0384166113d95760405162461bcd60e51b81526004016106279061354d565b6001600160a01b0386166114275760405162461bcd60e51b8152602060048201526015602482015274696e76616c696420746f6b656e206164647265737360581b6044820152606401610627565b6000805460ff60a01b1916600160a01b179055600180546001600160a01b038089166001600160a01b0319928316179092556002805488841692169190911790556040805163c45a015560e01b815290519186169163c45a015591600480820192602092909190829003018186803b1580156114a257600080fd5b505afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da9190613022565b6001600160a01b031663e6a439058460008151811061150957634e487b7160e01b600052603260045260246000fd5b60209081029190910101516001546040516001600160e01b031960e085901b16815261154292916001600160a01b031690600401613355565b60206040518083038186803b15801561155a57600080fd5b505afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115929190613022565b600380546001600160a01b03199081166001600160a01b0393841617909155600c805490911691861691909117905582516115d490600d906020860190612f14565b5081516115e890600e906020850190612f14565b5080516115fc90600f906020840190612f14565b507f4ae045405af58409ab59a9b3af6c2424441a8d0cc7f0d58d675d19073dec75e38686868686866040516116369695949392919061336f565b60405180910390a1505050505050565b3361164f611c5e565b6001600160a01b0316146116755760405162461bcd60e51b815260040161062790613576565b61271081106116965760405162461bcd60e51b8152600401610627906134f9565b60088190556040518181527f71e39bccc2e27c18ea159b9a4fbc08961b9d9583ea143ae3e5021cf6aefb613c906020015b60405180910390a150565b336116db611c5e565b6001600160a01b0316146117015760405162461bcd60e51b815260040161062790613576565b6002546001600160a01b0316158061172957506001546002546001600160a01b039081169116145b1561173057565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611761903090600401613341565b60206040518083038186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b1919061329d565b9050801561133157600061182082600f80548060200260200160405190810160405280929190818152602001828054801561181557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117f7575b505050505030612709565b60408051848152602081018390529192507fb578101e5d792c57de69a936b880873b1c2e9f776134e5a89f463decc7963e1c91016107da565b565b33611864611c5e565b6001600160a01b03161461188a5760405162461bcd60e51b815260040161062790613576565b61271081106118ab5760405162461bcd60e51b8152600401610627906134f9565b60058190556040518181527f0969f79b044617688492c7c9b226129947037ca88c450002a7561ed78aa549ac906020016116c7565b336118e9611c5e565b6001600160a01b03161461190f5760405162461bcd60e51b815260040161062790613576565b6001600160a01b0385166119355760405162461bcd60e51b81526004016106279061354d565b6126de84111561197c5760405162461bcd60e51b81526020600482015260126024820152710bee6d8d2e0e0c2ceca40e8dede40d0d2ced60731b6044820152606401610627565b600c80546001600160a01b0319166001600160a01b038716179055601084905582516119af90600d906020860190612f14565b5081516119c390600e906020850190612f14565b5080516119d790600f906020840190612f14565b507fac823b586c853c1953e323c1189297cec5b2cb4b1316ac35ccf979e1969dbc0f8585858585604051611a0f959493929190613438565b60405180910390a15050505050565b33611a27611c5e565b6001600160a01b031614611a4d5760405162461bcd60e51b815260040161062790613576565b6127108110611a6e5760405162461bcd60e51b8152600401610627906134f9565b60078190556040518181527fcc694eb069971c6c91f6c905b0f66a7a6322a90a42f3904b7508e7b9336a7dfe906020016116c7565b33611aac611c5e565b6001600160a01b031614611ad25760405162461bcd60e51b815260040161062790613576565b61185960006129a3565b600d8181548110610e3857600080fd5b33611af5611c5e565b6001600160a01b031614611b1b5760405162461bcd60e51b815260040161062790613576565b6001600160a01b03821615801590611b3b57506001600160a01b03811615155b611b575760405162461bcd60e51b8152600401610627906135ab565b6000826001600160a01b031663877887826040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9257600080fd5b505afa158015611ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bca919061329d565b604051631036c32960e31b81529091506001600160a01b038416906381b6194890611bfb908590859060040161341f565b600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b505050507f7f78141a3bd83bf938eb2a367b5b7e1a1056d8128b3f1809535eed46891c90338383604051610a4d929190613355565b6000546001600160a01b031690565b33611c76611c5e565b6001600160a01b031614611c9c5760405162461bcd60e51b815260040161062790613576565b6001600160a01b038116611cc25760405162461bcd60e51b81526004016106279061354d565b60405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611cfa573d6000803e3d6000fd5b507fea0c40665f6f46154fd7f8cb0bab49455cd181005581a97e76d29a474de8bfb282826040516107da92919061341f565b33611d35611c5e565b6001600160a01b031614611d5b5760405162461bcd60e51b815260040161062790613576565b600754479061271090611d6e90836136b6565b611d789190613696565b90508015611331576000611de582600d805480602002602001604051908101604052809291908181526020018280548015610c87576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610c6957505050505030612460565b60408051848152602081018390529192507f5af76d43c73e649d671103b29a6b93de2a53abb35bf2600ac3d04b13d413072d91016107da565b600e8181548110610e3857600080fd5b33611e37611c5e565b6001600160a01b031614611e5d5760405162461bcd60e51b815260040161062790613576565b600a811015611e9d5760405162461bcd60e51b815260206004820152600c60248201526b1cdb585b1b081c195c9a5bd960a21b6044820152606401610627565b60048190556040518181527f989f99d0a575dfaf67701aef35b8654442a4705a4bce243d8f81e1bb2bc4a63f906020016116c7565b33611edb611c5e565b6001600160a01b031614611f015760405162461bcd60e51b815260040161062790613576565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611f32903090600401613341565b60206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f82919061329d565b905080156120105760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611fbc903390859060040161341f565b602060405180830381600087803b158015611fd657600080fd5b505af1158015611fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200e91906131aa565b505b6003546040516370a0823160e01b81526001600160a01b03909116906370a0823190612040903090600401613341565b60206040518083038186803b15801561205857600080fd5b505afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612090919061329d565b9050801561211e5760035460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906120ca903390859060040161341f565b602060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c91906131aa565b505b47801561215457604051339082156108fc029083906000818181858888f19350505050158015612152573d6000803e3d6000fd5b505b6040517fcd310f174a338d5afb2b17ebca2bda872a317a1e5ec53f6277803b93e8644eb990600090a15050565b3361218a611c5e565b6001600160a01b0316146121b05760405162461bcd60e51b815260040161062790613576565b6008544790600290612710906121c690846136b6565b6121d09190613696565b6121da9190613696565b9050801561133157600061224782600d805480602002602001604051908101604052809291908181526020018280548015610c87576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610c6957505050505030612460565b60408051848152602081018390529192507f5af76d43c73e649d671103b29a6b93de2a53abb35bf2600ac3d04b13d413072d910160405180910390a1600154600090819081906122a2906001600160a01b03168686306129f3565b604080518381526020810185905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be390606001611a0f565b336122f1611c5e565b6001600160a01b0316146123175760405162461bcd60e51b815260040161062790613576565b61271081106123385760405162461bcd60e51b8152600401610627906134f9565b60068190556040518181527f0eeb4417a0dd5e563056eaf6d3024509bedf001cfac9394bb02f37e3414fa34b906020016116c7565b33612376611c5e565b6001600160a01b03161461239c5760405162461bcd60e51b815260040161062790613576565b6001600160a01b0381166124015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610627565b611331816129a3565b610e238363a9059cbb60e01b848460405160240161242992919061341f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b06565b600c5460405163d06ca61f60e01b815260009182916001600160a01b039091169063d06ca61f9061249790889088906004016135d4565b60006040518083038186803b1580156124af57600080fd5b505afa1580156124c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124eb9190810190613117565b9050600081600183516124fe91906136d5565b8151811061251c57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000856001875161253791906136d5565b8151811061255557634e487b7160e01b600052603260045260246000fd5b602002602001015190506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161258d9190613341565b60206040518083038186803b1580156125a557600080fd5b505afa1580156125b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dd919061329d565b600c546010549192506001600160a01b03169063b6f9de95908a906127109061260690886136b6565b6126109190613696565b8a8a61261e4261025861367e565b6040518663ffffffff1660e01b815260040161263d9493929190613491565b6000604051808303818588803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b50506040516370a0823160e01b8152600093506001600160a01b03861692506370a08231915061269e903090600401613341565b60206040518083038186803b1580156126b657600080fd5b505afa1580156126ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ee919061329d565b90506126fa82826136d5565b955050505050505b9392505050565b600c5460405163d06ca61f60e01b815260009182916001600160a01b039091169063d06ca61f9061274090889088906004016135d4565b60006040518083038186803b15801561275857600080fd5b505afa15801561276c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127949190810190613117565b9050600081600183516127a791906136d5565b815181106127c557634e487b7160e01b600052603260045260246000fd5b6020026020010151905061282a600c60009054906101000a90046001600160a01b0316878760008151811061280a57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316612bd89092919063ffffffff16565b6000856001875161283b91906136d5565b8151811061285957634e487b7160e01b600052603260045260246000fd5b602002602001015190506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016128919190613341565b60206040518083038186803b1580156128a957600080fd5b505afa1580156128bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e1919061329d565b600c546010549192506001600160a01b031690635c11d795908a906127109061290a90886136b6565b6129149190613696565b8a8a6129224261025861367e565b6040518663ffffffff1660e01b81526004016129429594939291906135ed565b600060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03851691506370a082319061269e903090600401613341565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600c5460009081908190612a14906001600160a01b03898116911687612cea565b600c546001600160a01b031663f305d7198789886000808a612a384261025861367e565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ad991906132b5565b600c549295509093509150612afc906001600160a01b0389811691166000612bd8565b9450945094915050565b6000612b5b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d9c9092919063ffffffff16565b805190915015610e235780806020019051810190612b7991906131aa565b610e235760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610627565b801580612c605750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612c0e9030908690600401613355565b60206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5e919061329d565b155b612ccb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610627565b610e238363095ea7b360e01b848460405160240161242992919061341f565b600081846001600160a01b031663dd62ed3e30866040518363ffffffff1660e01b8152600401612d1b929190613355565b60206040518083038186803b158015612d3357600080fd5b505afa158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b919061329d565b612d75919061367e565b9050612d968463095ea7b360e01b858460405160240161242992919061341f565b50505050565b6060612dab8484600085612db3565b949350505050565b606082471015612e145760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610627565b843b612e625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610627565b600080866001600160a01b03168587604051612e7e9190613325565b60006040518083038185875af1925050503d8060008114612ebb576040519150601f19603f3d011682016040523d82523d6000602084013e612ec0565b606091505b5091509150612ed0828286612edb565b979650505050505050565b60608315612eea575081612702565b825115612efa5782518084602001fd5b8160405162461bcd60e51b815260040161062791906134c6565b828054828255906000526020600020908101928215612f69579160200282015b82811115612f6957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612f34565b50612f75929150612f79565b5090565b5b80821115612f755760008155600101612f7a565b600082601f830112612f9e578081fd5b81356020612fb3612fae8361365a565b613629565b80838252828201915082860187848660051b8901011115612fd2578586fd5b855b85811015612ff9578135612fe781613744565b84529284019290840190600101612fd4565b5090979650505050505050565b600060208284031215613017578081fd5b813561270281613744565b600060208284031215613033578081fd5b815161270281613744565b60008060408385031215613050578081fd5b823561305b81613744565b9150602083013561306b81613744565b809150509250929050565b600080600080600060a0868803121561308d578081fd5b853561309881613744565b945060208601359350604086013567ffffffffffffffff808211156130bb578283fd5b6130c789838a01612f8e565b945060608801359150808211156130dc578283fd5b6130e889838a01612f8e565b935060808801359150808211156130fd578283fd5b5061310a88828901612f8e565b9150509295509295909350565b60006020808385031215613129578182fd5b825167ffffffffffffffff81111561313f578283fd5b8301601f8101851361314f578283fd5b805161315d612fae8261365a565b80828252848201915084840188868560051b870101111561317c578687fd5b8694505b8385101561319e578051835260019490940193918501918501613180565b50979650505050505050565b6000602082840312156131bb578081fd5b81518015158114612702578182fd5b60008060008060008060c087890312156131e2578081fd5b86356131ed81613744565b955060208701356131fd81613744565b9450604087013561320d81613744565b9350606087013567ffffffffffffffff80821115613229578283fd5b6132358a838b01612f8e565b9450608089013591508082111561324a578283fd5b6132568a838b01612f8e565b935060a089013591508082111561326b578283fd5b5061327889828a01612f8e565b9150509295509295509295565b600060208284031215613296578081fd5b5035919050565b6000602082840312156132ae578081fd5b5051919050565b6000806000606084860312156132c9578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b8381101561331a5781516001600160a01b0316875295820195908201906001016132f5565b509495945050505050565b600082516133378184602087016136ec565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03878116825286811660208301528516604082015260c0606082018190526000906133a3908301866132e2565b82810360808401526133b581866132e2565b905082810360a08401526133c981856132e2565b9998505050505050505050565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015612ff957845183529383019391830191600101613403565b6001600160a01b03929092168252602082015260400190565b60018060a01b038616815284602082015260a06040820152600061345f60a08301866132e2565b828103606084015261347181866132e2565b9050828103608084015261348581856132e2565b98975050505050505050565b8481526080602082015260006134aa60808301866132e2565b6001600160a01b03949094166040830152506060015292915050565b60208152600082518060208401526134e58160408501602087016136ec565b601f01601f19169190910160400192915050565b602080825260129082015271496e76616c69642070657263656e7461676560701b604082015260600190565b6020808252600e908201526d125b9d985b1a5908105b5bdd5b9d60921b604082015260600190565b6020808252600f908201526e696e76616c6964206164647265737360881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201526e496e76616c6964204164647265737360881b604082015260600190565b828152604060208201526000612dab60408301846132e2565b85815284602082015260a06040820152600061360c60a08301866132e2565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156136525761365261372e565b604052919050565b600067ffffffffffffffff8211156136745761367461372e565b5060051b60200190565b6000821982111561369157613691613718565b500190565b6000826136b157634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156136d0576136d0613718565b500290565b6000828210156136e7576136e7613718565b500390565b60005b838110156137075781810151838201526020016136ef565b83811115612d965750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133157600080fdfea2646970667358221220a5eb10d61e010eea8d177e81873515da96f01fa7b9f87964645e96eaa97e4ffc64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$8.28
Net Worth in ETH
0.00404
Token Allocations
ETH
51.68%
USDT
13.49%
CRV
12.96%
Others
21.86%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 51.68% | $2,051.42 | 0.00208657 | $4.28 | |
| ETH | 13.49% | $0.999681 | 1.118 | $1.12 | |
| ETH | 12.96% | $0.253126 | 4.2421 | $1.07 | |
| ETH | 5.99% | $0.211357 | 2.3463 | $0.4959 | |
| ETH | 4.12% | $0.000103 | 3,330.9951 | $0.3414 | |
| ETH | 4.07% | $0.022504 | 15 | $0.3375 | |
| ETH | 3.50% | $0.104264 | 2.7772 | $0.2895 | |
| ETH | 2.80% | $0.000084 | 2,747.9732 | $0.2321 | |
| ETH | 1.38% | $0.229138 | 0.5 | $0.1145 |
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.