ETH Price: $1,620.70 (-1.03%)
Gas: 10 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multi Chain

Transaction Hash
Method
Block
From
To
Value
Transfer181803502023-09-20 23:21:479 hrs 34 mins ago1695252107IN
0x610C58...Dba661Bd
0 ETH0.0009121310.58940219
Approve181752952023-09-20 6:23:351 day 2 hrs ago1695191015IN
0x610C58...Dba661Bd
0 ETH0.000438949.42603175
Approve181750832023-09-20 5:40:471 day 3 hrs ago1695188447IN
0x610C58...Dba661Bd
0 ETH0.000213247.97879623
Approve181750812023-09-20 5:40:231 day 3 hrs ago1695188423IN
0x610C58...Dba661Bd
0 ETH0.000380668.16414252
Approve181750722023-09-20 5:38:351 day 3 hrs ago1695188315IN
0x610C58...Dba661Bd
0 ETH0.00038558.26775868
Approve181703062023-09-19 13:38:351 day 19 hrs ago1695130715IN
0x610C58...Dba661Bd
0 ETH0.0005677312.175997
Transfer181702992023-09-19 13:37:111 day 19 hrs ago1695130631IN
0x610C58...Dba661Bd
0 ETH0.0008948311
Approve181663492023-09-19 0:19:232 days 8 hrs ago1695082763IN
0x610C58...Dba661Bd
0 ETH0.000231679.54045946
Approve181655272023-09-18 21:33:592 days 11 hrs ago1695072839IN
0x610C58...Dba661Bd
0 ETH0.0008035717.23417358
Approve181627862023-09-18 12:20:232 days 20 hrs ago1695039623IN
0x610C58...Dba661Bd
0 ETH0.000463859.96105859
Transfer181611932023-09-18 6:56:353 days 1 hr ago1695020195IN
0x610C58...Dba661Bd
0 ETH0.000617917.59703286
Transfer181593462023-09-18 0:41:473 days 8 hrs ago1694997707IN
0x610C58...Dba661Bd
0 ETH0.0011163313.72280959
Transfer181582122023-09-17 20:49:113 days 12 hrs ago1694983751IN
0x610C58...Dba661Bd
0 ETH0.000668778.22101342
Approve181548662023-09-17 9:26:473 days 23 hrs ago1694942807IN
0x610C58...Dba661Bd
0 ETH0.000326237.00570377
Transfer181533672023-09-17 4:20:114 days 4 hrs ago1694924411IN
0x610C58...Dba661Bd
0 ETH0.000523268.14430127
Transfer181533492023-09-17 4:16:354 days 4 hrs ago1694924195IN
0x610C58...Dba661Bd
0 ETH0.000704868.18531551
Approve181531822023-09-17 3:42:474 days 5 hrs ago1694922167IN
0x610C58...Dba661Bd
0 ETH0.000380678.17475041
Approve181524992023-09-17 1:21:474 days 7 hrs ago1694913707IN
0x610C58...Dba661Bd
0 ETH0.00042979.21579295
Approve181499482023-09-16 16:41:594 days 16 hrs ago1694882519IN
0x610C58...Dba661Bd
0 ETH0.0005529811.87511129
Approve181490452023-09-16 13:37:594 days 19 hrs ago1694871479IN
0x610C58...Dba661Bd
0 ETH0.0002596610.69315721
Approve181490232023-09-16 13:33:354 days 19 hrs ago1694871215IN
0x610C58...Dba661Bd
0 ETH0.0005254711.28437786
Approve181489302023-09-16 13:14:354 days 19 hrs ago1694870075IN
0x610C58...Dba661Bd
0 ETH0.0005449511.76622744
Approve181479712023-09-16 9:58:354 days 22 hrs ago1694858315IN
0x610C58...Dba661Bd
0 ETH0.000438679.4081531
Approve181466502023-09-16 5:29:595 days 3 hrs ago1694842199IN
0x610C58...Dba661Bd
0 ETH0.000243588.34117577
Approve181444472023-09-15 22:03:595 days 10 hrs ago1694815439IN
0x610C58...Dba661Bd
0 ETH0.0006340713.69393762
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Advanced Filter
Parent Txn Hash Block From To Value
181467812023-09-16 5:56:355 days 2 hrs ago1694843795
0x610C58...Dba661Bd
0.6256292 ETH
181467812023-09-16 5:56:355 days 2 hrs ago1694843795
0x610C58...Dba661Bd
0.06256292 ETH
181467812023-09-16 5:56:355 days 2 hrs ago1694843795
0x610C58...Dba661Bd
0.06256292 ETH
181467812023-09-16 5:56:355 days 2 hrs ago1694843795
0x610C58...Dba661Bd
0.75075504 ETH
181382322023-09-15 1:02:116 days 7 hrs ago1694739731
0x610C58...Dba661Bd
0.86445467 ETH
181382322023-09-15 1:02:116 days 7 hrs ago1694739731
0x610C58...Dba661Bd
0.08644546 ETH
181382322023-09-15 1:02:116 days 7 hrs ago1694739731
0x610C58...Dba661Bd
0.08644546 ETH
181382322023-09-15 1:02:116 days 7 hrs ago1694739731
0x610C58...Dba661Bd
1.0373456 ETH
181353962023-09-14 15:27:596 days 17 hrs ago1694705279
0x610C58...Dba661Bd
0.43814229 ETH
181353962023-09-14 15:27:596 days 17 hrs ago1694705279
0x610C58...Dba661Bd
0.04381422 ETH
181353962023-09-14 15:27:596 days 17 hrs ago1694705279
0x610C58...Dba661Bd
0.04381422 ETH
181353962023-09-14 15:27:596 days 17 hrs ago1694705279
0x610C58...Dba661Bd
0.52577075 ETH
180980772023-09-09 9:54:4711 days 23 hrs ago1694253287
0x610C58...Dba661Bd
0.48544073 ETH
180980772023-09-09 9:54:4711 days 23 hrs ago1694253287
0x610C58...Dba661Bd
0.04854407 ETH
180980772023-09-09 9:54:4711 days 23 hrs ago1694253287
0x610C58...Dba661Bd
0.04854407 ETH
180980772023-09-09 9:54:4711 days 23 hrs ago1694253287
0x610C58...Dba661Bd
0.58252888 ETH
180839232023-09-07 10:22:3513 days 22 hrs ago1694082155
0x610C58...Dba661Bd
0.49492961 ETH
180839232023-09-07 10:22:3513 days 22 hrs ago1694082155
0x610C58...Dba661Bd
0.04949296 ETH
180839232023-09-07 10:22:3513 days 22 hrs ago1694082155
0x610C58...Dba661Bd
0.04949296 ETH
180839232023-09-07 10:22:3513 days 22 hrs ago1694082155
0x610C58...Dba661Bd
0.59391553 ETH
180490712023-09-02 13:16:3518 days 19 hrs ago1693660595
0x610C58...Dba661Bd
0.73571313 ETH
180490712023-09-02 13:16:3518 days 19 hrs ago1693660595
0x610C58...Dba661Bd
0.07357131 ETH
180490712023-09-02 13:16:3518 days 19 hrs ago1693660595
0x610C58...Dba661Bd
0.07357131 ETH
180490712023-09-02 13:16:3518 days 19 hrs ago1693660595
0x610C58...Dba661Bd
0.88285576 ETH
180469102023-09-02 6:00:2319 days 2 hrs ago1693634423
0x610C58...Dba661Bd
0.68076302 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FX1SportsToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion
File 1 of 8 : FX1SportsToken.sol
//SPDX-License-Identifier: None

pragma solidity ^0.8.19;

import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IFX1SportsToken.sol";

/// @title FX1 Sports Token
/// @title https://fx1.io/
/// @title https://t.me/fx1_sports_portal
/// @author https://PROOFplatform.io
/// @author https://5thWeb.io

contract FX1SportsToken is Ownable2Step, IFX1SportsToken {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) public bots;
    mapping(address => bool) public excludedFromFees;
    mapping(address => bool) public excludedFromMaxTransfer;
    mapping(address => bool) public excludedFromMaxWallet;
    mapping(address => bool) public whitelists;

    uint256 private _totalSupply = 250_000_000 * 10 ** _decimals;
    uint256 public launchTime;
    uint256 public whitelistPeriod;
    uint256 public swapThreshold;
    uint256 public maxTransferAmount;
    uint256 public maxWalletAmount;
    uint256 private accLiquidityAmount;
    uint256 private accMarketingAmount;
    uint256 private accPROOFAmount;

    address public marketingTaxRecv;
    address public proofRevenue;
    address public proofRewards;
    address public proofAdmin;
    address public pair;
    address constant DEAD = 0x000000000000000000000000000000000000dEaD;

    bool private inSwapLiquidity;

    string private _name = "FX1 Sports";
    string private _symbol = "FX1";

    uint16 public immutable FIXED_POINT = 1000;
    uint8 private constant _decimals = 18;

    IUniswapV2Router02 public dexRouter;
    BuyFeeRate public buyfeeRate;
    SellFeeRate public sellfeeRate;

    modifier onlyPROOFAdmin() {
        require(
            proofAdmin == _msgSender(),
            "Ownable: caller is not the proofAdmin"
        );
        _;
    }

    constructor(Param memory _param) {
        require(
            _param.proofRevenue != address(0),
            "invalid PROOF Revenue address"
        );
        require(
            _param.proofRewards != address(0),
            "invalid PROOF Rewards address"
        );
        require(
            _param.proofAdmin != address(0),
            "invalid PROOF Rewards address"
        );
        require(
            _param.marketingTaxRecv != address(0),
            "invalid MarketingTaxRecv address"
        );
        require(
            _param.teamAllocator_1 != address(0),
            "invalid teamAllocator_1 address"
        );
        require(
            _param.teamAllocator_2 != address(0),
            "invalid teamAllocator_2 address"
        );
        require(_param.dexRouter != address(0), "invalid dexRouter adddress");
        require(_param.whitelistPeriod > 0, "invalid whitelistPeriod");
        require(_param.proofFeeDuration > 0, "invalid proofFeeDuration");
        require(
            _param.highPROOFFeeRate > 0 &&
                _param.highPROOFFeeRate > _param.normalPROOFFeeRate,
            "invalid highPROOFFeeRate"
        );
        require(_param.normalPROOFFeeRate > 0, "invalid normalPROOFFeeRate");
        require(
            _param.totalTeamAllocationRate > 0,
            "invalid totalTeamAllocationRate"
        );
        require(
            _param.totalTeamAllocationRate ==
                _param.teamAllocationRate_1 + _param.teamAllocationRate_2,
            "invalid teamAllocationRates"
        );

        address sender = msg.sender;
        proofRevenue = _param.proofRevenue;
        proofRewards = _param.proofRewards;
        proofAdmin = _param.proofAdmin;
        marketingTaxRecv = _param.marketingTaxRecv;
        dexRouter = IUniswapV2Router02(_param.dexRouter);
        whitelistPeriod = _param.whitelistPeriod;
        buyfeeRate.highPROOFFeeRate = _param.highPROOFFeeRate;
        buyfeeRate.normalPROOFFeeRate = _param.normalPROOFFeeRate;
        buyfeeRate.liquidityFeeRate = _param.liquidityFeeRate;
        buyfeeRate.marketingFeeRate = _param.marketingFeeRate;
        buyfeeRate.proofFeeDuration = _param.proofFeeDuration;
        buyfeeRate.highTotalFeeRate =
            _param.marketingFeeRate +
            _param.liquidityFeeRate +
            _param.highPROOFFeeRate;
        buyfeeRate.normalTotalFeeRate =
            _param.marketingFeeRate +
            _param.liquidityFeeRate +
            _param.normalPROOFFeeRate;

        sellfeeRate.highPROOFFeeRate = _param.highPROOFFeeRate;
        sellfeeRate.normalPROOFFeeRate = _param.normalPROOFFeeRate;
        sellfeeRate.liquidityFeeRate = _param.liquidityFeeRate;
        sellfeeRate.marketingFeeRate = _param.marketingFeeRate;
        sellfeeRate.proofFeeDuration = _param.proofFeeDuration;
        sellfeeRate.highTotalFeeRate =
            _param.marketingFeeRate +
            _param.liquidityFeeRate +
            _param.highPROOFFeeRate;
        sellfeeRate.normalTotalFeeRate =
            _param.marketingFeeRate +
            _param.liquidityFeeRate +
            _param.normalPROOFFeeRate;

        pair = IUniswapV2Factory(dexRouter.factory()).createPair(
            dexRouter.WETH(),
            address(this)
        );

        excludedFromFees[sender] = true;
        excludedFromMaxTransfer[sender] = true;
        excludedFromMaxTransfer[pair] = true;
        excludedFromMaxTransfer[address(this)] = true;
        excludedFromMaxWallet[sender] = true;
        excludedFromMaxWallet[pair] = true;
        excludedFromMaxWallet[address(this)] = true;
        excludedFromMaxWallet[proofRevenue] = true;
        excludedFromMaxWallet[proofRewards] = true;
        excludedFromMaxWallet[proofAdmin] = true;
        excludedFromMaxWallet[marketingTaxRecv] = true;
        whitelists[sender] = true;
        whitelists[pair] = true;
        whitelists[address(this)] = true;

        uint256 totalTeamAllocationAmount = (_totalSupply *
            _param.totalTeamAllocationRate) / FIXED_POINT;
        uint256 teamAllocationAmount_1 = (_totalSupply *
            _param.teamAllocationRate_1) / FIXED_POINT;
        uint256 teamAllocationAmount_2 = totalTeamAllocationAmount -
            teamAllocationAmount_1;
        uint256 amountForDeployer = _totalSupply - totalTeamAllocationAmount;
        _balances[_param.teamAllocator_1] += teamAllocationAmount_1;
        _balances[_param.teamAllocator_2] += teamAllocationAmount_2;
        _balances[msg.sender] += amountForDeployer;
        emit Transfer(address(0), msg.sender, amountForDeployer);
        emit Transfer(
            address(0),
            _param.teamAllocator_1,
            teamAllocationAmount_1
        );
        emit Transfer(
            address(0),
            _param.teamAllocator_2,
            teamAllocationAmount_2
        );
        swapThreshold = _totalSupply / 10000; // 0.01%
        maxTransferAmount = (_totalSupply * 5) / 1000; // 0.5%
        maxWalletAmount = (_totalSupply * 1) / 100; // 1%
    }

    // !---------------- functions for ERC20 token ----------------!
    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

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

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(
        address _recipient,
        uint256 _amount
    ) external override returns (bool) {
        _transfer(msg.sender, _recipient, _amount);
        return true;
    }

    function allowance(
        address _owner,
        address _spender
    ) external view override returns (uint256) {
        return _allowances[_owner][_spender];
    }

    function approve(
        address _spender,
        uint256 _amount
    ) external override returns (bool) {
        _approve(msg.sender, _spender, _amount);
        return true;
    }

    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external override returns (bool) {
        uint256 currentAllowance = _allowances[_sender][msg.sender];
        require(currentAllowance >= _amount, "Transfer > allowance");
        _approve(_sender, msg.sender, currentAllowance - _amount);
        _transfer(_sender, _recipient, _amount);
        return true;
    }

    // !---------------- functions for ERC20 token ----------------!

    /// @inheritdoc IFX1SportsToken
    function updatePROOFAdmin(
        address _newAdmin
    ) external override onlyPROOFAdmin {
        require(_newAdmin != address(0), "invalid proofAdmin address");
        proofAdmin = _newAdmin;
    }

    /// @inheritdoc IFX1SportsToken
    function setBots(address[] memory _bots) external override onlyPROOFAdmin {
        uint256 length = _bots.length;
        require(length > 0, "invalid array length");
        for (uint256 i = 0; i < _bots.length; i++) {
            bots[_bots[i]] = true;
        }
    }

    /// @inheritdoc IFX1SportsToken
    function cancelToken() external override onlyPROOFAdmin {
        excludedFromFees[address(dexRouter)] = true;
        excludedFromMaxTransfer[address(dexRouter)] = true;
        excludedFromMaxWallet[address(dexRouter)] = true;
        excludedFromMaxTransfer[owner()] = true;
        excludedFromMaxWallet[owner()] = true;
        _transferOwnership(proofAdmin);
    }

    /// @inheritdoc IFX1SportsToken
    function formatPROOFFee() external override onlyPROOFAdmin {
        require(buyfeeRate.normalPROOFFeeRate != 0, "already reduced");
        require(buyfeeRate.highPROOFFeeRate != 0, "already reduced");
        require(sellfeeRate.normalPROOFFeeRate != 0, "already reduced");
        require(sellfeeRate.highPROOFFeeRate != 0, "already reduced");
        buyfeeRate.highTotalFeeRate =
            buyfeeRate.highTotalFeeRate +
            0 -
            buyfeeRate.highPROOFFeeRate;
        buyfeeRate.highPROOFFeeRate = 0;
        buyfeeRate.normalTotalFeeRate =
            buyfeeRate.normalTotalFeeRate +
            0 -
            buyfeeRate.normalPROOFFeeRate;
        buyfeeRate.normalPROOFFeeRate = 0;

        sellfeeRate.highTotalFeeRate =
            sellfeeRate.highTotalFeeRate +
            0 -
            sellfeeRate.highPROOFFeeRate;
        sellfeeRate.highPROOFFeeRate = 0;
        sellfeeRate.normalTotalFeeRate =
            sellfeeRate.normalTotalFeeRate +
            0 -
            sellfeeRate.normalPROOFFeeRate;
        sellfeeRate.normalPROOFFeeRate = 0;
    }

    /// @inheritdoc IFX1SportsToken
    function delBot(address _notbot) external override {
        address sender = _msgSender();
        require(
            sender == proofAdmin || sender == owner(),
            "Ownable: caller doesn't have permission"
        );
        bots[_notbot] = false;
    }

    /// @inheritdoc IFX1SportsToken
    function setLaunchBegin() external override onlyOwner {
        require(launchTime == 0, "already launched");
        launchTime = block.timestamp;
    }

    /// @inheritdoc IFX1SportsToken
    function addWhitelists(
        address[] memory _accounts,
        bool _add
    ) external override onlyOwner {
        uint256 length = _accounts.length;
        require(length > 0, "invalid accounts length");

        for (uint256 i = 0; i < length; i++) {
            whitelists[_accounts[i]] = _add;
        }
    }

    /// @inheritdoc IFX1SportsToken
    function excludeWalletsFromMaxTransfer(
        address[] memory _accounts,
        bool _add
    ) external override onlyOwner {
        uint256 length = _accounts.length;
        require(length > 0, "invalid length array");
        for (uint256 i = 0; i < length; i++) {
            excludedFromMaxTransfer[_accounts[i]] = _add;
        }
    }

    /// @inheritdoc IFX1SportsToken
    function excludeWalletsFromMaxWallets(
        address[] memory _accounts,
        bool _add
    ) external override onlyOwner {
        uint256 length = _accounts.length;
        require(length > 0, "invalid length array");
        for (uint256 i = 0; i < length; i++) {
            excludedFromMaxWallet[_accounts[i]] = _add;
        }
    }

    /// @inheritdoc IFX1SportsToken
    function excludeWalletsFromFees(
        address[] memory _accounts,
        bool _add
    ) external override onlyOwner {
        uint256 length = _accounts.length;
        require(length > 0, "invalid length array");
        for (uint256 i = 0; i < length; i++) {
            excludedFromFees[_accounts[i]] = _add;
        }
    }

    /// @inheritdoc IFX1SportsToken
    function setMaxTransferAmount(
        uint256 newLimit
    ) external override onlyOwner {
        require(newLimit >= (_totalSupply * 5) / 1000, "Min 0.5% limit");
        maxTransferAmount = newLimit;
    }

    /// @inheritdoc IFX1SportsToken
    function setMaxWalletAmount(uint256 newLimit) external override onlyOwner {
        require(newLimit >= (_totalSupply * 10) / 1000, "Min 1% limit");
        maxWalletAmount = newLimit;
    }

    /// @inheritdoc IFX1SportsToken
    function setMarketingTaxWallet(
        address _marketingTaxWallet
    ) external override onlyOwner {
        require(
            _marketingTaxWallet != address(0),
            "invalid marketingTaxWallet address"
        );
        marketingTaxRecv = _marketingTaxWallet;
    }

    /// @inheritdoc IFX1SportsToken
    function reducePROOFFeeRate() external override onlyOwner {
        require(
            block.timestamp > launchTime + buyfeeRate.proofFeeDuration,
            "You must wait 72 hrs"
        );
        buyfeeRate.highTotalFeeRate =
            buyfeeRate.highTotalFeeRate +
            10 -
            buyfeeRate.highPROOFFeeRate;
        buyfeeRate.highPROOFFeeRate = 10;
        buyfeeRate.normalTotalFeeRate =
            buyfeeRate.normalTotalFeeRate +
            10 -
            buyfeeRate.normalPROOFFeeRate;
        buyfeeRate.normalPROOFFeeRate = 10;
        sellfeeRate.highTotalFeeRate =
            sellfeeRate.highTotalFeeRate +
            10 -
            sellfeeRate.highPROOFFeeRate;
        sellfeeRate.highPROOFFeeRate = 10;
        sellfeeRate.normalTotalFeeRate =
            sellfeeRate.normalTotalFeeRate +
            10 -
            sellfeeRate.normalPROOFFeeRate;
        sellfeeRate.normalPROOFFeeRate = 10;
    }

    /// @inheritdoc IFX1SportsToken
    function setMarketingFeeRate(
        uint16 _marketingBuyFeeRate,
        uint16 _marketingSellFeeRate
    ) external override onlyOwner {
        uint16 maxRateSet = 100;
        require(
            _marketingBuyFeeRate <= maxRateSet &&
                _marketingSellFeeRate <= maxRateSet,
            "Max Rate exceeded, please lower value"
        );
            buyfeeRate.highTotalFeeRate =
                buyfeeRate.highTotalFeeRate +
                _marketingBuyFeeRate -
                buyfeeRate.marketingFeeRate;
            buyfeeRate.normalTotalFeeRate =
                buyfeeRate.normalTotalFeeRate +
                _marketingBuyFeeRate -
                buyfeeRate.marketingFeeRate;
        buyfeeRate.marketingFeeRate = _marketingBuyFeeRate;
            sellfeeRate.highTotalFeeRate =
                sellfeeRate.highTotalFeeRate +
                _marketingSellFeeRate -
                sellfeeRate.marketingFeeRate;
            sellfeeRate.normalTotalFeeRate =
                sellfeeRate.normalTotalFeeRate +
                _marketingSellFeeRate -
                sellfeeRate.marketingFeeRate;
        sellfeeRate.marketingFeeRate = _marketingSellFeeRate;
    }

    /// @inheritdoc IFX1SportsToken
    function setLiquidityFeeRate(
        uint16 _liquidityBuyFeeRate,
        uint16 _liquiditySellFeeRate
    ) external override onlyOwner {
        uint16 maxRateSet = 100;
        require(
            _liquidityBuyFeeRate <= maxRateSet &&
                _liquiditySellFeeRate <= maxRateSet,
            "Max Rate exceeded, please lower value"
        );
            buyfeeRate.highTotalFeeRate =
                buyfeeRate.highTotalFeeRate +
                _liquidityBuyFeeRate -
                buyfeeRate.liquidityFeeRate;
            buyfeeRate.normalTotalFeeRate =
                buyfeeRate.normalTotalFeeRate +
                _liquidityBuyFeeRate -
                buyfeeRate.liquidityFeeRate;
        buyfeeRate.liquidityFeeRate = _liquidityBuyFeeRate;
            sellfeeRate.highTotalFeeRate =
                sellfeeRate.highTotalFeeRate +
                _liquiditySellFeeRate -
                sellfeeRate.liquidityFeeRate;
            sellfeeRate.normalTotalFeeRate =
                sellfeeRate.normalTotalFeeRate +
                _liquiditySellFeeRate -
                sellfeeRate.liquidityFeeRate;
        sellfeeRate.liquidityFeeRate = _liquiditySellFeeRate;
    }

    /// @inheritdoc IFX1SportsToken
    function setSwapThreshold(
        uint256 _swapThreshold
    ) external override onlyOwner {
        require(_swapThreshold > 0, "invalid swapThreshold");
        swapThreshold = _swapThreshold;
    }

    receive() external payable {}

    function _transfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal {
        require(_sender != address(0), "transfer from zero address");
        require(!bots[_sender] || !bots[_recipient], "no bots allowed");
        require(_recipient != address(0), "transfer to zero address");
        require(_amount > 0, "zero amount");
        require(_balances[_sender] >= _amount, "not enough amount to transfer");
        require(_sender == owner() || launchTime != 0, "not launched yet");
        if (block.timestamp < launchTime + whitelistPeriod) {
            require(whitelists[_recipient], "only whitelist");
        }
        require(
            excludedFromMaxTransfer[_sender] ||
                _amount <= maxTransferAmount + (10 * 10 ** _decimals),
            "exceeds to maxTransferAmount"
        );
        require(
            excludedFromMaxWallet[_recipient] ||
                _balances[_recipient] + _amount <=
                maxWalletAmount + (10 * 10 ** _decimals),
            "exceeds to maxWalletAmount"
        );

        if (
            inSwapLiquidity ||
            excludedFromFees[_recipient] ||
            excludedFromFees[_sender]
        ) {
            _basicTransfer(_sender, _recipient, _amount);
            emit Transfer(_sender, _recipient, _amount);
            return;
        }

        if (_sender == pair) {
            // buy
            _taxonBuyTransfer(_sender, _recipient, _amount);
        } else {
            _swapBack();
            if (_recipient == pair) {
                // sell
                _taxonSellTransfer(_sender, _recipient, _amount);
            } else {
                _basicTransfer(_sender, _recipient, _amount);
            }
        }

        emit Transfer(_sender, _recipient, _amount);
    }

    function _approve(
        address _owner,
        address _spender,
        uint256 _amount
    ) private {
        require(_owner != address(0), "Approve from zero");
        require(_spender != address(0), "Approve to zero");
        _allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    function _swapBack() internal {
        uint256 accTotalAmount = accPROOFAmount +
            accLiquidityAmount +
            accMarketingAmount;
        if (accTotalAmount <= swapThreshold) {
            return;
        }
        inSwapLiquidity = true;
        uint256 swapAmountForLiquidity = accLiquidityAmount / 2;
        uint256 swapAmount = accTotalAmount - swapAmountForLiquidity;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();
        _approve(address(this), address(dexRouter), swapAmount);
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            swapAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 swappedETHAmount = address(this).balance;
        require(swappedETHAmount > 0, "too small token for swapBack");
        uint256 ethForLiquidity = (swappedETHAmount * swapAmountForLiquidity) /
            swapAmount;

        if (ethForLiquidity > 0) {
            uint256 amountForLiquidity = accLiquidityAmount -
                swapAmountForLiquidity;
            _approve(address(this), address(dexRouter), amountForLiquidity);
            dexRouter.addLiquidityETH{value: ethForLiquidity}(
                address(this),
                amountForLiquidity,
                0,
                0,
                0x000000000000000000000000000000000000dEaD,
                block.timestamp
            );
            swappedETHAmount -= ethForLiquidity;
        }

        uint256 ethForPROOF = (swappedETHAmount * accPROOFAmount) / swapAmount;
        uint256 ethForPROOFRevenue = ethForPROOF / 2;
        uint256 ethForPROOFRewards = ethForPROOF - ethForPROOFRevenue;
        uint256 ethForMarketing = swappedETHAmount - ethForPROOF;
        _transferETH(proofRevenue, ethForPROOFRevenue);
        _transferETH(proofRewards, ethForPROOFRewards);
        _transferETH(marketingTaxRecv, ethForMarketing);

        accLiquidityAmount = 0;
        accMarketingAmount = 0;
        accPROOFAmount = 0;
        inSwapLiquidity = false;
    }

    function _taxonSellTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal {
        (
            uint16 totalFeeRate,
            uint16 proofFeeRate,
            ,
            uint16 liquidityFeeRate
        ) = _getSellFeeRate();

        uint256 feeAmount = (_amount * totalFeeRate) / FIXED_POINT;
        uint256 proofFeeAmount = (_amount * proofFeeRate) / FIXED_POINT;
        uint256 liquidityFeeAmount = (_amount * liquidityFeeRate) / FIXED_POINT;
        uint256 marketingFeeAmount = feeAmount -
            proofFeeAmount -
            liquidityFeeAmount;
        uint256 recvAmount = _amount - feeAmount;

        _balances[_sender] -= _amount;
        _balances[_recipient] += recvAmount;
        _balances[address(this)] += feeAmount;
        accPROOFAmount += proofFeeAmount;
        accLiquidityAmount += liquidityFeeAmount;
        accMarketingAmount += marketingFeeAmount;
    }

    function _taxonBuyTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal {
        (
            uint16 totalFeeRate,
            uint16 proofFeeRate,
            ,
            uint16 liquidityFeeRate
        ) = _getBuyFeeRate();

        uint256 feeAmount = (_amount * totalFeeRate) / FIXED_POINT;
        uint256 proofFeeAmount = (_amount * proofFeeRate) / FIXED_POINT;
        uint256 liquidityFeeAmount = (_amount * liquidityFeeRate) / FIXED_POINT;
        uint256 marketingFeeAmount = feeAmount -
            proofFeeAmount -
            liquidityFeeAmount;
        uint256 recvAmount = _amount - feeAmount;

        _balances[_sender] -= _amount;
        _balances[_recipient] += recvAmount;
        _balances[address(this)] += feeAmount;
        accPROOFAmount += proofFeeAmount;
        accLiquidityAmount += liquidityFeeAmount;
        accMarketingAmount += marketingFeeAmount;
    }

    function _basicTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) internal {
        _balances[_sender] -= _amount;
        _balances[_recipient] += _amount;
    }

    function _getSellFeeRate()
        internal
        view
        returns (
            uint16 _totalFeeRate,
            uint16 _proofFeeRate,
            uint16 _marketingFeeRate,
            uint16 _liquidityFeeRate
        )
    {
        if (block.timestamp < launchTime + sellfeeRate.proofFeeDuration) {
            return (
                sellfeeRate.highTotalFeeRate,
                sellfeeRate.highPROOFFeeRate,
                sellfeeRate.marketingFeeRate,
                sellfeeRate.liquidityFeeRate
            );
        } else {
            return (
                sellfeeRate.normalTotalFeeRate,
                sellfeeRate.normalPROOFFeeRate,
                sellfeeRate.marketingFeeRate,
                sellfeeRate.liquidityFeeRate
            );
        }
    }

    function _getBuyFeeRate()
        internal
        view
        returns (
            uint16 _totalFeeRate,
            uint16 _proofFeeRate,
            uint16 _marketingFeeRate,
            uint16 _liquidityFeeRate
        )
    {
        if (block.timestamp < launchTime + buyfeeRate.proofFeeDuration) {
            return (
                buyfeeRate.highTotalFeeRate,
                buyfeeRate.highPROOFFeeRate,
                buyfeeRate.marketingFeeRate,
                buyfeeRate.liquidityFeeRate
            );
        } else {
            return (
                buyfeeRate.normalTotalFeeRate,
                buyfeeRate.normalPROOFFeeRate,
                buyfeeRate.marketingFeeRate,
                buyfeeRate.liquidityFeeRate
            );
        }
    }

    function _transferETH(address _recipient, uint256 _amount) internal {
        if (_amount == 0) return;
        (bool sent, ) = _recipient.call{value: _amount}("");
        require(sent, "sending ETH failed");
    }
}

File 2 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 8 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides 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} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual returns (address) {
        return _pendingOwner;
    }

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() external {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

File 4 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 5 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 6 of 8 : IFX1SportsToken.sol
//SPDX-License-Identifier: None

pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/// @title FX1 Sports Token
/// @title https://fx1.io/
/// @title https://t.me/fx1_sports_portal
/// @author https://PROOFplatform.io
/// @author https://5thWeb.io

interface IFX1SportsToken is IERC20 {
    struct Param {
        address proofRevenue;
        address proofRewards;
        address proofAdmin;
        address marketingTaxRecv;
        address dexRouter;
        address teamAllocator_1;
        address teamAllocator_2;
        uint256 whitelistPeriod;
        uint256 proofFeeDuration;
        uint16 highPROOFFeeRate;
        uint16 normalPROOFFeeRate;
        uint16 marketingFeeRate;
        uint16 liquidityFeeRate;
        uint16 totalTeamAllocationRate;
        uint16 teamAllocationRate_1;
        uint16 teamAllocationRate_2;
    }

    struct BuyFeeRate {
        uint256 proofFeeDuration;
        uint16 highTotalFeeRate;
        uint16 normalTotalFeeRate;
        uint16 highPROOFFeeRate;
        uint16 normalPROOFFeeRate;
        uint16 marketingFeeRate;
        uint16 liquidityFeeRate;
    }

    struct SellFeeRate {
        uint256 proofFeeDuration;
        uint16 highTotalFeeRate;
        uint16 normalTotalFeeRate;
        uint16 highPROOFFeeRate;
        uint16 normalPROOFFeeRate;
        uint16 marketingFeeRate;
        uint16 liquidityFeeRate;
    }

    /// @notice Cancels Token from Fees and transfers ownership to PROOF.
    /// @dev Only PROOF Admin can call this function.
    function cancelToken() external;

    /// @notice Remove PROOFFeeRate.
    /// @dev Only PROOF Admin can call this function.
    function formatPROOFFee() external;

    /// @notice Locks trading until called. Cannont be called twice.
    /// @dev Only owner can call this function.
    function setLaunchBegin()external;

    /// @notice Set proofAdmin wallet address.
    /// @dev Only PROOF Admin can call this function.
    /// @param newAdmin The address of proofAdmin wallet.
    function updatePROOFAdmin(address newAdmin) external;

    /// @notice Add bots.
    /// @dev Only PROOF Admin can call this function.
    /// @param bots_ The address of bot.
    function setBots(address[] memory bots_) external;

    /// @notice Remove bots.
    /// @dev Only PROOF Admin and Owner can call this function.
    /// @param notbot The address to be removed from bots.
    function delBot(address notbot) external;

    /// @notice Add/Remove whitelists.
    /// @dev Only owner can call this function.
    /// @param _accounts The address of whitelists.
    /// @param _add True/False = Add/Remove
    function addWhitelists(address[] memory _accounts, bool _add) external;

    /// @notice Add/Remove wallets to excludedMaxTransfer.
    /// @dev Only owner can call this function.
    /// @param _accounts The address of accounts.
    /// @param _add True/False = Add/Remove
    function excludeWalletsFromMaxTransfer(
        address[] memory _accounts,
        bool _add
    ) external;

    /// @notice Add/Remove wallets to excludedMaxWallet.
    /// @dev Only owner can call this function.
    /// @param _accounts The address of accounts.
    /// @param _add True/False = Add/Remove
    function excludeWalletsFromMaxWallets(
        address[] memory _accounts,
        bool _add
    ) external;

    /// @notice Add/Remove wallets to excludedFromFees.
    /// @dev Only owner can call this function.
    /// @param _accounts The address of accounts.
    /// @param _add True/False = Add/Remove
    function excludeWalletsFromFees(
        address[] memory _accounts,
        bool _add
    ) external;

    /// @notice Set maxTransferAmount.
    /// @dev Only owner can call this function.
    /// @param _maxTransferAmount New maxTransferAmount.
    function setMaxTransferAmount(uint256 _maxTransferAmount) external;

    /// @notice Set maxWalletAmount.
    /// @dev Only owner can call this function.
    /// @param _maxWalletAmount New maxWalletAmount.
    function setMaxWalletAmount(uint256 _maxWalletAmount) external;

    /// @notice Set marketingTaxRecipient wallet address.
    /// @dev Only owner can call this function.
    /// @param _marketingTaxWallet The address of marketingTaxRecipient wallet.
    function setMarketingTaxWallet(address _marketingTaxWallet) external;

    /// @notice Reduce PROOFFeeRate.
    /// @dev Only owner can call this function.
    function reducePROOFFeeRate() external;

    /// @notice Set MarketingFeeRate.
    /// @dev Only owner can call this function.
    /// @dev Max Rate of 100(10%) 10 = 1%
    /// @param _marketingBuyFeeRate New MarketingBuyFeeRate.
    /// @param _marketingSellFeeRate New MarketingSellFeeRate.
    function setMarketingFeeRate(
        uint16 _marketingBuyFeeRate, 
        uint16 _marketingSellFeeRate
    ) external;

    /// @notice Set LiquidityFeeRate.
    /// @dev Only owner can call this function.
    /// @dev Max Rate of 100(10%) 10 = 1%
    /// @param _liquidityBuyFeeRate New liquiditySellFeeRate.
    /// @param _liquiditySellFeeRate New liquidityBuyFeeRate.
    function setLiquidityFeeRate(
        uint16 _liquidityBuyFeeRate,
        uint16 _liquiditySellFeeRate
    ) external;

    /// @notice Set swapThreshold.
    /// @dev Only owner can call this function.
    /// @param _swapThreshold New swapThreshold amount.
    function setSwapThreshold(uint256 _swapThreshold) external;
}

File 7 of 8 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

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 8 of 8 : IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

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);
}

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;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 2000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"address","name":"proofRevenue","type":"address"},{"internalType":"address","name":"proofRewards","type":"address"},{"internalType":"address","name":"proofAdmin","type":"address"},{"internalType":"address","name":"marketingTaxRecv","type":"address"},{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"address","name":"teamAllocator_1","type":"address"},{"internalType":"address","name":"teamAllocator_2","type":"address"},{"internalType":"uint256","name":"whitelistPeriod","type":"uint256"},{"internalType":"uint256","name":"proofFeeDuration","type":"uint256"},{"internalType":"uint16","name":"highPROOFFeeRate","type":"uint16"},{"internalType":"uint16","name":"normalPROOFFeeRate","type":"uint16"},{"internalType":"uint16","name":"marketingFeeRate","type":"uint16"},{"internalType":"uint16","name":"liquidityFeeRate","type":"uint16"},{"internalType":"uint16","name":"totalTeamAllocationRate","type":"uint16"},{"internalType":"uint16","name":"teamAllocationRate_1","type":"uint16"},{"internalType":"uint16","name":"teamAllocationRate_2","type":"uint16"}],"internalType":"struct IFX1SportsToken.Param","name":"_param","type":"tuple"}],"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":"OwnershipTransferStarted","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":"FIXED_POINT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"addWhitelists","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"","type":"address"}],"name":"bots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyfeeRate","outputs":[{"internalType":"uint256","name":"proofFeeDuration","type":"uint256"},{"internalType":"uint16","name":"highTotalFeeRate","type":"uint16"},{"internalType":"uint16","name":"normalTotalFeeRate","type":"uint16"},{"internalType":"uint16","name":"highPROOFFeeRate","type":"uint16"},{"internalType":"uint16","name":"normalPROOFFeeRate","type":"uint16"},{"internalType":"uint16","name":"marketingFeeRate","type":"uint16"},{"internalType":"uint16","name":"liquidityFeeRate","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"excludeWalletsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"excludeWalletsFromMaxTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"excludeWalletsFromMaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromMaxTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formatPROOFFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTaxRecv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofRevenue","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reducePROOFFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellfeeRate","outputs":[{"internalType":"uint256","name":"proofFeeDuration","type":"uint256"},{"internalType":"uint16","name":"highTotalFeeRate","type":"uint16"},{"internalType":"uint16","name":"normalTotalFeeRate","type":"uint16"},{"internalType":"uint16","name":"highPROOFFeeRate","type":"uint16"},{"internalType":"uint16","name":"normalPROOFFeeRate","type":"uint16"},{"internalType":"uint16","name":"marketingFeeRate","type":"uint16"},{"internalType":"uint16","name":"liquidityFeeRate","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bots","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchBegin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityBuyFeeRate","type":"uint16"},{"internalType":"uint16","name":"_liquiditySellFeeRate","type":"uint16"}],"name":"setLiquidityFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_marketingBuyFeeRate","type":"uint16"},{"internalType":"uint16","name":"_marketingSellFeeRate","type":"uint16"}],"name":"setMarketingFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingTaxWallet","type":"address"}],"name":"setMarketingTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setMaxTransferAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapThreshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"updatePROOFAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052620000126012600a62000e57565b6200002290630ee6b28062000e6f565b60095560408051808201909152600a8152694658312053706f72747360b01b602082015260179062000055908262000f2e565b5060408051808201909152600381526246583160e81b60208201526018906200007f908262000f2e565b506103e86080523480156200009357600080fd5b506040516200468638038062004686833981016040819052620000b69162001056565b620000c13362000cd4565b80516001600160a01b03166200011e5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c69642050524f4f4620526576656e7565206164647265737300000060448201526064015b60405180910390fd5b60208101516001600160a01b03166200017a5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c69642050524f4f4620526577617264732061646472657373000000604482015260640162000115565b60408101516001600160a01b0316620001d65760405162461bcd60e51b815260206004820152601d60248201527f696e76616c69642050524f4f4620526577617264732061646472657373000000604482015260640162000115565b60608101516001600160a01b0316620002325760405162461bcd60e51b815260206004820181905260248201527f696e76616c6964204d61726b6574696e67546178526563762061646472657373604482015260640162000115565b60a08101516001600160a01b03166200028e5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964207465616d416c6c6f6361746f725f31206164647265737300604482015260640162000115565b60c08101516001600160a01b0316620002ea5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964207465616d416c6c6f6361746f725f32206164647265737300604482015260640162000115565b60808101516001600160a01b0316620003465760405162461bcd60e51b815260206004820152601a60248201527f696e76616c696420646578526f75746572206164646472657373000000000000604482015260640162000115565b60008160e00151116200039c5760405162461bcd60e51b815260206004820152601760248201527f696e76616c69642077686974656c697374506572696f64000000000000000000604482015260640162000115565b600081610100015111620003f35760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642070726f6f664665654475726174696f6e0000000000000000604482015260640162000115565b600081610120015161ffff161180156200041e575080610140015161ffff1681610120015161ffff16115b6200046c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206869676850524f4f46466565526174650000000000000000604482015260640162000115565b600081610140015161ffff1611620004c75760405162461bcd60e51b815260206004820152601a60248201527f696e76616c6964206e6f726d616c50524f4f4646656552617465000000000000604482015260640162000115565b6000816101a0015161ffff1611620005225760405162461bcd60e51b815260206004820152601f60248201527f696e76616c696420746f74616c5465616d416c6c6f636174696f6e5261746500604482015260640162000115565b806101e00151816101c001516200053a91906200119c565b61ffff16816101a0015161ffff1614620005975760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207465616d416c6c6f636174696f6e52617465730000000000604482015260640162000115565b8051601380546001600160a01b03199081166001600160a01b0393841617909155602083015160148054831691841691909117905560408301516015805483169184169190911790556060830151601280548316918416919091179055608083015160198054909216921691909117905560e0810151600b55610120810151601b805461014084015161018085015161016086015163ffffffff60201b1990931664010000000061ffff8088169190910261ffff60301b1916919091176601000000000000938216939093029290921763ffffffff60401b19166a01000000000000000000008383160261ffff60401b191617680100000000000000009284169290920291909117909255610100840151601a55339291620006b9916200119c565b620006c591906200119c565b601b805461ffff191661ffff92909216919091179055610140820151610180830151610160840151620006f991906200119c565b6200070591906200119c565b601b805463ffff000019166201000061ffff93841602179055610120830151601d805461014086015161018087015161016088015163ffffffff60201b199093166401000000008688160261ffff60301b1916176601000000000000928716929092029190911763ffffffff60401b19166a01000000000000000000008287160261ffff60401b191617680100000000000000009583169590950294909417909155610100850151601c559091620007bd916200119c565b620007c991906200119c565b601d805461ffff191661ffff92909216919091179055610140820151610180830151610160840151620007fd91906200119c565b6200080991906200119c565b601d805461ffff92909216620100000263ffff0000199092169190911790556019546040805163c45a015560e01b815290516001600160a01b039092169163c45a0155916004808201926020929091908290030181865afa15801562000873573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008999190620011c1565b6001600160a01b031663c9c65396601960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009219190620011c1565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af11580156200096e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009949190620011c1565b601680546001600160a01b0319166001600160a01b039283161781558282166000818152600560209081526040808320805460ff19908116600190811790925560068452828520805482168317905586548816855282852080548216831790553080865283862080548316841790558686526007855283862080548316841790558754891686528386208054831684179055808652838620805483168417905560135489168652838620805483168417905560145489168652838620805483168417905560155489168652838620805483168417905560125489168652838620805483168417905595855260089093528184208054841682179055945490951682528482208054821685179055918152928320805490911690911790556080516101a084015160095461ffff9283169262000ad192169062000e6f565b62000add9190620011df565b9050600060805161ffff16846101c0015161ffff1660095462000b01919062000e6f565b62000b0d9190620011df565b9050600062000b1d828462001202565b905060008360095462000b31919062001202565b60a08701516001600160a01b031660009081526002602052604081208054929350859290919062000b6490849062001218565b909155505060c08601516001600160a01b03166000908152600260205260408120805484929062000b9790849062001218565b9091555050336000908152600260205260408120805483929062000bbd90849062001218565b90915550506040518181523390600090600080516020620046668339815191529060200160405180910390a38560a001516001600160a01b031660006001600160a01b0316600080516020620046668339815191528560405162000c2391815260200190565b60405180910390a38560c001516001600160a01b031660006001600160a01b0316600080516020620046668339815191528460405162000c6591815260200190565b60405180910390a361271060095462000c7f9190620011df565b600c556009546103e89062000c9690600562000e6f565b62000ca29190620011df565b600d5560095460649062000cb890600162000e6f565b62000cc49190620011df565b600e55506200122e945050505050565b600180546001600160a01b031916905562000cef8162000cf2565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000d9957816000190482111562000d7d5762000d7d62000d42565b8085161562000d8b57918102915b93841c939080029062000d5d565b509250929050565b60008262000db25750600162000e51565b8162000dc15750600062000e51565b816001811462000dda576002811462000de55762000e05565b600191505062000e51565b60ff84111562000df95762000df962000d42565b50506001821b62000e51565b5060208310610133831016604e8410600b841016171562000e2a575081810a62000e51565b62000e36838362000d58565b806000190482111562000e4d5762000e4d62000d42565b0290505b92915050565b600062000e6860ff84168362000da1565b9392505050565b808202811582820484141762000e515762000e5162000d42565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000eb457607f821691505b60208210810362000ed557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000f2957600081815260208120601f850160051c8101602086101562000f045750805b601f850160051c820191505b8181101562000f255782815560010162000f10565b5050505b505050565b81516001600160401b0381111562000f4a5762000f4a62000e89565b62000f628162000f5b845462000e9f565b8462000edb565b602080601f83116001811462000f9a576000841562000f815750858301515b600019600386901b1c1916600185901b17855562000f25565b600085815260208120601f198616915b8281101562000fcb5788860151825594840194600190910190840162000faa565b508582101562000fea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60405161020081016001600160401b038111828210171562001020576200102062000e89565b60405290565b80516001600160a01b03811681146200103e57600080fd5b919050565b805161ffff811681146200103e57600080fd5b600061020082840312156200106a57600080fd5b6200107462000ffa565b6200107f8362001026565b81526200108f6020840162001026565b6020820152620010a26040840162001026565b6040820152620010b56060840162001026565b6060820152620010c86080840162001026565b6080820152620010db60a0840162001026565b60a0820152620010ee60c0840162001026565b60c082015260e083015160e08201526101008084015181830152506101206200111981850162001043565b908201526101406200112d84820162001043565b908201526101606200114184820162001043565b908201526101806200115584820162001043565b908201526101a06200116984820162001043565b908201526101c06200117d84820162001043565b908201526101e06200119184820162001043565b908201529392505050565b61ffff818116838216019080821115620011ba57620011ba62000d42565b5092915050565b600060208284031215620011d457600080fd5b62000e688262001026565b600082620011fd57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111562000e515762000e5162000d42565b8082018082111562000e515762000e5162000d42565b6080516134076200125f60003960008181610720015281816125e90152818161262c015261266f01526134076000f3fe60806040526004361061032d5760003560e01c806379ba5097116101a5578063a9e75723116100ec578063d82e49c811610095578063dd62ed3e1161006f578063dd62ed3e146109e9578063e30c397814610a2f578063f2fde38b14610a4d578063f771286214610a6d57600080fd5b8063d82e49c81461094a578063dbe66ca01461095f578063dd22a9de1461098f57600080fd5b8063b48e665e116100c6578063b48e665e146108e4578063b515566a146108fa578063bfd792841461091a57600080fd5b8063a9e7572314610898578063aa4bde28146108ae578063abda625e146108c457600080fd5b806395d89b411161014e578063a4fd3e9911610128578063a4fd3e9914610838578063a8aa1b3114610858578063a9059cbb1461087857600080fd5b806395d89b41146107e3578063999e3b7c146107f85780639d0014b11461081857600080fd5b806385a132911161017f57806385a13291146107855780638bf55409146107a55780638da5cb5b146107c557600080fd5b806379ba5097146106f95780637a458d7a1461070e5780637d99f9a41461075557600080fd5b806327849d0211610274578063546a88111161021d578063715018a6116101f7578063715018a61461068e5780637653f01e146106a3578063790ca413146106c357806379a97e13146106d957600080fd5b8063546a88111461062357806359a51c341461063857806370a082311461065857600080fd5b80633b57bb5e1161024e5780633b57bb5e146105ce5780633ef92312146105ee578063478ea72e1461060357600080fd5b806327849d021461057d57806327a14fc214610592578063313ce567146105b257600080fd5b806317e58d72116102d657806323b872dd116102b057806323b872dd1461051d578063256c2cd11461053d578063273123b71461055d57600080fd5b806317e58d72146104a857806318160ddd146104d85780631e7be210146104ed57600080fd5b80630758d924116103075780630758d9241461041e578063095ea7b314610456578063165657331461048657600080fd5b8063026e9ff2146103395780630445b667146103d857806306fdde03146103fc57600080fd5b3661033457005b600080fd5b34801561034557600080fd5b50601a54601b54610393919061ffff80821691620100008104821691640100000000820481169166010000000000008104821691680100000000000000008204811691600160501b90041687565b6040805197885261ffff968716602089015294861694870194909452918416606086015283166080850152821660a08401521660c082015260e0015b60405180910390f35b3480156103e457600080fd5b506103ee600c5481565b6040519081526020016103cf565b34801561040857600080fd5b50610411610a8d565b6040516103cf9190612e2a565b34801561042a57600080fd5b5060195461043e906001600160a01b031681565b6040516001600160a01b0390911681526020016103cf565b34801561046257600080fd5b50610476610471366004612e9d565b610b1f565b60405190151581526020016103cf565b34801561049257600080fd5b506104a66104a1366004612f81565b610b36565b005b3480156104b457600080fd5b506104766104c3366004612fd8565b60066020526000908152604090205460ff1681565b3480156104e457600080fd5b506009546103ee565b3480156104f957600080fd5b50610476610508366004612fd8565b60086020526000908152604090205460ff1681565b34801561052957600080fd5b50610476610538366004612ffc565b610bfe565b34801561054957600080fd5b506104a6610558366004612f81565b610c9c565b34801561056957600080fd5b506104a6610578366004612fd8565b610d59565b34801561058957600080fd5b506104a6610e15565b34801561059e57600080fd5b506104a66105ad36600461303d565b61111f565b3480156105be57600080fd5b50604051601281526020016103cf565b3480156105da57600080fd5b506104a66105e9366004612f81565b611197565b3480156105fa57600080fd5b506104a6611254565b34801561060f57600080fd5b5060135461043e906001600160a01b031681565b34801561062f57600080fd5b506104a6611404565b34801561064457600080fd5b5060155461043e906001600160a01b031681565b34801561066457600080fd5b506103ee610673366004612fd8565b6001600160a01b031660009081526002602052604090205490565b34801561069a57600080fd5b506104a6611500565b3480156106af57600080fd5b5060125461043e906001600160a01b031681565b3480156106cf57600080fd5b506103ee600a5481565b3480156106e557600080fd5b506104a66106f4366004612fd8565b611512565b34801561070557600080fd5b506104a66115ff565b34801561071a57600080fd5b506107427f000000000000000000000000000000000000000000000000000000000000000081565b60405161ffff90911681526020016103cf565b34801561076157600080fd5b50610476610770366004612fd8565b60076020526000908152604090205460ff1681565b34801561079157600080fd5b506104a66107a0366004613068565b61168d565b3480156107b157600080fd5b506104a66107c036600461303d565b611873565b3480156107d157600080fd5b506000546001600160a01b031661043e565b3480156107ef57600080fd5b506104116118eb565b34801561080457600080fd5b5060145461043e906001600160a01b031681565b34801561082457600080fd5b506104a661083336600461303d565b6118fa565b34801561084457600080fd5b506104a6610853366004612fd8565b611957565b34801561086457600080fd5b5060165461043e906001600160a01b031681565b34801561088457600080fd5b50610476610893366004612e9d565b611a0a565b3480156108a457600080fd5b506103ee600d5481565b3480156108ba57600080fd5b506103ee600e5481565b3480156108d057600080fd5b506104a66108df366004613068565b611a17565b3480156108f057600080fd5b506103ee600b5481565b34801561090657600080fd5b506104a661091536600461309b565b611bec565b34801561092657600080fd5b50610476610935366004612fd8565b60046020526000908152604090205460ff1681565b34801561095657600080fd5b506104a6611d10565b34801561096b57600080fd5b5061047661097a366004612fd8565b60056020526000908152604090205460ff1681565b34801561099b57600080fd5b50601c54601d54610393919061ffff80821691620100008104821691640100000000820481169166010000000000008104821691680100000000000000008204811691600160501b90041687565b3480156109f557600080fd5b506103ee610a043660046130d8565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610a3b57600080fd5b506001546001600160a01b031661043e565b348015610a5957600080fd5b506104a6610a68366004612fd8565b611d6e565b348015610a7957600080fd5b506104a6610a88366004612f81565b611dec565b606060178054610a9c90613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac890613106565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b5050505050905090565b6000610b2c338484611ea9565b5060015b92915050565b610b3e611fb7565b815180610b925760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206c656e67746820617272617900000000000000000000000060448201526064015b60405180910390fd5b60005b81811015610bf8578260066000868481518110610bb457610bb4613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610bf08161316c565b915050610b95565b50505050565b6001600160a01b038316600090815260036020908152604080832033845290915281205482811015610c725760405162461bcd60e51b815260206004820152601460248201527f5472616e73666572203e20616c6c6f77616e63650000000000000000000000006044820152606401610b89565b610c868533610c818685613186565b611ea9565b610c91858585612011565b506001949350505050565b610ca4611fb7565b815180610cf35760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206c656e6774682061727261790000000000000000000000006044820152606401610b89565b60005b81811015610bf8578260056000868481518110610d1557610d15613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610d518161316c565b915050610cf6565b60155433906001600160a01b0316811480610d8157506000546001600160a01b038281169116145b610df35760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a2063616c6c657220646f65736e277420686176652070657260448201527f6d697373696f6e000000000000000000000000000000000000000000000000006064820152608401610b89565b506001600160a01b03166000908152600460205260409020805460ff19169055565b6015546001600160a01b03163314610e7d5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b601b546601000000000000900461ffff16600003610edd5760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601b54640100000000900461ffff16600003610f3b5760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601d546601000000000000900461ffff16600003610f9b5760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601d54640100000000900461ffff16600003610ff95760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601b5461ffff640100000000820481169161101691166000613199565b61102091906131bb565b601b805465ffff0000ffff191661ffff92831617908190556601000000000000810482169161105791620100009004166000613199565b61106191906131bb565b601b805467ffff0000ffff000019166201000061ffff9384160267ffff0000000000001916179055601d5464010000000081048216916110a391166000613199565b6110ad91906131bb565b601d805465ffff0000ffff191661ffff9283161790819055660100000000000081048216916110e491620100009004166000613199565b6110ee91906131bb565b601d805467ffff0000ffff000019166201000061ffff939093169290920267ffff0000000000001916919091179055565b611127611fb7565b6103e8600954600a61113991906131d6565b61114391906131ed565b8110156111925760405162461bcd60e51b815260206004820152600c60248201527f4d696e203125206c696d697400000000000000000000000000000000000000006044820152606401610b89565b600e55565b61119f611fb7565b8151806111ee5760405162461bcd60e51b815260206004820152601760248201527f696e76616c6964206163636f756e7473206c656e6774680000000000000000006044820152606401610b89565b60005b81811015610bf857826008600086848151811061121057611210613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061124c8161316c565b9150506111f1565b61125c611fb7565b601a54600a5461126c919061320f565b42116112ba5760405162461bcd60e51b815260206004820152601460248201527f596f75206d7573742077616974203732206872730000000000000000000000006044820152606401610b89565b601b5461ffff64010000000082048116916112d79116600a613199565b6112e191906131bb565b601b8054640a0000000065ffff0000ffff1990911661ffff938416171790819055660100000000000081048216916113219162010000900416600a613199565b61132b91906131bb565b601b805467ffff0000ffff000019166201000061ffff9384160267ffff000000000000191617660a000000000000179055601d5464010000000081048216916113769116600a613199565b61138091906131bb565b601d8054640a0000000065ffff0000ffff1990911661ffff938416171790819055660100000000000081048216916113c09162010000900416600a613199565b6113ca91906131bb565b601d805467ffff0000ffff000019166201000061ffff939093169290920267ffff000000000000191691909117660a000000000000179055565b6015546001600160a01b0316331461146c5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b601980546001600160a01b0390811660009081526005602090815260408083208054600160ff19918216811790925586548616855260068085528386208054831684179055965486168552600780855283862080548316841790558554871686529684528285208054821683179055845486168552959092529091208054909316179091556015546114fe911661254c565b565b611508611fb7565b6114fe600061254c565b6015546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b6001600160a01b0381166115d05760405162461bcd60e51b815260206004820152601a60248201527f696e76616c69642070726f6f6641646d696e20616464726573730000000000006044820152606401610b89565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60015433906001600160a01b031681146116815760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610b89565b61168a8161254c565b50565b611695611fb7565b606461ffff831681108015906116b357508061ffff168261ffff1611155b6117255760405162461bcd60e51b815260206004820152602560248201527f4d617820526174652065786365656465642c20706c65617365206c6f7765722060448201527f76616c75650000000000000000000000000000000000000000000000000000006064820152608401610b89565b601b5461ffff68010000000000000000820481169161174691869116613199565b61175091906131bb565b601b805461ffff191661ffff92831617908190556801000000000000000081048216916117869186916201000090910416613199565b61179091906131bb565b601b805469ffff00000000ffff000019166201000061ffff9384160269ffff000000000000000019161768010000000000000000868416810291909117909155601d549081048216916117e591859116613199565b6117ef91906131bb565b601d805461ffff191661ffff92831617908190556801000000000000000081048216916118259185916201000090910416613199565b61182f91906131bb565b601d805469ffff00000000ffff000019166201000061ffff9384160269ffff0000000000000000191617680100000000000000009490921693909302179091555050565b61187b611fb7565b6103e8600954600561188d91906131d6565b61189791906131ed565b8110156118e65760405162461bcd60e51b815260206004820152600e60248201527f4d696e20302e3525206c696d69740000000000000000000000000000000000006044820152606401610b89565b600d55565b606060188054610a9c90613106565b611902611fb7565b600081116119525760405162461bcd60e51b815260206004820152601560248201527f696e76616c696420737761705468726573686f6c6400000000000000000000006044820152606401610b89565b600c55565b61195f611fb7565b6001600160a01b0381166119db5760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206d61726b6574696e6754617857616c6c657420616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610b89565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610b2c338484612011565b611a1f611fb7565b606461ffff83168110801590611a3d57508061ffff168261ffff1611155b611aaf5760405162461bcd60e51b815260206004820152602560248201527f4d617820526174652065786365656465642c20706c65617365206c6f7765722060448201527f76616c75650000000000000000000000000000000000000000000000000000006064820152608401610b89565b601b5461ffff600160501b8204811691611acb91869116613199565b611ad591906131bb565b601b805461ffff191661ffff9283161790819055600160501b8104821691611b069186916201000090910416613199565b611b1091906131bb565b601b80546bffff000000000000ffff000019166201000061ffff938416026bffff00000000000000000000191617600160501b868416810291909117909155601d54908104821691611b6491859116613199565b611b6e91906131bb565b601d805461ffff191661ffff9283161790819055600160501b8104821691611b9f9185916201000090910416613199565b611ba991906131bb565b601d80546bffff000000000000ffff000019166201000061ffff938416026bffff00000000000000000000191617600160501b9490921693909302179091555050565b6015546001600160a01b03163314611c545760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b805180611ca35760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206172726179206c656e6774680000000000000000000000006044820152606401610b89565b60005b8251811015611d0b57600160046000858481518110611cc757611cc7613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611d038161316c565b915050611ca6565b505050565b611d18611fb7565b600a5415611d685760405162461bcd60e51b815260206004820152601060248201527f616c7265616479206c61756e63686564000000000000000000000000000000006044820152606401610b89565b42600a55565b611d76611fb7565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff199091168117909155611db46000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b611df4611fb7565b815180611e435760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206c656e6774682061727261790000000000000000000000006044820152606401610b89565b60005b81811015610bf8578260076000868481518110611e6557611e65613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611ea18161316c565b915050611e46565b6001600160a01b038316611eff5760405162461bcd60e51b815260206004820152601160248201527f417070726f76652066726f6d207a65726f0000000000000000000000000000006044820152606401610b89565b6001600160a01b038216611f555760405162461bcd60e51b815260206004820152600f60248201527f417070726f766520746f207a65726f00000000000000000000000000000000006044820152606401610b89565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b031633146114fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b89565b6001600160a01b0383166120675760405162461bcd60e51b815260206004820152601a60248201527f7472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606401610b89565b6001600160a01b03831660009081526004602052604090205460ff1615806120a857506001600160a01b03821660009081526004602052604090205460ff16155b6120f45760405162461bcd60e51b815260206004820152600f60248201527f6e6f20626f747320616c6c6f77656400000000000000000000000000000000006044820152606401610b89565b6001600160a01b03821661214a5760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220746f207a65726f206164647265737300000000000000006044820152606401610b89565b6000811161219a5760405162461bcd60e51b815260206004820152600b60248201527f7a65726f20616d6f756e740000000000000000000000000000000000000000006044820152606401610b89565b6001600160a01b0383166000908152600260205260409020548111156122025760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820616d6f756e7420746f207472616e736665720000006044820152606401610b89565b6000546001600160a01b038481169116148061221f5750600a5415155b61226b5760405162461bcd60e51b815260206004820152601060248201527f6e6f74206c61756e6368656420796574000000000000000000000000000000006044820152606401610b89565b600b54600a5461227b919061320f565b4210156122ea576001600160a01b03821660009081526008602052604090205460ff166122ea5760405162461bcd60e51b815260206004820152600e60248201527f6f6e6c792077686974656c6973740000000000000000000000000000000000006044820152606401610b89565b6001600160a01b03831660009081526006602052604090205460ff168061233457506123186012600a613306565b61232390600a6131d6565b600d54612330919061320f565b8111155b6123805760405162461bcd60e51b815260206004820152601c60248201527f6578636565647320746f206d61785472616e73666572416d6f756e74000000006044820152606401610b89565b6001600160a01b03821660009081526007602052604090205460ff16806123ed57506123ae6012600a613306565b6123b990600a6131d6565b600e546123c6919061320f565b6001600160a01b0383166000908152600260205260409020546123ea90839061320f565b11155b6124395760405162461bcd60e51b815260206004820152601a60248201527f6578636565647320746f206d617857616c6c6574416d6f756e740000000000006044820152606401610b89565b60165474010000000000000000000000000000000000000000900460ff168061247a57506001600160a01b03821660009081526005602052604090205460ff165b8061249d57506001600160a01b03831660009081526005602052604090205460ff165b156124f2576124ad838383612572565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611faa91815260200190565b6016546001600160a01b0390811690841603612518576125138383836125d1565b6124ad565b6125206127ae565b6016546001600160a01b039081169083160361254157612513838383612bed565b6124ad838383612572565b6001805473ffffffffffffffffffffffffffffffffffffffff1916905561168a81612bfa565b6001600160a01b0383166000908152600260205260408120805483929061259a908490613186565b90915550506001600160a01b038216600090815260026020526040812080548392906125c790849061320f565b9091555050505050565b60008060006125de612c57565b9350509250925060007f000000000000000000000000000000000000000000000000000000000000000061ffff168461ffff168661261c91906131d6565b61262691906131ed565b905060007f000000000000000000000000000000000000000000000000000000000000000061ffff168461ffff168761265f91906131d6565b61266991906131ed565b905060007f000000000000000000000000000000000000000000000000000000000000000061ffff168461ffff16886126a291906131d6565b6126ac91906131ed565b90506000816126bb8486613186565b6126c59190613186565b905060006126d3858a613186565b6001600160a01b038c16600090815260026020526040812080549293508b92909190612700908490613186565b90915550506001600160a01b038a166000908152600260205260408120805483929061272d90849061320f565b9091555050306000908152600260205260408120805487929061275190849061320f565b92505081905550836011600082825461276a919061320f565b9250508190555082600f6000828254612783919061320f565b92505081905550816010600082825461279c919061320f565b90915550505050505050505050505050565b6000601054600f546011546127c3919061320f565b6127cd919061320f565b9050600c5481116127db5750565b601680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055600f5460009061282c906002906131ed565b9050600061283a8284613186565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061287457612874613140565b6001600160a01b03928316602091820292909201810191909152601954604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa1580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a9190613315565b8160018151811061291d5761291d613140565b6001600160a01b0392831660209182029290920101526019546129439130911684611ea9565b6019546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790612995908590600090869030904290600401613332565b600060405180830381600087803b1580156129af57600080fd5b505af11580156129c3573d6000803e3d6000fd5b50479250505080612a165760405162461bcd60e51b815260206004820152601c60248201527f746f6f20736d616c6c20746f6b656e20666f7220737761704261636b000000006044820152606401610b89565b600083612a2386846131d6565b612a2d91906131ed565b90508015612b1f57600085600f54612a459190613186565b601954909150612a609030906001600160a01b031683611ea9565b6019546040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990849060c40160606040518083038185885af1158015612ae7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b0c91906133a3565b5050508183612b1b9190613186565b9250505b60008460115484612b3091906131d6565b612b3a91906131ed565b90506000612b496002836131ed565b90506000612b578284613186565b90506000612b658487613186565b601354909150612b7e906001600160a01b031684612cea565b601454612b94906001600160a01b031683612cea565b601254612baa906001600160a01b031682612cea565b50506000600f81905560108190556011555050601680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505050505050565b60008060006125de612d99565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080601a60000154600a54612c70919061320f565b421015612cac575050601b5461ffff8082169350640100000000820481169250680100000000000000008204811691600160501b900416612ce4565b5050601b5461ffff620100008204811693506601000000000000820481169250680100000000000000008204811691600160501b9004165b90919293565b80600003612cf6575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d43576040519150601f19603f3d011682016040523d82523d6000602084013e612d48565b606091505b5050905080611d0b5760405162461bcd60e51b815260206004820152601260248201527f73656e64696e6720455448206661696c656400000000000000000000000000006044820152606401610b89565b600080600080601c60000154600a54612db2919061320f565b421015612dee575050601d5461ffff8082169350640100000000820481169250680100000000000000008204811691600160501b900416612ce4565b5050601d5461ffff620100008204811693506601000000000000820481169250680100000000000000008204811691600160501b900416612ce4565b600060208083528351808285015260005b81811015612e5757858101830151858201604001528201612e3b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461168a57600080fd5b8035612e9881612e78565b919050565b60008060408385031215612eb057600080fd5b8235612ebb81612e78565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ef057600080fd5b8135602067ffffffffffffffff80831115612f0d57612f0d612ec9565b8260051b604051601f19603f83011681018181108482111715612f3257612f32612ec9565b604052938452858101830193838101925087851115612f5057600080fd5b83870191505b84821015612f7657612f6782612e8d565b83529183019190830190612f56565b979650505050505050565b60008060408385031215612f9457600080fd5b823567ffffffffffffffff811115612fab57600080fd5b612fb785828601612edf565b92505060208301358015158114612fcd57600080fd5b809150509250929050565b600060208284031215612fea57600080fd5b8135612ff581612e78565b9392505050565b60008060006060848603121561301157600080fd5b833561301c81612e78565b9250602084013561302c81612e78565b929592945050506040919091013590565b60006020828403121561304f57600080fd5b5035919050565b803561ffff81168114612e9857600080fd5b6000806040838503121561307b57600080fd5b61308483613056565b915061309260208401613056565b90509250929050565b6000602082840312156130ad57600080fd5b813567ffffffffffffffff8111156130c457600080fd5b6130d084828501612edf565b949350505050565b600080604083850312156130eb57600080fd5b82356130f681612e78565b91506020830135612fcd81612e78565b600181811c9082168061311a57607f821691505b60208210810361313a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019820361317f5761317f613156565b5060010190565b81810381811115610b3057610b30613156565b61ffff8181168382160190808211156131b4576131b4613156565b5092915050565b61ffff8281168282160390808211156131b4576131b4613156565b8082028115828204841417610b3057610b30613156565b60008261320a57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b3057610b30613156565b600181815b8085111561325d57816000190482111561324357613243613156565b8085161561325057918102915b93841c9390800290613227565b509250929050565b60008261327457506001610b30565b8161328157506000610b30565b816001811461329757600281146132a1576132bd565b6001915050610b30565b60ff8411156132b2576132b2613156565b50506001821b610b30565b5060208310610133831016604e8410600b84101617156132e0575081810a610b30565b6132ea8383613222565b80600019048211156132fe576132fe613156565b029392505050565b6000612ff560ff841683613265565b60006020828403121561332757600080fd5b8151612ff581612e78565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133825784516001600160a01b03168352938301939183019160010161335d565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156133b857600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220871b4873d65d4690ff54c756cb383054e571c1544d5ad25fc22d7ce4bc72990364736f6c63430008130033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e0000000000000000000000001bf4cb781b97724a8a22ef064dce6bbc1c26cdda000000000000000000000000acfb878960bcda38782d854efb2e687b57e31f09000000000000000000000000afc94420451fca019dc97100d14abcb8704d6e650000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000d015a304d44041d25d10486e64330e7888fb6647000000000000000000000000a39dc746652a0731da7ff1f4ad6385caf8a95e29000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000003f4800000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000032

Deployed Bytecode

0x60806040526004361061032d5760003560e01c806379ba5097116101a5578063a9e75723116100ec578063d82e49c811610095578063dd62ed3e1161006f578063dd62ed3e146109e9578063e30c397814610a2f578063f2fde38b14610a4d578063f771286214610a6d57600080fd5b8063d82e49c81461094a578063dbe66ca01461095f578063dd22a9de1461098f57600080fd5b8063b48e665e116100c6578063b48e665e146108e4578063b515566a146108fa578063bfd792841461091a57600080fd5b8063a9e7572314610898578063aa4bde28146108ae578063abda625e146108c457600080fd5b806395d89b411161014e578063a4fd3e9911610128578063a4fd3e9914610838578063a8aa1b3114610858578063a9059cbb1461087857600080fd5b806395d89b41146107e3578063999e3b7c146107f85780639d0014b11461081857600080fd5b806385a132911161017f57806385a13291146107855780638bf55409146107a55780638da5cb5b146107c557600080fd5b806379ba5097146106f95780637a458d7a1461070e5780637d99f9a41461075557600080fd5b806327849d0211610274578063546a88111161021d578063715018a6116101f7578063715018a61461068e5780637653f01e146106a3578063790ca413146106c357806379a97e13146106d957600080fd5b8063546a88111461062357806359a51c341461063857806370a082311461065857600080fd5b80633b57bb5e1161024e5780633b57bb5e146105ce5780633ef92312146105ee578063478ea72e1461060357600080fd5b806327849d021461057d57806327a14fc214610592578063313ce567146105b257600080fd5b806317e58d72116102d657806323b872dd116102b057806323b872dd1461051d578063256c2cd11461053d578063273123b71461055d57600080fd5b806317e58d72146104a857806318160ddd146104d85780631e7be210146104ed57600080fd5b80630758d924116103075780630758d9241461041e578063095ea7b314610456578063165657331461048657600080fd5b8063026e9ff2146103395780630445b667146103d857806306fdde03146103fc57600080fd5b3661033457005b600080fd5b34801561034557600080fd5b50601a54601b54610393919061ffff80821691620100008104821691640100000000820481169166010000000000008104821691680100000000000000008204811691600160501b90041687565b6040805197885261ffff968716602089015294861694870194909452918416606086015283166080850152821660a08401521660c082015260e0015b60405180910390f35b3480156103e457600080fd5b506103ee600c5481565b6040519081526020016103cf565b34801561040857600080fd5b50610411610a8d565b6040516103cf9190612e2a565b34801561042a57600080fd5b5060195461043e906001600160a01b031681565b6040516001600160a01b0390911681526020016103cf565b34801561046257600080fd5b50610476610471366004612e9d565b610b1f565b60405190151581526020016103cf565b34801561049257600080fd5b506104a66104a1366004612f81565b610b36565b005b3480156104b457600080fd5b506104766104c3366004612fd8565b60066020526000908152604090205460ff1681565b3480156104e457600080fd5b506009546103ee565b3480156104f957600080fd5b50610476610508366004612fd8565b60086020526000908152604090205460ff1681565b34801561052957600080fd5b50610476610538366004612ffc565b610bfe565b34801561054957600080fd5b506104a6610558366004612f81565b610c9c565b34801561056957600080fd5b506104a6610578366004612fd8565b610d59565b34801561058957600080fd5b506104a6610e15565b34801561059e57600080fd5b506104a66105ad36600461303d565b61111f565b3480156105be57600080fd5b50604051601281526020016103cf565b3480156105da57600080fd5b506104a66105e9366004612f81565b611197565b3480156105fa57600080fd5b506104a6611254565b34801561060f57600080fd5b5060135461043e906001600160a01b031681565b34801561062f57600080fd5b506104a6611404565b34801561064457600080fd5b5060155461043e906001600160a01b031681565b34801561066457600080fd5b506103ee610673366004612fd8565b6001600160a01b031660009081526002602052604090205490565b34801561069a57600080fd5b506104a6611500565b3480156106af57600080fd5b5060125461043e906001600160a01b031681565b3480156106cf57600080fd5b506103ee600a5481565b3480156106e557600080fd5b506104a66106f4366004612fd8565b611512565b34801561070557600080fd5b506104a66115ff565b34801561071a57600080fd5b506107427f00000000000000000000000000000000000000000000000000000000000003e881565b60405161ffff90911681526020016103cf565b34801561076157600080fd5b50610476610770366004612fd8565b60076020526000908152604090205460ff1681565b34801561079157600080fd5b506104a66107a0366004613068565b61168d565b3480156107b157600080fd5b506104a66107c036600461303d565b611873565b3480156107d157600080fd5b506000546001600160a01b031661043e565b3480156107ef57600080fd5b506104116118eb565b34801561080457600080fd5b5060145461043e906001600160a01b031681565b34801561082457600080fd5b506104a661083336600461303d565b6118fa565b34801561084457600080fd5b506104a6610853366004612fd8565b611957565b34801561086457600080fd5b5060165461043e906001600160a01b031681565b34801561088457600080fd5b50610476610893366004612e9d565b611a0a565b3480156108a457600080fd5b506103ee600d5481565b3480156108ba57600080fd5b506103ee600e5481565b3480156108d057600080fd5b506104a66108df366004613068565b611a17565b3480156108f057600080fd5b506103ee600b5481565b34801561090657600080fd5b506104a661091536600461309b565b611bec565b34801561092657600080fd5b50610476610935366004612fd8565b60046020526000908152604090205460ff1681565b34801561095657600080fd5b506104a6611d10565b34801561096b57600080fd5b5061047661097a366004612fd8565b60056020526000908152604090205460ff1681565b34801561099b57600080fd5b50601c54601d54610393919061ffff80821691620100008104821691640100000000820481169166010000000000008104821691680100000000000000008204811691600160501b90041687565b3480156109f557600080fd5b506103ee610a043660046130d8565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610a3b57600080fd5b506001546001600160a01b031661043e565b348015610a5957600080fd5b506104a6610a68366004612fd8565b611d6e565b348015610a7957600080fd5b506104a6610a88366004612f81565b611dec565b606060178054610a9c90613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac890613106565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b5050505050905090565b6000610b2c338484611ea9565b5060015b92915050565b610b3e611fb7565b815180610b925760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206c656e67746820617272617900000000000000000000000060448201526064015b60405180910390fd5b60005b81811015610bf8578260066000868481518110610bb457610bb4613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610bf08161316c565b915050610b95565b50505050565b6001600160a01b038316600090815260036020908152604080832033845290915281205482811015610c725760405162461bcd60e51b815260206004820152601460248201527f5472616e73666572203e20616c6c6f77616e63650000000000000000000000006044820152606401610b89565b610c868533610c818685613186565b611ea9565b610c91858585612011565b506001949350505050565b610ca4611fb7565b815180610cf35760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206c656e6774682061727261790000000000000000000000006044820152606401610b89565b60005b81811015610bf8578260056000868481518110610d1557610d15613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610d518161316c565b915050610cf6565b60155433906001600160a01b0316811480610d8157506000546001600160a01b038281169116145b610df35760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a2063616c6c657220646f65736e277420686176652070657260448201527f6d697373696f6e000000000000000000000000000000000000000000000000006064820152608401610b89565b506001600160a01b03166000908152600460205260409020805460ff19169055565b6015546001600160a01b03163314610e7d5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b601b546601000000000000900461ffff16600003610edd5760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601b54640100000000900461ffff16600003610f3b5760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601d546601000000000000900461ffff16600003610f9b5760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601d54640100000000900461ffff16600003610ff95760405162461bcd60e51b815260206004820152600f60248201527f616c7265616479207265647563656400000000000000000000000000000000006044820152606401610b89565b601b5461ffff640100000000820481169161101691166000613199565b61102091906131bb565b601b805465ffff0000ffff191661ffff92831617908190556601000000000000810482169161105791620100009004166000613199565b61106191906131bb565b601b805467ffff0000ffff000019166201000061ffff9384160267ffff0000000000001916179055601d5464010000000081048216916110a391166000613199565b6110ad91906131bb565b601d805465ffff0000ffff191661ffff9283161790819055660100000000000081048216916110e491620100009004166000613199565b6110ee91906131bb565b601d805467ffff0000ffff000019166201000061ffff939093169290920267ffff0000000000001916919091179055565b611127611fb7565b6103e8600954600a61113991906131d6565b61114391906131ed565b8110156111925760405162461bcd60e51b815260206004820152600c60248201527f4d696e203125206c696d697400000000000000000000000000000000000000006044820152606401610b89565b600e55565b61119f611fb7565b8151806111ee5760405162461bcd60e51b815260206004820152601760248201527f696e76616c6964206163636f756e7473206c656e6774680000000000000000006044820152606401610b89565b60005b81811015610bf857826008600086848151811061121057611210613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061124c8161316c565b9150506111f1565b61125c611fb7565b601a54600a5461126c919061320f565b42116112ba5760405162461bcd60e51b815260206004820152601460248201527f596f75206d7573742077616974203732206872730000000000000000000000006044820152606401610b89565b601b5461ffff64010000000082048116916112d79116600a613199565b6112e191906131bb565b601b8054640a0000000065ffff0000ffff1990911661ffff938416171790819055660100000000000081048216916113219162010000900416600a613199565b61132b91906131bb565b601b805467ffff0000ffff000019166201000061ffff9384160267ffff000000000000191617660a000000000000179055601d5464010000000081048216916113769116600a613199565b61138091906131bb565b601d8054640a0000000065ffff0000ffff1990911661ffff938416171790819055660100000000000081048216916113c09162010000900416600a613199565b6113ca91906131bb565b601d805467ffff0000ffff000019166201000061ffff939093169290920267ffff000000000000191691909117660a000000000000179055565b6015546001600160a01b0316331461146c5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b601980546001600160a01b0390811660009081526005602090815260408083208054600160ff19918216811790925586548616855260068085528386208054831684179055965486168552600780855283862080548316841790558554871686529684528285208054821683179055845486168552959092529091208054909316179091556015546114fe911661254c565b565b611508611fb7565b6114fe600061254c565b6015546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b6001600160a01b0381166115d05760405162461bcd60e51b815260206004820152601a60248201527f696e76616c69642070726f6f6641646d696e20616464726573730000000000006044820152606401610b89565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60015433906001600160a01b031681146116815760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610b89565b61168a8161254c565b50565b611695611fb7565b606461ffff831681108015906116b357508061ffff168261ffff1611155b6117255760405162461bcd60e51b815260206004820152602560248201527f4d617820526174652065786365656465642c20706c65617365206c6f7765722060448201527f76616c75650000000000000000000000000000000000000000000000000000006064820152608401610b89565b601b5461ffff68010000000000000000820481169161174691869116613199565b61175091906131bb565b601b805461ffff191661ffff92831617908190556801000000000000000081048216916117869186916201000090910416613199565b61179091906131bb565b601b805469ffff00000000ffff000019166201000061ffff9384160269ffff000000000000000019161768010000000000000000868416810291909117909155601d549081048216916117e591859116613199565b6117ef91906131bb565b601d805461ffff191661ffff92831617908190556801000000000000000081048216916118259185916201000090910416613199565b61182f91906131bb565b601d805469ffff00000000ffff000019166201000061ffff9384160269ffff0000000000000000191617680100000000000000009490921693909302179091555050565b61187b611fb7565b6103e8600954600561188d91906131d6565b61189791906131ed565b8110156118e65760405162461bcd60e51b815260206004820152600e60248201527f4d696e20302e3525206c696d69740000000000000000000000000000000000006044820152606401610b89565b600d55565b606060188054610a9c90613106565b611902611fb7565b600081116119525760405162461bcd60e51b815260206004820152601560248201527f696e76616c696420737761705468726573686f6c6400000000000000000000006044820152606401610b89565b600c55565b61195f611fb7565b6001600160a01b0381166119db5760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206d61726b6574696e6754617857616c6c657420616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610b89565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610b2c338484612011565b611a1f611fb7565b606461ffff83168110801590611a3d57508061ffff168261ffff1611155b611aaf5760405162461bcd60e51b815260206004820152602560248201527f4d617820526174652065786365656465642c20706c65617365206c6f7765722060448201527f76616c75650000000000000000000000000000000000000000000000000000006064820152608401610b89565b601b5461ffff600160501b8204811691611acb91869116613199565b611ad591906131bb565b601b805461ffff191661ffff9283161790819055600160501b8104821691611b069186916201000090910416613199565b611b1091906131bb565b601b80546bffff000000000000ffff000019166201000061ffff938416026bffff00000000000000000000191617600160501b868416810291909117909155601d54908104821691611b6491859116613199565b611b6e91906131bb565b601d805461ffff191661ffff9283161790819055600160501b8104821691611b9f9185916201000090910416613199565b611ba991906131bb565b601d80546bffff000000000000ffff000019166201000061ffff938416026bffff00000000000000000000191617600160501b9490921693909302179091555050565b6015546001600160a01b03163314611c545760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660448201526420b236b4b760d91b6064820152608401610b89565b805180611ca35760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206172726179206c656e6774680000000000000000000000006044820152606401610b89565b60005b8251811015611d0b57600160046000858481518110611cc757611cc7613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611d038161316c565b915050611ca6565b505050565b611d18611fb7565b600a5415611d685760405162461bcd60e51b815260206004820152601060248201527f616c7265616479206c61756e63686564000000000000000000000000000000006044820152606401610b89565b42600a55565b611d76611fb7565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff199091168117909155611db46000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b611df4611fb7565b815180611e435760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206c656e6774682061727261790000000000000000000000006044820152606401610b89565b60005b81811015610bf8578260076000868481518110611e6557611e65613140565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611ea18161316c565b915050611e46565b6001600160a01b038316611eff5760405162461bcd60e51b815260206004820152601160248201527f417070726f76652066726f6d207a65726f0000000000000000000000000000006044820152606401610b89565b6001600160a01b038216611f555760405162461bcd60e51b815260206004820152600f60248201527f417070726f766520746f207a65726f00000000000000000000000000000000006044820152606401610b89565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b031633146114fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b89565b6001600160a01b0383166120675760405162461bcd60e51b815260206004820152601a60248201527f7472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606401610b89565b6001600160a01b03831660009081526004602052604090205460ff1615806120a857506001600160a01b03821660009081526004602052604090205460ff16155b6120f45760405162461bcd60e51b815260206004820152600f60248201527f6e6f20626f747320616c6c6f77656400000000000000000000000000000000006044820152606401610b89565b6001600160a01b03821661214a5760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220746f207a65726f206164647265737300000000000000006044820152606401610b89565b6000811161219a5760405162461bcd60e51b815260206004820152600b60248201527f7a65726f20616d6f756e740000000000000000000000000000000000000000006044820152606401610b89565b6001600160a01b0383166000908152600260205260409020548111156122025760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820616d6f756e7420746f207472616e736665720000006044820152606401610b89565b6000546001600160a01b038481169116148061221f5750600a5415155b61226b5760405162461bcd60e51b815260206004820152601060248201527f6e6f74206c61756e6368656420796574000000000000000000000000000000006044820152606401610b89565b600b54600a5461227b919061320f565b4210156122ea576001600160a01b03821660009081526008602052604090205460ff166122ea5760405162461bcd60e51b815260206004820152600e60248201527f6f6e6c792077686974656c6973740000000000000000000000000000000000006044820152606401610b89565b6001600160a01b03831660009081526006602052604090205460ff168061233457506123186012600a613306565b61232390600a6131d6565b600d54612330919061320f565b8111155b6123805760405162461bcd60e51b815260206004820152601c60248201527f6578636565647320746f206d61785472616e73666572416d6f756e74000000006044820152606401610b89565b6001600160a01b03821660009081526007602052604090205460ff16806123ed57506123ae6012600a613306565b6123b990600a6131d6565b600e546123c6919061320f565b6001600160a01b0383166000908152600260205260409020546123ea90839061320f565b11155b6124395760405162461bcd60e51b815260206004820152601a60248201527f6578636565647320746f206d617857616c6c6574416d6f756e740000000000006044820152606401610b89565b60165474010000000000000000000000000000000000000000900460ff168061247a57506001600160a01b03821660009081526005602052604090205460ff165b8061249d57506001600160a01b03831660009081526005602052604090205460ff165b156124f2576124ad838383612572565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611faa91815260200190565b6016546001600160a01b0390811690841603612518576125138383836125d1565b6124ad565b6125206127ae565b6016546001600160a01b039081169083160361254157612513838383612bed565b6124ad838383612572565b6001805473ffffffffffffffffffffffffffffffffffffffff1916905561168a81612bfa565b6001600160a01b0383166000908152600260205260408120805483929061259a908490613186565b90915550506001600160a01b038216600090815260026020526040812080548392906125c790849061320f565b9091555050505050565b60008060006125de612c57565b9350509250925060007f00000000000000000000000000000000000000000000000000000000000003e861ffff168461ffff168661261c91906131d6565b61262691906131ed565b905060007f00000000000000000000000000000000000000000000000000000000000003e861ffff168461ffff168761265f91906131d6565b61266991906131ed565b905060007f00000000000000000000000000000000000000000000000000000000000003e861ffff168461ffff16886126a291906131d6565b6126ac91906131ed565b90506000816126bb8486613186565b6126c59190613186565b905060006126d3858a613186565b6001600160a01b038c16600090815260026020526040812080549293508b92909190612700908490613186565b90915550506001600160a01b038a166000908152600260205260408120805483929061272d90849061320f565b9091555050306000908152600260205260408120805487929061275190849061320f565b92505081905550836011600082825461276a919061320f565b9250508190555082600f6000828254612783919061320f565b92505081905550816010600082825461279c919061320f565b90915550505050505050505050505050565b6000601054600f546011546127c3919061320f565b6127cd919061320f565b9050600c5481116127db5750565b601680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055600f5460009061282c906002906131ed565b9050600061283a8284613186565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061287457612874613140565b6001600160a01b03928316602091820292909201810191909152601954604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa1580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a9190613315565b8160018151811061291d5761291d613140565b6001600160a01b0392831660209182029290920101526019546129439130911684611ea9565b6019546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790612995908590600090869030904290600401613332565b600060405180830381600087803b1580156129af57600080fd5b505af11580156129c3573d6000803e3d6000fd5b50479250505080612a165760405162461bcd60e51b815260206004820152601c60248201527f746f6f20736d616c6c20746f6b656e20666f7220737761704261636b000000006044820152606401610b89565b600083612a2386846131d6565b612a2d91906131ed565b90508015612b1f57600085600f54612a459190613186565b601954909150612a609030906001600160a01b031683611ea9565b6019546040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990849060c40160606040518083038185885af1158015612ae7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b0c91906133a3565b5050508183612b1b9190613186565b9250505b60008460115484612b3091906131d6565b612b3a91906131ed565b90506000612b496002836131ed565b90506000612b578284613186565b90506000612b658487613186565b601354909150612b7e906001600160a01b031684612cea565b601454612b94906001600160a01b031683612cea565b601254612baa906001600160a01b031682612cea565b50506000600f81905560108190556011555050601680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505050505050565b60008060006125de612d99565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080601a60000154600a54612c70919061320f565b421015612cac575050601b5461ffff8082169350640100000000820481169250680100000000000000008204811691600160501b900416612ce4565b5050601b5461ffff620100008204811693506601000000000000820481169250680100000000000000008204811691600160501b9004165b90919293565b80600003612cf6575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d43576040519150601f19603f3d011682016040523d82523d6000602084013e612d48565b606091505b5050905080611d0b5760405162461bcd60e51b815260206004820152601260248201527f73656e64696e6720455448206661696c656400000000000000000000000000006044820152606401610b89565b600080600080601c60000154600a54612db2919061320f565b421015612dee575050601d5461ffff8082169350640100000000820481169250680100000000000000008204811691600160501b900416612ce4565b5050601d5461ffff620100008204811693506601000000000000820481169250680100000000000000008204811691600160501b900416612ce4565b600060208083528351808285015260005b81811015612e5757858101830151858201604001528201612e3b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461168a57600080fd5b8035612e9881612e78565b919050565b60008060408385031215612eb057600080fd5b8235612ebb81612e78565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ef057600080fd5b8135602067ffffffffffffffff80831115612f0d57612f0d612ec9565b8260051b604051601f19603f83011681018181108482111715612f3257612f32612ec9565b604052938452858101830193838101925087851115612f5057600080fd5b83870191505b84821015612f7657612f6782612e8d565b83529183019190830190612f56565b979650505050505050565b60008060408385031215612f9457600080fd5b823567ffffffffffffffff811115612fab57600080fd5b612fb785828601612edf565b92505060208301358015158114612fcd57600080fd5b809150509250929050565b600060208284031215612fea57600080fd5b8135612ff581612e78565b9392505050565b60008060006060848603121561301157600080fd5b833561301c81612e78565b9250602084013561302c81612e78565b929592945050506040919091013590565b60006020828403121561304f57600080fd5b5035919050565b803561ffff81168114612e9857600080fd5b6000806040838503121561307b57600080fd5b61308483613056565b915061309260208401613056565b90509250929050565b6000602082840312156130ad57600080fd5b813567ffffffffffffffff8111156130c457600080fd5b6130d084828501612edf565b949350505050565b600080604083850312156130eb57600080fd5b82356130f681612e78565b91506020830135612fcd81612e78565b600181811c9082168061311a57607f821691505b60208210810361313a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019820361317f5761317f613156565b5060010190565b81810381811115610b3057610b30613156565b61ffff8181168382160190808211156131b4576131b4613156565b5092915050565b61ffff8281168282160390808211156131b4576131b4613156565b8082028115828204841417610b3057610b30613156565b60008261320a57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b3057610b30613156565b600181815b8085111561325d57816000190482111561324357613243613156565b8085161561325057918102915b93841c9390800290613227565b509250929050565b60008261327457506001610b30565b8161328157506000610b30565b816001811461329757600281146132a1576132bd565b6001915050610b30565b60ff8411156132b2576132b2613156565b50506001821b610b30565b5060208310610133831016604e8410600b84101617156132e0575081810a610b30565b6132ea8383613222565b80600019048211156132fe576132fe613156565b029392505050565b6000612ff560ff841683613265565b60006020828403121561332757600080fd5b8151612ff581612e78565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133825784516001600160a01b03168352938301939183019160010161335d565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156133b857600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220871b4873d65d4690ff54c756cb383054e571c1544d5ad25fc22d7ce4bc72990364736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e0000000000000000000000001bf4cb781b97724a8a22ef064dce6bbc1c26cdda000000000000000000000000acfb878960bcda38782d854efb2e687b57e31f09000000000000000000000000afc94420451fca019dc97100d14abcb8704d6e650000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000d015a304d44041d25d10486e64330e7888fb6647000000000000000000000000a39dc746652a0731da7ff1f4ad6385caf8a95e29000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000003f4800000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000032

-----Decoded View---------------
Arg [0] : _param (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e
Arg [1] : 0000000000000000000000001bf4cb781b97724a8a22ef064dce6bbc1c26cdda
Arg [2] : 000000000000000000000000acfb878960bcda38782d854efb2e687b57e31f09
Arg [3] : 000000000000000000000000afc94420451fca019dc97100d14abcb8704d6e65
Arg [4] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [5] : 000000000000000000000000d015a304d44041d25d10486e64330e7888fb6647
Arg [6] : 000000000000000000000000a39dc746652a0731da7ff1f4ad6385caf8a95e29
Arg [7] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [8] : 000000000000000000000000000000000000000000000000000000000003f480
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000032


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.