Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 25,161 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy And Burn | 21442033 | 3 hrs ago | IN | 0 ETH | 0.00393261 | ||||
Buy And Burn | 21442026 | 3 hrs ago | IN | 0 ETH | 0.00509628 | ||||
Buy And Burn | 21442015 | 3 hrs ago | IN | 0 ETH | 0.00310022 | ||||
Buy And Burn | 21441959 | 3 hrs ago | IN | 0 ETH | 0.00676424 | ||||
Buy And Burn | 21439636 | 11 hrs ago | IN | 0 ETH | 0.00397064 | ||||
Buy And Burn | 21439635 | 11 hrs ago | IN | 0 ETH | 0.00510546 | ||||
Buy And Burn | 21439622 | 11 hrs ago | IN | 0 ETH | 0.00590344 | ||||
Buy And Burn | 21439567 | 11 hrs ago | IN | 0 ETH | 0.00660428 | ||||
Buy And Burn | 21437245 | 19 hrs ago | IN | 0 ETH | 0.00425741 | ||||
Buy And Burn | 21437245 | 19 hrs ago | IN | 0 ETH | 0.00507294 | ||||
Buy And Burn | 21437169 | 19 hrs ago | IN | 0 ETH | 0.00696078 | ||||
Buy And Burn | 21435379 | 25 hrs ago | IN | 0 ETH | 0.00274312 | ||||
Buy And Burn | 21434854 | 27 hrs ago | IN | 0 ETH | 0.00387959 | ||||
Buy And Burn | 21434785 | 27 hrs ago | IN | 0 ETH | 0.00306827 | ||||
Buy And Burn | 21434785 | 27 hrs ago | IN | 0 ETH | 0.00393934 | ||||
Buy And Burn | 21432997 | 33 hrs ago | IN | 0 ETH | 0.00296076 | ||||
Buy And Burn | 21432471 | 35 hrs ago | IN | 0 ETH | 0.00540287 | ||||
Buy And Burn | 21432400 | 35 hrs ago | IN | 0 ETH | 0.00449472 | ||||
Buy And Burn | 21432400 | 35 hrs ago | IN | 0 ETH | 0.00650122 | ||||
Buy And Burn | 21429672 | 44 hrs ago | IN | 0 ETH | 0.00617937 | ||||
Buy And Burn | 21427447 | 2 days ago | IN | 0 ETH | 0.00320336 | ||||
Buy And Burn | 21427445 | 2 days ago | IN | 0 ETH | 0.00461758 | ||||
Buy And Burn | 21427336 | 2 days ago | IN | 0 ETH | 0.00439072 | ||||
Buy And Burn | 21427193 | 2 days ago | IN | 0 ETH | 0.00594674 | ||||
Buy And Burn | 21425056 | 2 days ago | IN | 0 ETH | 0.00402058 |
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
Contract Source Code (Solidity Standard Json-Input format)
// 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; } }
// 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); } }
// 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); } }
// 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";
// 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";
// 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); }
// 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); }
// 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; } }
// 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(); } } }
// 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; } }
// 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); }
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); }
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; }
// 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; }
// 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); }
// 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; }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; interface ITitanOnBurn { function onBurn(address user, uint256 amount) external; }
// 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; }
// 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; }
// 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;
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000001 | 138,397,870,159.634 | $80,968.43 |
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.