Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 465 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw From Ot... | 316625521 | 321 days ago | IN | 0 ETH | 0.00001795 | ||||
| Deposit Native | 272221225 | 451 days ago | IN | 0.0003 ETH | 0.00000536 | ||||
| Withdraw From Ot... | 267813241 | 464 days ago | IN | 0 ETH | 0.00000515 | ||||
| Withdraw From Ot... | 254132357 | 503 days ago | IN | 0 ETH | 0.00000745 | ||||
| Deposit | 254070149 | 504 days ago | IN | 0 ETH | 0.00000618 | ||||
| Withdraw From Ot... | 253465921 | 505 days ago | IN | 0 ETH | 0.00000504 | ||||
| Withdraw From Ot... | 246845325 | 525 days ago | IN | 0 ETH | 0.00000632 | ||||
| Withdraw From Ot... | 246290330 | 526 days ago | IN | 0 ETH | 0.00000509 | ||||
| Withdraw From Ot... | 233211734 | 564 days ago | IN | 0 ETH | 0.00007303 | ||||
| Withdraw From Ot... | 233210504 | 564 days ago | IN | 0 ETH | 0.0001779 | ||||
| Deposit | 233209695 | 564 days ago | IN | 0 ETH | 0.00027227 | ||||
| Withdraw From Ot... | 231280881 | 570 days ago | IN | 0 ETH | 0.0000054 | ||||
| Withdraw From Ot... | 231108392 | 570 days ago | IN | 0 ETH | 0.00001006 | ||||
| Withdraw From Ot... | 229277906 | 576 days ago | IN | 0 ETH | 0.00000475 | ||||
| Withdraw From Ot... | 228050331 | 579 days ago | IN | 0 ETH | 0.00000597 | ||||
| Withdraw Native | 228050093 | 579 days ago | IN | 0 ETH | 0.00000586 | ||||
| Withdraw From Ot... | 227248320 | 582 days ago | IN | 0 ETH | 0.00000504 | ||||
| Withdraw Native | 227233413 | 582 days ago | IN | 0 ETH | 0.00000596 | ||||
| Withdraw From Ot... | 226679325 | 583 days ago | IN | 0 ETH | 0.00000501 | ||||
| Deposit Native | 224842211 | 589 days ago | IN | 0.03 ETH | 0.00000563 | ||||
| Withdraw From Ot... | 221414327 | 598 days ago | IN | 0 ETH | 0.00000601 | ||||
| Deposit | 221414075 | 598 days ago | IN | 0 ETH | 0.00000605 | ||||
| Withdraw Native | 217573467 | 610 days ago | IN | 0 ETH | 0.00000676 | ||||
| Withdraw Native | 215546611 | 616 days ago | IN | 0 ETH | 0.0000062 | ||||
| Withdraw From Ot... | 212808079 | 624 days ago | IN | 0 ETH | 0.00000428 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 272221225 | 451 days ago | 0.0003 ETH | ||||
| 228050093 | 579 days ago | 0.20490117 ETH | ||||
| 228050093 | 579 days ago | 0.20490117 ETH | ||||
| 227233413 | 582 days ago | 0.03007973 ETH | ||||
| 227233413 | 582 days ago | 0.03007973 ETH | ||||
| 224842211 | 589 days ago | 0.03 ETH | ||||
| 217573467 | 610 days ago | 0.15957552 ETH | ||||
| 217573467 | 610 days ago | 0.15957552 ETH | ||||
| 215546611 | 616 days ago | 0.03212565 ETH | ||||
| 215546611 | 616 days ago | 0.03212565 ETH | ||||
| 204279972 | 649 days ago | 0.032 ETH | ||||
| 197397617 | 669 days ago | 0.04399422 ETH | ||||
| 197397617 | 669 days ago | 0.04399422 ETH | ||||
| 171354960 | 746 days ago | 0.197 ETH | ||||
| 170960381 | 748 days ago | 0.87 ETH | ||||
| 170922683 | 748 days ago | 2.5 ETH | ||||
| 167276466 | 759 days ago | 3.5 ETH | ||||
| 166199326 | 762 days ago | 1.00051054 ETH | ||||
| 166199326 | 762 days ago | 1.00051054 ETH | ||||
| 162373267 | 773 days ago | 0.60047323 ETH | ||||
| 162373267 | 773 days ago | 0.60047323 ETH | ||||
| 160649810 | 778 days ago | 1 ETH | ||||
| 159332003 | 783 days ago | 4.29999999 ETH | ||||
| 159332003 | 783 days ago | 4.29999999 ETH | ||||
| 159331603 | 783 days ago | 4.3 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
import "./Interfaces.sol";
import "@openzeppelin/contracts-0.8/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts-0.8/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts-0.8/utils/Address.sol";
import "@openzeppelin/contracts-0.8/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts-0.8/access/Ownable.sol";
import "@openzeppelin/contracts-0.8/utils/Address.sol";
/**
* @title PoolDepositor
* @author WombexFinance
* @notice Allows to deposit underlying tokens and wrap them in lp tokens
*/
contract PoolDepositor is Ownable {
using SafeERC20 for IERC20;
using Address for address payable;
struct ApprovePool {
address pool;
address[] tokens;
}
address public weth;
address public booster;
address public voterProxy;
address public masterWombat;
mapping (address => uint256) public lpTokenToPid;
/**
* @param _weth WETH
* @param _booster Booster
* @param _masterWombat MasterWombat
*/
constructor(address _weth, address _booster, address _masterWombat) public Ownable() {
weth = _weth;
booster = _booster;
voterProxy = IBooster(_booster).voterProxy();
masterWombat = _masterWombat;
}
function updateBooster() public onlyOwner {
booster = IStaker(voterProxy).operator();
}
/**
* @notice Approve spending of router tokens by pool
* @dev Needs to be done after asset deployment for router to be able to support the tokens
*/
function approveSpendingMultiplePools(uint256[] calldata pids) public onlyOwner {
for (uint256 i; i < pids.length; i++) {
IBooster.PoolInfo memory p = IBooster(booster).poolInfo(pids[i]);
uint256 wmPid = IStaker(voterProxy).lpTokenToPid(p.gauge, p.lptoken);
address[] memory tokens = new address[](2);
tokens[0] = p.lptoken;
tokens[1] = IAsset(p.lptoken).underlyingToken();
address[] memory boosterTokens = new address[](1);
boosterTokens[0] = p.lptoken;
approveSpendingByPool(tokens, IAsset(p.lptoken).pool());
approveSpendingByPool(boosterTokens, booster);
}
}
/**
* @notice Approve spending of router tokens by pool
* @dev Needs to be done after asset deployment for router to be able to support the tokens
* @param tokens array of tokens to be approved
* @param pool to be approved to spend
*/
function approveSpendingByPool(address[] memory tokens, address pool) public onlyOwner {
for (uint256 i; i < tokens.length; i++) {
if (IERC20(tokens[i]).allowance(address(this), pool) != 0) {
IERC20(tokens[i]).safeApprove(pool, 0);
}
IERC20(tokens[i]).safeApprove(pool, type(uint256).max);
}
}
/**
* @notice Approve spending of router tokens by pool and booster
* @dev Needs to be done after asset deployment for router to be able to support the tokens
* @param tokens array of tokens to be approved
* @param pool to be approved to spend
*/
function approveSpendingByPoolAndBooster(address[] memory tokens, address pool) public onlyOwner {
approveSpendingByPool(tokens, pool);
approveSpendingByPool(tokens, booster);
}
function resqueTokens(address[] calldata _tokens, address _recipient) external onlyOwner {
for (uint256 i; i < _tokens.length; i++) {
IERC20(_tokens[i]).safeTransfer(_recipient, IERC20(_tokens[i]).balanceOf(address(this)));
}
}
function resqueNative(address payable _recipient) external onlyOwner {
_recipient.sendValue(address(this).balance);
}
function setBoosterLpTokensPid() external {
uint256 poolLength = IBooster(booster).poolLength();
for (uint256 i = 0; i < poolLength; i++) {
IBooster.PoolInfo memory p = IBooster(booster).poolInfo(i);
lpTokenToPid[p.lptoken] = i;
}
}
receive() external payable {}
function depositNative(address _lptoken, uint256 _minLiquidity, uint256 _deadline, bool _stake) external payable {
uint256 amount = msg.value;
IWETH(weth).deposit{value: amount}();
_deposit(_lptoken, weth, amount, _minLiquidity, _deadline, _stake);
}
function withdrawNative(address _lptoken, address _underlying, uint256 _amount, uint256 _minOut, uint256 _deadline, address payable _recipient) external {
uint256 wethBalanceBefore = IERC20(weth).balanceOf(address(this));
_withdraw(_lptoken, _underlying, _amount, _minOut, _deadline, address(this));
uint256 wethAmount = IERC20(weth).balanceOf(address(this)) - wethBalanceBefore;
IWETH(weth).withdraw(wethAmount);
_recipient.sendValue(wethAmount);
}
function deposit(address _lptoken, uint256 _amount, uint256 _minLiquidity, uint256 _deadline, bool _stake) public {
address underlying = IAsset(_lptoken).underlyingToken();
IERC20(underlying).transferFrom(msg.sender, address(this), _amount);
_deposit(_lptoken, underlying, _amount, _minLiquidity, _deadline, _stake);
}
function _deposit(address _lptoken, address _underlying, uint256 _amount, uint256 _minLiquidity, uint256 _deadline, bool _stake) internal {
address pool = IAsset(_lptoken).pool();
uint256 balanceBefore = IERC20(_lptoken).balanceOf(address(this));
IPool(pool).deposit(_underlying, _amount, _minLiquidity, address(this), _deadline, false);
uint256 resultLpAmount = IERC20(_lptoken).balanceOf(address(this)) - balanceBefore;
IBooster(booster).depositFor(lpTokenToPid[_lptoken], resultLpAmount, _stake, msg.sender);
}
function withdraw(address _lptoken, uint256 _amount, uint256 _minOut, uint256 _deadline, address _recipient) public {
_withdraw(_lptoken, IAsset(_lptoken).underlyingToken(), _amount, _minOut, _deadline, _recipient);
}
function withdrawFromOtherAsset(address _lptoken, address _underlying, uint256 _amount, uint256 _minOut, uint256 _deadline, address _recipient) public {
_withdraw(_lptoken, _underlying, _amount, _minOut, _deadline, _recipient);
}
function _withdraw(address _lptoken, address _underlying, uint256 _amount, uint256 _minOut, uint256 _deadline, address _recipient) internal {
address pool = IAsset(_lptoken).pool();
IBooster.PoolInfo memory p = IBooster(booster).poolInfo(lpTokenToPid[_lptoken]);
IRewards(p.crvRewards).withdraw(_amount, address(this), msg.sender);
address lpTokenUnderlying = IAsset(_lptoken).underlyingToken();
if (lpTokenUnderlying == _underlying) {
IPool(pool).withdraw(_underlying, _amount, _minOut, _recipient, _deadline);
} else {
IPool(pool).withdrawFromOtherAsset(lpTokenUnderlying, _underlying, _amount, _minOut, _recipient, _deadline);
}
}
function getDepositAmountOut(
address _lptoken,
uint256 _amount
) external view returns (uint256 liquidity, uint256 reward) {
address pool = IAsset(_lptoken).pool();
address underlying = IAsset(_lptoken).underlyingToken();
return IPool(pool).quotePotentialDeposit(underlying, _amount);
}
function getTokenDecimals(address _token) public view returns (uint8 decimals) {
try ERC20(_token).decimals() returns (uint8 _decimals) {
decimals = _decimals;
} catch {
decimals = uint8(18);
}
}
function getWithdrawAmountOut(
address _lptoken,
address _tokenOut,
uint256 _amount
) external view returns (uint256 amount, uint256 fee) {
address pool = IAsset(_lptoken).pool();
address lpTokenUnderlying = IAsset(_lptoken).underlyingToken();
(amount, fee) = IPool(pool).quotePotentialWithdraw(lpTokenUnderlying, _amount);
if (_tokenOut != lpTokenUnderlying) {
(amount, ) = IPool(pool).quotePotentialWithdrawFromOtherAsset(lpTokenUnderlying, _tokenOut, _amount);
}
}
}// 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/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// 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 (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/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
// 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
pragma solidity 0.8.11;
import "@openzeppelin/contracts-0.8/token/ERC20/IERC20.sol";
interface IWomDepositor {
function deposit(uint256 _amount, address _stakeAddress) external returns (bool);
}
interface IWETH {
function deposit() external payable;
function withdraw(uint wad) external;
}
interface IAsset is IERC20 {
function underlyingToken() external view returns (address);
function pool() external view returns (address);
function cash() external view returns (uint120);
function liability() external view returns (uint120);
function decimals() external view returns (uint8);
function underlyingTokenDecimals() external view returns (uint8);
function setPool(address pool_) external;
function underlyingTokenBalance() external view returns (uint256);
function transferUnderlyingToken(address to, uint256 amount) external;
function mint(address to, uint256 amount) external;
function burn(address to, uint256 amount) external;
function addCash(uint256 amount) external;
function removeCash(uint256 amount) external;
function addLiability(uint256 amount) external;
function removeLiability(uint256 amount) external;
}
interface IWmxLocker {
struct EarnedData {
address token;
uint256 amount;
}
struct LockedBalance {
uint112 amount;
uint32 unlockTime;
}
function lock(address _account, uint256 _amount) external;
function checkpointEpoch() external;
function epochCount() external view returns (uint256);
function balanceAtEpochOf(uint256 _epoch, address _user) external view returns (uint256 amount);
function totalSupplyAtEpoch(uint256 _epoch) external view returns (uint256 supply);
function queueNewRewards(address _rewardsToken, uint256 reward) external;
function getReward(address _account, bool _stake) external;
function getReward(address _account) external;
function balanceOf(address _account) external view returns (uint256 amount);
function balances(address _account) external view returns (uint112 locked, uint32 nextUnlockIndex);
function claimableRewards(address _account) external view returns (EarnedData[] memory userRewards);
function getVotes(address account) external view returns (uint256);
function getPastVotes(address account, uint256 timestamp) external view returns (uint256 votes);
function lockedBalances(address _user) external view returns (
uint256 total,
uint256 unlockable,
uint256 locked,
LockedBalance[] memory lockData
);
function addReward(address _rewardsToken, address _distributor) external;
function approveRewardDistributor(
address _rewardsToken,
address _distributor,
bool _approved
) external;
function modifyBlacklist(address _account, bool _blacklisted) external;
function setKickIncentive(uint256 _rate, uint256 _delay) external;
function shutdown() external;
function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external;
}
interface IOwnable {
function transferOwnership(address _newOwner) external;
}
interface IRewardsManager {
function onNewRewardToken(address _token) external;
}
interface IWmxLockerExt {
struct LockerRewardData {
uint32 periodFinish;
uint32 lastUpdateTime;
uint96 rewardRate;
uint96 rewardPerTokenStored;
}
function rewardData(address token) external view returns (LockerRewardData memory);
}
interface IBribeVoter {
function vote(IERC20[] calldata _lpVote, int256[] calldata _deltas) external returns (uint256[][] memory bribeRewards);
function votes(address _user, address _lpToken) external view returns (uint256);
function infos(address _lpToken) external view returns (uint104 supplyBaseIndex, uint104 supplyVoteIndex, uint40 nextEpochStartTime, uint128 claimable, bool whitelist, address gaugeManager, address bribe);
function weights(address _lpToken) external view returns (uint128 allocPoint, uint128 voteWeight);
function getUserVotes(address _user, address _lpToken) external view returns (uint256);
}
interface IMasterWombatRewarder {
function rewardTokens() external view returns (address[] memory tokens);
}
interface IExtraRewardsDistributor {
function addReward(address _token, uint256 _amount) external;
}
interface IWomDepositorWrapper {
function getMinOut(uint256, uint256) external view returns (uint256);
function deposit(
uint256,
uint256,
bool,
address _stakeAddress
) external;
}
interface ITokenFactory{
function CreateDepositToken(address) external returns(address);
function CreateBribesVotingToken() external returns(address);
}
interface IBribesRewardFactory {
function CreateBribesRewards(address _stakingToken, address _lptoken, bool _callOperatorOnGetReward) external returns (address);
}
interface IRewards{
function asset() external returns(address);
function stake(address, uint256) external;
function stakeFor(address, uint256) external;
function withdraw(address, uint256) external;
function withdraw(uint256 assets, address receiver, address owner) external;
function exit(address) external;
function getReward(address) external;
function queueNewRewards(address, uint256) external;
function notifyRewardAmount(uint256) external;
function addExtraReward(address) external;
function extraRewardsLength() external view returns (uint256);
function stakingToken() external view returns (address);
function rewardToken() external view returns(address);
function earned(address _token, address _account) external view returns (uint256);
function updateOperatorData(address operator_, uint256 pid_) external;
function setRewardTokenPaused(address token_, bool paused_) external;
function balanceOf(address _account) external view returns (uint256 amount);
function rewardTokensList() external view returns (address[] memory);
function tokenRewards(address _token) external view returns (address token, uint256 periodFinish, uint256 rewardRate, uint256 lastUpdateTime, uint256 rewardPerTokenStored, uint256 queuedRewards, uint256 currentRewards, uint256 historicalRewards, bool paused);
}
interface IGauge {
function notifyRewardAmount(IERC20 token, uint256 amount) external;
}
interface IBribe {
function onVote(
address user,
uint256 newVote,
uint256 originalTotalVotes
) external returns (uint256[] memory rewards);
function pendingTokens(address _user) external view returns (uint256[] memory rewards);
function rewardTokens() external view returns (IERC20[] memory tokens);
function rewardLength() external view returns (uint256);
function rewardInfo(uint256 i) external view returns (IERC20 rewardToken, uint96 tokenPerSec, uint128 accTokenPerShare, uint128 distributedAmount);
}
interface IVe {
function vote(address user, int256 voteDelta) external;
}
interface INftLocker {
function voteBoost(address _account) external view returns (uint256);
}
interface IBribeRewardsPool is IRewards {
function withdrawAndUnwrapFrom(address _from, uint256 _amount, address _claimRecipient) external returns(bool);
function updateBribesConfig(bool _callOperatorOnGetReward) external;
function updateRatioConfig(uint256 _duration, uint256 _maxRewardRatio) external;
}
interface ITokenMinter is IERC20 {
function mint(address,uint256) external;
function burn(address,uint256) external;
function setOperator(address) external;
function updateOperator(address) external;
function getFactAmounMint(uint256 _amount) external view returns(uint256 amount);
}
interface IStaker{
function deposit(address, address) external returns (bool);
function withdraw(address) external returns (uint256);
function withdrawLp(address, address, uint256) external returns (bool);
function withdrawAllLp(address, address) external returns (bool);
function lock(uint256 _lockDays) external;
function releaseLock(uint256 _slot) external returns(uint256);
function getGaugeRewardTokens(address _lptoken, address _gauge) external returns (address[] memory tokens);
function claimCrv(address, uint256) external returns (address[] memory tokens, uint256[] memory balances);
function balanceOfPool(address, address) external view returns (uint256);
function lpTokenToPid(address, address) external view returns (uint256);
function operator() external view returns (address);
function depositor() external view returns (address);
function wom() external view returns (address);
function veWom() external view returns (address);
function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);
function setVote(bytes32 hash, bool valid) external;
function setDepositor(address _depositor) external;
function setOwner(address _owner) external;
}
interface IPool {
function deposit(
address token,
uint256 amount,
uint256 minimumLiquidity,
address to,
uint256 deadline,
bool shouldStake
) external returns (uint256);
function withdraw(
address token,
uint256 liquidity,
uint256 minimumAmount,
address to,
uint256 deadline
) external returns (uint256 amount);
function quotePotentialSwap(
address fromToken,
address toToken,
int256 fromAmount
) external view returns (uint256 potentialOutcome, uint256 haircut);
function quotePotentialDeposit(
address token,
uint256 amount
) external view returns (uint256 liquidity, uint256 reward);
function quotePotentialWithdraw(
address token,
uint256 liquidity
) external view returns (uint256 amount, uint256 fee);
function quotePotentialWithdrawFromOtherAsset(
address fromToken,
address toToken,
uint256 liquidity
) external view virtual returns (uint256 amount, uint256 withdrewAmount);
function withdrawFromOtherAsset(
address fromToken,
address toToken,
uint256 liquidity,
uint256 minimumAmount,
address to,
uint256 deadline
) external returns (uint256 amount);
function swap(
address fromToken,
address toToken,
uint256 fromAmount,
uint256 minimumToAmount,
address to,
uint256 deadline
) external returns (uint256 actualToAmount, uint256 haircut);
function quoteAmountIn(
address fromToken,
address toToken,
int256 toAmount
) external view returns (uint256 amountIn, uint256 haircut);
function addressOfAsset(address token) external view returns (address);
function getTokens() external view returns (address[] memory);
}
interface IWombatRouter {
function getAmountOut(
address[] calldata tokenPath,
address[] calldata poolPath,
int256 amountIn
) external view returns (uint256 amountOut, uint256[] memory haircuts);
/**
* @notice Returns the minimum input asset amount required to buy the given output asset amount
* (accounting for fees and slippage)
* Note: This function should be used as estimation only. The actual swap amount might
* be different due to precision error (the error is typically under 1e-6)
*/
function getAmountIn(
address[] calldata tokenPath,
address[] calldata poolPath,
uint256 amountOut
) external view returns (uint256 amountIn, uint256[] memory haircuts);
function swapExactTokensForTokens(
address[] calldata tokenPath,
address[] calldata poolPath,
uint256 fromAmount,
uint256 minimumToAmount,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function swapExactNativeForTokens(
address[] calldata tokenPath, // the first address should be WBNB
address[] calldata poolPath,
uint256 minimumamountOut,
address to,
uint256 deadline
) external payable returns (uint256 amountOut);
function swapExactTokensForNative(
address[] calldata tokenPath, // the last address should be WBNB
address[] calldata poolPath,
uint256 amountIn,
uint256 minimumamountOut,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function addLiquidityNative(
IPool pool,
uint256 minimumLiquidity,
address to,
uint256 deadline,
bool shouldStake
) external payable returns (uint256 liquidity);
function removeLiquidityNative(
IPool pool,
uint256 liquidity,
uint256 minimumAmount,
address to,
uint256 deadline
) external returns (uint256 amount);
function removeLiquidityFromOtherAssetAsNative(
IPool pool,
address fromToken,
uint256 liquidity,
uint256 minimumAmount,
address to,
uint256 deadline
) external returns (uint256 amount);
}
interface IBooster {
struct PoolInfo {
address lptoken;
address token;
address gauge;
address crvRewards;
bool shutdown;
}
function crv() external view returns (address);
function cvx() external view returns (address);
function owner() external view returns (address);
function voterProxy() external view returns (address);
function earmarkDelegate() external view returns (address);
function poolLength() external view returns (uint256);
function poolInfo(uint256 _pid) external view returns (PoolInfo memory);
function depositFor(uint256 _pid, uint256 _amount, bool _stake, address _receiver) external returns (bool);
function setOwner(address _owner) external;
function setPoolManager(address _poolManager) external;
function voterProxyClaimRewards(uint256 _pid, address[] memory pendingTokens) external returns (uint256[] memory pendingRewards);
function addPool(address _lptoken, address _gauge) external returns (uint256);
function addCreatedPool(address _lptoken, address _gauge, address _token, address _crvRewards) external returns (uint256);
function approveDistribution(address _distro, address[] memory _distributionTokens, uint256 _amount) external;
function approvePoolsCrvRewardsDistribution(address _token) external;
function distributeRewards(uint256 _pid, address _lpToken, address _rewardToken, address[] memory _transferTo, uint256[] memory _transferAmount, bool[] memory _callQueue) external;
function lpPendingRewards(address _lptoken, address _token) external view returns (uint256);
function earmarkRewards(uint256 _pid) external;
function earmarkRewardsIfAvailable(uint256 _pid) external;
function shutdownPool(uint256 _pid) external returns (bool);
function forceShutdownPool(uint256 _pid) external returns (bool);
function gaugeMigrate(address _newGauge, uint256[] memory migratePids) external;
function voteExecute(address _voting, uint256 _value, bytes calldata _data) external returns (bytes memory);
function setVotingValid(address _voting, bool _value) external;
function mintRatio() external view returns (uint256);
function customMintRatio(uint256 _pid) external view returns (uint256);
function crvLockRewards() external view returns (address);
function cvxLocker() external view returns (address);
function minterMint(address _address, uint256 _amount) external returns(bool);
}
interface IBoosterEarmark {
function earmarkIncentive() external view returns (uint256);
function distributionByTokenLength(address _token) external view returns (uint256);
function distributionByTokens(address, uint256) external view returns (address, uint256, bool);
function distributionTokenList() external view returns (address[] memory);
function addPool(address _lptoken, address _gauge) external returns (uint256);
function addCreatedPool(address _lptoken, address _gauge, address _token, address _crvRewards) external returns (uint256);
function isEarmarkAvailable(uint256 _pid) external view returns(bool);
function isEarmarkPoolAvailable(uint256 _pid, IBooster.PoolInfo memory _pool) external view returns (bool);
function earmarkRewards(uint256[] memory _pids) external;
function earmarkPeriod() external view returns (uint256);
function lastEarmarkAt(uint256 pid) external view returns (uint256);
function getEarmarkPoolExecuteOn(uint256 pid) external view returns (uint256);
function getEarmarkPoolExecuteOn(uint256 _pid, IBooster.PoolInfo calldata _pool) external view returns (uint256);
function updateDistributionByTokens(
address _token,
address[] memory _distros,
uint256[] memory _shares,
bool[] memory _callQueue
) external;
}
interface ISwapRouter {
function swapExactTokensForTokens(
address[] calldata tokenPath,
address[] calldata poolPath,
uint256 amountIn,
uint256 minimumamountOut,
address to,
uint256 deadline
) external returns (uint256 amountOut);
function getAmountOut(
address[] calldata tokenPath,
address[] calldata poolPath,
int256 amountIn
) external view returns (uint256 amountOut, uint256[] memory haircuts);
}
interface IWomSwapDepositor {
function pool() external view returns (address);
function deposit(uint256 _amount, address _stakeAddress, uint256 _minAmountOut, uint256 _deadline) external returns (bool);
}
/**
* @dev Interface of the MasterWombatV2
*/
interface IMasterWombatV2 {
function getAssetPid(address asset) external view returns (uint256 pid);
function poolLength() external view returns (uint256);
function pendingTokens(uint256 _pid, address _user)
external
view
returns (
uint256 pendingRewards,
IERC20[] memory bonusTokenAddresses,
string[] memory bonusTokenSymbols,
uint256[] memory pendingBonusRewards
);
function rewarderBonusTokenInfo(uint256 _pid)
external
view
returns (IERC20[] memory bonusTokenAddresses, string[] memory bonusTokenSymbols);
function massUpdatePools() external;
function updatePool(uint256 _pid) external;
function deposit(uint256 _pid, uint256 _amount) external returns (uint256, uint256[] memory);
function multiClaim(uint256[] memory _pids)
external
returns (
uint256 transfered,
uint256[] memory rewards,
uint256[][] memory additionalRewards
);
function withdraw(uint256 _pid, uint256 _amount) external returns (uint256, uint256[] memory);
function emergencyWithdraw(uint256 _pid) external;
function migrate(uint256[] calldata _pids) external;
function depositFor(
uint256 _pid,
uint256 _amount,
address _user
) external;
function updateFactor(address _user, uint256 _newVeWomBalance) external;
function poolInfo(uint256 _pid) external view returns (address lpToken, uint96 allocPoint, IMasterWombatRewarder rewarder, uint256 sumOfFactors, uint104 accWomPerShare, uint104 accWomPerFactorShare, uint40 lastRewardTimestamp);
}
interface IMasterWombatV3 {
struct PoolInfoV3 {
address lpToken; // Address of LP token contract.
////
address rewarder;
uint40 periodFinish;
////
uint128 sumOfFactors; // 20.18 fixed point. the sum of all boosted factors by all of the users in the pool
uint128 rewardRate; // 20.18 fixed point.
////
uint104 accWomPerShare; // 19.12 fixed point. Accumulated WOM per share, times 1e12.
uint104 accWomPerFactorShare; // 19.12 fixed point. Accumulated WOM per factor share
uint40 lastRewardTimestamp;
}
function poolInfoV3(uint256 _index) external view returns (PoolInfoV3 memory);
// Info of each user.
struct UserInfo {
// storage slot 1
uint128 amount; // 20.18 fixed point. How many LP tokens the user has provided.
uint128 factor; // 20.18 fixed point. boosted factor = sqrt (lpAmount * veWom.balanceOf())
// storage slot 2
uint128 rewardDebt; // 20.18 fixed point. Reward debt. See explanation below.
uint128 pendingWom; // 20.18 fixed point. Amount of pending wom
}
function userInfo(uint256 _pid, address _user) external view returns (UserInfo memory);
}{
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 800
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_booster","type":"address"},{"internalType":"address","name":"_masterWombat","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"pool","type":"address"}],"name":"approveSpendingByPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"pool","type":"address"}],"name":"approveSpendingByPoolAndBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"approveSpendingMultiplePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minLiquidity","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"uint256","name":"_minLiquidity","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"depositNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getDepositAmountOut","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTokenDecimals","outputs":[{"internalType":"uint8","name":"decimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getWithdrawAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpTokenToPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterWombat","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"}],"name":"resqueNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"resqueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBoosterLpTokensPid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voterProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawFromOtherAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"address payable","name":"_recipient","type":"address"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200290138038062002901833981016040819052620000349162000174565b6200003f3362000107565b600180546001600160a01b038086166001600160a01b03199283161790925560028054928516929091168217905560408051631ba980b360e01b81529051631ba980b3916004808201926020929091908290030181865afa158015620000a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000cf9190620001be565b600380546001600160a01b039283166001600160a01b0319918216179091556004805493909216921691909117905550620001e39050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200016f57600080fd5b919050565b6000806000606084860312156200018a57600080fd5b620001958462000157565b9250620001a56020850162000157565b9150620001b56040850162000157565b90509250925092565b600060208284031215620001d157600080fd5b620001dc8262000157565b9392505050565b61270e80620001f36000396000f3fe6080604052600436106101845760003560e01c80638d8f82e6116100d6578063dd185d331161007f578063f2fde38b11610059578063f2fde38b14610441578063f80c04a314610461578063fd340c841461048157600080fd5b8063dd185d33146103f9578063e0770b3e14610419578063ec1701a71461042c57600080fd5b8063c6def076116100b0578063c6def07614610399578063d210087b146103b9578063d84ff842146103d957600080fd5b80638d8f82e61461033b5780638da5cb5b1461035b578063b11a49d61461037957600080fd5b80633bd61ba811610138578063715018a611610112578063715018a6146102df578063785c7cf6146102f45780637c8c68251461032657600080fd5b80633bd61ba81461027f5780633fc8cef31461029f578063650739d0146102bf57600080fd5b8063156e1ff411610169578063156e1ff4146102055780631ba980b31461022757806323f78f991461025f57600080fd5b806309d7b245146101905780630ff0bc3b146101ca57600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004612126565b6104a1565b604080519283526020830191909152015b60405180910390f35b3480156101d657600080fd5b506101f76101e5366004612167565b60056020526000908152604090205481565b6040519081526020016101c1565b34801561021157600080fd5b50610225610220366004612184565b610680565b005b34801561023357600080fd5b50600354610247906001600160a01b031681565b6040516001600160a01b0390911681526020016101c1565b34801561026b57600080fd5b5061022561027a366004612230565b6107f5565b34801561028b57600080fd5b50600454610247906001600160a01b031681565b3480156102ab57600080fd5b50600154610247906001600160a01b031681565b3480156102cb57600080fd5b506101b06102da366004612287565b610943565b3480156102eb57600080fd5b50610225610a92565b34801561030057600080fd5b5061031461030f366004612167565b610af8565b60405160ff90911681526020016101c1565b34801561033257600080fd5b50610225610b68565b34801561034757600080fd5b506102256103563660046122fa565b610c83565b34801561036757600080fd5b506000546001600160a01b0316610247565b34801561038557600080fd5b506102256103943660046123be565b610de4565b3480156103a557600080fd5b50600254610247906001600160a01b031681565b3480156103c557600080fd5b506102256103d436600461240e565b61113c565b3480156103e557600080fd5b506102256103f4366004612464565b611231565b34801561040557600080fd5b506102256104143660046122fa565b6112a7565b6102256104273660046124ac565b611322565b34801561043857600080fd5b5061022561139f565b34801561044d57600080fd5b5061022561045c366004612167565b61149f565b34801561046d57600080fd5b5061022561047c366004612167565b611581565b34801561048d57600080fd5b5061022561049c366004612184565b6115ee565b6000806000856001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050891906124f6565b90506000866001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561054a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056e91906124f6565b60405163907448ed60e01b81526001600160a01b038083166004830152602482018890529192509083169063907448ed906044016040805180830381865afa1580156105be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e29190612513565b90945092506001600160a01b03868116908216146106765760405163a4275ceb60e01b81526001600160a01b03828116600483015287811660248301526044820187905283169063a4275ceb906064016040805180830381865afa15801561064e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106729190612513565b5093505b5050935093915050565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed9190612537565b90506106fd8787878787306115f8565b6001546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561074a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076e9190612537565b6107789190612566565b600154604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156107bf57600080fd5b505af11580156107d3573d6000803e3d6000fd5b506107eb925050506001600160a01b038416826118f9565b5050505050505050565b6000546001600160a01b031633146108545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60005b8281101561093d5761092b828585848181106108755761087561257d565b905060200201602081019061088a9190612167565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156108d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f49190612537565b8686858181106109065761090661257d565b905060200201602081019061091b9190612167565b6001600160a01b03169190611a12565b8061093581612593565b915050610857565b50505050565b6000806000846001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906124f6565b90506000856001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1091906124f6565b6040516361858e2360e01b81526001600160a01b03808316600483015260248201889052919250908316906361858e23906044016040805180830381865afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a849190612513565b9350935050505b9250929050565b6000546001600160a01b03163314610aec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b610af66000611aa2565b565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610b54575060408051601f3d908101601f19168201909252610b51918101906125ae565b60015b610b6057506012919050565b90505b919050565b6002546040805163040f1f6d60e11b815290516000926001600160a01b03169163081e3eda9160048083019260209291908290030181865afa158015610bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd69190612537565b905060005b81811015610c7f57600254604051631526fe2760e01b8152600481018390526000916001600160a01b031690631526fe279060240160a060405180830381865afa158015610c2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5191906125d1565b516001600160a01b031660009081526005602052604090208290555080610c7781612593565b915050610bdb565b5050565b6000546001600160a01b03163314610cdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b60005b8251811015610ddf57828181518110610cfb57610cfb61257d565b6020908102919091010151604051636eb1769f60e11b81523060048201526001600160a01b0384811660248301529091169063dd62ed3e90604401602060405180830381865afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d779190612537565b15610db457610db4826000858481518110610d9457610d9461257d565b60200260200101516001600160a01b0316611aff9092919063ffffffff16565b610dcd82600019858481518110610d9457610d9461257d565b80610dd781612593565b915050610ce0565b505050565b6000546001600160a01b03163314610e3e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b60005b81811015610ddf576002546000906001600160a01b0316631526fe27858585818110610e6f57610e6f61257d565b905060200201356040518263ffffffff1660e01b8152600401610e9491815260200190565b60a060405180830381865afa158015610eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed591906125d1565b6003546040828101518351915163bca8b4d160e01b81526001600160a01b03918216600482015291811660248301529293506000929091169063bca8b4d190604401602060405180830381865afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190612537565b6040805160028082526060820183529293506000929091602083019080368337019050509050826000015181600081518110610f9657610f9661257d565b60200260200101906001600160a01b031690816001600160a01b03168152505082600001516001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101c91906124f6565b8160018151811061102f5761102f61257d565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508360000151816000815181106110845761108461257d565b60200260200101906001600160a01b031690816001600160a01b03168152505061110e8285600001516001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035691906124f6565b6002546111259082906001600160a01b0316610c83565b50505050808061113490612593565b915050610e41565b6000856001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a091906124f6565b6040516323b872dd60e01b8152336004820152306024820152604481018790529091506001600160a01b038216906323b872dd906064016020604051808303816000875af11580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190612669565b50611229868287878787611c1b565b505050505050565b6112a085866001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129791906124f6565b868686866115f8565b5050505050565b6000546001600160a01b031633146113015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b61130b8282610c83565b600254610c7f9083906001600160a01b0316610c83565b60015460408051630d0e30db60e41b8152905134926001600160a01b03169163d0e30db091849160048082019260009290919082900301818588803b15801561136a57600080fd5b505af115801561137e573d6000803e3d6000fd5b50506001546112a093508892506001600160a01b0316905083878787611c1b565b6000546001600160a01b031633146113f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b600360009054906101000a90046001600160a01b03166001600160a01b031663570ca7356040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147091906124f6565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b6001600160a01b0381166115755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161084b565b61157e81611aa2565b50565b6000546001600160a01b031633146115db5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b61157e6001600160a01b038216476118f9565b6112298686868686865b6000866001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165c91906124f6565b6002546001600160a01b03898116600090815260056020526040808220549051631526fe2760e01b8152600481019190915293945092911690631526fe279060240160a060405180830381865afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df91906125d1565b6060810151604051632d182be560e21b8152600481018990523060248201523360448201529192506001600160a01b03169063b460af9490606401600060405180830381600087803b15801561173457600080fd5b505af1158015611748573d6000803e3d6000fd5b505050506000886001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b091906124f6565b9050876001600160a01b0316816001600160a01b0316141561185b576040516309a5fca360e01b81526001600160a01b03898116600483015260248201899052604482018890528581166064830152608482018790528416906309a5fca39060a4016020604051808303816000875af1158015611831573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118559190612537565b506118ee565b604051630f91f06f60e01b81526001600160a01b03828116600483015289811660248301526044820189905260648201889052858116608483015260a48201879052841690630f91f06f9060c4016020604051808303816000875af11580156118c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec9190612537565b505b505050505050505050565b804710156119495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161084b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611996576040519150601f19603f3d011682016040523d82523d6000602084013e61199b565b606091505b5050905080610ddf5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161084b565b6040516001600160a01b038316602482015260448101829052610ddf90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e90565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580611b795750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b779190612537565b155b611beb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161084b565b6040516001600160a01b038316602482015260448101829052610ddf90849063095ea7b360e01b90606401611a3e565b6000866001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7f91906124f6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ced9190612537565b604051636281baef60e01b81526001600160a01b038981166004830152602482018990526044820188905230606483015260848201879052600060a483015291925090831690636281baef9060c4016020604051808303816000875af1158015611d5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7f9190612537565b506040516370a0823160e01b815230600482015260009082906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190612537565b611df79190612566565b6002546001600160a01b038b8116600090815260056020526040908190205490516317baa44360e01b8152600481019190915260248101849052871515604482015233606482015292935016906317baa443906084016020604051808303816000875af1158015611e6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec9190612669565b6000611ee5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f759092919063ffffffff16565b805190915015610ddf5780806020019051810190611f039190612669565b610ddf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161084b565b6060611f848484600085611f8e565b90505b9392505050565b6060824710156120065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161084b565b843b6120545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161084b565b600080866001600160a01b0316858760405161207091906126b2565b60006040518083038185875af1925050503d80600081146120ad576040519150601f19603f3d011682016040523d82523d6000602084013e6120b2565b606091505b50915091506120c28282866120cd565b979650505050505050565b606083156120dc575081611f87565b8251156120ec5782518084602001fd5b8160405162461bcd60e51b815260040161084b91906126ce565b6001600160a01b038116811461157e57600080fd5b8035610b6381612106565b60008060006060848603121561213b57600080fd5b833561214681612106565b9250602084013561215681612106565b929592945050506040919091013590565b60006020828403121561217957600080fd5b8135611f8781612106565b60008060008060008060c0878903121561219d57600080fd5b86356121a881612106565b955060208701356121b881612106565b945060408701359350606087013592506080870135915060a08701356121dd81612106565b809150509295509295509295565b60008083601f8401126121fd57600080fd5b50813567ffffffffffffffff81111561221557600080fd5b6020830191508360208260051b8501011115610a8b57600080fd5b60008060006040848603121561224557600080fd5b833567ffffffffffffffff81111561225c57600080fd5b612268868287016121eb565b909450925050602084013561227c81612106565b809150509250925092565b6000806040838503121561229a57600080fd5b82356122a581612106565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122f2576122f26122b3565b604052919050565b6000806040838503121561230d57600080fd5b823567ffffffffffffffff8082111561232557600080fd5b818501915085601f83011261233957600080fd5b813560208282111561234d5761234d6122b3565b8160051b925061235e8184016122c9565b828152928401810192818101908985111561237857600080fd5b948201945b848610156123a2578535935061239284612106565b838252948201949082019061237d565b96506123b1905087820161211b565b9450505050509250929050565b600080602083850312156123d157600080fd5b823567ffffffffffffffff8111156123e857600080fd5b6123f4858286016121eb565b90969095509350505050565b801515811461157e57600080fd5b600080600080600060a0868803121561242657600080fd5b853561243181612106565b9450602086013593506040860135925060608601359150608086013561245681612400565b809150509295509295909350565b600080600080600060a0868803121561247c57600080fd5b853561248781612106565b9450602086013593506040860135925060608601359150608086013561245681612106565b600080600080608085870312156124c257600080fd5b84356124cd81612106565b9350602085013592506040850135915060608501356124eb81612400565b939692955090935050565b60006020828403121561250857600080fd5b8151611f8781612106565b6000806040838503121561252657600080fd5b505080516020909101519092909150565b60006020828403121561254957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561257857612578612550565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156125a7576125a7612550565b5060010190565b6000602082840312156125c057600080fd5b815160ff81168114611f8757600080fd5b600060a082840312156125e357600080fd5b60405160a0810181811067ffffffffffffffff82111715612606576126066122b3565b604052825161261481612106565b8152602083015161262481612106565b6020820152604083015161263781612106565b6040820152606083015161264a81612106565b6060820152608083015161265d81612400565b60808201529392505050565b60006020828403121561267b57600080fd5b8151611f8781612400565b60005b838110156126a1578181015183820152602001612689565b8381111561093d5750506000910152565b600082516126c4818460208701612686565b9190910192915050565b60208152600082518060208401526126ed816040850160208701612686565b601f01601f1916919091016040019291505056fea164736f6c634300080b000a00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab10000000000000000000000000a251fa652b59592e60f4bfbce3cd9cb3d3bd5e900000000000000000000000062a83c6791a3d7950d823bb71a38e47252b6b6f4
Deployed Bytecode
0x6080604052600436106101845760003560e01c80638d8f82e6116100d6578063dd185d331161007f578063f2fde38b11610059578063f2fde38b14610441578063f80c04a314610461578063fd340c841461048157600080fd5b8063dd185d33146103f9578063e0770b3e14610419578063ec1701a71461042c57600080fd5b8063c6def076116100b0578063c6def07614610399578063d210087b146103b9578063d84ff842146103d957600080fd5b80638d8f82e61461033b5780638da5cb5b1461035b578063b11a49d61461037957600080fd5b80633bd61ba811610138578063715018a611610112578063715018a6146102df578063785c7cf6146102f45780637c8c68251461032657600080fd5b80633bd61ba81461027f5780633fc8cef31461029f578063650739d0146102bf57600080fd5b8063156e1ff411610169578063156e1ff4146102055780631ba980b31461022757806323f78f991461025f57600080fd5b806309d7b245146101905780630ff0bc3b146101ca57600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004612126565b6104a1565b604080519283526020830191909152015b60405180910390f35b3480156101d657600080fd5b506101f76101e5366004612167565b60056020526000908152604090205481565b6040519081526020016101c1565b34801561021157600080fd5b50610225610220366004612184565b610680565b005b34801561023357600080fd5b50600354610247906001600160a01b031681565b6040516001600160a01b0390911681526020016101c1565b34801561026b57600080fd5b5061022561027a366004612230565b6107f5565b34801561028b57600080fd5b50600454610247906001600160a01b031681565b3480156102ab57600080fd5b50600154610247906001600160a01b031681565b3480156102cb57600080fd5b506101b06102da366004612287565b610943565b3480156102eb57600080fd5b50610225610a92565b34801561030057600080fd5b5061031461030f366004612167565b610af8565b60405160ff90911681526020016101c1565b34801561033257600080fd5b50610225610b68565b34801561034757600080fd5b506102256103563660046122fa565b610c83565b34801561036757600080fd5b506000546001600160a01b0316610247565b34801561038557600080fd5b506102256103943660046123be565b610de4565b3480156103a557600080fd5b50600254610247906001600160a01b031681565b3480156103c557600080fd5b506102256103d436600461240e565b61113c565b3480156103e557600080fd5b506102256103f4366004612464565b611231565b34801561040557600080fd5b506102256104143660046122fa565b6112a7565b6102256104273660046124ac565b611322565b34801561043857600080fd5b5061022561139f565b34801561044d57600080fd5b5061022561045c366004612167565b61149f565b34801561046d57600080fd5b5061022561047c366004612167565b611581565b34801561048d57600080fd5b5061022561049c366004612184565b6115ee565b6000806000856001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050891906124f6565b90506000866001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561054a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056e91906124f6565b60405163907448ed60e01b81526001600160a01b038083166004830152602482018890529192509083169063907448ed906044016040805180830381865afa1580156105be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e29190612513565b90945092506001600160a01b03868116908216146106765760405163a4275ceb60e01b81526001600160a01b03828116600483015287811660248301526044820187905283169063a4275ceb906064016040805180830381865afa15801561064e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106729190612513565b5093505b5050935093915050565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed9190612537565b90506106fd8787878787306115f8565b6001546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561074a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076e9190612537565b6107789190612566565b600154604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156107bf57600080fd5b505af11580156107d3573d6000803e3d6000fd5b506107eb925050506001600160a01b038416826118f9565b5050505050505050565b6000546001600160a01b031633146108545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60005b8281101561093d5761092b828585848181106108755761087561257d565b905060200201602081019061088a9190612167565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156108d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f49190612537565b8686858181106109065761090661257d565b905060200201602081019061091b9190612167565b6001600160a01b03169190611a12565b8061093581612593565b915050610857565b50505050565b6000806000846001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906124f6565b90506000856001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1091906124f6565b6040516361858e2360e01b81526001600160a01b03808316600483015260248201889052919250908316906361858e23906044016040805180830381865afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a849190612513565b9350935050505b9250929050565b6000546001600160a01b03163314610aec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b610af66000611aa2565b565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610b54575060408051601f3d908101601f19168201909252610b51918101906125ae565b60015b610b6057506012919050565b90505b919050565b6002546040805163040f1f6d60e11b815290516000926001600160a01b03169163081e3eda9160048083019260209291908290030181865afa158015610bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd69190612537565b905060005b81811015610c7f57600254604051631526fe2760e01b8152600481018390526000916001600160a01b031690631526fe279060240160a060405180830381865afa158015610c2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5191906125d1565b516001600160a01b031660009081526005602052604090208290555080610c7781612593565b915050610bdb565b5050565b6000546001600160a01b03163314610cdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b60005b8251811015610ddf57828181518110610cfb57610cfb61257d565b6020908102919091010151604051636eb1769f60e11b81523060048201526001600160a01b0384811660248301529091169063dd62ed3e90604401602060405180830381865afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d779190612537565b15610db457610db4826000858481518110610d9457610d9461257d565b60200260200101516001600160a01b0316611aff9092919063ffffffff16565b610dcd82600019858481518110610d9457610d9461257d565b80610dd781612593565b915050610ce0565b505050565b6000546001600160a01b03163314610e3e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b60005b81811015610ddf576002546000906001600160a01b0316631526fe27858585818110610e6f57610e6f61257d565b905060200201356040518263ffffffff1660e01b8152600401610e9491815260200190565b60a060405180830381865afa158015610eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed591906125d1565b6003546040828101518351915163bca8b4d160e01b81526001600160a01b03918216600482015291811660248301529293506000929091169063bca8b4d190604401602060405180830381865afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190612537565b6040805160028082526060820183529293506000929091602083019080368337019050509050826000015181600081518110610f9657610f9661257d565b60200260200101906001600160a01b031690816001600160a01b03168152505082600001516001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101c91906124f6565b8160018151811061102f5761102f61257d565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508360000151816000815181106110845761108461257d565b60200260200101906001600160a01b031690816001600160a01b03168152505061110e8285600001516001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035691906124f6565b6002546111259082906001600160a01b0316610c83565b50505050808061113490612593565b915050610e41565b6000856001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a091906124f6565b6040516323b872dd60e01b8152336004820152306024820152604481018790529091506001600160a01b038216906323b872dd906064016020604051808303816000875af11580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190612669565b50611229868287878787611c1b565b505050505050565b6112a085866001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129791906124f6565b868686866115f8565b5050505050565b6000546001600160a01b031633146113015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b61130b8282610c83565b600254610c7f9083906001600160a01b0316610c83565b60015460408051630d0e30db60e41b8152905134926001600160a01b03169163d0e30db091849160048082019260009290919082900301818588803b15801561136a57600080fd5b505af115801561137e573d6000803e3d6000fd5b50506001546112a093508892506001600160a01b0316905083878787611c1b565b6000546001600160a01b031633146113f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b600360009054906101000a90046001600160a01b03166001600160a01b031663570ca7356040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147091906124f6565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b6001600160a01b0381166115755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161084b565b61157e81611aa2565b50565b6000546001600160a01b031633146115db5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084b565b61157e6001600160a01b038216476118f9565b6112298686868686865b6000866001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165c91906124f6565b6002546001600160a01b03898116600090815260056020526040808220549051631526fe2760e01b8152600481019190915293945092911690631526fe279060240160a060405180830381865afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df91906125d1565b6060810151604051632d182be560e21b8152600481018990523060248201523360448201529192506001600160a01b03169063b460af9490606401600060405180830381600087803b15801561173457600080fd5b505af1158015611748573d6000803e3d6000fd5b505050506000886001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b091906124f6565b9050876001600160a01b0316816001600160a01b0316141561185b576040516309a5fca360e01b81526001600160a01b03898116600483015260248201899052604482018890528581166064830152608482018790528416906309a5fca39060a4016020604051808303816000875af1158015611831573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118559190612537565b506118ee565b604051630f91f06f60e01b81526001600160a01b03828116600483015289811660248301526044820189905260648201889052858116608483015260a48201879052841690630f91f06f9060c4016020604051808303816000875af11580156118c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec9190612537565b505b505050505050505050565b804710156119495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161084b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611996576040519150601f19603f3d011682016040523d82523d6000602084013e61199b565b606091505b5050905080610ddf5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161084b565b6040516001600160a01b038316602482015260448101829052610ddf90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e90565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580611b795750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b779190612537565b155b611beb5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161084b565b6040516001600160a01b038316602482015260448101829052610ddf90849063095ea7b360e01b90606401611a3e565b6000866001600160a01b03166316f0115b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7f91906124f6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ced9190612537565b604051636281baef60e01b81526001600160a01b038981166004830152602482018990526044820188905230606483015260848201879052600060a483015291925090831690636281baef9060c4016020604051808303816000875af1158015611d5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7f9190612537565b506040516370a0823160e01b815230600482015260009082906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190612537565b611df79190612566565b6002546001600160a01b038b8116600090815260056020526040908190205490516317baa44360e01b8152600481019190915260248101849052871515604482015233606482015292935016906317baa443906084016020604051808303816000875af1158015611e6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec9190612669565b6000611ee5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f759092919063ffffffff16565b805190915015610ddf5780806020019051810190611f039190612669565b610ddf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161084b565b6060611f848484600085611f8e565b90505b9392505050565b6060824710156120065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161084b565b843b6120545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161084b565b600080866001600160a01b0316858760405161207091906126b2565b60006040518083038185875af1925050503d80600081146120ad576040519150601f19603f3d011682016040523d82523d6000602084013e6120b2565b606091505b50915091506120c28282866120cd565b979650505050505050565b606083156120dc575081611f87565b8251156120ec5782518084602001fd5b8160405162461bcd60e51b815260040161084b91906126ce565b6001600160a01b038116811461157e57600080fd5b8035610b6381612106565b60008060006060848603121561213b57600080fd5b833561214681612106565b9250602084013561215681612106565b929592945050506040919091013590565b60006020828403121561217957600080fd5b8135611f8781612106565b60008060008060008060c0878903121561219d57600080fd5b86356121a881612106565b955060208701356121b881612106565b945060408701359350606087013592506080870135915060a08701356121dd81612106565b809150509295509295509295565b60008083601f8401126121fd57600080fd5b50813567ffffffffffffffff81111561221557600080fd5b6020830191508360208260051b8501011115610a8b57600080fd5b60008060006040848603121561224557600080fd5b833567ffffffffffffffff81111561225c57600080fd5b612268868287016121eb565b909450925050602084013561227c81612106565b809150509250925092565b6000806040838503121561229a57600080fd5b82356122a581612106565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122f2576122f26122b3565b604052919050565b6000806040838503121561230d57600080fd5b823567ffffffffffffffff8082111561232557600080fd5b818501915085601f83011261233957600080fd5b813560208282111561234d5761234d6122b3565b8160051b925061235e8184016122c9565b828152928401810192818101908985111561237857600080fd5b948201945b848610156123a2578535935061239284612106565b838252948201949082019061237d565b96506123b1905087820161211b565b9450505050509250929050565b600080602083850312156123d157600080fd5b823567ffffffffffffffff8111156123e857600080fd5b6123f4858286016121eb565b90969095509350505050565b801515811461157e57600080fd5b600080600080600060a0868803121561242657600080fd5b853561243181612106565b9450602086013593506040860135925060608601359150608086013561245681612400565b809150509295509295909350565b600080600080600060a0868803121561247c57600080fd5b853561248781612106565b9450602086013593506040860135925060608601359150608086013561245681612106565b600080600080608085870312156124c257600080fd5b84356124cd81612106565b9350602085013592506040850135915060608501356124eb81612400565b939692955090935050565b60006020828403121561250857600080fd5b8151611f8781612106565b6000806040838503121561252657600080fd5b505080516020909101519092909150565b60006020828403121561254957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561257857612578612550565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156125a7576125a7612550565b5060010190565b6000602082840312156125c057600080fd5b815160ff81168114611f8757600080fd5b600060a082840312156125e357600080fd5b60405160a0810181811067ffffffffffffffff82111715612606576126066122b3565b604052825161261481612106565b8152602083015161262481612106565b6020820152604083015161263781612106565b6040820152606083015161264a81612106565b6060820152608083015161265d81612400565b60808201529392505050565b60006020828403121561267b57600080fd5b8151611f8781612400565b60005b838110156126a1578181015183820152602001612689565b8381111561093d5750506000910152565b600082516126c4818460208701612686565b9190910192915050565b60208152600082518060208401526126ed816040850160208701612686565b601f01601f1916919091016040019291505056fea164736f6c634300080b000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab10000000000000000000000000a251fa652b59592e60f4bfbce3cd9cb3d3bd5e900000000000000000000000062a83c6791a3d7950d823bb71a38e47252b6b6f4
-----Decoded View---------------
Arg [0] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
Arg [1] : _booster (address): 0x0A251FA652B59592E60f4bfBce3cD9Cb3d3bd5E9
Arg [2] : _masterWombat (address): 0x62A83C6791A3d7950D823BB71a38e47252b6b6F4
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [1] : 0000000000000000000000000a251fa652b59592e60f4bfbce3cd9cb3d3bd5e9
Arg [2] : 00000000000000000000000062a83c6791a3d7950d823bb71a38e47252b6b6f4
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.