ETH Price: $2,437.75 (-0.73%)
 

Overview

Max Total Supply

100,000,000 OCEAN

Holders

123

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
Null: 0x000...000
Balance
0 OCEAN

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Ocean

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 8 : Token.sol
/**


----------------------------  Social Links  ----------------------------


Telegram:  https://t.me/OceanPortal

Website:   https://www.ocean.navy

Docs:      https://docs.ocean.navy

Twitter:   https://www.ocean.navy/twitter/


----------------------------  $OCEAN Info  ----------------------------


🌊  $OCEAN is powered by a brand new smart contract.


📈  Rule 1:   Taxes are derived from the $OCEAN market cap.

    Example:  If the market cap is $25,000, the current sea
              creature will be the Humpack, "🐋".
            
              Because the market cap is in the Humpack range, the buy
              tax will be 2% and the sell tax will be 1%.


🔄  Rule 2:   The token name is derived from the $OCEAN market cap.

    Example:  If the market cap rises from $49,000 to $51,000,
              the token name will update from "🐋" to "🦭".


💸  Rule 3:   Each wallet is assigned a sea creature based on the $OCEAN
              market cap during its first swap.

    Tip:      Once a wallet has been assigned a sea creature, it
              can never be re-assigned.

    Tip:      The lower you wait to buy, the better the sea
              creature you get will be.

    Example:  If a wallet purchases $OCEAN at a $65,000 market
              cap, then that wallet's buy tax would never exceed
              the Seal (🦭) buy tax of 2%.


🛢️  Rule 4:   Oil spills briefly override everybody's taxes each time
              a market cap milestone is broken.

    Tip:      Each time the $OCEAN market cap enters the range of the
              next sea creature, everybody's tax becomes 0/15 for
              the next 120 seconds.

    Tip:      Sells become less effective at suppressing buy volume
              during an oil spill.

    Tip:      There is no limit on the amount of oil spills that can
              happen.


-------------------------  $OCEAN Milestones  -------------------------


💡  Each sea creature has slightly different milestones and taxes:

🐳  Whale       $0 MC
    Lifetime tax: 2/0

🐋  Humpback    $20,000 MC
    Lifetime tax: 2/1

🦭  Seal        $50,000 MC
    Lifetime tax: 2/2

🦈  Shark       $100,000 MC
    Lifetime tax: 3/2

🐬  Dolphin     $200,000 MC
    Lifetime tax: 3/3

🦑  Squid       $400,000 MC
    Lifetime tax: 4/3

🐙  Octopus     $700,000 MC
    Lifetime tax: 4/4

🐠  Angelfish   $1,200,000 MC
    Lifetime tax: 5/4

🐟  Mackerel    $1,800,000 MC
    Lifetime tax: 5/5

🐡  Blowfish    $2,600,000 MC
    Lifetime tax: 6/5

🦞  Lobster     $3,900,000 MC
    Lifetime tax: 6/6

🦀  Crab        $5,500,000 MC
    Lifetime tax: 7/6

🦐  Shrimp      $8,000,000 MC
    Lifetime tax: 7/7

🪸  Coral       $12,000,000 MC
    Lifetime tax: 8/7

🦠  Amoeba      $25,000,000 MC
    Lifetime tax: 8/8


*/

// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.14;

import "@openzeppelin/openzeppelin-contracts/access/Ownable.sol";
import "@openzeppelin/openzeppelin-contracts/token/ERC20/IERC20.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract Ocean is Context, IERC20, Ownable {

    mapping(uint256 => string) internal seaCreatures;

    mapping(uint256 => uint256) internal milestones;

    mapping(uint256 => uint256) internal buyTaxGlobal;
    mapping(uint256 => uint256) internal sellTaxGlobal;

    uint256 internal lastSeaCreature;
    uint256 internal lastProgression;

    mapping(address => uint256) internal seaCreature;
    mapping(address => bool) internal isSeaCreature;

    string private _name = unicode"🐳";
    string private constant _symbol = "OCEAN";
    uint8 private constant _decimals = 9;

    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 100000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 public constant maxBuyTax = 8;
    uint256 public constant maxSellTax = 8;
    uint256 private _taxFee = 2;

    address payable private _buybackWallet = payable(msg.sender);
    address payable private _marketingWallet = payable(msg.sender);

    IUniswapV2Router02 public constant uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    IUniswapV2Factory public constant uniswapV2Factory = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IERC20 public constant weth = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    address public immutable OCEAN;
    address public uniswapV2Pair;

    AggregatorV3Interface public constant chainlinkV3Feed = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419);

    bool private tradingOpen;
    bool private inTaxSwap;
    bool private inContractSwap;

    uint256 public maxSwap = _tTotal / 50;
    uint256 public maxWallet = _tTotal / 50;
    uint256 private constant _triggerSwap = 1e9;

    modifier lockTheSwap {
        inTaxSwap = true;
        _;
        inTaxSwap = false;
    }

    constructor() {
        OCEAN = address(this);
        uniswapV2Pair = uniswapV2Factory.createPair(OCEAN, WETH);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[OCEAN] = true;
        _isExcludedFromFee[_buybackWallet] = true;
        _isExcludedFromFee[_marketingWallet] = true;
        _approve(OCEAN, address(uniswapV2Router), MAX);
        _approve(owner(), address(uniswapV2Router), MAX);

        // 🐳  Whale       $0 MC
        seaCreatures[0] = unicode"🐳";
        milestones[0] = 0;
        buyTaxGlobal[0] = 2;
        sellTaxGlobal[0] = 0;

        // 🐋  Humpback    $20,000 MC
        seaCreatures[1] = unicode"🐋";
        milestones[1] = 10000;
        buyTaxGlobal[1] = 2;
        sellTaxGlobal[1] = 1;

        // 🦭  Seal        $50,000 MC
        seaCreatures[2] = unicode"🦭";
        milestones[2] = 20000;
        buyTaxGlobal[2] = 2;
        sellTaxGlobal[2] = 2;

        // 🦈  Shark       $100,000 MC
        seaCreatures[3] = unicode"🦈";
        milestones[3] = 100000;
        buyTaxGlobal[3] = 3;
        sellTaxGlobal[3] = 2;

        // 🐬  Dolphin     $200,000 MC
        seaCreatures[4] = unicode"🐬";
        milestones[4] = 200000;
        buyTaxGlobal[4] = 3;
        sellTaxGlobal[4] = 3;

        // 🦑  Squid       $400,000 MC
        seaCreatures[5] = unicode"🦑";
        milestones[5] = 400000;
        buyTaxGlobal[5] = 4;
        sellTaxGlobal[5] = 3;

        // 🐙  Octopus     $700,000 MC
        seaCreatures[6] = unicode"🐙";
        milestones[6] = 700000;
        buyTaxGlobal[6] = 4;
        sellTaxGlobal[6] = 4;

        // 🐠  Angelfish   $1,200,000 MC
        seaCreatures[7] = unicode"🐠";
        milestones[7] = 1200000;
        buyTaxGlobal[7] = 5;
        sellTaxGlobal[7] = 4;

        // 🐟  Mackerel    $1,800,000 MC
        seaCreatures[8] = unicode"🐟";
        milestones[8] = 1800000;
        buyTaxGlobal[8] = 5;
        sellTaxGlobal[8] = 5;

        // 🐡  Blowfish    $2,600,000 MC
        seaCreatures[9] = unicode"🐡";
        milestones[9] = 2600000;
        buyTaxGlobal[9] = 6;
        sellTaxGlobal[9] = 5;

        // 🦞  Lobster     $3,900,000 MC
        seaCreatures[10] = unicode"🦞";
        milestones[10] = 3900000;
        buyTaxGlobal[10] = 6;
        sellTaxGlobal[10] = 6;

        // 🦀  Crab        $5,500,000 MC
        seaCreatures[11] = unicode"🦀";
        milestones[11] = 5500000;
        buyTaxGlobal[11] = 7;
        sellTaxGlobal[11] = 6;

        // 🦐  Shrimp      $8,000,000 MC
        seaCreatures[12] = unicode"🦐";
        milestones[12] = 8000000;
        buyTaxGlobal[12] = 7;
        sellTaxGlobal[12] = 7;

        // 🪸  Coral       $12,000,000 MC
        seaCreatures[13] = unicode"🪸";
        milestones[13] = 12000000;
        buyTaxGlobal[13] = 8;
        sellTaxGlobal[13] = 7;

        // 🦠  Amoeba      $25,000,000 MC
        seaCreatures[14] = unicode"🦠";
        milestones[14] = 25000000;
        buyTaxGlobal[14] = 8;
        sellTaxGlobal[14] = 8;

        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    receive() external payable {}

    function getETHUSDPriceFeed() external pure returns (address) {
        return address(chainlinkV3Feed);
    }

    function getETHUSDPrice() public view returns (uint256) {
        (
            ,
            int256 answer,
            ,
            ,
        ) = chainlinkV3Feed.latestRoundData();
        return uint256(answer / 1e8);
    }

    function getOCEANUSDMarketCap() public view returns (uint256) {
        return ((weth.balanceOf(uniswapV2Pair) * getETHUSDPrice()) / 1e18) * (totalSupply() / balanceOf(uniswapV2Pair)) * 2;
    }

    function getCurrentSeaCreature() public view returns (uint256) {
        uint256 marketCap = getOCEANUSDMarketCap();
        for (uint256 i = 14; i >= 0; i--) {
            if (marketCap >= milestones[i]) {
                return i;
            }
        }
        return 0;
    }

    function getCurrentSeaCreatureEmoji() public view returns (string memory) {
        return seaCreatures[getCurrentSeaCreature()];
    }

    function getLastSeaCreature() external view returns (uint256) {
        return lastSeaCreature;
    }

    function getNextSeaCreature() public view returns (uint256) {
        uint256 currentSeaCreature = getCurrentSeaCreature();
        return currentSeaCreature == 14 ? 14 : currentSeaCreature + 1;
    }

    function getNextSeaCreatureEmoji() external view returns (string memory) {
        return seaCreatures[getNextSeaCreature()];
    }

    function hasOilSpill() public view returns (bool) {
        return lastProgression + 120 >= block.timestamp;
    }

    function getLastOilSpill() external view returns (uint256) {
        return lastProgression;
    }

    function getOilSpillTimeRemaining() external view returns (uint256) {
        if (hasOilSpill()) {
            return lastProgression + 120 - block.timestamp;
        }
        return 0;
    }

    function getGlobalMaxBuyTax() external pure returns (uint256) {
        return maxBuyTax;
    }

    function getGlobalMaxSellTax() external pure returns (uint256) {
        return maxSellTax;
    }

    function getGlobalBuyTax() public view returns (uint256) {
        if (hasOilSpill()) {
            return 0;
        }
        uint256 globalBuyTax = 14 - getCurrentSeaCreature();
        return globalBuyTax > maxBuyTax ? maxBuyTax : globalBuyTax;
    }

    function getGlobalSellTax() public view returns (uint256) {
        if (hasOilSpill()) {
            return 15;
        }
        uint256 globalSellTax = getCurrentSeaCreature();
        return globalSellTax > maxSellTax ? maxSellTax : globalSellTax;
    }

    function getWalletIsSeaCreature(address _wallet) external view returns (bool) {
        return isSeaCreature[_wallet];
    }

    function getWalletSeaCreature(address _wallet) public view returns (uint256) {
        return isSeaCreature[_wallet] ? seaCreature[_wallet] : getCurrentSeaCreature();
    }

    function getWalletSeaCreatureEmoji(address _wallet) external view returns (string memory) {
        return seaCreatures[getWalletSeaCreature(_wallet)];
    }

    function getWalletBuyTax(address _wallet) public view returns (uint256) {
        if (hasOilSpill()) {
            return 0;
        }
        return isSeaCreature[_wallet] ? buyTaxGlobal[seaCreature[_wallet]] : getGlobalBuyTax();
    }

    function getWalletMaxBuylTax(address _wallet) external view returns (uint256) {
        return isSeaCreature[_wallet] ? buyTaxGlobal[seaCreature[_wallet]] : maxBuyTax;
    }

    function getWalletSellTax(address _wallet) public view returns (uint256) {
        if (hasOilSpill()) {
            return 15;
        }
        return isSeaCreature[_wallet] ? sellTaxGlobal[seaCreature[_wallet]] : getGlobalSellTax();
    }

    function getWalletMaxSellTax(address _wallet) external view returns (uint256) {
        return isSeaCreature[_wallet] ? seaCreature[_wallet] : maxSellTax;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        require(_allowances[sender][_msgSender()] >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function name() public view returns (string memory) {
        return hasOilSpill() ? unicode"🛢️" : _name;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function _removeTax() private {
        if (_taxFee == 0) {
            return;
        }

        _taxFee = 0;
    }

    function _restoreTax() private {
        _taxFee = 2;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "TOKEN: Transfer amount must exceed zero");

        if (from != owner() && to != owner() && from != OCEAN && to != OCEAN) {
            if (!tradingOpen) {
                require(from == OCEAN, "TOKEN: This account cannot send tokens until trading is enabled");
            }

            require(amount <= maxSwap, "TOKEN: Max Transaction Limit");

            if (to != uniswapV2Pair) {
                require(balanceOf(to) + amount <= maxWallet, "TOKEN: Balance exceeds wallet size!");
            }

            uint256 contractTokenBalance = balanceOf(OCEAN);

            if ((contractTokenBalance >= _triggerSwap) && !inTaxSwap && from != uniswapV2Pair && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
                inContractSwap = true;
                _swapOCEANForETH(contractTokenBalance >= maxSwap ? maxSwap : contractTokenBalance);
                inContractSwap = false;
                if (OCEAN.balance > 0) _sendETHToFee(OCEAN.balance);
            }
        }

        bool takeFee = true;
        bool needsRefresh;

        if ((_isExcludedFromFee[from] || _isExcludedFromFee[to]) || (from != uniswapV2Pair && to != uniswapV2Pair)) {
            takeFee = false;
        } else {
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
                if (!isSeaCreature[to]) {
                    seaCreature[to] = getCurrentSeaCreature();
                    isSeaCreature[to] = true;
                }
                _taxFee = getWalletBuyTax(to);
                needsRefresh = true;
            }
            if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
                if (!isSeaCreature[from]) {
                    seaCreature[from] = getCurrentSeaCreature();
                    isSeaCreature[from] = true;
                }
                _taxFee = getWalletSellTax(from);
                needsRefresh = true;
            }
        }

        _tokenTransfer(from, to, amount, takeFee);

        if (needsRefresh) {
            _refresh();
        }
    }

    function _refresh() private {
        uint256 currentSeaCreature = getCurrentSeaCreature();
        if (currentSeaCreature > lastSeaCreature) {
            lastProgression = block.timestamp;
        }
        lastSeaCreature = currentSeaCreature;
        _name = getCurrentSeaCreatureEmoji();
    }

    function _swapOCEANForETH(uint256 _amountOCEAN) private lockTheSwap returns (bool) {
        address[] memory path = new address[](2);
        path[0] = OCEAN;
        path[1] = WETH;
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(_amountOCEAN, 0, path, OCEAN, block.timestamp + 3600);
        return true;
    }

    function _sendETHToFee(uint256 _amountETH) private returns (bool) {
        (bool success, ) = payable(_marketingWallet).call{value: _amountETH}("");
        return success;
    }

    function enableTrading() external onlyOwner {
        tradingOpen = true;
    }

    function removeLimits() external onlyOwner {
        maxSwap = _tTotal;
        maxWallet = _tTotal;
    }

    function swapTokensForEthManual(uint256 _contractTokenBalance) external returns (bool) {
        require(_msgSender() == _buybackWallet || _msgSender() == _marketingWallet);
        return _swapOCEANForETH(_contractTokenBalance);
    }

    function sendETHToFeeManual(uint256 _contractETHBalance) external returns (bool) {
        require(_msgSender() == _buybackWallet || _msgSender() == _marketingWallet);
        return _sendETHToFee(_contractETHBalance);
    }

    function _tokenFromReflection(uint256 rAmount) private view returns (uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        require(totalSupply() <= MAX, "Total reflections must be less than max");
        return (!inContractSwap && inTaxSwap) ? totalSupply() * 1024 : rAmount / _getRate();
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
        if (!takeFee) _removeTax();
        _transferStandard(sender, recipient, amount);
        if (!takeFee) _restoreTax();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        if (!inTaxSwap || inContractSwap) {
            (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tTeam) = _getValues(tAmount);
            _rOwned[sender] = _rOwned[sender] - rAmount;
            _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
            _rOwned[OCEAN] = _rOwned[OCEAN] + (tTeam * _getRate());
            _rTotal = _rTotal - rFee;
            _tFeeTotal = _tFeeTotal + tFee;
            emit Transfer(sender, recipient, tTransferAmount);
        } else {
            emit Transfer(sender, recipient, tAmount);
        }
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tTeam) = _getTValues(tAmount, 0, _taxFee);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tTeam, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tTeam);
    }

    function _getTValues(uint256 tAmount, uint256 redisFee, uint256 taxFee) private pure returns (uint256, uint256, uint256) {
        uint256 tFee = tAmount * redisFee / 100;
        uint256 tTeam = tAmount * taxFee / 100;
        return (tAmount - tFee - tTeam, tFee, tTeam);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tTeam, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        return (rAmount, rAmount - rFee - (tTeam * currentRate), rFee);
    }

    function _getRate() private view returns (uint256) {
        return _rTotal / _tTotal;
    }
}

File 2 of 8 : Ownable.sol
// 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);
    }
}

File 3 of 8 : IERC20.sol
// 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);
}

File 4 of 8 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 5 of 8 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 6 of 8 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

File 7 of 8 : Context.sol
// 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;
    }
}

File 8 of 8 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

Settings
{
  "remappings": [
    "@chainlink/contracts/=lib/chainlink/contracts/",
    "@openzeppelin/openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "@uniswap/v2-core/contracts/=lib/v2-core/contracts/",
    "@uniswap/v2-periphery/contracts/=lib/v2-periphery/contracts/",
    "chainlink/=lib/chainlink/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "v2-core/=lib/v2-core/contracts/",
    "v2-periphery/=lib/v2-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OCEAN","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":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainlinkV3Feed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentSeaCreature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSeaCreatureEmoji","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHUSDPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHUSDPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getGlobalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalMaxBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getGlobalMaxSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getGlobalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastOilSpill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastSeaCreature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextSeaCreature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextSeaCreatureEmoji","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOCEANUSDMarketCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOilSpillTimeRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletIsSeaCreature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletMaxBuylTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletMaxSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletSeaCreature","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletSeaCreatureEmoji","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasOilSpill","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractETHBalance","type":"uint256"}],"name":"sendETHToFeeManual","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractTokenBalance","type":"uint256"}],"name":"swapTokensForEthManual","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600460a090815263f09f90b360e01b60c05260099062000025908262001036565b506200003c67016345785d8a000060001962001118565b6200004a906000196200112f565b600e55600260105560118054336001600160a01b0319918216811790925560128054909116909117905562000089603267016345785d8a000062001157565b601455620000a1603267016345785d8a000062001157565b601555348015620000b157600080fd5b50620000bd3362000e15565b3060808190526040516364e329cb60e11b8152600481019190915273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26024820152735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9063c9c65396906044016020604051808303816000875af115801562000131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015791906200116e565b601380546001600160a01b0319166001600160a01b039283161790556000805482168152600d6020526040808220805460ff1990811660019081179092556080518086168552838520805483168417905560115486168552838520805483168417905560125490951684529190922080549091169091179055620001f390737a250d5630b4cf539739df2c5dacb4c659f2488d60001962000e65565b620002286200020a6000546001600160a01b031690565b737a250d5630b4cf539739df2c5dacb4c659f2488d60001962000e65565b604080518082019091526004815263f09f90b360e01b60208083019190915260008052600190527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49906200027d908262001036565b5060007fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b81905560027f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec819055604080518082019091526004815263f09f908b60e01b602082810191909152600192839052919091527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f9062000343908262001036565b506127107fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05560027fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c81905560017fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05819055604080518082019091526004815263f09fa6ad60e01b60208281019190915260009390935291527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f906200040a908262001036565b50614e207f679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c5560027fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d8190557f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7556040805180820190915260048152631e13f4d160e31b6020828101919091526003600052600190527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b90620004ce908262001036565b50620186a07f88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c35560037fcbc4e5fb02c3d1de23a9f1e014b4d2ee5aeaea9505df5e855c9210bf472495af5560027f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa055604080518082019091526004808252633c27e42b60e21b602083810191909152600091909152600190527fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b5676439062000595908262001036565b5062030d407fee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918f5560037f83ec6a1f0257b830b5e016457c9cf1435391bf56cc98f369a58a54fe937724658190557f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f55604080518082019091526004815263f09fa69160e01b6020828101919091526005600052600190527fe2689cd4a84e23ad2f564004f1c9013e9589d260bde6380aba3ca7e09e4df40c906200065a908262001036565b5062061a807fb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e3845560047f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b46594225081905560037f04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f05556040805180820190915290815263f09f909960e01b6020828101919091526006600052600190527f8f331abe73332f95a25873e8b430885974c0409691f89d643119a11623a7924a9062000720908262001036565b50620aae607f59dd4b18488d12f51eda69757a0ed42a2010c14b564330cc74a06895e60c077b5560047fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f38190557fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f81905560408051808201909152908152630784fc8560e51b6020828101919091526007600052600190527fdc686ec4a0ff239c70e7c7c36e8f853eced3bc8618f48d2b816da2a74311237e90620007e6908262001036565b5062124f807facd8ef244210bb6898e73c48bf820ed8ecc857a3bab8d79c10e4fa92b1e9ca655560057ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd25560047fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5518190556040805180820190915290815263f09f909f60e01b6020828101919091526008600052600190527f4db623e5c4870b62d3fc9b4e8f893a1a77627d75ab45d9ff7e56ba19564af99b90620008ac908262001036565b50621b77407f3a5ea591190eeb3f8fcdced843c78df04ec0dfd42f5510375207515664fa0a755560057f85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe8190557f2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a455604080518082019091526004815263f09f90a160e01b6020828101919091526009600052600190527f74a5fbcb419ab7dbacbb2c92a4e163730f0da5c72b911deecf4f05a6b327d0a49062000971908262001036565b506227ac407ff85cc6ffc513dc6cf7d199ef87b7a63cf9defe62251c1c247cd12f1eec7bff295560067f8a8dc4e5242ea8b1ab1d60606dae757e6c2cca9f92a2cced9f72c19960bcb4585560057f4ad5a04d53b5856f318545bb721f67d3f6d0a5a999f25eec7e20eaeb4c47b93355604080518082019091526004815263784fd34f60e11b602082810191909152600a600052600190527f2a32391a76c35a36352b711f9152c0d0a340cd686850c8ef25fbb11c71b89e7b9062000a36908262001036565b50623b82607fd3604db978f6137b0d18816b77b2ce810487a3af08a922e0b184963be5f3adfc5560067f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d538190557f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f310935560408051808201909152600481526301e13f4d60e71b602082810191909152600b600052600190527ffc80cd5fe514767bc6e66ec558e68a5429ea70b50fa6caa3b53fc9278e9186329062000afb908262001036565b506253ec607fab9952baf6478d8cfb7253ce86a6c53a7b7549582c76210b1581ae682b7e556f5560077f2d72af3c1b2b2956e6f694fb741556d5ca9524373974378cdbec16afa8b841645560067f0c1469ad586d86b6976c45826d7ae56d76ee516e37a2bccffbe904b74dbae7ea556040805180820190915260048152630f09fa6960e41b602082810191909152600c600052600190527f23bf72df16f8335be9a3eddfb5ef1c739b12847d13a384ec83f578699d38eb899062000bc0908262001036565b50627a12007fbd814762a7e35d5c162a7570d14baa68bd622cabb1ad83d40dd70f8a88aa67c05560077fd56a60595ebefebed7f22dcee6c2acc61b06cf8c68e84c88677840365d1ff92b8190557f140aabff1a85df08546c9a350c79ae18341bde4a2cef5d2fd460885c0128ce26556040805180820190915260048152631e13f55760e31b602082810191909152600d600052600190527f86b3fa87ee245373978e0d2d334dbde866c9b8b039036b87c5eb2fd89bcb6bab9062000c85908262001036565b5062b71b007feb5d92aa5b18af35c2d0c0d14a538792cf1a66aa06ab9dae49d32446e9063ca15560087fa8f2d96126c6d0ad63adabaef7bf5cf47f163fb0c218a473d28f62312d197bcf5560077fa5022b2bfd144bf9103d80168549b5df7c72ab60bd51bf71a02a08d844853b4a556040805180820190915260048152630784fd3560e51b602082810191909152600e600052600190527f57aaafa65c4e563d39fff90096a5fa76d42117f53d87ef870784e64d63a8a16b9062000d4a908262001036565b5063017d78407f20de3dd312970f46a1d560f6c70f0e5bd10e638b9bb3836368f28838c607ea3e5560087fd6ebcc64c739277b117ce359e436534b234b76e914c80ad276abf5b5620789398190557feb3e677499e881fe1bdbc344a49c412138038a9f40883b6dc68f713aab48352355600e54336000818152600a6020908152604080832094909455925167016345785d8a00008152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620011a0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03831662000ecd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b03821662000f305760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000ec4565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000fbc57607f821691505b60208210810362000fdd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200103157600081815260208120601f850160051c810160208610156200100c5750805b601f850160051c820191505b818110156200102d5782815560010162001018565b5050505b505050565b81516001600160401b0381111562001052576200105262000f91565b6200106a8162001063845462000fa7565b8462000fe3565b602080601f831160018114620010a25760008415620010895750858301515b600019600386901b1c1916600185901b1785556200102d565b600085815260208120601f198616915b82811015620010d357888601518255948401946001909101908401620010b2565b5085821015620010f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826200112a576200112a62001102565b500690565b818103818111156200115157634e487b7160e01b600052601160045260246000fd5b92915050565b60008262001169576200116962001102565b500490565b6000602082840312156200118157600080fd5b81516001600160a01b03811681146200119957600080fd5b9392505050565b6080516123b262001202600039600081816107eb015281816112fb01528181611339015281816113860152818161150a015281816115fe0152818161162901528181611a4501528181611af701528181611cec0152611d2f01526123b26000f3fe6080604052600436106102b25760003560e01c806390526cf211610175578063c4918b4e116100dc578063dd62ed3e11610095578063ef19dd811161006f578063ef19dd81146107d9578063f2fde38b1461080d578063f8b45b051461082d578063fdec60701461084357600080fd5b8063dd62ed3e1461075e578063de38c34e146107a4578063e7a6082e146107c457600080fd5b8063c4918b4e146106d6578063c6c934fa146106ec578063c83ccdec14610701578063c8e956ab14610662578063cc2d04aa14610716578063cd02a6d31461073657600080fd5b8063a9059cbb1161012e578063a9059cbb14610677578063ad1efb9214610697578063ad5c464814610459578063ae0b06ab146106ac578063bf45efce14610496578063bf4b1990146106c157600080fd5b806390526cf21461059b5780639399568f146105bb57806395d89b41146105f45780639c2b88d414610622578063a163123214610642578063a411209a1461066257600080fd5b80633fc8cef3116102195780635b01708a116101d25780635b01708a1461050757806370a082311461051c578063715018a61461053c578063751039fc146105535780638a8c523c146105685780638da5cb5b1461057d57600080fd5b80633fc8cef314610459578063442f0436146104815780634987dfec1461049657806349bd5a5e146104aa578063529f7676146104ca57806359d0f713146104df57600080fd5b806323b872dd1161026b57806323b872dd146103be578063255e421c146103de57806327f421d5146103f35780632a6cf5ea146104085780632e7b522814610428578063313ce5671461043d57600080fd5b80630255874f146102be57806306fdde03146102f1578063095ea7b3146103135780631207f090146103435780631694505e1461036357806318160ddd146103a357600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506102de6102d9366004611f30565b61086a565b6040519081526020015b60405180910390f35b3480156102fd57600080fd5b506103066108db565b6040516102e89190611f52565b34801561031f57600080fd5b5061033361032e366004611fa0565b61099f565b60405190151581526020016102e8565b34801561034f57600080fd5b5061030661035e366004611f30565b6109b5565b34801561036f57600080fd5b5061038b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102e8565b3480156103af57600080fd5b5067016345785d8a00006102de565b3480156103ca57600080fd5b506103336103d9366004611fca565b610a62565b3480156103ea57600080fd5b506102de610b3d565b3480156103ff57600080fd5b50610306610c21565b34801561041457600080fd5b506102de610423366004611f30565b610c48565b34801561043457600080fd5b506102de610c8b565b34801561044957600080fd5b50604051600981526020016102e8565b34801561046557600080fd5b5061038b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561048d57600080fd5b506005546102de565b3480156104a257600080fd5b5060086102de565b3480156104b657600080fd5b5060135461038b906001600160a01b031681565b3480156104d657600080fd5b506102de610cce565b3480156104eb57600080fd5b5061038b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b34801561051357600080fd5b506102de610d0b565b34801561052857600080fd5b506102de610537366004611f30565b610d38565b34801561054857600080fd5b50610551610d5a565b005b34801561055f57600080fd5b50610551610d6e565b34801561057457600080fd5b50610551610d89565b34801561058957600080fd5b506000546001600160a01b031661038b565b3480156105a757600080fd5b506103336105b6366004612006565b610da6565b3480156105c757600080fd5b506103336105d6366004611f30565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561060057600080fd5b5060408051808201909152600581526427a1a2a0a760d91b6020820152610306565b34801561062e57600080fd5b506102de61063d366004611f30565b610df0565b34801561064e57600080fd5b506102de61065d366004611f30565b610e58565b34801561066e57600080fd5b506102de600881565b34801561068357600080fd5b50610333610692366004611fa0565b610e7f565b3480156106a357600080fd5b506006546102de565b3480156106b857600080fd5b50610306610e8c565b3480156106cd57600080fd5b506102de610e9a565b3480156106e257600080fd5b506102de60145481565b3480156106f857600080fd5b506102de610f29565b34801561070d57600080fd5b506102de610f48565b34801561072257600080fd5b50610333610731366004612006565b610f77565b34801561074257600080fd5b5061038b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b34801561076a57600080fd5b506102de61077936600461201f565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156107b057600080fd5b506102de6107bf366004611f30565b610fc1565b3480156107d057600080fd5b50610333610fe9565b3480156107e557600080fd5b5061038b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561081957600080fd5b50610551610828366004611f30565b611002565b34801561083957600080fd5b506102de60155481565b34801561084f57600080fd5b50735f4ec3df9cbd43714fe2740f5e3616155c5b841961038b565b6000610874610fe9565b156108815750600f919050565b6001600160a01b03821660009081526008602052604090205460ff166108ae576108a9610f29565b6108d5565b6001600160a01b038216600090815260076020908152604080832054835260049091529020545b92915050565b60606108e5610fe9565b61097957600980546108f690612052565b80601f016020809104026020016040519081016040528092919081815260200182805461092290612052565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b60405180604001604052806007815260200166f09f9ba2efb88f60c81b8152505b905090565b60006109ac33848461107b565b50600192915050565b6060600160006109c484610fc1565b815260200190815260200160002080546109dd90612052565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0990612052565b8015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b50505050509050919050565b6000610a6f8484846111a0565b6001600160a01b0384166000908152600c60209081526040808320338452909152902054821115610af85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6001600160a01b0384166000908152600c6020908152604080832033808552925290912054610b33918691610b2e9086906120a2565b61107b565b5060019392505050565b601354600090610b55906001600160a01b0316610d38565b610b679067016345785d8a00006120cb565b670de0b6b3a7640000610b78610e9a565b6013546040516370a0823160e01b81526001600160a01b03909116600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf891906120df565b610c0291906120f8565b610c0c91906120cb565b610c1691906120f8565b61099a9060026120f8565b606060016000610c2f610d0b565b815260200190815260200160002080546108f690612052565b6001600160a01b03811660009081526008602052604081205460ff16610c6f5760086108d5565b506001600160a01b031660009081526007602052604090205490565b6000610c95610fe9565b15610ca05750600090565b6000610caa610cce565b610cb590600e6120a2565b905060088111610cc55780610cc8565b60085b91505090565b600080610cd9610b3d565b9050600e5b6000818152600260205260409020548210610cf95792915050565b80610d038161210f565b915050610cde565b600080610d16610cce565b905080600e14610d3057610d2b816001612126565b610cc8565b600e91505090565b6001600160a01b0381166000908152600a60205260408120546108d59061184d565b610d62611901565b610d6c600061195b565b565b610d76611901565b67016345785d8a00006014819055601555565b610d91611901565b6013805460ff60a01b1916600160a01b179055565b6011546000906001600160a01b0316336001600160a01b03161480610dde57506012546001600160a01b0316336001600160a01b0316145b610de757600080fd5b6108d5826119ab565b6000610dfa610fe9565b15610e0757506000919050565b6001600160a01b03821660009081526008602052604090205460ff16610e2f576108a9610c8b565b506001600160a01b03166000908152600760209081526040808320548352600390915290205490565b6001600160a01b03811660009081526008602052604081205460ff16610e2f5760086108d5565b60006109ac3384846111a0565b606060016000610c2f610cce565b600080735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612153565b5050509150506305f5e10081610cc891906121a3565b6000610f33610fe9565b15610f3e5750600f90565b6000610cb5610cce565b6000610f52610fe9565b15610f7157426006546078610f679190612126565b61099a91906120a2565b50600090565b6011546000906001600160a01b0316336001600160a01b03161480610faf57506012546001600160a01b0316336001600160a01b0316145b610fb857600080fd5b6108d582611a0b565b6001600160a01b03811660009081526008602052604081205460ff16610c6f576108a9610cce565b6000426006546078610ffb9190612126565b1015905090565b61100a611901565b6001600160a01b03811661106f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b6110788161195b565b50565b6001600160a01b0383166110dd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610aef565b6001600160a01b03821661113e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610aef565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166112045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aef565b6001600160a01b0382166112665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aef565b600081116112c65760405162461bcd60e51b815260206004820152602760248201527f544f4b454e3a205472616e7366657220616d6f756e74206d75737420657863656044820152666564207a65726f60c81b6064820152608401610aef565b6000546001600160a01b038481169116148015906112f257506000546001600160a01b03838116911614155b801561133057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b801561136e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b1561165b57601354600160a01b900460ff1661142b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461142b5760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c6564006064820152608401610aef565b60145481111561147d5760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a204d6178205472616e73616374696f6e204c696d6974000000006044820152606401610aef565b6013546001600160a01b03838116911614611503576015548161149f84610d38565b6114a99190612126565b11156115035760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b6064820152608401610aef565b600061152e7f0000000000000000000000000000000000000000000000000000000000000000610d38565b9050633b9aca00811015801561154e5750601354600160a81b900460ff16155b801561156857506013546001600160a01b03858116911614155b801561158d57506001600160a01b0384166000908152600d602052604090205460ff16155b80156115b257506001600160a01b0383166000908152600d602052604090205460ff16155b15611659576013805460ff60b01b1916600160b01b1790556014546115e6908210156115de5781611a0b565b601454611a0b565b506013805460ff60b01b191690556001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163115611659576116577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316316119ab565b505b505b6001600160a01b0383166000908152600d60205260408120546001919060ff168061169e57506001600160a01b0384166000908152600d602052604090205460ff165b806116d057506013546001600160a01b038681169116148015906116d057506013546001600160a01b03858116911614155b156116de576000915061182c565b6013546001600160a01b03868116911614801561171857506001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15611785576001600160a01b03841660009081526008602052604090205460ff1661177557611745610cce565b6001600160a01b0385166000908152600760209081526040808320939093556008905220805460ff191660011790555b61177e84610df0565b6010555060015b6013546001600160a01b0385811691161480156117bf57506001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d14155b1561182c576001600160a01b03851660009081526008602052604090205460ff1661181c576117ec610cce565b6001600160a01b0386166000908152600760209081526040808320939093556008905220805460ff191660011790555b6118258561086a565b6010555060015b61183885858585611b8a565b801561184657611846611bb7565b5050505050565b6000600e548211156118b45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610aef565b601354600160b01b900460ff161580156118d75750601354600160a81b900460ff165b6118ed576118e3611bf0565b6108a990836120cb565b6108d567016345785d8a00006104006120f8565b6000546001600160a01b03163314610d6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60125460405160009182916001600160a01b039091169084908381818185875af1925050503d80600081146119fc576040519150601f19603f3d011682016040523d82523d6000602084013e611a01565b606091505b5090949350505050565b6013805460ff60a81b1916600160a81b179055604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611a7757611a776121e7565b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611abf57611abf6121e7565b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d63791ac947846000847f0000000000000000000000000000000000000000000000000000000000000000611b2242610e10612126565b6040518663ffffffff1660e01b8152600401611b429594939291906121fd565b600060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b50506013805460ff60a81b19169055506001949350505050565b80611b9757611b97611c08565b611ba2848484611c1b565b80611bb157611bb16002601055565b50505050565b6000611bc1610cce565b9050600554811115611bd257426006555b6005819055611bdf610e8c565b600990611bec90826122bc565b5050565b600067016345785d8a0000600e5461099a91906120cb565b601054600003611c1457565b6000601055565b601354600160a81b900460ff161580611c3d5750601354600160b01b900460ff165b15611dce57600080600080600080611c5487611e18565b6001600160a01b038f166000908152600a6020526040902054959b50939950919750955093509150611c879087906120a2565b6001600160a01b03808b166000908152600a602052604080822093909355908a1681522054611cb7908690612126565b6001600160a01b0389166000908152600a6020526040902055611cd8611bf0565b611ce290826120f8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600a6020526040902054611d259190612126565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600a6020526040902055600e54611d6c9085906120a2565b600e55600f54611d7d908390612126565b600f556040518381526001600160a01b03808a1691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161119391815260200190565b505050565b6000806000806000806000806000611e348a6000601054611e6c565b9250925092506000806000611e528d8686611e4d611bf0565b611ec5565b919f909e50909c50959a5093985091965092945050505050565b60008080806064611e7d87896120f8565b611e8791906120cb565b905060006064611e97878a6120f8565b611ea191906120cb565b905080611eae838a6120a2565b611eb891906120a2565b9891975095509350505050565b6000808080611ed485896120f8565b90506000611ee286896120f8565b905081611eef87896120f8565b611ef983856120a2565b611f0391906120a2565b909a90995090975095505050505050565b80356001600160a01b0381168114611f2b57600080fd5b919050565b600060208284031215611f4257600080fd5b611f4b82611f14565b9392505050565b600060208083528351808285015260005b81811015611f7f57858101830151858201604001528201611f63565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215611fb357600080fd5b611fbc83611f14565b946020939093013593505050565b600080600060608486031215611fdf57600080fd5b611fe884611f14565b9250611ff660208501611f14565b9150604084013590509250925092565b60006020828403121561201857600080fd5b5035919050565b6000806040838503121561203257600080fd5b61203b83611f14565b915061204960208401611f14565b90509250929050565b600181811c9082168061206657607f821691505b60208210810361208657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108d5576108d561208c565b634e487b7160e01b600052601260045260246000fd5b6000826120da576120da6120b5565b500490565b6000602082840312156120f157600080fd5b5051919050565b80820281158282048414176108d5576108d561208c565b60008161211e5761211e61208c565b506000190190565b808201808211156108d5576108d561208c565b805169ffffffffffffffffffff81168114611f2b57600080fd5b600080600080600060a0868803121561216b57600080fd5b61217486612139565b945060208601519350604086015192506060860151915061219760808701612139565b90509295509295909350565b6000826121b2576121b26120b5565b600160ff1b8214600019841416156121cc576121cc61208c565b500590565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561224d5784516001600160a01b031683529383019391830191600101612228565b50506001600160a01b03969096166060850152505050608001529392505050565b601f821115611e1357600081815260208120601f850160051c810160208610156122955750805b601f850160051c820191505b818110156122b4578281556001016122a1565b505050505050565b815167ffffffffffffffff8111156122d6576122d66121d1565b6122ea816122e48454612052565b8461226e565b602080601f83116001811461231f57600084156123075750858301515b600019600386901b1c1916600185901b1785556122b4565b600085815260208120601f198616915b8281101561234e5788860151825594840194600190910190840161232f565b508582101561236c5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220a567472fe30cd96e0ba160fb3969db66f2bb859d031b66dd3e6a58f2b5a867c164736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806390526cf211610175578063c4918b4e116100dc578063dd62ed3e11610095578063ef19dd811161006f578063ef19dd81146107d9578063f2fde38b1461080d578063f8b45b051461082d578063fdec60701461084357600080fd5b8063dd62ed3e1461075e578063de38c34e146107a4578063e7a6082e146107c457600080fd5b8063c4918b4e146106d6578063c6c934fa146106ec578063c83ccdec14610701578063c8e956ab14610662578063cc2d04aa14610716578063cd02a6d31461073657600080fd5b8063a9059cbb1161012e578063a9059cbb14610677578063ad1efb9214610697578063ad5c464814610459578063ae0b06ab146106ac578063bf45efce14610496578063bf4b1990146106c157600080fd5b806390526cf21461059b5780639399568f146105bb57806395d89b41146105f45780639c2b88d414610622578063a163123214610642578063a411209a1461066257600080fd5b80633fc8cef3116102195780635b01708a116101d25780635b01708a1461050757806370a082311461051c578063715018a61461053c578063751039fc146105535780638a8c523c146105685780638da5cb5b1461057d57600080fd5b80633fc8cef314610459578063442f0436146104815780634987dfec1461049657806349bd5a5e146104aa578063529f7676146104ca57806359d0f713146104df57600080fd5b806323b872dd1161026b57806323b872dd146103be578063255e421c146103de57806327f421d5146103f35780632a6cf5ea146104085780632e7b522814610428578063313ce5671461043d57600080fd5b80630255874f146102be57806306fdde03146102f1578063095ea7b3146103135780631207f090146103435780631694505e1461036357806318160ddd146103a357600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506102de6102d9366004611f30565b61086a565b6040519081526020015b60405180910390f35b3480156102fd57600080fd5b506103066108db565b6040516102e89190611f52565b34801561031f57600080fd5b5061033361032e366004611fa0565b61099f565b60405190151581526020016102e8565b34801561034f57600080fd5b5061030661035e366004611f30565b6109b5565b34801561036f57600080fd5b5061038b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102e8565b3480156103af57600080fd5b5067016345785d8a00006102de565b3480156103ca57600080fd5b506103336103d9366004611fca565b610a62565b3480156103ea57600080fd5b506102de610b3d565b3480156103ff57600080fd5b50610306610c21565b34801561041457600080fd5b506102de610423366004611f30565b610c48565b34801561043457600080fd5b506102de610c8b565b34801561044957600080fd5b50604051600981526020016102e8565b34801561046557600080fd5b5061038b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561048d57600080fd5b506005546102de565b3480156104a257600080fd5b5060086102de565b3480156104b657600080fd5b5060135461038b906001600160a01b031681565b3480156104d657600080fd5b506102de610cce565b3480156104eb57600080fd5b5061038b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b34801561051357600080fd5b506102de610d0b565b34801561052857600080fd5b506102de610537366004611f30565b610d38565b34801561054857600080fd5b50610551610d5a565b005b34801561055f57600080fd5b50610551610d6e565b34801561057457600080fd5b50610551610d89565b34801561058957600080fd5b506000546001600160a01b031661038b565b3480156105a757600080fd5b506103336105b6366004612006565b610da6565b3480156105c757600080fd5b506103336105d6366004611f30565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561060057600080fd5b5060408051808201909152600581526427a1a2a0a760d91b6020820152610306565b34801561062e57600080fd5b506102de61063d366004611f30565b610df0565b34801561064e57600080fd5b506102de61065d366004611f30565b610e58565b34801561066e57600080fd5b506102de600881565b34801561068357600080fd5b50610333610692366004611fa0565b610e7f565b3480156106a357600080fd5b506006546102de565b3480156106b857600080fd5b50610306610e8c565b3480156106cd57600080fd5b506102de610e9a565b3480156106e257600080fd5b506102de60145481565b3480156106f857600080fd5b506102de610f29565b34801561070d57600080fd5b506102de610f48565b34801561072257600080fd5b50610333610731366004612006565b610f77565b34801561074257600080fd5b5061038b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b34801561076a57600080fd5b506102de61077936600461201f565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156107b057600080fd5b506102de6107bf366004611f30565b610fc1565b3480156107d057600080fd5b50610333610fe9565b3480156107e557600080fd5b5061038b7f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c46881565b34801561081957600080fd5b50610551610828366004611f30565b611002565b34801561083957600080fd5b506102de60155481565b34801561084f57600080fd5b50735f4ec3df9cbd43714fe2740f5e3616155c5b841961038b565b6000610874610fe9565b156108815750600f919050565b6001600160a01b03821660009081526008602052604090205460ff166108ae576108a9610f29565b6108d5565b6001600160a01b038216600090815260076020908152604080832054835260049091529020545b92915050565b60606108e5610fe9565b61097957600980546108f690612052565b80601f016020809104026020016040519081016040528092919081815260200182805461092290612052565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b60405180604001604052806007815260200166f09f9ba2efb88f60c81b8152505b905090565b60006109ac33848461107b565b50600192915050565b6060600160006109c484610fc1565b815260200190815260200160002080546109dd90612052565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0990612052565b8015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b50505050509050919050565b6000610a6f8484846111a0565b6001600160a01b0384166000908152600c60209081526040808320338452909152902054821115610af85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6001600160a01b0384166000908152600c6020908152604080832033808552925290912054610b33918691610b2e9086906120a2565b61107b565b5060019392505050565b601354600090610b55906001600160a01b0316610d38565b610b679067016345785d8a00006120cb565b670de0b6b3a7640000610b78610e9a565b6013546040516370a0823160e01b81526001600160a01b03909116600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf891906120df565b610c0291906120f8565b610c0c91906120cb565b610c1691906120f8565b61099a9060026120f8565b606060016000610c2f610d0b565b815260200190815260200160002080546108f690612052565b6001600160a01b03811660009081526008602052604081205460ff16610c6f5760086108d5565b506001600160a01b031660009081526007602052604090205490565b6000610c95610fe9565b15610ca05750600090565b6000610caa610cce565b610cb590600e6120a2565b905060088111610cc55780610cc8565b60085b91505090565b600080610cd9610b3d565b9050600e5b6000818152600260205260409020548210610cf95792915050565b80610d038161210f565b915050610cde565b600080610d16610cce565b905080600e14610d3057610d2b816001612126565b610cc8565b600e91505090565b6001600160a01b0381166000908152600a60205260408120546108d59061184d565b610d62611901565b610d6c600061195b565b565b610d76611901565b67016345785d8a00006014819055601555565b610d91611901565b6013805460ff60a01b1916600160a01b179055565b6011546000906001600160a01b0316336001600160a01b03161480610dde57506012546001600160a01b0316336001600160a01b0316145b610de757600080fd5b6108d5826119ab565b6000610dfa610fe9565b15610e0757506000919050565b6001600160a01b03821660009081526008602052604090205460ff16610e2f576108a9610c8b565b506001600160a01b03166000908152600760209081526040808320548352600390915290205490565b6001600160a01b03811660009081526008602052604081205460ff16610e2f5760086108d5565b60006109ac3384846111a0565b606060016000610c2f610cce565b600080735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612153565b5050509150506305f5e10081610cc891906121a3565b6000610f33610fe9565b15610f3e5750600f90565b6000610cb5610cce565b6000610f52610fe9565b15610f7157426006546078610f679190612126565b61099a91906120a2565b50600090565b6011546000906001600160a01b0316336001600160a01b03161480610faf57506012546001600160a01b0316336001600160a01b0316145b610fb857600080fd5b6108d582611a0b565b6001600160a01b03811660009081526008602052604081205460ff16610c6f576108a9610cce565b6000426006546078610ffb9190612126565b1015905090565b61100a611901565b6001600160a01b03811661106f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aef565b6110788161195b565b50565b6001600160a01b0383166110dd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610aef565b6001600160a01b03821661113e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610aef565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166112045760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aef565b6001600160a01b0382166112665760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aef565b600081116112c65760405162461bcd60e51b815260206004820152602760248201527f544f4b454e3a205472616e7366657220616d6f756e74206d75737420657863656044820152666564207a65726f60c81b6064820152608401610aef565b6000546001600160a01b038481169116148015906112f257506000546001600160a01b03838116911614155b801561133057507f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c4686001600160a01b0316836001600160a01b031614155b801561136e57507f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c4686001600160a01b0316826001600160a01b031614155b1561165b57601354600160a01b900460ff1661142b577f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c4686001600160a01b0316836001600160a01b03161461142b5760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c6564006064820152608401610aef565b60145481111561147d5760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a204d6178205472616e73616374696f6e204c696d6974000000006044820152606401610aef565b6013546001600160a01b03838116911614611503576015548161149f84610d38565b6114a99190612126565b11156115035760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b6064820152608401610aef565b600061152e7f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c468610d38565b9050633b9aca00811015801561154e5750601354600160a81b900460ff16155b801561156857506013546001600160a01b03858116911614155b801561158d57506001600160a01b0384166000908152600d602052604090205460ff16155b80156115b257506001600160a01b0383166000908152600d602052604090205460ff16155b15611659576013805460ff60b01b1916600160b01b1790556014546115e6908210156115de5781611a0b565b601454611a0b565b506013805460ff60b01b191690556001600160a01b037f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c468163115611659576116577f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c4686001600160a01b0316316119ab565b505b505b6001600160a01b0383166000908152600d60205260408120546001919060ff168061169e57506001600160a01b0384166000908152600d602052604090205460ff165b806116d057506013546001600160a01b038681169116148015906116d057506013546001600160a01b03858116911614155b156116de576000915061182c565b6013546001600160a01b03868116911614801561171857506001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15611785576001600160a01b03841660009081526008602052604090205460ff1661177557611745610cce565b6001600160a01b0385166000908152600760209081526040808320939093556008905220805460ff191660011790555b61177e84610df0565b6010555060015b6013546001600160a01b0385811691161480156117bf57506001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d14155b1561182c576001600160a01b03851660009081526008602052604090205460ff1661181c576117ec610cce565b6001600160a01b0386166000908152600760209081526040808320939093556008905220805460ff191660011790555b6118258561086a565b6010555060015b61183885858585611b8a565b801561184657611846611bb7565b5050505050565b6000600e548211156118b45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610aef565b601354600160b01b900460ff161580156118d75750601354600160a81b900460ff165b6118ed576118e3611bf0565b6108a990836120cb565b6108d567016345785d8a00006104006120f8565b6000546001600160a01b03163314610d6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aef565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60125460405160009182916001600160a01b039091169084908381818185875af1925050503d80600081146119fc576040519150601f19603f3d011682016040523d82523d6000602084013e611a01565b606091505b5090949350505050565b6013805460ff60a81b1916600160a81b179055604080516002808252606082018352600092839291906020830190803683370190505090507f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c46881600081518110611a7757611a776121e7565b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611abf57611abf6121e7565b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d63791ac947846000847f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c468611b2242610e10612126565b6040518663ffffffff1660e01b8152600401611b429594939291906121fd565b600060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b50506013805460ff60a81b19169055506001949350505050565b80611b9757611b97611c08565b611ba2848484611c1b565b80611bb157611bb16002601055565b50505050565b6000611bc1610cce565b9050600554811115611bd257426006555b6005819055611bdf610e8c565b600990611bec90826122bc565b5050565b600067016345785d8a0000600e5461099a91906120cb565b601054600003611c1457565b6000601055565b601354600160a81b900460ff161580611c3d5750601354600160b01b900460ff165b15611dce57600080600080600080611c5487611e18565b6001600160a01b038f166000908152600a6020526040902054959b50939950919750955093509150611c879087906120a2565b6001600160a01b03808b166000908152600a602052604080822093909355908a1681522054611cb7908690612126565b6001600160a01b0389166000908152600a6020526040902055611cd8611bf0565b611ce290826120f8565b6001600160a01b037f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c468166000908152600a6020526040902054611d259190612126565b6001600160a01b037f000000000000000000000000de392c6b4d652d13502e0837ed9965a45673c468166000908152600a6020526040902055600e54611d6c9085906120a2565b600e55600f54611d7d908390612126565b600f556040518381526001600160a01b03808a1691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161119391815260200190565b505050565b6000806000806000806000806000611e348a6000601054611e6c565b9250925092506000806000611e528d8686611e4d611bf0565b611ec5565b919f909e50909c50959a5093985091965092945050505050565b60008080806064611e7d87896120f8565b611e8791906120cb565b905060006064611e97878a6120f8565b611ea191906120cb565b905080611eae838a6120a2565b611eb891906120a2565b9891975095509350505050565b6000808080611ed485896120f8565b90506000611ee286896120f8565b905081611eef87896120f8565b611ef983856120a2565b611f0391906120a2565b909a90995090975095505050505050565b80356001600160a01b0381168114611f2b57600080fd5b919050565b600060208284031215611f4257600080fd5b611f4b82611f14565b9392505050565b600060208083528351808285015260005b81811015611f7f57858101830151858201604001528201611f63565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215611fb357600080fd5b611fbc83611f14565b946020939093013593505050565b600080600060608486031215611fdf57600080fd5b611fe884611f14565b9250611ff660208501611f14565b9150604084013590509250925092565b60006020828403121561201857600080fd5b5035919050565b6000806040838503121561203257600080fd5b61203b83611f14565b915061204960208401611f14565b90509250929050565b600181811c9082168061206657607f821691505b60208210810361208657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108d5576108d561208c565b634e487b7160e01b600052601260045260246000fd5b6000826120da576120da6120b5565b500490565b6000602082840312156120f157600080fd5b5051919050565b80820281158282048414176108d5576108d561208c565b60008161211e5761211e61208c565b506000190190565b808201808211156108d5576108d561208c565b805169ffffffffffffffffffff81168114611f2b57600080fd5b600080600080600060a0868803121561216b57600080fd5b61217486612139565b945060208601519350604086015192506060860151915061219760808701612139565b90509295509295909350565b6000826121b2576121b26120b5565b600160ff1b8214600019841416156121cc576121cc61208c565b500590565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561224d5784516001600160a01b031683529383019391830191600101612228565b50506001600160a01b03969096166060850152505050608001529392505050565b601f821115611e1357600081815260208120601f850160051c810160208610156122955750805b601f850160051c820191505b818110156122b4578281556001016122a1565b505050505050565b815167ffffffffffffffff8111156122d6576122d66121d1565b6122ea816122e48454612052565b8461226e565b602080601f83116001811461231f57600084156123075750858301515b600019600386901b1c1916600185901b1785556122b4565b600085815260208120601f198616915b8281101561234e5788860151825594840194600190910190840161232f565b508582101561236c5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220a567472fe30cd96e0ba160fb3969db66f2bb859d031b66dd3e6a58f2b5a867c164736f6c63430008130033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.