ETH Price: $3,286.65 (-10.64%)

Contract

0x3F2b113d180ecb1457e450b9EfcAC3df1Dd29AD3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy And Burn214420332024-12-20 6:46:473 hrs ago1734677207IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0039326113.22977289
Buy And Burn214420262024-12-20 6:45:113 hrs ago1734677111IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0050962814.04242107
Buy And Burn214420152024-12-20 6:42:593 hrs ago1734676979IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0031002212.50411436
Buy And Burn214419592024-12-20 6:31:353 hrs ago1734676295IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0067642416.65823262
Buy And Burn214396362024-12-19 22:45:1111 hrs ago1734648311IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0039706413.35769025
Buy And Burn214396352024-12-19 22:44:5911 hrs ago1734648299IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0051054614.06800725
Buy And Burn214396222024-12-19 22:42:2311 hrs ago1734648143IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0059034414.11405024
Buy And Burn214395672024-12-19 22:31:2311 hrs ago1734647483IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0066042815.38559226
Buy And Burn214372452024-12-19 14:44:4719 hrs ago1734619487IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0042574114.41553674
Buy And Burn214372452024-12-19 14:44:4719 hrs ago1734619487IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0050729414.15778984
Buy And Burn214371692024-12-19 14:29:3519 hrs ago1734618575IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0069607817.13293723
Buy And Burn214353792024-12-19 8:29:1125 hrs ago1734596951IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0027431211.06383344
Buy And Burn214348542024-12-19 6:43:2327 hrs ago1734590603IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0038795910.68468522
Buy And Burn214347852024-12-19 6:29:2327 hrs ago1734589763IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0030682710.3891377
Buy And Burn214347852024-12-19 6:29:2327 hrs ago1734589763IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0039393410.3891377
Buy And Burn214329972024-12-19 0:28:5933 hrs ago1734568139IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0029607611.94165744
Buy And Burn214324712024-12-18 22:43:1135 hrs ago1734561791IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0054028714.88867637
Buy And Burn214324002024-12-18 22:28:5935 hrs ago1734560939IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0044947215.21958427
Buy And Burn214324002024-12-18 22:28:5935 hrs ago1734560939IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0065012216.13647353
Buy And Burn214296722024-12-18 13:19:3544 hrs ago1734527975IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0061793714.3972673
Buy And Burn214274472024-12-18 5:51:352 days ago1734501095IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0032033610.77649088
Buy And Burn214274452024-12-18 5:51:112 days ago1734501071IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0046175812.72143281
Buy And Burn214273362024-12-18 5:29:232 days ago1734499763IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0043907210.47485635
Buy And Burn214271932024-12-18 5:00:472 days ago1734498047IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0059467413.85416778
Buy And Burn214250562024-12-17 21:50:592 days ago1734472259IN
0x3F2b113d...f1Dd29AD3
0 ETH0.0040205813.61363717
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ElementBuyBurn

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 21 : ElementBuyBurn.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;

import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "@openzeppelin/contracts/interfaces/IERC165.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import "./interfaces/IElement280.sol";
import "./interfaces/ITitanOnBurn.sol";
import "./interfaces/ITITANX.sol";
import "./interfaces/IWETH9.sol";

import "./lib/constants.sol";

/// @title Element 280 Buy&Burn Contract
contract ElementBuyBurn is Ownable2Step, IERC165, ITitanOnBurn {
    using SafeERC20 for IERC20;

    // --------------------------- STATE VARIABLES --------------------------- //

    struct EcosystemToken {
        uint256 capPerSwapTitanX;
        uint256 capPerSwapEco;
        uint256 interval;
        uint256 lastTimestamp;
        uint256 totalE280Burned;
        uint256 totalTokensBurned;
        uint256 titanXAllocation;
        uint8 allocationPercent;
    }

    address public treasury;
    address public devWallet;
    address public immutable E280;

    /// @notice Incentive fee amount, measured in basis points (100 bps = 1%).
    uint16 public incentiveFeeBps = 30;

    /// @notice The total amount of TitanX allocated for Buy&Burn.
    uint256 public totalTitanXAllocated;
    /// @notice The total amount of TitanX tokens used in Buy&Burn to date.
    uint256 public totalTitanXUsed;
    /// @notice The total amount of Element 280 tokens burned to date.
    uint256 public totalE280Burned;

    /// @notice The maximum amount of ETH/WETH that can be swapped per rebalance.
    uint256 public capPerSwapETH = 2 ether;
    /// @notice Time between rebalances in seconds.
    uint256 public rebalanceInterval = 2 hours;
    /// @notice Time of the last rebalance in seconds.
    uint256 public lastRebalance;
    uint256 private constant minTitanX = 1 ether;

    /// @notice The list of all ecosystem tokens integrated in the Buy&Burn contract.
    address[] public ecosystemTokens;

    /// @notice A mapping of ecosystem token addresses to their corresponding data.
    /// @return capPerSwapTitanX The maximum amount of TitanX that can be allocated for each swap.
    /// @return capPerSwapEco The maximum amount of the ecosystem token that can be swapped at one time.
    /// @return interval The cooldown period (in seconds) between Buy&Burn operations for the token.
    /// @return lastTimestamp The timestamp of the last Buy&Burn operation for the token.
    /// @return totalE280Burned The total amount of E280 tokens burned through this ecosystem token's swaps.
    /// @return totalTokensBurned The total amount of the ecosystem token burned.
    /// @return titanXAllocation The amount of TitanX allocated for this ecosystem token to be used for Buy&Burn.
    /// @return allocationPercent The percentage of total TitanX to be allocated to this ecosystem token during rebalance.
    mapping(address token => EcosystemToken) public tokens;

    // --------------------------- EVENTS --------------------------- //
    event Rebalance();
    event BuyBurn(address token);

    // --------------------------- CONSTRUCTOR --------------------------- //
    constructor(
        address _E280,
        address _owner,
        address _devWallet,
        address _treasury,
        address[] memory _ecosystemTokens,
        uint8[] memory _percentages,
        uint256[] memory _capsPerSwapTitanX,
        uint256[] memory _capsPerSwapEco,
        uint256[] memory _intervals
    ) Ownable(_owner) {
        require(_ecosystemTokens.length == NUM_ECOSYSTEM_TOKENS, "Incorrect number of tokens");
        require(_percentages.length == NUM_ECOSYSTEM_TOKENS, "Incorrect number of tokens");
        require(_capsPerSwapTitanX.length == NUM_ECOSYSTEM_TOKENS, "Incorrect number of tokens");
        require(_capsPerSwapEco.length == NUM_ECOSYSTEM_TOKENS, "Incorrect number of tokens");
        require(_intervals.length == NUM_ECOSYSTEM_TOKENS, "Incorrect number of tokens");
        require(_E280 != address(0), "E280 token address not provided");
        require(_owner != address(0), "Owner wallet not provided");
        require(_devWallet != address(0), "Dev wallet address not provided");
        require(_treasury != address(0), "Treasury address not provided");

        E280 = _E280;
        devWallet = _devWallet;
        treasury = _treasury;
        ecosystemTokens = _ecosystemTokens;

        uint8 totalPercentage;
        for (uint256 i = 0; i < _ecosystemTokens.length; i++) {
            address token = _ecosystemTokens[i];
            uint8 allocation = _percentages[i];
            require(token != address(0), "Incorrect token address");
            require(allocation > 0, "Incorrect percentage value");
            require(tokens[token].allocationPercent == 0, "Duplicate token");
            tokens[token] =
                EcosystemToken(_capsPerSwapTitanX[i], _capsPerSwapEco[i], _intervals[i], 0, 0, 0, 0, allocation);
            totalPercentage += allocation;
        }
        require(totalPercentage == 100, "Percentages do not add up to 100");
    }

    receive() external payable {}

    // --------------------------- PUBLIC FUNCTIONS --------------------------- //

    /// @notice Rebalances ecosystem token allocations by redistributing ETH, WETH, and TitanX tokens.
    /// @dev Has a cooldown equal to rebalanceInterval.
    function rebalance() external {
        require(address(msg.sender).code.length == 0 && msg.sender == tx.origin, "No contracts");
        require(block.timestamp > lastRebalance + rebalanceInterval, "Cooldown in progress");
        //Swap ETH to WETH if available
        uint256 ethBalance = address(this).balance;
        if (ethBalance > 0) IWETH9(WETH9).deposit{value: ethBalance}();

        //Check if WETH is available
        uint256 wethBalance = IERC20(WETH9).balanceOf(address(this));
        uint256 wethToSwap = wethBalance > capPerSwapETH ? capPerSwapETH : wethBalance;
        if (wethToSwap > 0) _swapWETHForTitanX(wethToSwap);

        uint256 unaccountedTitan = getUnaccountedTitanX();
        if (unaccountedTitan > 0) {
            lastRebalance = block.timestamp;
            for (uint256 i = 0; i < ecosystemTokens.length; i++) {
                EcosystemToken storage token = tokens[ecosystemTokens[i]];
                uint256 allocation = unaccountedTitan * token.allocationPercent / 100;
                unchecked {
                    token.titanXAllocation += allocation;
                    totalTitanXAllocated += allocation;
                }
            }
        }
        emit Rebalance();
    }

    /// @notice Buys and burns the Element 280 tokens based on TitanX allocations or native balance of a specific ecosystem token.
    /// @param tokenAddress The address of the ecosystem token to be used in Buy&Burn.
    /// @param minTokenAmount The minimum amount out for the TitanX -> Ecosystem token swap.
    /// @param minE280Amount The minimum amount out for Ecosystem token -> ELMT swap.
    /// @param deadline The deadline for the swaps.
    function buyAndBurn(address tokenAddress, uint256 minTokenAmount, uint256 minE280Amount, uint256 deadline)
        external
    {
        require(address(msg.sender).code.length == 0 && msg.sender == tx.origin, "No contracts");
        if (tokenAddress == TITANX) return _handleTitanXBuyAndBurn(tokenAddress, minE280Amount, deadline);
        EcosystemToken storage token = tokens[tokenAddress];
        require(block.timestamp > token.lastTimestamp + token.interval, "Cooldown in progress");
        IERC20 tokenContract = IERC20(tokenAddress);
        uint256 tokenBalance = tokenContract.balanceOf(address(this));
        (uint256 totalAllocation, bool isNative) = _getNextSwapValue(token, tokenBalance);
        require(totalAllocation > 0, "No allocation available");
        uint256 tokensToDistribute;
        if (isNative) {
            tokensToDistribute = _processIncentiveFee(tokenContract, totalAllocation);
        } else {
            tokenBalance += _swapTitanXToToken(tokenAddress, totalAllocation, minTokenAmount, deadline);
            uint256 newTotalAllocation = tokenBalance > token.capPerSwapEco ? token.capPerSwapEco : tokenBalance;
            tokensToDistribute = _processIncentiveFee(tokenContract, newTotalAllocation);
        }
        (uint256 tokenBurnFee, uint256 tokensToSwap) = _handleTokenDisperse(tokenContract, tokensToDistribute);
        _handleTokenBurn(tokenAddress, tokenBurnFee);
        _handleE280Swap(tokenAddress, tokensToSwap, minE280Amount, deadline);
        uint256 totalBurned = _handleE280Burn();
        unchecked {
            if (!isNative) {
                totalTitanXUsed += totalAllocation;
                token.titanXAllocation -= totalAllocation;
            }
            token.totalE280Burned += totalBurned;
        }
        token.lastTimestamp = block.timestamp;
        emit BuyBurn(tokenAddress);
    }

    // --------------------------- ADMINISTRATIVE FUNCTIONS --------------------------- //

    /// @notice Sets the treasury address.
    /// @param _address The new treasury address.
    function setTreasury(address _address) external onlyOwner {
        require(_address != address(0), "Treasury address not provided");
        treasury = _address;
    }

    /// @notice Sets the incentive fee basis points (bps) for token swaps.
    /// @param bps The incentive fee in basis points (0 - 1000), (100 bps = 1%).
    function setIncentiveFee(uint16 bps) external onlyOwner {
        require(bps < 1001, "Incentive should not exceed 10%");
        incentiveFeeBps = bps;
    }

    /// @notice Sets the cap per swap for ETH/TitanX and WETH/TitanX swaps.
    /// @param limit The new cap limit in WEI.
    function setEthCapPerSwap(uint256 limit) external onlyOwner {
        capPerSwapETH = limit;
    }

    /// @notice Sets the rebalance interval.
    /// @param interval The new rebalance interval in seconds.
    function setRebalanceInterval(uint256 interval) external onlyOwner {
        rebalanceInterval = interval;
    }

    /// @notice Sets the cooldown interval for a specific token.
    /// @param tokenAddress The address of the token.
    /// @param interval The new cooldown interval in seconds for the token.
    function setTokenInterval(address tokenAddress, uint256 interval) external onlyOwner {
        EcosystemToken storage token = tokens[tokenAddress];
        require(token.allocationPercent > 0, "Not an ecosystem token");
        token.interval = interval;
    }

    /// @notice Sets the cap per swap for a specific token.
    /// @param tokenAddress The address of the token.
    /// @param capPerSwapTitanX The new TitanX cap per swap in WEI.
    /// @param capPerSwapEco The new token cap per swap in WEI.
    function setTokenCapPerSwap(address tokenAddress, uint256 capPerSwapTitanX, uint256 capPerSwapEco)
        external
        onlyOwner
    {
        EcosystemToken storage token = tokens[tokenAddress];
        require(token.allocationPercent > 0, "Not an ecosystem token");
        token.capPerSwapTitanX = capPerSwapTitanX;
        token.capPerSwapEco = capPerSwapEco;
    }

    // --------------------------- VIEW FUNCTIONS --------------------------- //

    /// @notice Checks if rebalance is available.
    function isRebalanceAvailable() external view returns (bool) {
        if (block.timestamp <= lastRebalance + rebalanceInterval) return false;
        return address(this).balance > 0 || IERC20(WETH9).balanceOf(address(this)) > 0 || getUnaccountedTitanX() > 0;
    }

    /// @notice Returns the amount of unaccounted TitanX tokens held by the contract.
    /// @return unaccountedTitan The amount of TitanX tokens available for rebalancing.
    function getUnaccountedTitanX() public view returns (uint256 unaccountedTitan) {
        uint256 titanBalance = IERC20(TITANX).balanceOf(address(this));
        unchecked {
            unaccountedTitan = titanBalance + totalTitanXUsed - totalTitanXAllocated;
        }
        if (unaccountedTitan < minTitanX) return 0;
        return unaccountedTitan;
    }

    /// @notice Returns the next amount of tokens that will be swaped in next Buy&Burn operation and whether the swap is in native tokens.
    /// @param tokenAddress The address of the ecosystem token to use in Buy&Burn.
    /// @return tokensToSwap The amount of tokens that will be used in Buy&Burn.
    /// @return isNative Whether the ecosystem token or TitanX allocation will be used for the Buy&Burn operation.
    function getNextSwapValue(address tokenAddress) public view returns (uint256 tokensToSwap, bool isNative) {
        EcosystemToken storage token = tokens[tokenAddress];
        require(token.capPerSwapTitanX > 0, "Token is disabled");
        uint256 nativeBalance = IERC20(tokenAddress).balanceOf(address(this));
        isNative = tokenAddress == TITANX ? false : token.capPerSwapEco <= nativeBalance;
        tokensToSwap = isNative
            ? token.capPerSwapEco
            : token.titanXAllocation > token.capPerSwapTitanX ? token.capPerSwapTitanX : token.titanXAllocation;
    }

    /// @notice Calculates the incentive fee to be applied based on the input token amount.
    /// @param tokenAmount The amount of tokens being used.
    /// @return The calculated incentive fee in tokens.
    function calculateIncentiveFee(uint256 tokenAmount) public view returns (uint256) {
        unchecked {
            return tokenAmount * incentiveFeeBps / 10000;
        }
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) {
        return interfaceId == INTERFACE_ID_ERC165 || interfaceId == INTERFACE_ID_ITITANONBURN;
    }

    // --------------------------- INTERNAL FUNCTIONS --------------------------- //

    function _getNextSwapValue(EcosystemToken memory token, uint256 tokenBalance)
        internal
        pure
        returns (uint256 tokensToSwap, bool isNative)
    {
        require(token.capPerSwapTitanX > 0, "Token is disabled");
        isNative = token.capPerSwapEco <= tokenBalance;
        tokensToSwap = isNative
            ? token.capPerSwapEco
            : token.titanXAllocation > token.capPerSwapTitanX ? token.capPerSwapTitanX : token.titanXAllocation;
    }

    function _processIncentiveFee(IERC20 token, uint256 tokenAmount) internal returns (uint256) {
        uint256 incentiveFee = calculateIncentiveFee(tokenAmount);
        token.safeTransfer(msg.sender, incentiveFee);
        unchecked {
            return tokenAmount - incentiveFee;
        }
    }

    function _handleTitanXBuyAndBurn(address tokenAddress, uint256 minE280Amount, uint256 deadline) internal {
        EcosystemToken storage token = tokens[tokenAddress];
        require(block.timestamp > token.lastTimestamp + token.interval, "Cooldown in progress");
        (uint256 totalTitanXAllocation,) = _getNextSwapValue(token, 0);
        require(totalTitanXAllocation > 0, "No allocation available");
        uint256 titanXToSwap = _processIncentiveFee(IERC20(tokenAddress), totalTitanXAllocation);
        (uint256 tokensToSwap, uint256 burnFee) = _handleTitanXDisperse(titanXToSwap);
        _handleE280Swap(tokenAddress, tokensToSwap, minE280Amount, deadline);
        uint256 totalBurned = _handleE280Burn();
        unchecked {
            totalTitanXUsed += totalTitanXAllocation;
            token.titanXAllocation -= totalTitanXAllocation;
            token.totalE280Burned += totalBurned;
            token.totalTokensBurned += burnFee;
            token.lastTimestamp = block.timestamp;
        }
        emit BuyBurn(tokenAddress);
    }

    function _handleTitanXDisperse(uint256 amount) internal returns (uint256 tokensToSwap, uint256 burnFee) {
        IERC20 titanX = IERC20(TITANX);
        uint256 devFee;
        uint256 treasuryFee;
        unchecked {
            devFee = amount * DEV_PERCENT / 100;
            burnFee = amount * BURN_PERCENT / 100;
            treasuryFee = amount * TREASURY_PERCENT / 100 + burnFee;
            tokensToSwap = amount - devFee - treasuryFee;
        }
        titanX.safeTransfer(devWallet, devFee);
        titanX.safeTransfer(treasury, treasuryFee);
    }

    function _handleTokenDisperse(IERC20 token, uint256 amount)
        internal
        returns (uint256 burnFee, uint256 tokensToSwap)
    {
        uint256 devFee;
        uint256 treasuryFee;
        unchecked {
            devFee = amount * DEV_PERCENT / 100;
            treasuryFee = amount * TREASURY_PERCENT / 100;
            burnFee = amount * BURN_PERCENT / 100;
            tokensToSwap = amount - devFee - treasuryFee - burnFee;
        }
        token.safeTransfer(devWallet, devFee);
        token.safeTransfer(treasury, treasuryFee);
    }

    function _handleE280Swap(address tokenIn, uint256 amount, uint256 minAmountOut, uint256 deadline)
        internal
        returns (uint256)
    {
        require(minAmountOut > 0, "minAmountOut not provided");
        IERC20(tokenIn).safeIncreaseAllowance(UNISWAP_V2_ROUTER, amount);

        address[] memory path = new address[](2);
        path[0] = tokenIn;
        path[1] = E280;

        uint256[] memory amounts = IUniswapV2Router02(UNISWAP_V2_ROUTER).swapExactTokensForTokens(
            amount, minAmountOut, path, address(this), deadline
        );
        return amounts[1];
    }

    function _handleTokenBurn(address tokenAddress, uint256 amountToBurn) internal {
        if (tokenAddress == HELIOS_ADDRESS || tokenAddress == HYPER_ADDRESS || tokenAddress == HYDRA_ADDRESS) {
            IERC20(tokenAddress).safeIncreaseAllowance(address(this), amountToBurn);
            ITITANX(tokenAddress).burnTokensToPayAddress(address(this), amountToBurn, 0, 8, devWallet);
        } else if (tokenAddress == DRAGONX_ADDRESS) {
            IERC20(tokenAddress).safeTransfer(DRAGONX_BURN_ADDRESS, amountToBurn);
            tokens[tokenAddress].totalTokensBurned += amountToBurn;
        } else {
            IERC20Burnable(tokenAddress).burn(amountToBurn);
            tokens[tokenAddress].totalTokensBurned += amountToBurn;
        }
    }

    function _handleE280Burn() internal returns (uint256) {
        IElement280 e280 = IElement280(E280);
        uint256 amountToBurn = IERC20(E280).balanceOf(address(this));
        e280.burn(amountToBurn);
        totalE280Burned += amountToBurn;
        return amountToBurn;
    }

    function _swapWETHForTitanX(uint256 amountIn) private returns (uint256) {
        ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
            tokenIn: WETH9,
            tokenOut: TITANX,
            fee: POOL_FEE_1PERCENT,
            recipient: address(this),
            deadline: block.timestamp,
            amountIn: amountIn,
            amountOutMinimum: 0,
            sqrtPriceLimitX96: 0
        });
        IERC20(WETH9).safeIncreaseAllowance(UNISWAP_V3_ROUTER, amountIn);
        uint256 amountOut = ISwapRouter(UNISWAP_V3_ROUTER).exactInputSingle(params);
        return amountOut;
    }

    /// @notice ITitanOnBurn interface function.
    function onBurn(address, uint256 amount) external {
        EcosystemToken storage token = tokens[msg.sender];
        require(token.allocationPercent != 0, "Not an ecosystem token");
        unchecked {
            token.totalTokensBurned += amount;
        }
    }

    function _swapTitanXToToken(address outputToken, uint256 amount, uint256 minAmountOut, uint256 deadline)
        internal
        returns (uint256)
    {
        if (outputToken == BLAZE_ADDRESS) return _swapUniswapV2Pool(outputToken, amount, minAmountOut, deadline);
        if (outputToken == BDX_ADDRESS || outputToken == HYDRA_ADDRESS || outputToken == AWESOMEX_ADDRESS) {
            return _swapMultihop(outputToken, DRAGONX_ADDRESS, amount, minAmountOut, deadline);
        }
        if (outputToken == FLUX_ADDRESS) {
            return _swapMultihop(outputToken, INFERNO_ADDRESS, amount, minAmountOut, deadline);
        }
        return _swapUniswapV3Pool(outputToken, amount, minAmountOut, deadline);
    }

    function _swapUniswapV3Pool(address outputToken, uint256 amountIn, uint256 minAmountOut, uint256 deadline)
        private
        returns (uint256)
    {
        ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
            tokenIn: TITANX,
            tokenOut: outputToken,
            fee: POOL_FEE_1PERCENT,
            recipient: address(this),
            deadline: deadline,
            amountIn: amountIn,
            amountOutMinimum: minAmountOut,
            sqrtPriceLimitX96: 0
        });
        IERC20(TITANX).safeIncreaseAllowance(UNISWAP_V3_ROUTER, amountIn);
        uint256 amountOut = ISwapRouter(UNISWAP_V3_ROUTER).exactInputSingle(params);
        return amountOut;
    }

    function _swapUniswapV2Pool(address outputToken, uint256 amountIn, uint256 minAmountOut, uint256 deadline)
        internal
        returns (uint256)
    {
        require(minAmountOut > 0, "minAmountOut not provided");
        IERC20(TITANX).safeIncreaseAllowance(UNISWAP_V2_ROUTER, amountIn);

        address[] memory path = new address[](2);
        path[0] = TITANX;
        path[1] = outputToken;

        uint256[] memory amounts = IUniswapV2Router02(UNISWAP_V2_ROUTER).swapExactTokensForTokens(
            amountIn, minAmountOut, path, address(this), deadline
        );

        return amounts[1];
    }

    function _swapMultihop(
        address outputToken,
        address midToken,
        uint256 amountIn,
        uint256 minAmountOut,
        uint256 deadline
    ) internal returns (uint256) {
        bytes memory path = abi.encodePacked(TITANX, POOL_FEE_1PERCENT, midToken, POOL_FEE_1PERCENT, outputToken);

        ISwapRouter.ExactInputParams memory params = ISwapRouter.ExactInputParams({
            path: path,
            recipient: address(this),
            deadline: deadline,
            amountIn: amountIn,
            amountOutMinimum: minAmountOut
        });
        IERC20(TITANX).safeIncreaseAllowance(UNISWAP_V3_ROUTER, amountIn);
        uint256 amoutOut = ISwapRouter(UNISWAP_V3_ROUTER).exactInput(params);
        return amoutOut;
    }
}

File 2 of 21 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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 21 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.20;

import {Ownable} from "./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.
 *
 * The initial owner is specified at deployment time in the constructor for `Ownable`. 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() public virtual {
        address sender = _msgSender();
        if (pendingOwner() != sender) {
            revert OwnableUnauthorizedAccount(sender);
        }
        _transferOwnership(sender);
    }
}

File 4 of 21 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../utils/introspection/IERC165.sol";

File 5 of 21 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../token/ERC20/IERC20.sol";

File 6 of 21 : IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
        external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 7 of 21 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

File 8 of 21 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}

File 9 of 21 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success,) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(address target, bool success, bytes memory returndata)
        internal
        view
        returns (bytes memory)
    {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

File 10 of 21 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 11 of 21 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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

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

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

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

File 13 of 21 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import "./IUniswapV2Router01.sol";

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

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

File 14 of 21 : IUniswapV3SwapCallback.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;
}

File 15 of 21 : ISwapRouter.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;

import "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol";

/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}

File 16 of 21 : IElement280.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "./IERC20Burnable.sol";

interface IElement280 is IERC20Burnable {
    function presaleEnd() external returns (uint256);
    function handleRedeem(uint256 amount, address receiver) external;
}

File 17 of 21 : IERC20Burnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IERC20Burnable {
    function burn(uint256 value) external;
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 18 of 21 : ITitanOnBurn.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

interface ITitanOnBurn {
    function onBurn(address user, uint256 amount) external;
}

File 19 of 21 : ITITANX.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;

interface ITITANX {
    error TitanX_InvalidAmount();
    error TitanX_InsufficientBalance();
    error TitanX_NotSupportedContract();
    error TitanX_InsufficientProtocolFees();
    error TitanX_FailedToSendAmount();
    error TitanX_NotAllowed();
    error TitanX_NoCycleRewardToClaim();
    error TitanX_NoSharesExist();
    error TitanX_EmptyUndistributeFees();
    error TitanX_InvalidBurnRewardPercent();
    error TitanX_InvalidBatchCount();
    error TitanX_InvalidMintLadderInterval();
    error TitanX_InvalidMintLadderRange();
    error TitanX_MaxedWalletMints();
    error TitanX_LPTokensHasMinted();
    error TitanX_InvalidAddress();
    error TitanX_InsufficientBurnAllowance();

    function getBalance() external;

    /**
     * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);

    function burnTokensToPayAddress(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage,
        address rewardPaybackAddress
    ) external;

    function burnTokens(address user, uint256 amount, uint256 userRebatePercentage, uint256 rewardPaybackPercentage)
        external;

    function userBurnTokens(uint256 amount) external;
}

File 20 of 21 : IWETH9.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.10;

import "@openzeppelin/contracts/interfaces/IERC20.sol";

/// @title Interface for WETH9
interface IWETH9 is IERC20 {
    /// @notice Deposit ether to get wrapped ether
    function deposit() external payable;

    /// @notice Withdraw wrapped ether to get ether
    function withdraw(uint256) external;
}

File 21 of 21 : constants.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "../interfaces/ITitanOnBurn.sol";
import "@openzeppelin/contracts/interfaces/IERC20.sol";

// ===================== Contract Addresses =====================================
uint8 constant NUM_ECOSYSTEM_TOKENS = 14;

address constant WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address constant TITANX = 0xF19308F923582A6f7c465e5CE7a9Dc1BEC6665B1;
address constant HYPER_ADDRESS = 0xE2cfD7a01ec63875cd9Da6C7c1B7025166c2fA2F;
address constant HELIOS_ADDRESS = 0x2614f29C39dE46468A921Fd0b41fdd99A01f2EDf;
address constant DRAGONX_ADDRESS = 0x96a5399D07896f757Bd4c6eF56461F58DB951862;
address constant BDX_ADDRESS = 0x9f278Dc799BbC61ecB8e5Fb8035cbfA29803623B;
address constant BLAZE_ADDRESS = 0xfcd7cceE4071aA4ecFAC1683b7CC0aFeCAF42A36;
address constant INFERNO_ADDRESS = 0x00F116ac0c304C570daAA68FA6c30a86A04B5C5F;
address constant HYDRA_ADDRESS = 0xCC7ed2ab6c3396DdBc4316D2d7C1b59ff9d2091F;
address constant AWESOMEX_ADDRESS = 0xa99AFcC6Aa4530d01DFFF8E55ec66E4C424c048c;
address constant FLUX_ADDRESS = 0xBFDE5ac4f5Adb419A931a5bF64B0f3BB5a623d06;

address constant DRAGONX_BURN_ADDRESS = 0x1d59429571d8Fde785F45bf593E94F2Da6072Edb;

// ===================== Presale ================================================
uint256 constant PRESALE_LENGTH = 28 days;
uint256 constant COOLDOWN_PERIOD = 48 hours;
uint256 constant LP_POOL_SIZE = 200_000_000_000 ether;

// ===================== Fees ===================================================
uint256 constant DEV_PERCENT = 6;
uint256 constant TREASURY_PERCENT = 4;
uint256 constant BURN_PERCENT = 10;

// ===================== Sell Tax ===============================================
uint256 constant PRESALE_TRANSFER_TAX_PERCENTAGE = 16;
uint256 constant TRANSFER_TAX_PERCENTAGE = 4;
uint256 constant NFT_REDEEM_TAX_PERCENTAGE = 3;

// ===================== Holder Vault ===========================================
uint16 constant MAX_CYCLES_PER_CLAIM = 100;
uint32 constant CYCLE_INTERVAL = 7 days;

// ===================== UNISWAP Interface ======================================

address constant UNISWAP_V2_FACTORY = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
address constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address constant UNISWAP_V3_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564;
uint24 constant POOL_FEE_1PERCENT = 10000;

// ===================== Interface IDs ==========================================
bytes4 constant INTERFACE_ID_ERC165 = 0x01ffc9a7;
bytes4 constant INTERFACE_ID_ERC20 = type(IERC20).interfaceId;
bytes4 constant INTERFACE_ID_ERC721 = 0x80ac58cd;
bytes4 constant INTERFACE_ID_ERC721Metadata = 0x5b5e139f;
bytes4 constant INTERFACE_ID_ITITANONBURN = type(ITitanOnBurn).interfaceId;

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_E280","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address[]","name":"_ecosystemTokens","type":"address[]"},{"internalType":"uint8[]","name":"_percentages","type":"uint8[]"},{"internalType":"uint256[]","name":"_capsPerSwapTitanX","type":"uint256[]"},{"internalType":"uint256[]","name":"_capsPerSwapEco","type":"uint256[]"},{"internalType":"uint256[]","name":"_intervals","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"BuyBurn","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":[],"name":"Rebalance","type":"event"},{"inputs":[],"name":"E280","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"minTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minE280Amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"buyAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"calculateIncentiveFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capPerSwapETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ecosystemTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getNextSwapValue","outputs":[{"internalType":"uint256","name":"tokensToSwap","type":"uint256"},{"internalType":"bool","name":"isNative","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnaccountedTitanX","outputs":[{"internalType":"uint256","name":"unaccountedTitan","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incentiveFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRebalanceAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"onBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","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":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setEthCapPerSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setIncentiveFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"capPerSwapTitanX","type":"uint256"},{"internalType":"uint256","name":"capPerSwapEco","type":"uint256"}],"name":"setTokenCapPerSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setTokenInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"capPerSwapTitanX","type":"uint256"},{"internalType":"uint256","name":"capPerSwapEco","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"lastTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalE280Burned","type":"uint256"},{"internalType":"uint256","name":"totalTokensBurned","type":"uint256"},{"internalType":"uint256","name":"titanXAllocation","type":"uint256"},{"internalType":"uint8","name":"allocationPercent","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalE280Burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTitanXAllocated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTitanXUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526003805461ffff60a01b1916600f60a11b179055671bc16d674ec80000600755611c206008553480156200003757600080fd5b5060405162003346380380620033468339810160408190526200005a9162000952565b876001600160a01b0381166200008b57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b62000096816200067a565b508451600e14620000d95760405162461bcd60e51b815260206004820152601a602482015260008051602062003326833981519152604482015260640162000082565b8351600e146200011b5760405162461bcd60e51b815260206004820152601a602482015260008051602062003326833981519152604482015260640162000082565b8251600e146200015d5760405162461bcd60e51b815260206004820152601a602482015260008051602062003326833981519152604482015260640162000082565b8151600e146200019f5760405162461bcd60e51b815260206004820152601a602482015260008051602062003326833981519152604482015260640162000082565b8051600e14620001e15760405162461bcd60e51b815260206004820152601a602482015260008051602062003326833981519152604482015260640162000082565b6001600160a01b038916620002395760405162461bcd60e51b815260206004820152601f60248201527f4532383020746f6b656e2061646472657373206e6f742070726f766964656400604482015260640162000082565b6001600160a01b038816620002915760405162461bcd60e51b815260206004820152601960248201527f4f776e65722077616c6c6574206e6f742070726f766964656400000000000000604482015260640162000082565b6001600160a01b038716620002e95760405162461bcd60e51b815260206004820152601f60248201527f4465762077616c6c65742061646472657373206e6f742070726f766964656400604482015260640162000082565b6001600160a01b038616620003415760405162461bcd60e51b815260206004820152601d60248201527f54726561737572792061646472657373206e6f742070726f7669646564000000604482015260640162000082565b6001600160a01b03898116608052600380546001600160a01b03199081168a8416179091556002805490911691881691909117905584516200038b90600a906020880190620006e8565b506000805b865181101562000614576000878281518110620003b157620003b162000a7f565b602002602001015190506000878381518110620003d257620003d262000a7f565b6020026020010151905060006001600160a01b0316826001600160a01b031603620004405760405162461bcd60e51b815260206004820152601760248201527f496e636f727265637420746f6b656e2061646472657373000000000000000000604482015260640162000082565b60008160ff1611620004955760405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742070657263656e746167652076616c7565000000000000604482015260640162000082565b6001600160a01b0382166000908152600b602052604090206007015460ff1615620004f55760405162461bcd60e51b815260206004820152600f60248201526e223ab83634b1b0ba32903a37b5b2b760891b604482015260640162000082565b60405180610100016040528088858151811062000516576200051662000a7f565b6020026020010151815260200187858151811062000538576200053862000a7f565b602002602001015181526020018685815181106200055a576200055a62000a7f565b6020908102919091018101518252600082820181905260408084018290526060808501839052608080860184905260ff88811660a0978801526001600160a01b038a168552600b865293839020875181559487015160018601559186015160028501558501516003840155840151600483015591830151600582015560c0830151600682015560e0909201516007909201805460ff19169290911691909117905562000607818562000a95565b9350505060010162000390565b508060ff166064146200066a5760405162461bcd60e51b815260206004820181905260248201527f50657263656e746167657320646f206e6f742061646420757020746f20313030604482015260640162000082565b5050505050505050505062000ac3565b600180546001600160a01b0319169055620006958162000698565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000740579160200282015b828111156200074057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000709565b506200074e92915062000752565b5090565b5b808211156200074e576000815560010162000753565b80516001600160a01b03811681146200078157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620007c757620007c762000786565b604052919050565b60006001600160401b03821115620007eb57620007eb62000786565b5060051b60200190565b600082601f8301126200080757600080fd5b81516020620008206200081a83620007cf565b6200079c565b8083825260208201915060208460051b8701019350868411156200084357600080fd5b602086015b848110156200086a576200085c8162000769565b835291830191830162000848565b509695505050505050565b600082601f8301126200088757600080fd5b815160206200089a6200081a83620007cf565b8083825260208201915060208460051b870101935086841115620008bd57600080fd5b602086015b848110156200086a57805160ff81168114620008de5760008081fd5b8352918301918301620008c2565b600082601f830112620008fe57600080fd5b81516020620009116200081a83620007cf565b8083825260208201915060208460051b8701019350868411156200093457600080fd5b602086015b848110156200086a578051835291830191830162000939565b60008060008060008060008060006101208a8c0312156200097257600080fd5b6200097d8a62000769565b98506200098d60208b0162000769565b97506200099d60408b0162000769565b9650620009ad60608b0162000769565b60808b01519096506001600160401b0380821115620009cb57600080fd5b620009d98d838e01620007f5565b965060a08c0151915080821115620009f057600080fd5b620009fe8d838e0162000875565b955060c08c015191508082111562000a1557600080fd5b62000a238d838e01620008ec565b945060e08c015191508082111562000a3a57600080fd5b62000a488d838e01620008ec565b93506101008c015191508082111562000a6057600080fd5b5062000a6f8c828d01620008ec565b9150509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b60ff818116838216019081111562000abd57634e487b7160e01b600052601160045260246000fd5b92915050565b60805161283962000aed6000396000818161032101528181611861015261197501526128396000f3fe6080604052600436106101db5760003560e01c8063715018a611610102578063d531054e11610095578063f0f4426011610064578063f0f44260146105ee578063f2fde38b1461060e578063f51048a91461062e578063ffba83741461064357600080fd5b8063d531054e146104dc578063dbdc4fee14610511578063e30c397814610531578063e48603391461054f57600080fd5b8063867cd185116100d1578063867cd1851461044f5780638da5cb5b146104885780638ea5220f146104a6578063d1dd1381146104c657600080fd5b8063715018a6146103f0578063726377911461040557806379ba5097146104255780637d7c2a1c1461043a57600080fd5b806323e25e7a1161017a5780634479ef84116101495780634479ef841461037b57806345a1b92c146103905780635b7dcaed146103b057806361d027b3146103d057600080fd5b806323e25e7a146102d95780632a8985d6146102f95780632e7ab3121461030f5780633c83980f1461035b57600080fd5b80630f6a44fa116101b65780630f6a44fa14610273578063106b9ca11461029757806316d1d916146102ad5780631e546ccd146102c357600080fd5b80628ca8a9146101e757806301ffc9a7146102095780630ec787501461023e57600080fd5b366101e257005b600080fd5b3480156101f357600080fd5b5061020761020236600461237b565b610663565b005b34801561021557600080fd5b506102296102243660046123a5565b6106b7565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025e6102593660046123cf565b6106ee565b60408051928352901515602083015201610235565b34801561027f57600080fd5b5061028960055481565b604051908152602001610235565b3480156102a357600080fd5b5061028960095481565b3480156102b957600080fd5b5061028960085481565b3480156102cf57600080fd5b5061028960075481565b3480156102e557600080fd5b506102076102f43660046123ea565b61081f565b34801561030557600080fd5b5061028960045481565b34801561031b57600080fd5b506103437f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610235565b34801561036757600080fd5b5061020761037636600461241d565b61086f565b34801561038757600080fd5b50610229610b61565b34801561039c57600080fd5b506102076103ab36600461237b565b610c18565b3480156103bc57600080fd5b506102076103cb366004612456565b610c5e565b3480156103dc57600080fd5b50600254610343906001600160a01b031681565b3480156103fc57600080fd5b50610207610c6b565b34801561041157600080fd5b5061020761042036600461246f565b610c7f565b34801561043157600080fd5b50610207610cfe565b34801561044657600080fd5b50610207610d42565b34801561045b57600080fd5b5061028961046a366004612456565b60035460009061271090600160a01b900461ffff1683020492915050565b34801561049457600080fd5b506000546001600160a01b0316610343565b3480156104b257600080fd5b50600354610343906001600160a01b031681565b3480156104d257600080fd5b5061028960065481565b3480156104e857600080fd5b506003546104fe90600160a01b900461ffff1681565b60405161ffff9091168152602001610235565b34801561051d57600080fd5b5061034361052c366004612456565b610f99565b34801561053d57600080fd5b506001546001600160a01b0316610343565b34801561055b57600080fd5b506105b061056a3660046123cf565b600b602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260ff1660e082015261010001610235565b3480156105fa57600080fd5b506102076106093660046123cf565b610fc3565b34801561061a57600080fd5b506102076106293660046123cf565b611043565b34801561063a57600080fd5b506102896110b4565b34801561064f57600080fd5b5061020761065e366004612456565b611155565b61066b611162565b6001600160a01b0382166000908152600b60205260409020600781015460ff166106b05760405162461bcd60e51b81526004016106a790612493565b60405180910390fd5b6002015550565b60006001600160e01b031982166301ffc9a760e01b14806106e857506001600160e01b031982166311686e4b60e21b145b92915050565b6001600160a01b0381166000908152600b60205260408120805482919061074b5760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a5cc8191a5cd8589b1959607a1b60448201526064016106a7565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b691906124c3565b90506001600160a01b03851673f19308f923582a6f7c465e5ce7a9dc1bec6665b1146107e95780826001015411156107ec565b60005b925082610810578154600683015411610809578160060154610816565b8154610816565b81600101545b93505050915091565b610827611162565b6001600160a01b0383166000908152600b60205260409020600781015460ff166108635760405162461bcd60e51b81526004016106a790612493565b91825560019091015550565b333b15801561087d57503332145b6108b85760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b60448201526064016106a7565b73f19308f923582a6f7c465e5ce7a9dc1bec6665b0196001600160a01b038516016108ed576108e884838361118f565b610b5b565b6001600160a01b0384166000908152600b602052604090206002810154600382015461091991906124f2565b42116109375760405162461bcd60e51b81526004016106a790612505565b6040516370a0823160e01b815230600482015285906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a491906124c3565b604080516101008101825285548152600186015460208201526002860154918101919091526003850154606082015260048501546080820152600585015460a0820152600685015460c0820152600785015460ff1660e08201529091506000908190610a109084611337565b9150915060008211610a5e5760405162461bcd60e51b81526020600482015260176024820152764e6f20616c6c6f636174696f6e20617661696c61626c6560481b60448201526064016106a7565b60008115610a7757610a7085846113bd565b9050610ab8565b610a838a848b8a6113f2565b610a8d90856124f2565b9350600086600101548511610aa25784610aa8565b86600101545b9050610ab486826113bd565b9150505b600080610ac5878461151c565b91509150610ad38c8361157e565b610adf8c828c8c611795565b506000610aea61195d565b905084610b0557600580548701905560068901805487900390555b600489018054820190554260038a01556040516001600160a01b038e1681527f7721850e658dea53d926df81ff64a0583878d89df90b0e81cfaff1f7076d75059060200160405180910390a15050505050505050505b50505050565b6000600854600954610b7391906124f2565b4211610b7f5750600090565b6000471180610c0157506040516370a0823160e01b815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff91906124c3565b115b80610c1357506000610c116110b4565b115b905090565b336000908152600b602052604081206007810154909160ff9091169003610c515760405162461bcd60e51b81526004016106a790612493565b6005018054909101905550565b610c66611162565b600855565b610c73611162565b610c7d6000611a67565b565b610c87611162565b6103e98161ffff1610610cdc5760405162461bcd60e51b815260206004820152601f60248201527f496e63656e746976652073686f756c64206e6f7420657863656564203130250060448201526064016106a7565b6003805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60015433906001600160a01b03168114610d365760405163118cdaa760e01b81526001600160a01b03821660048201526024016106a7565b610d3f81611a67565b50565b333b158015610d5057503332145b610d8b5760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b60448201526064016106a7565b600854600954610d9b91906124f2565b4211610db95760405162461bcd60e51b81526004016106a790612505565b478015610e295773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b50505050505b6040516370a0823160e01b815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f91906124c3565b905060006007548211610eb25781610eb6565b6007545b90508015610ec957610ec781611a80565b505b6000610ed36110b4565b90508015610f6a574260095560005b600a54811015610f68576000600b6000600a8481548110610f0557610f05612533565b60009182526020808320909101546001600160a01b0316835282019290925260400181206007810154909250606490610f419060ff1686612549565b610f4b9190612560565b600690920180548301905550600480549091019055600101610ee2565b505b6040517ff57243a1fddfdc9fa2c7de26cc3503b1b94cfd4368d2b82d0970bfbb2fbce3a490600090a150505050565b600a8181548110610fa957600080fd5b6000918252602090912001546001600160a01b0316905081565b610fcb611162565b6001600160a01b0381166110215760405162461bcd60e51b815260206004820152601d60248201527f54726561737572792061646472657373206e6f742070726f766964656400000060448201526064016106a7565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61104b611162565b600180546001600160a01b0383166001600160a01b0319909116811790915561107c6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6040516370a0823160e01b8152306004820152600090819073f19308f923582a6f7c465e5ce7a9dc1bec6665b1906370a0823190602401602060405180830381865afa158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c91906124c3565b90506004546005548201039150670de0b6b3a764000082101561115157600091505090565b5090565b61115d611162565b600755565b6000546001600160a01b03163314610c7d5760405163118cdaa760e01b81523360048201526024016106a7565b6001600160a01b0383166000908152600b60205260409020600281015460038201546111bb91906124f2565b42116111d95760405162461bcd60e51b81526004016106a790612505565b604080516101008101825282548152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460ff1660e08201526000906112409082611337565b5090506000811161128d5760405162461bcd60e51b81526020600482015260176024820152764e6f20616c6c6f636174696f6e20617661696c61626c6560481b60448201526064016106a7565b600061129986836113bd565b90506000806112a783611b87565b915091506112b788838989611795565b5060006112c261195d565b600580548701815560068801805488900390556004880180548301905587018054840190554260038801556040516001600160a01b038b1681529091507f7721850e658dea53d926df81ff64a0583878d89df90b0e81cfaff1f7076d75059060200160405180910390a1505050505050505050565b60008060008460000151116113825760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a5cc8191a5cd8589b1959607a1b60448201526064016106a7565b82846020015111159050806113ae57835160c0850151116113a7578360c001516113b4565b83516113b4565b83602001515b91509250929050565b600354600090612710600160a01b90910461ffff168302046113e96001600160a01b0385163383611bfa565b90910392915050565b600073fcd7ccee4071aa4ecfac1683b7cc0afecaf42a35196001600160a01b0386160161142c5761142585858585611c5e565b9050611514565b6001600160a01b038516739f278dc799bbc61ecb8e5fb8035cbfa29803623b148061147357506001600160a01b03851673cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f145b8061149a57506001600160a01b03851673a99afcc6aa4530d01dfff8e55ec66e4c424c048c145b156114c057611425857396a5399d07896f757bd4c6ef56461f58db951862868686611d5b565b73bfde5ac4f5adb419a931a5bf64b0f3bb5a623d05196001600160a01b03861601611505576114258572f116ac0c304c570daaa68fa6c30a86a04b5c5f868686611d5b565b61151185858585611eab565b90505b949350505050565b6003546064600a83028190049160048402829004600685029290920480850383900384900392909161155b906001600160a01b03888116911684611bfa565b600254611575906001600160a01b03888116911683611bfa565b50509250929050565b6001600160a01b038216732614f29c39de46468a921fd0b41fdd99a01f2edf14806115c557506001600160a01b03821673e2cfd7a01ec63875cd9da6c7c1b7025166c2fa2f145b806115ec57506001600160a01b03821673cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f145b15611683576116056001600160a01b0383163083611fb3565b60035460405163067e7faf60e31b81523060048201526024810183905260006044820152600860648201526001600160a01b039182166084820152908316906333f3fd789060a401600060405180830381600087803b15801561166757600080fd5b505af115801561167b573d6000803e3d6000fd5b505050505050565b7396a5399d07896f757bd4c6ef56461f58db951861196001600160a01b03831601611706576116d06001600160a01b038316731d59429571d8fde785f45bf593e94f2da6072edb83611bfa565b6001600160a01b0382166000908152600b6020526040812060050180548392906116fb9084906124f2565b909155506117919050565b604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506001600160a01b0382166000908152600b60205260408120600501805483929061178b9084906124f2565b90915550505b5050565b60008083116117e25760405162461bcd60e51b81526020600482015260196024820152781b5a5b905b5bdd5b9d13dd5d081b9bdd081c1c9bdd9a591959603a1b60448201526064016106a7565b61180a6001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d86611fb3565b604080516002808252606082018352600092602083019080368337019050509050858160008151811061183f5761183f612533565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061189357611893612533565b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b8152600090737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed1739906118ed9089908990879030908b90600401612598565b6000604051808303816000875af115801561190c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611934919081019061260b565b90508060018151811061194957611949612533565b602002602001015192505050949350505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000009082906001600160a01b038316906370a0823190602401602060405180830381865afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec91906124c3565b604051630852cd8d60e31b8152600481018290529091506001600160a01b038316906342966c6890602401600060405180830381600087803b158015611a3157600080fd5b505af1158015611a45573d6000803e3d6000fd5b505050508060066000828254611a5b91906124f2565b90915550909392505050565b600180546001600160a01b0319169055610d3f8161203d565b604080516101008101825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280825273f19308f923582a6f7c465e5ce7a9dc1bec6665b160208301526127109282019290925230606082015242608082015260a08101839052600060c0820181905260e0820181905291611b0a9073e592427a0aece92de3edee1f18e0157c0586156485611fb3565b60405163414bf38960e01b815260009073e592427a0aece92de3edee1f18e0157c058615649063414bf38990611b449085906004016126c9565b6020604051808303816000875af1158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151491906124c3565b6003546064600a8302819004600484028290048101600685029290920480850383900393919273f19308f923582a6f7c465e5ce7a9dc1bec6665b192611bd89084906001600160a01b031684611bfa565b600254611bf2906001600160a01b03858116911683611bfa565b505050915091565b6040516001600160a01b03838116602483015260448201839052611c5991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061208d565b505050565b6000808311611cab5760405162461bcd60e51b81526020600482015260196024820152781b5a5b905b5bdd5b9d13dd5d081b9bdd081c1c9bdd9a591959603a1b60448201526064016106a7565b611cde73f19308f923582a6f7c465e5ce7a9dc1bec6665b1737a250d5630b4cf539739df2c5dacb4c659f2488d86611fb3565b60408051600280825260608201835260009260208301908036833701905050905073f19308f923582a6f7c465e5ce7a9dc1bec6665b181600081518110611d2757611d27612533565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061189357611893612533565b60405173f19308f923582a6f7c465e5ce7a9dc1bec6665b160601b602082015261027160ec1b60348201819052606086811b6bffffffffffffffffffffffff199081166037850152604b84019290925287901b16604e820152600090819060620160408051601f1981840301815260a08301825280835230602084015290820185905260608201879052608082018690529150611e2173f19308f923582a6f7c465e5ce7a9dc1bec6665b173e592427a0aece92de3edee1f18e0157c0586156488611fb3565b60405163c04b8d5960e01b815260009073e592427a0aece92de3edee1f18e0157c058615649063c04b8d5990611e5b908590600401612756565b6020604051808303816000875af1158015611e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9e91906124c3565b9998505050505050505050565b604080516101008101825273f19308f923582a6f7c465e5ce7a9dc1bec6665b18082526001600160a01b0387166020830152612710928201929092523060608201526080810183905260a0810185905260c08101849052600060e0820181905291611f2b9073e592427a0aece92de3edee1f18e0157c0586156487611fb3565b60405163414bf38960e01b815260009073e592427a0aece92de3edee1f18e0157c058615649063414bf38990611f659085906004016126c9565b6020604051808303816000875af1158015611f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa891906124c3565b979650505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612003573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202791906124c3565b9050610b5b848461203885856124f2565b6120f0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006120a26001600160a01b03841683612180565b905080516000141580156120c75750808060200190518101906120c591906127c5565b155b15611c5957604051635274afe760e01b81526001600160a01b03841660048201526024016106a7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526121418482612195565b610b5b576040516001600160a01b0384811660248301526000604483015261217691869182169063095ea7b390606401611c27565b610b5b848261208d565b606061218e8383600061223d565b9392505050565b6000806000846001600160a01b0316846040516121b291906127e7565b6000604051808303816000865af19150503d80600081146121ef576040519150601f19603f3d011682016040523d82523d6000602084013e6121f4565b606091505b509150915081801561221e57508051158061221e57508080602001905181019061221e91906127c5565b801561223457506000856001600160a01b03163b115b95945050505050565b6060814710156122625760405163cd78605960e01b81523060048201526024016106a7565b600080856001600160a01b0316848660405161227e91906127e7565b60006040518083038185875af1925050503d80600081146122bb576040519150601f19603f3d011682016040523d82523d6000602084013e6122c0565b606091505b50915091506122d08683836122da565b9695505050505050565b6060826122ef576122ea82612336565b61218e565b815115801561230657506001600160a01b0384163b155b1561232f57604051639996b31560e01b81526001600160a01b03851660048201526024016106a7565b508061218e565b8051156123465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b038116811461237657600080fd5b919050565b6000806040838503121561238e57600080fd5b6123978361235f565b946020939093013593505050565b6000602082840312156123b757600080fd5b81356001600160e01b03198116811461218e57600080fd5b6000602082840312156123e157600080fd5b61218e8261235f565b6000806000606084860312156123ff57600080fd5b6124088461235f565b95602085013595506040909401359392505050565b6000806000806080858703121561243357600080fd5b61243c8561235f565b966020860135965060408601359560600135945092505050565b60006020828403121561246857600080fd5b5035919050565b60006020828403121561248157600080fd5b813561ffff8116811461218e57600080fd5b6020808252601690820152752737ba1030b71032b1b7b9bcb9ba32b6903a37b5b2b760511b604082015260600190565b6000602082840312156124d557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106e8576106e86124dc565b602080825260149082015273436f6f6c646f776e20696e2070726f677265737360601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176106e8576106e86124dc565b60008261257d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b818110156125ea5784516001600160a01b0316835293830193918301916001016125c5565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561261e57600080fd5b825167ffffffffffffffff8082111561263657600080fd5b818501915085601f83011261264a57600080fd5b81518181111561265c5761265c612582565b8060051b604051601f19603f8301168101818110858211171561268157612681612582565b60405291825284820192508381018501918883111561269f57600080fd5b938501935b828510156126bd578451845293850193928501926126a4565b98975050505050505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b60005b8381101561274d578181015183820152602001612735565b50506000910152565b602081526000825160a0602084015280518060c085015261277e8160e0860160208501612732565b60018060a01b0360208601511660408501526040850151606085015260608501516080850152608085015160a085015260e0601f19601f8301168501019250505092915050565b6000602082840312156127d757600080fd5b8151801515811461218e57600080fd5b600082516127f9818460208701612732565b919091019291505056fea2646970667358221220a68541917a7aa0260a282d13441438c5d075c0004171276e368799e231604e5f64736f6c63430008180033496e636f7272656374206e756d626572206f6620746f6b656e73000000000000000000000000000000000000e9a53c43a0b58706e67341c4055de861e29ee943000000000000000000000000cb9ecf72ea9dbc0a5bbc1061335f7ec12a33416100000000000000000000000047e126330f9ef54fc9ce64a672166c974a17abde00000000000000000000000015e5b9b9adf208cc7ca3ae1e6a49506eb5f397dd0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000f19308f923582a6f7c465e5ce7a9dc1bec6665b1000000000000000000000000e2cfd7a01ec63875cd9da6c7c1b7025166c2fa2f0000000000000000000000002614f29c39de46468a921fd0b41fdd99a01f2edf00000000000000000000000096a5399d07896f757bd4c6ef56461f58db9518620000000000000000000000009f278dc799bbc61ecb8e5fb8035cbfa29803623b000000000000000000000000cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f000000000000000000000000a99afcc6aa4530d01dfff8e55ec66e4c424c048c000000000000000000000000fcd7ccee4071aa4ecfac1683b7cc0afecaf42a3600000000000000000000000000f116ac0c304c570daaa68fa6c30a86a04b5c5f000000000000000000000000bfde5ac4f5adb419a931a5bf64b0f3bb5a623d0600000000000000000000000066b5228cfd34d9f4d9f03188d67816286c7c0b74000000000000000000000000d60abfb751db36514a592963fd71dd50c6cf9ba9000000000000000000000000db04fb08378129621634c151e9b61fef569479200000000000000000000000006532b3f1e4dbff542fbd6befe5ed7041c10b385a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000295be96e64066972000000000000000000000000000000000000000000000000295be96e64066972000000000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000003e09de2596099e2b000000000000000000000000000000000000000000000000295be96e64066972000000000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000000f8277896582678ac00000000000000000000000000000000000000000000000295be96e6406697200000000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000019d971e4fe8401e74000000000000000000000000000000000000000000000002e87669c308736a04000000000000000000000000000000000000000000000000f8277896582678ac0000000000000000000000000000000000000000000000019d971e4fe8401e740000000000000000000000000000000000000000000000019d971e4fe8401e74000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000295be96e6406697200000000000000000000000000000000000000000000000018d0bf423c03d8de0000000000000000000000000000000000000000000000004d8c55aefb8c05b5c000000000000000000000000000000000000000000000000c685fa11e01ec6f00000000000000000000000000000000000000000000000006342fd08f00f63780000000000000000000000000000000000000000000000006342fd08f00f63780000000000000000000000000000000000000000000000017c80c9f7983afd4c00000000000000000000000000000000000000000000000000005c283d410394100000000000000000000000000000000000000000000006765c793fa10079d0000000000000000000000000000000000000000000000007c13bc4b2c133c5600000000000000000000000000000000000000000000000000013e7c00dcea7bec000000000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000250ec4ddca432f600000000000000000000000000000000000000000000000000000821ab0d4414980000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e10

Deployed Bytecode

0x6080604052600436106101db5760003560e01c8063715018a611610102578063d531054e11610095578063f0f4426011610064578063f0f44260146105ee578063f2fde38b1461060e578063f51048a91461062e578063ffba83741461064357600080fd5b8063d531054e146104dc578063dbdc4fee14610511578063e30c397814610531578063e48603391461054f57600080fd5b8063867cd185116100d1578063867cd1851461044f5780638da5cb5b146104885780638ea5220f146104a6578063d1dd1381146104c657600080fd5b8063715018a6146103f0578063726377911461040557806379ba5097146104255780637d7c2a1c1461043a57600080fd5b806323e25e7a1161017a5780634479ef84116101495780634479ef841461037b57806345a1b92c146103905780635b7dcaed146103b057806361d027b3146103d057600080fd5b806323e25e7a146102d95780632a8985d6146102f95780632e7ab3121461030f5780633c83980f1461035b57600080fd5b80630f6a44fa116101b65780630f6a44fa14610273578063106b9ca11461029757806316d1d916146102ad5780631e546ccd146102c357600080fd5b80628ca8a9146101e757806301ffc9a7146102095780630ec787501461023e57600080fd5b366101e257005b600080fd5b3480156101f357600080fd5b5061020761020236600461237b565b610663565b005b34801561021557600080fd5b506102296102243660046123a5565b6106b7565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025e6102593660046123cf565b6106ee565b60408051928352901515602083015201610235565b34801561027f57600080fd5b5061028960055481565b604051908152602001610235565b3480156102a357600080fd5b5061028960095481565b3480156102b957600080fd5b5061028960085481565b3480156102cf57600080fd5b5061028960075481565b3480156102e557600080fd5b506102076102f43660046123ea565b61081f565b34801561030557600080fd5b5061028960045481565b34801561031b57600080fd5b506103437f000000000000000000000000e9a53c43a0b58706e67341c4055de861e29ee94381565b6040516001600160a01b039091168152602001610235565b34801561036757600080fd5b5061020761037636600461241d565b61086f565b34801561038757600080fd5b50610229610b61565b34801561039c57600080fd5b506102076103ab36600461237b565b610c18565b3480156103bc57600080fd5b506102076103cb366004612456565b610c5e565b3480156103dc57600080fd5b50600254610343906001600160a01b031681565b3480156103fc57600080fd5b50610207610c6b565b34801561041157600080fd5b5061020761042036600461246f565b610c7f565b34801561043157600080fd5b50610207610cfe565b34801561044657600080fd5b50610207610d42565b34801561045b57600080fd5b5061028961046a366004612456565b60035460009061271090600160a01b900461ffff1683020492915050565b34801561049457600080fd5b506000546001600160a01b0316610343565b3480156104b257600080fd5b50600354610343906001600160a01b031681565b3480156104d257600080fd5b5061028960065481565b3480156104e857600080fd5b506003546104fe90600160a01b900461ffff1681565b60405161ffff9091168152602001610235565b34801561051d57600080fd5b5061034361052c366004612456565b610f99565b34801561053d57600080fd5b506001546001600160a01b0316610343565b34801561055b57600080fd5b506105b061056a3660046123cf565b600b602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260ff1660e082015261010001610235565b3480156105fa57600080fd5b506102076106093660046123cf565b610fc3565b34801561061a57600080fd5b506102076106293660046123cf565b611043565b34801561063a57600080fd5b506102896110b4565b34801561064f57600080fd5b5061020761065e366004612456565b611155565b61066b611162565b6001600160a01b0382166000908152600b60205260409020600781015460ff166106b05760405162461bcd60e51b81526004016106a790612493565b60405180910390fd5b6002015550565b60006001600160e01b031982166301ffc9a760e01b14806106e857506001600160e01b031982166311686e4b60e21b145b92915050565b6001600160a01b0381166000908152600b60205260408120805482919061074b5760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a5cc8191a5cd8589b1959607a1b60448201526064016106a7565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015610792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b691906124c3565b90506001600160a01b03851673f19308f923582a6f7c465e5ce7a9dc1bec6665b1146107e95780826001015411156107ec565b60005b925082610810578154600683015411610809578160060154610816565b8154610816565b81600101545b93505050915091565b610827611162565b6001600160a01b0383166000908152600b60205260409020600781015460ff166108635760405162461bcd60e51b81526004016106a790612493565b91825560019091015550565b333b15801561087d57503332145b6108b85760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b60448201526064016106a7565b73f19308f923582a6f7c465e5ce7a9dc1bec6665b0196001600160a01b038516016108ed576108e884838361118f565b610b5b565b6001600160a01b0384166000908152600b602052604090206002810154600382015461091991906124f2565b42116109375760405162461bcd60e51b81526004016106a790612505565b6040516370a0823160e01b815230600482015285906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a491906124c3565b604080516101008101825285548152600186015460208201526002860154918101919091526003850154606082015260048501546080820152600585015460a0820152600685015460c0820152600785015460ff1660e08201529091506000908190610a109084611337565b9150915060008211610a5e5760405162461bcd60e51b81526020600482015260176024820152764e6f20616c6c6f636174696f6e20617661696c61626c6560481b60448201526064016106a7565b60008115610a7757610a7085846113bd565b9050610ab8565b610a838a848b8a6113f2565b610a8d90856124f2565b9350600086600101548511610aa25784610aa8565b86600101545b9050610ab486826113bd565b9150505b600080610ac5878461151c565b91509150610ad38c8361157e565b610adf8c828c8c611795565b506000610aea61195d565b905084610b0557600580548701905560068901805487900390555b600489018054820190554260038a01556040516001600160a01b038e1681527f7721850e658dea53d926df81ff64a0583878d89df90b0e81cfaff1f7076d75059060200160405180910390a15050505050505050505b50505050565b6000600854600954610b7391906124f2565b4211610b7f5750600090565b6000471180610c0157506040516370a0823160e01b815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff91906124c3565b115b80610c1357506000610c116110b4565b115b905090565b336000908152600b602052604081206007810154909160ff9091169003610c515760405162461bcd60e51b81526004016106a790612493565b6005018054909101905550565b610c66611162565b600855565b610c73611162565b610c7d6000611a67565b565b610c87611162565b6103e98161ffff1610610cdc5760405162461bcd60e51b815260206004820152601f60248201527f496e63656e746976652073686f756c64206e6f7420657863656564203130250060448201526064016106a7565b6003805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60015433906001600160a01b03168114610d365760405163118cdaa760e01b81526001600160a01b03821660048201526024016106a7565b610d3f81611a67565b50565b333b158015610d5057503332145b610d8b5760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b60448201526064016106a7565b600854600954610d9b91906124f2565b4211610db95760405162461bcd60e51b81526004016106a790612505565b478015610e295773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b50505050505b6040516370a0823160e01b815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f91906124c3565b905060006007548211610eb25781610eb6565b6007545b90508015610ec957610ec781611a80565b505b6000610ed36110b4565b90508015610f6a574260095560005b600a54811015610f68576000600b6000600a8481548110610f0557610f05612533565b60009182526020808320909101546001600160a01b0316835282019290925260400181206007810154909250606490610f419060ff1686612549565b610f4b9190612560565b600690920180548301905550600480549091019055600101610ee2565b505b6040517ff57243a1fddfdc9fa2c7de26cc3503b1b94cfd4368d2b82d0970bfbb2fbce3a490600090a150505050565b600a8181548110610fa957600080fd5b6000918252602090912001546001600160a01b0316905081565b610fcb611162565b6001600160a01b0381166110215760405162461bcd60e51b815260206004820152601d60248201527f54726561737572792061646472657373206e6f742070726f766964656400000060448201526064016106a7565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61104b611162565b600180546001600160a01b0383166001600160a01b0319909116811790915561107c6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6040516370a0823160e01b8152306004820152600090819073f19308f923582a6f7c465e5ce7a9dc1bec6665b1906370a0823190602401602060405180830381865afa158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c91906124c3565b90506004546005548201039150670de0b6b3a764000082101561115157600091505090565b5090565b61115d611162565b600755565b6000546001600160a01b03163314610c7d5760405163118cdaa760e01b81523360048201526024016106a7565b6001600160a01b0383166000908152600b60205260409020600281015460038201546111bb91906124f2565b42116111d95760405162461bcd60e51b81526004016106a790612505565b604080516101008101825282548152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460ff1660e08201526000906112409082611337565b5090506000811161128d5760405162461bcd60e51b81526020600482015260176024820152764e6f20616c6c6f636174696f6e20617661696c61626c6560481b60448201526064016106a7565b600061129986836113bd565b90506000806112a783611b87565b915091506112b788838989611795565b5060006112c261195d565b600580548701815560068801805488900390556004880180548301905587018054840190554260038801556040516001600160a01b038b1681529091507f7721850e658dea53d926df81ff64a0583878d89df90b0e81cfaff1f7076d75059060200160405180910390a1505050505050505050565b60008060008460000151116113825760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881a5cc8191a5cd8589b1959607a1b60448201526064016106a7565b82846020015111159050806113ae57835160c0850151116113a7578360c001516113b4565b83516113b4565b83602001515b91509250929050565b600354600090612710600160a01b90910461ffff168302046113e96001600160a01b0385163383611bfa565b90910392915050565b600073fcd7ccee4071aa4ecfac1683b7cc0afecaf42a35196001600160a01b0386160161142c5761142585858585611c5e565b9050611514565b6001600160a01b038516739f278dc799bbc61ecb8e5fb8035cbfa29803623b148061147357506001600160a01b03851673cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f145b8061149a57506001600160a01b03851673a99afcc6aa4530d01dfff8e55ec66e4c424c048c145b156114c057611425857396a5399d07896f757bd4c6ef56461f58db951862868686611d5b565b73bfde5ac4f5adb419a931a5bf64b0f3bb5a623d05196001600160a01b03861601611505576114258572f116ac0c304c570daaa68fa6c30a86a04b5c5f868686611d5b565b61151185858585611eab565b90505b949350505050565b6003546064600a83028190049160048402829004600685029290920480850383900384900392909161155b906001600160a01b03888116911684611bfa565b600254611575906001600160a01b03888116911683611bfa565b50509250929050565b6001600160a01b038216732614f29c39de46468a921fd0b41fdd99a01f2edf14806115c557506001600160a01b03821673e2cfd7a01ec63875cd9da6c7c1b7025166c2fa2f145b806115ec57506001600160a01b03821673cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f145b15611683576116056001600160a01b0383163083611fb3565b60035460405163067e7faf60e31b81523060048201526024810183905260006044820152600860648201526001600160a01b039182166084820152908316906333f3fd789060a401600060405180830381600087803b15801561166757600080fd5b505af115801561167b573d6000803e3d6000fd5b505050505050565b7396a5399d07896f757bd4c6ef56461f58db951861196001600160a01b03831601611706576116d06001600160a01b038316731d59429571d8fde785f45bf593e94f2da6072edb83611bfa565b6001600160a01b0382166000908152600b6020526040812060050180548392906116fb9084906124f2565b909155506117919050565b604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506001600160a01b0382166000908152600b60205260408120600501805483929061178b9084906124f2565b90915550505b5050565b60008083116117e25760405162461bcd60e51b81526020600482015260196024820152781b5a5b905b5bdd5b9d13dd5d081b9bdd081c1c9bdd9a591959603a1b60448201526064016106a7565b61180a6001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d86611fb3565b604080516002808252606082018352600092602083019080368337019050509050858160008151811061183f5761183f612533565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000e9a53c43a0b58706e67341c4055de861e29ee9438160018151811061189357611893612533565b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b8152600090737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed1739906118ed9089908990879030908b90600401612598565b6000604051808303816000875af115801561190c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611934919081019061260b565b90508060018151811061194957611949612533565b602002602001015192505050949350505050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000e9a53c43a0b58706e67341c4055de861e29ee9439082906001600160a01b038316906370a0823190602401602060405180830381865afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec91906124c3565b604051630852cd8d60e31b8152600481018290529091506001600160a01b038316906342966c6890602401600060405180830381600087803b158015611a3157600080fd5b505af1158015611a45573d6000803e3d6000fd5b505050508060066000828254611a5b91906124f2565b90915550909392505050565b600180546001600160a01b0319169055610d3f8161203d565b604080516101008101825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280825273f19308f923582a6f7c465e5ce7a9dc1bec6665b160208301526127109282019290925230606082015242608082015260a08101839052600060c0820181905260e0820181905291611b0a9073e592427a0aece92de3edee1f18e0157c0586156485611fb3565b60405163414bf38960e01b815260009073e592427a0aece92de3edee1f18e0157c058615649063414bf38990611b449085906004016126c9565b6020604051808303816000875af1158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151491906124c3565b6003546064600a8302819004600484028290048101600685029290920480850383900393919273f19308f923582a6f7c465e5ce7a9dc1bec6665b192611bd89084906001600160a01b031684611bfa565b600254611bf2906001600160a01b03858116911683611bfa565b505050915091565b6040516001600160a01b03838116602483015260448201839052611c5991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061208d565b505050565b6000808311611cab5760405162461bcd60e51b81526020600482015260196024820152781b5a5b905b5bdd5b9d13dd5d081b9bdd081c1c9bdd9a591959603a1b60448201526064016106a7565b611cde73f19308f923582a6f7c465e5ce7a9dc1bec6665b1737a250d5630b4cf539739df2c5dacb4c659f2488d86611fb3565b60408051600280825260608201835260009260208301908036833701905050905073f19308f923582a6f7c465e5ce7a9dc1bec6665b181600081518110611d2757611d27612533565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061189357611893612533565b60405173f19308f923582a6f7c465e5ce7a9dc1bec6665b160601b602082015261027160ec1b60348201819052606086811b6bffffffffffffffffffffffff199081166037850152604b84019290925287901b16604e820152600090819060620160408051601f1981840301815260a08301825280835230602084015290820185905260608201879052608082018690529150611e2173f19308f923582a6f7c465e5ce7a9dc1bec6665b173e592427a0aece92de3edee1f18e0157c0586156488611fb3565b60405163c04b8d5960e01b815260009073e592427a0aece92de3edee1f18e0157c058615649063c04b8d5990611e5b908590600401612756565b6020604051808303816000875af1158015611e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9e91906124c3565b9998505050505050505050565b604080516101008101825273f19308f923582a6f7c465e5ce7a9dc1bec6665b18082526001600160a01b0387166020830152612710928201929092523060608201526080810183905260a0810185905260c08101849052600060e0820181905291611f2b9073e592427a0aece92de3edee1f18e0157c0586156487611fb3565b60405163414bf38960e01b815260009073e592427a0aece92de3edee1f18e0157c058615649063414bf38990611f659085906004016126c9565b6020604051808303816000875af1158015611f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa891906124c3565b979650505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612003573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202791906124c3565b9050610b5b848461203885856124f2565b6120f0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006120a26001600160a01b03841683612180565b905080516000141580156120c75750808060200190518101906120c591906127c5565b155b15611c5957604051635274afe760e01b81526001600160a01b03841660048201526024016106a7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526121418482612195565b610b5b576040516001600160a01b0384811660248301526000604483015261217691869182169063095ea7b390606401611c27565b610b5b848261208d565b606061218e8383600061223d565b9392505050565b6000806000846001600160a01b0316846040516121b291906127e7565b6000604051808303816000865af19150503d80600081146121ef576040519150601f19603f3d011682016040523d82523d6000602084013e6121f4565b606091505b509150915081801561221e57508051158061221e57508080602001905181019061221e91906127c5565b801561223457506000856001600160a01b03163b115b95945050505050565b6060814710156122625760405163cd78605960e01b81523060048201526024016106a7565b600080856001600160a01b0316848660405161227e91906127e7565b60006040518083038185875af1925050503d80600081146122bb576040519150601f19603f3d011682016040523d82523d6000602084013e6122c0565b606091505b50915091506122d08683836122da565b9695505050505050565b6060826122ef576122ea82612336565b61218e565b815115801561230657506001600160a01b0384163b155b1561232f57604051639996b31560e01b81526001600160a01b03851660048201526024016106a7565b508061218e565b8051156123465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b038116811461237657600080fd5b919050565b6000806040838503121561238e57600080fd5b6123978361235f565b946020939093013593505050565b6000602082840312156123b757600080fd5b81356001600160e01b03198116811461218e57600080fd5b6000602082840312156123e157600080fd5b61218e8261235f565b6000806000606084860312156123ff57600080fd5b6124088461235f565b95602085013595506040909401359392505050565b6000806000806080858703121561243357600080fd5b61243c8561235f565b966020860135965060408601359560600135945092505050565b60006020828403121561246857600080fd5b5035919050565b60006020828403121561248157600080fd5b813561ffff8116811461218e57600080fd5b6020808252601690820152752737ba1030b71032b1b7b9bcb9ba32b6903a37b5b2b760511b604082015260600190565b6000602082840312156124d557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106e8576106e86124dc565b602080825260149082015273436f6f6c646f776e20696e2070726f677265737360601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176106e8576106e86124dc565b60008261257d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b818110156125ea5784516001600160a01b0316835293830193918301916001016125c5565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561261e57600080fd5b825167ffffffffffffffff8082111561263657600080fd5b818501915085601f83011261264a57600080fd5b81518181111561265c5761265c612582565b8060051b604051601f19603f8301168101818110858211171561268157612681612582565b60405291825284820192508381018501918883111561269f57600080fd5b938501935b828510156126bd578451845293850193928501926126a4565b98975050505050505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b60005b8381101561274d578181015183820152602001612735565b50506000910152565b602081526000825160a0602084015280518060c085015261277e8160e0860160208501612732565b60018060a01b0360208601511660408501526040850151606085015260608501516080850152608085015160a085015260e0601f19601f8301168501019250505092915050565b6000602082840312156127d757600080fd5b8151801515811461218e57600080fd5b600082516127f9818460208701612732565b919091019291505056fea2646970667358221220a68541917a7aa0260a282d13441438c5d075c0004171276e368799e231604e5f64736f6c63430008180033

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

000000000000000000000000e9a53c43a0b58706e67341c4055de861e29ee943000000000000000000000000cb9ecf72ea9dbc0a5bbc1061335f7ec12a33416100000000000000000000000047e126330f9ef54fc9ce64a672166c974a17abde00000000000000000000000015e5b9b9adf208cc7ca3ae1e6a49506eb5f397dd0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000f19308f923582a6f7c465e5ce7a9dc1bec6665b1000000000000000000000000e2cfd7a01ec63875cd9da6c7c1b7025166c2fa2f0000000000000000000000002614f29c39de46468a921fd0b41fdd99a01f2edf00000000000000000000000096a5399d07896f757bd4c6ef56461f58db9518620000000000000000000000009f278dc799bbc61ecb8e5fb8035cbfa29803623b000000000000000000000000cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f000000000000000000000000a99afcc6aa4530d01dfff8e55ec66e4c424c048c000000000000000000000000fcd7ccee4071aa4ecfac1683b7cc0afecaf42a3600000000000000000000000000f116ac0c304c570daaa68fa6c30a86a04b5c5f000000000000000000000000bfde5ac4f5adb419a931a5bf64b0f3bb5a623d0600000000000000000000000066b5228cfd34d9f4d9f03188d67816286c7c0b74000000000000000000000000d60abfb751db36514a592963fd71dd50c6cf9ba9000000000000000000000000db04fb08378129621634c151e9b61fef569479200000000000000000000000006532b3f1e4dbff542fbd6befe5ed7041c10b385a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000295be96e64066972000000000000000000000000000000000000000000000000295be96e64066972000000000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000003e09de2596099e2b000000000000000000000000000000000000000000000000295be96e64066972000000000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000000f8277896582678ac00000000000000000000000000000000000000000000000295be96e6406697200000000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000019d971e4fe8401e74000000000000000000000000000000000000000000000002e87669c308736a04000000000000000000000000000000000000000000000000f8277896582678ac0000000000000000000000000000000000000000000000019d971e4fe8401e740000000000000000000000000000000000000000000000019d971e4fe8401e74000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000295be96e6406697200000000000000000000000000000000000000000000000018d0bf423c03d8de0000000000000000000000000000000000000000000000004d8c55aefb8c05b5c000000000000000000000000000000000000000000000000c685fa11e01ec6f00000000000000000000000000000000000000000000000006342fd08f00f63780000000000000000000000000000000000000000000000006342fd08f00f63780000000000000000000000000000000000000000000000017c80c9f7983afd4c00000000000000000000000000000000000000000000000000005c283d410394100000000000000000000000000000000000000000000006765c793fa10079d0000000000000000000000000000000000000000000000007c13bc4b2c133c5600000000000000000000000000000000000000000000000000013e7c00dcea7bec000000000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000250ec4ddca432f600000000000000000000000000000000000000000000000000000821ab0d4414980000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e10

-----Decoded View---------------
Arg [0] : _E280 (address): 0xe9A53C43a0B58706e67341C4055de861e29Ee943
Arg [1] : _owner (address): 0xcb9eCf72Ea9DbC0a5bBc1061335F7ec12A334161
Arg [2] : _devWallet (address): 0x47E126330f9eF54FC9Ce64A672166C974A17ABDE
Arg [3] : _treasury (address): 0x15E5B9B9Adf208cC7CA3aE1e6a49506eB5f397Dd
Arg [4] : _ecosystemTokens (address[]): 0xF19308F923582A6f7c465e5CE7a9Dc1BEC6665B1,0xE2cfD7a01ec63875cd9Da6C7c1B7025166c2fA2F,0x2614f29C39dE46468A921Fd0b41fdd99A01f2EDf,0x96a5399D07896f757Bd4c6eF56461F58DB951862,0x9f278Dc799BbC61ecB8e5Fb8035cbfA29803623B,0xCC7ed2ab6c3396DdBc4316D2d7C1b59ff9d2091F,0xa99AFcC6Aa4530d01DFFF8E55ec66E4C424c048c,0xfcd7cceE4071aA4ecFAC1683b7CC0aFeCAF42A36,0x00F116ac0c304C570daAA68FA6c30a86A04B5C5F,0xBFDE5ac4f5Adb419A931a5bF64B0f3BB5a623d06,0x66b5228CfD34d9f4d9f03188d67816286C7c0b74,0xD60ABFB751dB36514a592963fD71DD50c6CF9Ba9,0xDB04fb08378129621634C151E9b61FEf56947920,0x6532B3F1e4DBff542fbD6befE5Ed7041c10B385a
Arg [5] : _percentages (uint8[]): 8,8,8,12,8,8,3,8,10,5,9,3,5,5
Arg [6] : _capsPerSwapTitanX (uint256[]): 800000000000000000000000000,800000000000000000000000000,800000000000000000000000000,1200000000000000000000000000,800000000000000000000000000,800000000000000000000000000,300000000000000000000000000,800000000000000000000000000,1000000000000000000000000000,500000000000000000000000000,900000000000000000000000000,300000000000000000000000000,500000000000000000000000000,500000000000000000000000000
Arg [7] : _capsPerSwapEco (uint256[]): 800000000000000000000000000,480000000000000000000000000,1500000000000000000000000000,240000000000000000000000000,120000000000000000000000000,120000000000000000000000000,460000000000000000000000000,1700000000000000000000,2000000000000000000000000000,2400000000000000000000000000,94000000000000000000000,1600000000000000000000000,2800000000000000000000000,150000000000000000000
Arg [8] : _intervals (uint256[]): 3600,3600,3600,3600,3600,3600,3600,3600,3600,3600,3600,3600,3600,3600

-----Encoded View---------------
84 Constructor Arguments found :
Arg [0] : 000000000000000000000000e9a53c43a0b58706e67341c4055de861e29ee943
Arg [1] : 000000000000000000000000cb9ecf72ea9dbc0a5bbc1061335f7ec12a334161
Arg [2] : 00000000000000000000000047e126330f9ef54fc9ce64a672166c974a17abde
Arg [3] : 00000000000000000000000015e5b9b9adf208cc7ca3ae1e6a49506eb5f397dd
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [6] : 00000000000000000000000000000000000000000000000000000000000004e0
Arg [7] : 00000000000000000000000000000000000000000000000000000000000006c0
Arg [8] : 00000000000000000000000000000000000000000000000000000000000008a0
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [10] : 000000000000000000000000f19308f923582a6f7c465e5ce7a9dc1bec6665b1
Arg [11] : 000000000000000000000000e2cfd7a01ec63875cd9da6c7c1b7025166c2fa2f
Arg [12] : 0000000000000000000000002614f29c39de46468a921fd0b41fdd99a01f2edf
Arg [13] : 00000000000000000000000096a5399d07896f757bd4c6ef56461f58db951862
Arg [14] : 0000000000000000000000009f278dc799bbc61ecb8e5fb8035cbfa29803623b
Arg [15] : 000000000000000000000000cc7ed2ab6c3396ddbc4316d2d7c1b59ff9d2091f
Arg [16] : 000000000000000000000000a99afcc6aa4530d01dfff8e55ec66e4c424c048c
Arg [17] : 000000000000000000000000fcd7ccee4071aa4ecfac1683b7cc0afecaf42a36
Arg [18] : 00000000000000000000000000f116ac0c304c570daaa68fa6c30a86a04b5c5f
Arg [19] : 000000000000000000000000bfde5ac4f5adb419a931a5bf64b0f3bb5a623d06
Arg [20] : 00000000000000000000000066b5228cfd34d9f4d9f03188d67816286c7c0b74
Arg [21] : 000000000000000000000000d60abfb751db36514a592963fd71dd50c6cf9ba9
Arg [22] : 000000000000000000000000db04fb08378129621634c151e9b61fef56947920
Arg [23] : 0000000000000000000000006532b3f1e4dbff542fbd6befe5ed7041c10b385a
Arg [24] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [28] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [33] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [39] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [40] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [41] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [42] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [43] : 000000000000000000000000000000000000000003e09de2596099e2b0000000
Arg [44] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [45] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [46] : 000000000000000000000000000000000000000000f8277896582678ac000000
Arg [47] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [48] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [49] : 0000000000000000000000000000000000000000019d971e4fe8401e74000000
Arg [50] : 000000000000000000000000000000000000000002e87669c308736a04000000
Arg [51] : 000000000000000000000000000000000000000000f8277896582678ac000000
Arg [52] : 0000000000000000000000000000000000000000019d971e4fe8401e74000000
Arg [53] : 0000000000000000000000000000000000000000019d971e4fe8401e74000000
Arg [54] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [55] : 00000000000000000000000000000000000000000295be96e640669720000000
Arg [56] : 0000000000000000000000000000000000000000018d0bf423c03d8de0000000
Arg [57] : 000000000000000000000000000000000000000004d8c55aefb8c05b5c000000
Arg [58] : 000000000000000000000000000000000000000000c685fa11e01ec6f0000000
Arg [59] : 0000000000000000000000000000000000000000006342fd08f00f6378000000
Arg [60] : 0000000000000000000000000000000000000000006342fd08f00f6378000000
Arg [61] : 0000000000000000000000000000000000000000017c80c9f7983afd4c000000
Arg [62] : 00000000000000000000000000000000000000000000005c283d410394100000
Arg [63] : 000000000000000000000000000000000000000006765c793fa10079d0000000
Arg [64] : 000000000000000000000000000000000000000007c13bc4b2c133c560000000
Arg [65] : 0000000000000000000000000000000000000000000013e7c00dcea7bec00000
Arg [66] : 0000000000000000000000000000000000000000000152d02c7e14af68000000
Arg [67] : 0000000000000000000000000000000000000000000250ec4ddca432f6000000
Arg [68] : 00000000000000000000000000000000000000000000000821ab0d4414980000
Arg [69] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [70] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [71] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [73] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [75] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [80] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [81] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000e10


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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