More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 509 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 18736135 | 390 days ago | IN | 0 ETH | 0.00872109 | ||||
Withdraw | 18719364 | 393 days ago | IN | 0 ETH | 0.0059249 | ||||
Withdraw | 18694072 | 396 days ago | IN | 0 ETH | 0.00574069 | ||||
Withdraw | 18690400 | 397 days ago | IN | 0 ETH | 0.00389049 | ||||
Withdraw | 18688669 | 397 days ago | IN | 0 ETH | 0.00444732 | ||||
Withdraw | 18688635 | 397 days ago | IN | 0 ETH | 0.00415116 | ||||
Withdraw | 18688445 | 397 days ago | IN | 0 ETH | 0.00528832 | ||||
Withdraw | 18688390 | 397 days ago | IN | 0 ETH | 0.00484343 | ||||
Withdraw | 18684392 | 398 days ago | IN | 0 ETH | 0.00400738 | ||||
Withdraw | 18671889 | 399 days ago | IN | 0 ETH | 0.00875989 | ||||
Withdraw | 18657066 | 401 days ago | IN | 0 ETH | 0.00602805 | ||||
Withdraw | 18656329 | 402 days ago | IN | 0 ETH | 0.00402749 | ||||
Withdraw | 18651518 | 402 days ago | IN | 0 ETH | 0.00333677 | ||||
Withdraw | 18650128 | 402 days ago | IN | 0 ETH | 0.00505678 | ||||
Withdraw | 18646467 | 403 days ago | IN | 0 ETH | 0.00258558 | ||||
Withdraw | 18643324 | 403 days ago | IN | 0 ETH | 0.00489206 | ||||
Withdraw | 18640387 | 404 days ago | IN | 0 ETH | 0.00463562 | ||||
Deposit | 18633270 | 405 days ago | IN | 0 ETH | 0.00414844 | ||||
Withdraw | 18618643 | 407 days ago | IN | 0 ETH | 0.00397545 | ||||
Deposit | 18607273 | 408 days ago | IN | 0 ETH | 0.00310926 | ||||
Deposit | 18604048 | 409 days ago | IN | 0 ETH | 0.00215146 | ||||
Withdraw | 18598042 | 410 days ago | IN | 0 ETH | 0.00244739 | ||||
Withdraw | 18585056 | 412 days ago | IN | 0 ETH | 0.00574892 | ||||
Withdraw | 18577762 | 413 days ago | IN | 0 ETH | 0.00545819 | ||||
Deposit | 18576480 | 413 days ago | IN | 0 ETH | 0.003974 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MeowlFeeSharingWithCompounding
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {IERC20, SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IUniswapV2Router02} from "./interfaces/IUniswapV2Router02.sol"; import {IRewardsDistribution} from "./interfaces/IRewardsDistribution.sol"; /** * @title MeowlFeeSharingWithCompounding * @notice It sells WETH to MEOWL using Uniswap V2. * @dev Prime shares represent the number of shares in the FeeSharingSystem. When not specified, shares represent secondary shares in this contract. */ contract MeowlFeeSharingWithCompounding is Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; // Maximum buffer between 2 harvests (in blocks) uint256 public constant MAXIMUM_HARVEST_BUFFER_BLOCKS = 6500; // FeeSharingSystem (handles the distribution of WETH for MEOWL stakers) IRewardsDistribution public immutable feeSharingSystem; // Router of Uniswap v2 IUniswapV2Router02 public immutable uniswapRouter; // Minimum deposit in MEOWL (it is derived from the FeeSharingSystem) uint256 public immutable MINIMUM_DEPOSIT_MEOWL; // Meowl Token (MEOWL) IERC20 public immutable meowl; // Reward token (WETH) IERC20 public immutable rewardToken; // Whether harvest and WETH selling is triggered automatically at user action bool public canHarvest; // Buffer between two harvests (in blocks) uint256 public harvestBufferBlocks; // Last user action block uint256 public lastHarvestBlock; // Maximum price of MEOWL (in WETH) multiplied 1e18 (e.g., 0.0004 ETH --> 4e14) uint256 public maxPriceMEOWLInWETH; // Threshold amount (in rewardToken) uint256 public thresholdAmount; // Total number of shares outstanding uint256 public totalShares; // Keeps track of number of user shares mapping(address => uint256) public userInfo; event ConversionToMEOWL(uint256 amountSold, uint256 amountReceived); event Deposit(address indexed user, uint256 amount); event FailedConversion(); event HarvestStart(); event HarvestStop(); event NewHarvestBufferBlocks(uint256 harvestBufferBlocks); event NewMaximumPriceMEOWLInWETH(uint256 maxPriceMEOWLInWETH); event NewThresholdAmount(uint256 thresholdAmount); event Withdraw(address indexed user, uint256 amount); /** * @notice Constructor * @param _feeSharingSystem address of the fee sharing system contract * @param _uniswapRouter address of the Uniswap v2 router */ constructor(address _feeSharingSystem, address _uniswapRouter) { address meowlTokenAddress = address( IRewardsDistribution(_feeSharingSystem).stakingToken() ); address rewardTokenAddress = address( IRewardsDistribution(_feeSharingSystem).rewardsToken() ); meowl = IERC20(meowlTokenAddress); rewardToken = IERC20(rewardTokenAddress); feeSharingSystem = IRewardsDistribution(_feeSharingSystem); uniswapRouter = IUniswapV2Router02(_uniswapRouter); IERC20(meowlTokenAddress).approve(_feeSharingSystem, type(uint256).max); IERC20(rewardTokenAddress).approve(_uniswapRouter, type(uint256).max); MINIMUM_DEPOSIT_MEOWL = 10 ** 18; } /** * @notice Deposit MEOWL tokens * @param amount amount to deposit (in MEOWL) * @dev There is a limit of 1 MEOWL per deposit to prevent potential manipulation of the shares */ function deposit(uint256 amount) external nonReentrant whenNotPaused { require( amount >= MINIMUM_DEPOSIT_MEOWL, "Deposit: Amount must be >= 1 MEOWL" ); if ( block.number > (lastHarvestBlock + harvestBufferBlocks) && canHarvest && totalShares != 0 ) { _harvestAndSellAndCompound(); } // Transfer MEOWL tokens to this address meowl.safeTransferFrom(msg.sender, address(this), amount); // Fetch the total number of MEOWL staked by this contract uint256 totalAmountStaked = feeSharingSystem.balanceOf(address(this)); uint256 currentShares = totalShares == 0 ? amount : (amount * totalShares) / totalAmountStaked; require(currentShares != 0, "Deposit: Fail"); // Adjust number of shares for user/total userInfo[msg.sender] += currentShares; totalShares += currentShares; // Deposit to FeeSharingSystem contract feeSharingSystem.stake(amount); emit Deposit(msg.sender, amount); } /** * @notice Redeem shares for MEOWL tokens * @param shares number of shares to redeem */ function withdraw(uint256 shares) external nonReentrant { require( (shares > 0) && (shares <= userInfo[msg.sender]), "Withdraw: Shares equal to 0 or larger than user shares" ); _withdraw(shares); } /** * @notice Withdraw all shares of sender */ function withdrawAll() external nonReentrant { require(userInfo[msg.sender] > 0, "Withdraw: Shares equal to 0"); _withdraw(userInfo[msg.sender]); } /** * @notice Harvest pending WETH, sell them to MEOWL, and deposit MEOWL (if possible) * @dev Only callable by owner. */ function harvestAndSellAndCompound() external nonReentrant onlyOwner { require(totalShares != 0, "Harvest: No share"); require(block.number != lastHarvestBlock, "Harvest: Already done"); _harvestAndSellAndCompound(); } /** * @notice Adjust allowance if necessary * @dev Only callable by owner. */ function checkAndAdjustMEOWLTokenAllowanceIfRequired() external onlyOwner { meowl.approve(address(feeSharingSystem), type(uint256).max); } /** * @notice Adjust allowance if necessary * @dev Only callable by owner. */ function checkAndAdjustRewardTokenAllowanceIfRequired() external onlyOwner { rewardToken.approve(address(uniswapRouter), type(uint256).max); } /** * @notice Update harvest buffer block * @param _newHarvestBufferBlocks buffer in blocks between two harvest operations * @dev Only callable by owner. */ function updateHarvestBufferBlocks( uint256 _newHarvestBufferBlocks ) external onlyOwner { require( _newHarvestBufferBlocks <= MAXIMUM_HARVEST_BUFFER_BLOCKS, "Owner: Must be below MAXIMUM_HARVEST_BUFFER_BLOCKS" ); harvestBufferBlocks = _newHarvestBufferBlocks; emit NewHarvestBufferBlocks(_newHarvestBufferBlocks); } /** * @notice Start automatic harvest/selling transactions * @dev Only callable by owner */ function startHarvest() external onlyOwner { canHarvest = true; emit HarvestStart(); } /** * @notice Stop automatic harvest transactions * @dev Only callable by owner */ function stopHarvest() external onlyOwner { canHarvest = false; emit HarvestStop(); } /** * @notice Update maximum price of MEOWL in WETH * @param _newMaxPriceMEOWLInWETH new maximum price of MEOWL in WETH times 1e18 * @dev Only callable by owner */ function updateMaxPriceOfMEOWInWETH( uint256 _newMaxPriceMEOWLInWETH ) external onlyOwner { maxPriceMEOWLInWETH = _newMaxPriceMEOWLInWETH; emit NewMaximumPriceMEOWLInWETH(_newMaxPriceMEOWLInWETH); } /** * @notice Adjust threshold amount for periodic Uniswap v3 WETH --> MEOWL conversion * @param _newThresholdAmount new threshold amount (in WETH) * @dev Only callable by owner */ function updateThresholdAmount( uint256 _newThresholdAmount ) external onlyOwner { thresholdAmount = _newThresholdAmount; emit NewThresholdAmount(_newThresholdAmount); } /** * @notice Pause * @dev Only callable by owner */ function pause() external onlyOwner whenNotPaused { _pause(); } /** * @notice Unpause * @dev Only callable by owner */ function unpause() external onlyOwner whenPaused { _unpause(); } /** * @notice Calculate price of one share (in MEOWL token) * Share price is expressed times 1e18 */ function calculateSharePriceInMEOWL() external view returns (uint256) { uint256 totalAmountStakedWithAggregator = feeSharingSystem.balanceOf( address(this) ); return totalShares == 0 ? MINIMUM_DEPOSIT_MEOWL : (totalAmountStakedWithAggregator * MINIMUM_DEPOSIT_MEOWL) / (totalShares); } /** * @notice Calculate price of one share (in prime share) * Share price is expressed times 1e18 */ function calculateSharePriceInPrimeShare() external view returns (uint256) { uint256 totalNumberPrimeShares = feeSharingSystem.balanceOf( address(this) ); return totalShares == 0 ? MINIMUM_DEPOSIT_MEOWL : (totalNumberPrimeShares * MINIMUM_DEPOSIT_MEOWL) / totalShares; } /** * @notice Calculate shares value of a user (in MEOWL) * @param user address of the user */ function calculateSharesValueInMEOWL( address user ) external view returns (uint256) { uint256 totalAmountStakedWithAggregator = feeSharingSystem.balanceOf( address(this) ); return totalShares == 0 ? 0 : (totalAmountStakedWithAggregator * userInfo[user]) / totalShares; } /** * @notice Harvest pending WETH, sell them to MEOWL, and deposit MEOWL (if possible) */ function _harvestAndSellAndCompound() internal { // Try/catch to prevent revertions if nothing to harvest try feeSharingSystem.getReward() {} catch {} uint256 amountToSell = rewardToken.balanceOf(address(this)); if (amountToSell >= thresholdAmount) { bool isExecuted = _sellRewardTokenToMEOWL(amountToSell); if (isExecuted) { uint256 adjustedAmount = meowl.balanceOf(address(this)); if (adjustedAmount >= MINIMUM_DEPOSIT_MEOWL) { feeSharingSystem.stake(adjustedAmount); } } } // Adjust last harvest block lastHarvestBlock = block.number; } /** * @notice Sell WETH to MEOWL * @param _amount amount of rewardToken to convert (WETH) * @return whether the transaction went through */ function _sellRewardTokenToMEOWL(uint256 _amount) internal returns (bool) { uint256 amountOutMinimum = maxPriceMEOWLInWETH != 0 ? (_amount * 1e18) / maxPriceMEOWLInWETH : 0; address[] memory path = new address[](2); path[0] = address(rewardToken); path[1] = address(meowl); uint startBal = meowl.balanceOf(address(this)); // Swap try uniswapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( _amount, amountOutMinimum, path, address(this), block.timestamp ) { uint amountOut = meowl.balanceOf(address(this)) - startBal; emit ConversionToMEOWL(_amount, amountOut); return true; } catch { emit FailedConversion(); return false; } } /** * @notice Withdraw shares * @param _shares number of shares to redeem * @dev The difference between the two snapshots of MEOWL balances is used to know how many tokens to transfer to user. */ function _withdraw(uint256 _shares) internal { if ( block.number > (lastHarvestBlock + harvestBufferBlocks) && canHarvest ) { _harvestAndSellAndCompound(); } // Take snapshot of current MEOWL balance uint256 previousBalanceMEOWL = meowl.balanceOf(address(this)); // Fetch total number of prime shares uint256 totalNumberPrimeShares = feeSharingSystem.balanceOf( address(this) ); // Calculate number of prime shares to redeem based on existing shares (from this contract) uint256 currentNumberPrimeShares = (totalNumberPrimeShares * _shares) / totalShares; // Adjust number of shares for user/total userInfo[msg.sender] -= _shares; totalShares -= _shares; // Withdraw amount equivalent in prime shares feeSharingSystem.withdraw(currentNumberPrimeShares); // Calculate the difference between the current balance of MEOWL with the previous snapshot uint256 amountToTransfer = meowl.balanceOf(address(this)) - previousBalanceMEOWL; // Transfer the MEOWL amount back to user meowl.safeTransfer(msg.sender, amountToTransfer); emit Withdraw(msg.sender, amountToTransfer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-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.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IRewardsDistribution { function notifyRewardAmount(uint256 reward) external; function totalSupply() external view returns (uint256); function stakingToken() external view returns (IERC20); function rewardsToken() external view returns (IERC20); function balanceOf(address account) external view returns (uint256); function stake(uint256 amount) external; function withdraw(uint256 amount) external; function getReward() external; }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.19; interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_feeSharingSystem","type":"address"},{"internalType":"address","name":"_uniswapRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReceived","type":"uint256"}],"name":"ConversionToMEOWL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[],"name":"FailedConversion","type":"event"},{"anonymous":false,"inputs":[],"name":"HarvestStart","type":"event"},{"anonymous":false,"inputs":[],"name":"HarvestStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"harvestBufferBlocks","type":"uint256"}],"name":"NewHarvestBufferBlocks","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPriceMEOWLInWETH","type":"uint256"}],"name":"NewMaximumPriceMEOWLInWETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"thresholdAmount","type":"uint256"}],"name":"NewThresholdAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAXIMUM_HARVEST_BUFFER_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_DEPOSIT_MEOWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateSharePriceInMEOWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateSharePriceInPrimeShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateSharesValueInMEOWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkAndAdjustMEOWLTokenAllowanceIfRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkAndAdjustRewardTokenAllowanceIfRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeSharingSystem","outputs":[{"internalType":"contract IRewardsDistribution","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestAndSellAndCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestBufferBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceMEOWLInWETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"meowl","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"thresholdAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newHarvestBufferBlocks","type":"uint256"}],"name":"updateHarvestBufferBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxPriceMEOWLInWETH","type":"uint256"}],"name":"updateMaxPriceOfMEOWInWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newThresholdAmount","type":"uint256"}],"name":"updateThresholdAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040818152346200031157808262002064803803809162000024828562000316565b83398101031262000311576200003a8262000350565b916200004a602080920162000350565b60008054845192956001600160a01b0391829190338382167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08780a36001600160a81b0319163360ff60a01b1916178455600180556372f702f360e01b855216928481600481875afa90811562000307579082918491620002e5575b501692855163d1af0c7d60e01b81528581600481855afa908115620002db579083918591620002a7575b5016918460e052610100978389528260805216918260a052865163095ea7b360e01b9283825260048201528681604481886000199a8b60248401525af180156200029d576044928895949287926200027b575b50895197889586948552600485015260248401525af19081156200027057506200023b575b5050670de0b6b3a764000060c05251611cc39182620003a18339608051828181610572015281816107fd01528181610a6c01528181610f28015281816113cc015281816114ac0152611a4a015260a0518281816101c001528181610ab001526117c3015260c0518281816104b201528181610944015281816114120152818161143d01526115ba015260e05182818161040c0152818161053b01528181610f6201528181611586015281816117610152611a020152518181816101fa015281816102790152818161151401526117370152f35b816200025f92903d1062000268575b62000256818362000316565b81019062000386565b50388062000168565b503d6200024a565b8451903d90823e3d90fd5b6200029590873d8911620002685762000256818362000316565b503862000143565b88513d87823e3d90fd5b620002cc9150873d8911620002d3575b620002c3818362000316565b81019062000365565b38620000f0565b503d620002b7565b87513d86823e3d90fd5b620003009150863d8811620002d357620002c3818362000316565b38620000c6565b86513d85823e3d90fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200033a57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200031157565b908160209103126200031157516001600160a01b0381168103620003115790565b90816020910312620003115751801515810362000311579056fe60406080815260048036101561001457600080fd5b600091823560e01c8381630292ac0e14610ef457508063056f7a0f14610e485780630a738779146103d35780631064ac1514610e24578063130180de14610d6f57806314b74d9a14610d515780631959a00214610d1757806328f4dbb614610cf85780632e1a7d4d14610c4b5780633a98ef3914610c2c5780633f4ba83a14610bcb5780635c975abb14610ba657806363583eb714610b875780637067859114610b39578063715018a614610adf578063735de9f714610a9b5780637f085fd114610a575780638456cb59146109f0578063853828b614610967578063871e5aa71461092c5780638b2aa5971461090f5780638da5cb5b146108e7578063b10aa43a1461089d578063b22c1189146107b7578063b3e7860814610798578063b6b55f2514610489578063db200bfa1461043b578063df54439b146103f7578063eb8c5d9c146103d3578063f2fde38b146102fc578063f7b00553146102ac578063f7c618c1146102645763fca3f55b1461018d57600080fd5b8291346102605782600319360112610260576020906101aa610f94565b825163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692820192909252600019602482015293849160449183917f0000000000000000000000000000000000000000000000000000000000000000165af1908115610257575061022c575080f35b61024c9060203d8111610250575b6102448183611039565b81019061112b565b5080f35b503d61023a565b513d84823e3d90fd5b5050fd5b8382346102a857816003193601126102a857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b83346102f957806003193601126102f9576102c5610f94565b600160ff1960025416176002557fd1051920bdffd26b2c190ffd77161a6611db762e9d0b4c2b87681f6a45af75ec8180a180f35b80fd5b50346103cf5760203660031901126103cf576001600160a01b038235818116939192908490036103cb5761032e610f94565b8315610379575050600054826bffffffffffffffffffffffff60a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8480fd5b8280fd5b8382346102a857816003193601126102a8576020906103f06113b1565b9051908152f35b8382346102a857816003193601126102a857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5090346103cf5760203660031901126103cf577f0c5f835c1112970802d2e3848cc0541d14975686d176cfc3439b7ac0a9ee28d091602091359061047d610f94565b8160065551908152a180f35b50346103cf5760209081600319360112610794578235926104a86110d5565b6104b061108e565b7f00000000000000000000000000000000000000000000000000000000000000008410610748576104e5815460035490610fec565b43118061073c575b80610731575b610724575b81516323b872dd60e01b848201523360248201523060448201526064808201869052815260a0810167ffffffffffffffff81118282101761071157835261055f907f0000000000000000000000000000000000000000000000000000000000000000611148565b81516370a0823160e01b815230818301527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691908481602481865afa9081156107075787916106d6575b5060075490816106bf575050845b801561068c57906105eb8792338452600887528584206105e1828254610fec565b9055600754610fec565b600755823b156102a85760248691838651958694859363534a7e1d60e11b85528401525af180156106825761064d575b50907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91519283523392a26001805580f35b9361067a7fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c93929561100f565b93909161061b565b82513d87823e3d90fd5b835162461bcd60e51b8152808301869052600d60248201526c11195c1bdcda5d0e8811985a5b609a1b6044820152606490fd5b6106cc6106d1928861105b565b61106e565b6105c0565b90508481813d8311610700575b6106ed8183611039565b810103126106fc5751386105b2565b8680fd5b503d6106e3565b84513d89823e3d90fd5b634e487b7160e01b875260418352602487fd5b61072c6114a2565b6104f8565b5060075415156104f3565b5060ff600254166104ed565b82608492519162461bcd60e51b8352820152602260248201527f4465706f7369743a20416d6f756e74206d757374206265203e3d2031204d454f60448201526115d360f21b6064820152fd5b8380fd5b8382346102a857816003193601126102a8576020906003549051908152f35b5082346102f957602092836003193601126102a8576001600160a01b038135818116929083900361079457859060248651809481936370a0823160e01b835230908301527f0000000000000000000000000000000000000000000000000000000000000000165afa908115610893578391610866575b50836007549283156000146108485750505050905b51908152f35b90846106cc939261086096526008885220549061105b565b90610842565b90508481813d831161088c575b61087d8183611039565b810103126103cf57518561082d565b503d610873565b84513d85823e3d90fd5b83346102f957806003193601126102f9576108b6610f94565b60ff19600254166002557fac2c97b84646af77f8f38b20c67f88e77b613bb18dcff8dada6d85fc46bbb6858180a180f35b8382346102a857816003193601126102a857905490516001600160a01b039091168152602090f35b8382346102a857816003193601126102a857602090516119648152f35b8382346102a857816003193601126102a857602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5090346103cf57826003193601126103cf576109816110d5565b338352600860205281832054156109ae57506109a79033835260086020528220546119c3565b6001805580f35b6020606492519162461bcd60e51b8352820152601b60248201527f57697468647261773a2053686172657320657175616c20746f203000000000006044820152fd5b8382346102a857816003193601126102a85760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610a2e610f94565b610a3661108e565b610a3e61108e565b835460ff60a01b1916600160a01b17845551338152a180f35b8382346102a857816003193601126102a857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b8382346102a857816003193601126102a857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b83346102f957806003193601126102f957610af8610f94565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5090346103cf5760203660031901126103cf577f027061b81be353405da713893b16979d95fbd57b148f60b8837fcab321d04067916020913590610b7b610f94565b8160055551908152a180f35b8382346102a857816003193601126102a8576020906005549051908152f35b8382346102a857816003193601126102a85760ff6020925460a01c1690519015158152f35b8382346102a857816003193601126102a85760207f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610c09610f94565b610c11611365565b610c19611365565b835460ff60a01b1916845551338152a180f35b8382346102a857816003193601126102a8576020906007549051908152f35b5090346103cf5760203660031901126103cf57803591610c696110d5565b82151580610ce3575b15610c8157836109a7846119c3565b906020608492519162461bcd60e51b8352820152603660248201527f57697468647261773a2053686172657320657175616c20746f2030206f72206c6044820152756172676572207468616e20757365722073686172657360501b6064820152fd5b50338452600860205280842054831115610c72565b8382346102a857816003193601126102a8576020906006549051908152f35b5090346103cf5760203660031901126103cf57356001600160a01b038116908190036103cf57828291602094526008845220549051908152f35b5090346103cf57826003193601126103cf5760209250549051908152f35b50346103cf5760203660031901126103cf57813591610d8c610f94565b6119648311610dc75750816020917f6d7e6751f19ef9993001812d2c797cbadcd5d28801195fc8865e1f89210388789360035551908152a180f35b6020608492519162461bcd60e51b8352820152603260248201527f4f776e65723a204d7573742062652062656c6f77204d4158494d554d5f484152604482015271564553545f4255464645525f424c4f434b5360701b6064820152fd5b8382346102a857816003193601126102a85760209060ff6002541690519015158152f35b50346103cf57826003193601126103cf57610e616110d5565b610e69610f94565b60075415610ebd5781544314610e8257826109a76114a2565b906020606492519162461bcd60e51b83528201526015602482015274486172766573743a20416c726561647920646f6e6560581b6044820152fd5b906020606492519162461bcd60e51b83528201526011602482015270486172766573743a204e6f20736861726560781b6044820152fd5b92905034610260578260031936011261026057602090610f12610f94565b825163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692820192909252600019602482015293849160449183917f0000000000000000000000000000000000000000000000000000000000000000165af1908115610257575061022c575080f35b6000546001600160a01b03163303610fa857565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b91908201809211610ff957565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff811161102357604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761102357604052565b81810292918115918404141715610ff957565b8115611078570490565b634e487b7160e01b600052601260045260246000fd5b60ff60005460a01c1661109d57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b6002600154146110e6576002600155565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b90816020910312611143575180151581036111435790565b600080fd5b6040805167ffffffffffffffff94936001600160a01b03909316929091820185811183821017611023576040526020928383527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564848401526000808386829551910182855af1903d15611284573d968711611270576111e8949596604051906111da88601f19601f8401160183611039565b81528093873d92013e611291565b805190828215928315611258575b505050156112015750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b611268935082018101910161112b565b3882816111f6565b634e487b7160e01b83526041600452602483fd5b91506111e8939495506060915b919290156112f357508151156112a5575090565b3b156112ae5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156113065750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061134c575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350611329565b60ff60005460a01c161561137557565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561149657600091611465575b50600754806114345750507f000000000000000000000000000000000000000000000000000000000000000090565b6106cc611462927f00000000000000000000000000000000000000000000000000000000000000009061105b565b90565b906020823d821161148e575b8161147e60209383611039565b810103126102f957505138611405565b3d9150611471565b6040513d6000823e3d90fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116803b1561114357604090815192631e8c5c8960e11b8452600093848160048183875af16116a6575b5082516370a0823160e01b8082523060048301526020929183816024817f000000000000000000000000000000000000000000000000000000000000000087165afa90811561169c57879161166f575b5060065481101561155e575b5050505050505043600455565b611567906116c6565b611572575b80611551565b8290602486518094819382523060048301527f0000000000000000000000000000000000000000000000000000000000000000165afa918215611665578592611637575b50507f00000000000000000000000000000000000000000000000000000000000000008110156115e8575b808061156c565b813b156107945782916024859492859351958693849263534a7e1d60e11b845260048401525af19081156102575750611623575b80806115e1565b61162d829161100f565b6102f9578061161c565b90809250813d831161165e575b61164e8183611039565b81010312611143575138806115b6565b503d611644565b84513d87823e3d90fd5b90508381813d8311611695575b6116868183611039565b81010312611143575138611545565b503d61167c565b86513d89823e3d90fd5b6116b29094919461100f565b92386114f5565b91908203918211610ff957565b600554600091908281156119bb5750670de0b6b3a764000090818302918383041483151715610ff9576116f89161106e565b905b60408051916060830183811067ffffffffffffffff82111761102357825260028352602080840193833686378051156119a5576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116865281516001977f0000000000000000000000000000000000000000000000000000000000000000831693909290918910156119a55783878301528651976370a0823160e01b93848a523060048b0152868a602481895afa998a1561199a5760009a61196b575b50827f00000000000000000000000000000000000000000000000000000000000000001692833b1561114357899492919451948593635c11d79560e01b855260a48501918b6004870152602486015260a06044860152518091528c60c4850193926000915b8b84841061194f575050505050509181600081819530606483015242608483015203925af1908161193b575b5061188357505050505050507faae67a130b4659edc2a47c783b84fd0693bf47710bfcf2ab37958b56367627418180a190565b9184959697926024829596518094819382523060048301525afa91821561193057916118e3575b507fe890cfe6ec691ae4f15274772bc844e8837443f30138c17714c9f5441fb29fa5946118d6916116b9565b908351928352820152a190565b90508181813d8311611929575b6118fa8183611039565b8101031261114357517fe890cfe6ec691ae4f15274772bc844e8837443f30138c17714c9f5441fb29fa56118aa565b503d6118f0565b8551903d90823e3d90fd5b61194691995061100f565b60009738611850565b855183168752899750958601959094019391909101908e611824565b90998782813d8311611993575b6119828183611039565b810103126102f957505198386117bf565b503d611978565b89513d6000823e3d90fd5b634e487b7160e01b600052603260045260246000fd5b9050906116fa565b60049081546119d760009160035490610fec565b431180611c81575b611c74575b604080516370a0823160e01b808252308683015260209492936024937f0000000000000000000000000000000000000000000000000000000000000000936001600160a01b03808616949193929089858981895afa948515611c6a578495611c3b575b507f000000000000000000000000000000000000000000000000000000000000000016908851838152308c8201528a818a81865afa908115611c31579082918691611bfe575b50611a9e611ac792611aa79261105b565b6007549061106e565b9133865260088c528a8620611abd8282546116b9565b90556007546116b9565b600755813b15610794578390888c838c519586948593632e1a7d4d60e01b85528401525af18015611bf45790899291611be1575b50868851809681938252308d8301525afa908115611bd65790611ba7575b611b2392506116b9565b9483519263a9059cbb60e01b86850152338185015286604485015260448452608084019184831067ffffffffffffffff841117611b9457505083527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364939291611b8b91611148565b519283523392a2565b604190634e487b7160e01b600052526000fd5b508582813d8311611bcf575b611bbd8183611039565b8101031261114357611b239151611b19565b503d611bb3565b8651903d90823e3d90fd5b611bed9093919361100f565b9138611afb565b88513d85823e3d90fd5b8092508c8092503d8311611c2a575b611c178183611039565b810103126103cb57518190611a9e611a8d565b503d611c0d565b8a513d87823e3d90fd5b9094508981813d8311611c63575b611c538183611039565b8101031261079457519338611a47565b503d611c49565b89513d86823e3d90fd5b611c7c6114a2565b6119e4565b5060ff600254166119df56fea264697066735822122056f94f98737056624a402e38dca70e2c6e9758e28ff570a0ddb865705695d72d64736f6c63430008130033000000000000000000000000679a376dab6318d62de3c87292e207532c8607a90000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x60406080815260048036101561001457600080fd5b600091823560e01c8381630292ac0e14610ef457508063056f7a0f14610e485780630a738779146103d35780631064ac1514610e24578063130180de14610d6f57806314b74d9a14610d515780631959a00214610d1757806328f4dbb614610cf85780632e1a7d4d14610c4b5780633a98ef3914610c2c5780633f4ba83a14610bcb5780635c975abb14610ba657806363583eb714610b875780637067859114610b39578063715018a614610adf578063735de9f714610a9b5780637f085fd114610a575780638456cb59146109f0578063853828b614610967578063871e5aa71461092c5780638b2aa5971461090f5780638da5cb5b146108e7578063b10aa43a1461089d578063b22c1189146107b7578063b3e7860814610798578063b6b55f2514610489578063db200bfa1461043b578063df54439b146103f7578063eb8c5d9c146103d3578063f2fde38b146102fc578063f7b00553146102ac578063f7c618c1146102645763fca3f55b1461018d57600080fd5b8291346102605782600319360112610260576020906101aa610f94565b825163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d811692820192909252600019602482015293849160449183917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2165af1908115610257575061022c575080f35b61024c9060203d8111610250575b6102448183611039565b81019061112b565b5080f35b503d61023a565b513d84823e3d90fd5b5050fd5b8382346102a857816003193601126102a857517f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168152602090f35b5080fd5b83346102f957806003193601126102f9576102c5610f94565b600160ff1960025416176002557fd1051920bdffd26b2c190ffd77161a6611db762e9d0b4c2b87681f6a45af75ec8180a180f35b80fd5b50346103cf5760203660031901126103cf576001600160a01b038235818116939192908490036103cb5761032e610f94565b8315610379575050600054826bffffffffffffffffffffffff60a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8480fd5b8280fd5b8382346102a857816003193601126102a8576020906103f06113b1565b9051908152f35b8382346102a857816003193601126102a857517f0000000000000000000000001f1f26c966f483997728bed0f9814938b2b5e2946001600160a01b03168152602090f35b5090346103cf5760203660031901126103cf577f0c5f835c1112970802d2e3848cc0541d14975686d176cfc3439b7ac0a9ee28d091602091359061047d610f94565b8160065551908152a180f35b50346103cf5760209081600319360112610794578235926104a86110d5565b6104b061108e565b7f0000000000000000000000000000000000000000000000000de0b6b3a76400008410610748576104e5815460035490610fec565b43118061073c575b80610731575b610724575b81516323b872dd60e01b848201523360248201523060448201526064808201869052815260a0810167ffffffffffffffff81118282101761071157835261055f907f0000000000000000000000001f1f26c966f483997728bed0f9814938b2b5e294611148565b81516370a0823160e01b815230818301527f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a96001600160a01b031691908481602481865afa9081156107075787916106d6575b5060075490816106bf575050845b801561068c57906105eb8792338452600887528584206105e1828254610fec565b9055600754610fec565b600755823b156102a85760248691838651958694859363534a7e1d60e11b85528401525af180156106825761064d575b50907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91519283523392a26001805580f35b9361067a7fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c93929561100f565b93909161061b565b82513d87823e3d90fd5b835162461bcd60e51b8152808301869052600d60248201526c11195c1bdcda5d0e8811985a5b609a1b6044820152606490fd5b6106cc6106d1928861105b565b61106e565b6105c0565b90508481813d8311610700575b6106ed8183611039565b810103126106fc5751386105b2565b8680fd5b503d6106e3565b84513d89823e3d90fd5b634e487b7160e01b875260418352602487fd5b61072c6114a2565b6104f8565b5060075415156104f3565b5060ff600254166104ed565b82608492519162461bcd60e51b8352820152602260248201527f4465706f7369743a20416d6f756e74206d757374206265203e3d2031204d454f60448201526115d360f21b6064820152fd5b8380fd5b8382346102a857816003193601126102a8576020906003549051908152f35b5082346102f957602092836003193601126102a8576001600160a01b038135818116929083900361079457859060248651809481936370a0823160e01b835230908301527f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a9165afa908115610893578391610866575b50836007549283156000146108485750505050905b51908152f35b90846106cc939261086096526008885220549061105b565b90610842565b90508481813d831161088c575b61087d8183611039565b810103126103cf57518561082d565b503d610873565b84513d85823e3d90fd5b83346102f957806003193601126102f9576108b6610f94565b60ff19600254166002557fac2c97b84646af77f8f38b20c67f88e77b613bb18dcff8dada6d85fc46bbb6858180a180f35b8382346102a857816003193601126102a857905490516001600160a01b039091168152602090f35b8382346102a857816003193601126102a857602090516119648152f35b8382346102a857816003193601126102a857602090517f0000000000000000000000000000000000000000000000000de0b6b3a76400008152f35b5090346103cf57826003193601126103cf576109816110d5565b338352600860205281832054156109ae57506109a79033835260086020528220546119c3565b6001805580f35b6020606492519162461bcd60e51b8352820152601b60248201527f57697468647261773a2053686172657320657175616c20746f203000000000006044820152fd5b8382346102a857816003193601126102a85760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610a2e610f94565b610a3661108e565b610a3e61108e565b835460ff60a01b1916600160a01b17845551338152a180f35b8382346102a857816003193601126102a857517f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a96001600160a01b03168152602090f35b8382346102a857816003193601126102a857517f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03168152602090f35b83346102f957806003193601126102f957610af8610f94565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5090346103cf5760203660031901126103cf577f027061b81be353405da713893b16979d95fbd57b148f60b8837fcab321d04067916020913590610b7b610f94565b8160055551908152a180f35b8382346102a857816003193601126102a8576020906005549051908152f35b8382346102a857816003193601126102a85760ff6020925460a01c1690519015158152f35b8382346102a857816003193601126102a85760207f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610c09610f94565b610c11611365565b610c19611365565b835460ff60a01b1916845551338152a180f35b8382346102a857816003193601126102a8576020906007549051908152f35b5090346103cf5760203660031901126103cf57803591610c696110d5565b82151580610ce3575b15610c8157836109a7846119c3565b906020608492519162461bcd60e51b8352820152603660248201527f57697468647261773a2053686172657320657175616c20746f2030206f72206c6044820152756172676572207468616e20757365722073686172657360501b6064820152fd5b50338452600860205280842054831115610c72565b8382346102a857816003193601126102a8576020906006549051908152f35b5090346103cf5760203660031901126103cf57356001600160a01b038116908190036103cf57828291602094526008845220549051908152f35b5090346103cf57826003193601126103cf5760209250549051908152f35b50346103cf5760203660031901126103cf57813591610d8c610f94565b6119648311610dc75750816020917f6d7e6751f19ef9993001812d2c797cbadcd5d28801195fc8865e1f89210388789360035551908152a180f35b6020608492519162461bcd60e51b8352820152603260248201527f4f776e65723a204d7573742062652062656c6f77204d4158494d554d5f484152604482015271564553545f4255464645525f424c4f434b5360701b6064820152fd5b8382346102a857816003193601126102a85760209060ff6002541690519015158152f35b50346103cf57826003193601126103cf57610e616110d5565b610e69610f94565b60075415610ebd5781544314610e8257826109a76114a2565b906020606492519162461bcd60e51b83528201526015602482015274486172766573743a20416c726561647920646f6e6560581b6044820152fd5b906020606492519162461bcd60e51b83528201526011602482015270486172766573743a204e6f20736861726560781b6044820152fd5b92905034610260578260031936011261026057602090610f12610f94565b825163095ea7b360e01b81526001600160a01b037f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a9811692820192909252600019602482015293849160449183917f0000000000000000000000001f1f26c966f483997728bed0f9814938b2b5e294165af1908115610257575061022c575080f35b6000546001600160a01b03163303610fa857565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b91908201809211610ff957565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff811161102357604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761102357604052565b81810292918115918404141715610ff957565b8115611078570490565b634e487b7160e01b600052601260045260246000fd5b60ff60005460a01c1661109d57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b6002600154146110e6576002600155565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b90816020910312611143575180151581036111435790565b600080fd5b6040805167ffffffffffffffff94936001600160a01b03909316929091820185811183821017611023576040526020928383527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564848401526000808386829551910182855af1903d15611284573d968711611270576111e8949596604051906111da88601f19601f8401160183611039565b81528093873d92013e611291565b805190828215928315611258575b505050156112015750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b611268935082018101910161112b565b3882816111f6565b634e487b7160e01b83526041600452602483fd5b91506111e8939495506060915b919290156112f357508151156112a5575090565b3b156112ae5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156113065750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061134c575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350611329565b60ff60005460a01c161561137557565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6040516370a0823160e01b81523060048201526020816024817f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a96001600160a01b03165afa90811561149657600091611465575b50600754806114345750507f0000000000000000000000000000000000000000000000000de0b6b3a764000090565b6106cc611462927f0000000000000000000000000000000000000000000000000de0b6b3a76400009061105b565b90565b906020823d821161148e575b8161147e60209383611039565b810103126102f957505138611405565b3d9150611471565b6040513d6000823e3d90fd5b6001600160a01b037f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a98116803b1561114357604090815192631e8c5c8960e11b8452600093848160048183875af16116a6575b5082516370a0823160e01b8082523060048301526020929183816024817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc287165afa90811561169c57879161166f575b5060065481101561155e575b5050505050505043600455565b611567906116c6565b611572575b80611551565b8290602486518094819382523060048301527f0000000000000000000000001f1f26c966f483997728bed0f9814938b2b5e294165afa918215611665578592611637575b50507f0000000000000000000000000000000000000000000000000de0b6b3a76400008110156115e8575b808061156c565b813b156107945782916024859492859351958693849263534a7e1d60e11b845260048401525af19081156102575750611623575b80806115e1565b61162d829161100f565b6102f9578061161c565b90809250813d831161165e575b61164e8183611039565b81010312611143575138806115b6565b503d611644565b84513d87823e3d90fd5b90508381813d8311611695575b6116868183611039565b81010312611143575138611545565b503d61167c565b86513d89823e3d90fd5b6116b29094919461100f565b92386114f5565b91908203918211610ff957565b600554600091908281156119bb5750670de0b6b3a764000090818302918383041483151715610ff9576116f89161106e565b905b60408051916060830183811067ffffffffffffffff82111761102357825260028352602080840193833686378051156119a5576001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116865281516001977f0000000000000000000000001f1f26c966f483997728bed0f9814938b2b5e294831693909290918910156119a55783878301528651976370a0823160e01b93848a523060048b0152868a602481895afa998a1561199a5760009a61196b575b50827f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1692833b1561114357899492919451948593635c11d79560e01b855260a48501918b6004870152602486015260a06044860152518091528c60c4850193926000915b8b84841061194f575050505050509181600081819530606483015242608483015203925af1908161193b575b5061188357505050505050507faae67a130b4659edc2a47c783b84fd0693bf47710bfcf2ab37958b56367627418180a190565b9184959697926024829596518094819382523060048301525afa91821561193057916118e3575b507fe890cfe6ec691ae4f15274772bc844e8837443f30138c17714c9f5441fb29fa5946118d6916116b9565b908351928352820152a190565b90508181813d8311611929575b6118fa8183611039565b8101031261114357517fe890cfe6ec691ae4f15274772bc844e8837443f30138c17714c9f5441fb29fa56118aa565b503d6118f0565b8551903d90823e3d90fd5b61194691995061100f565b60009738611850565b855183168752899750958601959094019391909101908e611824565b90998782813d8311611993575b6119828183611039565b810103126102f957505198386117bf565b503d611978565b89513d6000823e3d90fd5b634e487b7160e01b600052603260045260246000fd5b9050906116fa565b60049081546119d760009160035490610fec565b431180611c81575b611c74575b604080516370a0823160e01b808252308683015260209492936024937f0000000000000000000000001f1f26c966f483997728bed0f9814938b2b5e294936001600160a01b03808616949193929089858981895afa948515611c6a578495611c3b575b507f000000000000000000000000679a376dab6318d62de3c87292e207532c8607a916908851838152308c8201528a818a81865afa908115611c31579082918691611bfe575b50611a9e611ac792611aa79261105b565b6007549061106e565b9133865260088c528a8620611abd8282546116b9565b90556007546116b9565b600755813b15610794578390888c838c519586948593632e1a7d4d60e01b85528401525af18015611bf45790899291611be1575b50868851809681938252308d8301525afa908115611bd65790611ba7575b611b2392506116b9565b9483519263a9059cbb60e01b86850152338185015286604485015260448452608084019184831067ffffffffffffffff841117611b9457505083527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364939291611b8b91611148565b519283523392a2565b604190634e487b7160e01b600052526000fd5b508582813d8311611bcf575b611bbd8183611039565b8101031261114357611b239151611b19565b503d611bb3565b8651903d90823e3d90fd5b611bed9093919361100f565b9138611afb565b88513d85823e3d90fd5b8092508c8092503d8311611c2a575b611c178183611039565b810103126103cb57518190611a9e611a8d565b503d611c0d565b8a513d87823e3d90fd5b9094508981813d8311611c63575b611c538183611039565b8101031261079457519338611a47565b503d611c49565b89513d86823e3d90fd5b611c7c6114a2565b6119e4565b5060ff600254166119df56fea264697066735822122056f94f98737056624a402e38dca70e2c6e9758e28ff570a0ddb865705695d72d64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000679a376dab6318d62de3c87292e207532c8607a90000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : _feeSharingSystem (address): 0x679A376Dab6318d62DE3C87292e207532c8607a9
Arg [1] : _uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000679a376dab6318d62de3c87292e207532c8607a9
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,343.76 | 0.2251 | $752.64 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.