More Info
Private Name Tags
ContractCreator
Multichain Info
1 address found via
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Tup | 21882819 | 559 days ago | IN | 0 CELO | 0.02189429 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
30251703 | 74 days ago | 0.00371755 CELO | ||||
29502740 | 118 days ago | 0.00208031 CELO | ||||
29295048 | 130 days ago | 0.01075003 CELO | ||||
29295034 | 130 days ago | 0.00129577 CELO | ||||
29251253 | 132 days ago | 0.00008924 CELO | ||||
29099999 | 141 days ago | 0.418 CELO | ||||
29099994 | 141 days ago | 0.00000051 CELO | ||||
28982021 | 148 days ago | 0.01722833 CELO | ||||
28982014 | 148 days ago | 0.00099999 CELO | ||||
28982014 | 148 days ago | 0.00121966 CELO | ||||
28982014 | 148 days ago | 0.00499999 CELO | ||||
28982014 | 148 days ago | 0.00609378 CELO | ||||
28982014 | 148 days ago | 0.00999999 CELO | ||||
28982014 | 148 days ago | 0.0121763 CELO | ||||
28982014 | 148 days ago | 0.04999999 CELO | ||||
28982014 | 148 days ago | 0.0604345 CELO | ||||
28982014 | 148 days ago | 0.09999999 CELO | ||||
28982014 | 148 days ago | 0.11976969 CELO | ||||
28982014 | 148 days ago | 0.49999999 CELO | ||||
28982014 | 148 days ago | 0.5582313 CELO | ||||
28982014 | 148 days ago | 0.99999999 CELO | ||||
28982014 | 148 days ago | 1.02920473 CELO | ||||
28982014 | 148 days ago | 0.00099999 CELO | ||||
28982014 | 148 days ago | 0.00121966 CELO | ||||
28982014 | 148 days ago | 0.00499999 CELO |
Loading...
Loading
Contract Name:
HelperCelo
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 5000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./ITimeIsUp.sol"; import "./IHelperBase.sol"; import "./IUniswapV2Factory.sol"; import "./IUniswapV2Router02.sol"; import "./IUniswapV2Pair.sol"; import "./IWETH.sol"; contract HelperCelo is Ownable, IHelperBase { using Math for uint256; bool internal immutable hasAlternativeSwap; bool internal isInternal; bool internal isRunningArbitrage; bool internal swapSuccessful; enum Operation { ETH_TO_TUP_INTERNAL_TUP_TO_ETH_EXTERNAL, ETH_TO_TUP_EXTERNAL_TUP_TO_ETH_INTERNAL } Operation internal operation; IUniswapV2Router02 internal router; IUniswapV2Factory internal factory; ITimeIsUp internal tup; address internal constant CELO = 0x471EcE3750Da237f93B8E339c536989b8978a438; address internal _pairTupEth; uint256 internal constant FACTOR = 10 ** 18; uint256 internal constant ARBITRAGE_RATE = 500; uint256 internal constant SWAP_FEE = 100; uint256[22] internal rangesWETH = [ 50_000_000 ether, 10_000_000 ether, 5_000_000 ether, 1_000_000 ether, 500_000 ether, 100_000 ether, 50_000 ether, 10_000 ether, 5_000 ether, 1_000 ether, 500 ether, 100 ether, 50 ether, 10 ether, 5 ether, 1 ether, 0.5 ether, 0.1 ether, 0.05 ether, 0.01 ether, 0.005 ether, 0.001 ether ]; modifier fromTup() { require(msg.sender == address(tup), "Helper: only TUP token contract can call this function"); _; } modifier internalOnly() { require(isInternal, "Helper: sorry buddy but you do not have access to this function"); _; } modifier adjustInternalCondition() { isInternal = true; _; isInternal = false; } modifier runningArbitrage() { if (!isRunningArbitrage) { isRunningArbitrage = true; _; isRunningArbitrage = false; } } constructor( address _addressProvider, address _exchangeRouterAddress, address _tupTokenAddress, bool _hasAlternativeSwap, address _owner ) { router = IUniswapV2Router02(_exchangeRouterAddress); factory = IUniswapV2Factory(router.factory()); tup = ITimeIsUp(payable(_tupTokenAddress)); hasAlternativeSwap = _hasAlternativeSwap; if (_owner != msg.sender) transferOwnership(_owner); } function _calculateFee(uint256 amount) internal virtual returns (uint256) { return amount + amount.mulDiv(SWAP_FEE, 10_000); } function _startTraditionalSwap(address asset, uint256 amount) internal virtual returns (bool) { return false; } function _startAlternativeSwap(uint256 amountIn, uint256 amountOut) internal returns (bool) { address weth = CELO; swapSuccessful = false; IUniswapV2Pair pair = IUniswapV2Pair(_pairTupEth); if (operation == Operation.ETH_TO_TUP_EXTERNAL_TUP_TO_ETH_INTERNAL) { uint256 amount0Out = address(tup) == pair.token0() ? amountOut : 0; uint256 amount1Out = address(tup) == pair.token1() ? amountOut : 0; try pair.swap(amount0Out, amount1Out, address(this), bytes(abi.encode(address(tup), amountOut))) { return swapSuccessful; } catch { return swapSuccessful; } } else { // ETH_TO_TUP_INTERNAL_TUP_TO_ETH_EXTERNAL uint256 amount0Out = weth == pair.token0() ? amountIn : 0; uint256 amount1Out = weth == pair.token1() ? amountIn : 0; try pair.swap(amount0Out, amount1Out, address(this), bytes(abi.encode(weth, amountIn))) { return swapSuccessful; } catch { return swapSuccessful; } } } receive() external payable { } fallback() external payable { require(msg.data.length == 0); } function _commonCall(address sender, bytes calldata data) internal { if (msg.sender == _pairTupEth) { if (sender == address(this)) { // Operation.ETH_TO_TUP_EXTERNAL_TUP_TO_ETH_INTERNAL (address tokenToBorrow, uint256 amountToBorrow) = abi.decode(data, (address, uint256)); if (tokenToBorrow == address(tup)) { // 1. TUP -> ETH (Internal) try tup.sell(amountToBorrow) { address[] memory path = new address[](2); path[0] = CELO; path[1] = address(tup); uint256[] memory amountRequired = router.getAmountsIn(amountToBorrow, path); IWETH(path[0]).deposit{ value: amountRequired[0] }(); // 2. ETH -> TUP (External) IERC20(path[0]).transfer(msg.sender, amountRequired[0]); tup.receiveProfit{ value: address(this).balance }(); swapSuccessful = true; } catch { swapSuccessful = false; return; } } else { // 1. ETH -> TUP (Internal) address weth = CELO; IWETH(weth).withdraw(amountToBorrow); try tup.buy{ value: amountToBorrow }() { address[] memory path = new address[](2); path[0] = address(tup); path[1] = weth; uint256[] memory amountRequired = router.getAmountsIn(amountToBorrow, path); // 2. TUP -> ETH (External) IERC20(path[0]).transfer(msg.sender, amountRequired[0]); try tup.returnNative{ value: address(this).balance }() { // We return the pool amount to the contract here try tup.sell(tup.balanceOf(address(this))) { tup.receiveProfit{ value: address(this).balance }(); swapSuccessful = true; } catch { swapSuccessful = false; return; } } catch { swapSuccessful = false; return; } } catch { swapSuccessful = false; return; } } } } else { swapSuccessful = false; return; } } function _createPair(address asset01, address asset02) internal returns (address pair) { pair = factory.getPair(asset01, asset02); if (pair == address(0) && asset01 != address(0) && asset02 != address(0)) { try factory.createPair(asset01, asset02) returns (address p) { pair = p; } catch { revert(); } } return pair; } function _performOperation(address asset, uint256 amount) internal returns (bool) { if (operation == Operation.ETH_TO_TUP_INTERNAL_TUP_TO_ETH_EXTERNAL) { IWETH(asset).withdraw(amount); // assumming asset == weth try tup.buy{ value: amount }() { address[] memory path = new address[](2); path[0] = address(tup); path[1] = asset; uint256 tupAmount = tup.balanceOf(address(this)); tup.approve(address(router), tupAmount); try router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tupAmount, 0, // amount, path, address(this), block.timestamp + 300 ) { return true; } catch { return false; } } catch { return false; } } else { address[] memory path = new address[](2); path[0] = asset; path[1] = address(tup); IERC20(asset).approve(address(router), amount); try router.swapExactTokensForTokensSupportingFeeOnTransferTokens( amount, 0, //tup.queryAmountInternalLP(amount), path, address(this), block.timestamp + 300 ) { uint256 tupAmount = tup.balanceOf(address(this)); try tup.sell(tupAmount) { IWETH(asset).deposit{ value: address(this).balance }(); return true; } catch { return false; } } catch { return false; } } } /** * @dev Add liquidity for the TUP/ETH pair LP in third party exchange (based on UniswapV2) * */ function addLiquidityNative(uint256 tupAmount) external payable fromTup returns (bool) { tup.approve(address(router), tupAmount); IERC20(CELO).approve(address(router), msg.value); // add liquidity for the TUP/ETH pair try router.addLiquidity( CELO, address(tup), msg.value, tupAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0), block.timestamp + 300 ) { return true; } catch { tup.returnNative{ value: msg.value }(); return false; } } function checkAndPerformArbitrage() external virtual runningArbitrage fromTup adjustInternalCondition returns (bool) { address weth = CELO; address pair = factory.getPair(address(tup), weth); uint256 balanceInternalNative = tup.poolBalance(); uint256 balanceExternalNative = IERC20(weth).balanceOf(pair); uint256 balanceInternalTUP = tup.balanceOf(address(tup)); uint256 balanceExternalTUP = tup.balanceOf(pair); if (balanceInternalNative == 0 || balanceExternalNative == 0) { return false; } uint256 rateInternal = balanceInternalTUP.mulDiv(FACTOR, balanceInternalNative); uint256 rateExternal = balanceExternalTUP.mulDiv(FACTOR, balanceExternalNative); if (rateExternal == 0 || rateInternal == 0) { return false; } bool shouldPerformArbitrage = (rateExternal > rateInternal) ? (rateExternal - rateInternal).mulDiv(10_000, rateExternal) >= ARBITRAGE_RATE : (rateInternal - rateExternal).mulDiv(10_000, rateInternal) >= ARBITRAGE_RATE; return (shouldPerformArbitrage ? _performArbitrage() : false); } function _performArbitrage() internal returns (bool success) { address weth = CELO; address[] memory assets_01 = new address[](2); assets_01[0] = weth; assets_01[1] = address(tup); address[] memory assets_02 = new address[](2); assets_02[0] = address(tup); assets_02[1] = weth; uint256[] memory amountOutExternal; uint256 amountOutInternal; address pair = factory.getPair(address(tup), weth); uint256 balanceInternalNative = tup.poolBalance(); uint256 balanceExternalNative = IERC20(weth).balanceOf(pair); uint256 balanceInternalTUP = tup.balanceOf(address(tup)); uint256 balanceExternalTUP = tup.balanceOf(pair); // getAmountsIn (amountOut, path) --> Given an amountOut value of path[1] token, it will tell us how many path[0] tokens we send // getAmountsOut(amountIn, path) --> Given an amountIn value of path[0] token, it will tell us how many path[1] tokens we receive for (uint256 i = 0; i < rangesWETH.length; i++) { amountOutExternal = router.getAmountsOut(rangesWETH[i], assets_01); amountOutInternal = tup.queryNativeAmount(amountOutExternal[1]); uint256 totalWithFee = _calculateFee(rangesWETH[i]); if (amountOutInternal <= totalWithFee) { amountOutInternal = tup.queryAmountOptimal(rangesWETH[i]); amountOutExternal = router.getAmountsOut(amountOutInternal, assets_02); if (amountOutExternal[1] > totalWithFee) { // perform arbitrage here - Option #1 - Buy TUP LP Internal and Sell TUP LP External if (balanceExternalNative >= amountOutExternal[1] && balanceInternalTUP >= amountOutInternal) { operation = Operation.ETH_TO_TUP_INTERNAL_TUP_TO_ETH_EXTERNAL; if (!hasAlternativeSwap) { success = _startTraditionalSwap(weth, rangesWETH[i]); if (!success) { success = _startAlternativeSwap(rangesWETH[i], amountOutInternal); } } else { success = _startAlternativeSwap(rangesWETH[i], amountOutInternal); } if (success) { break; } } } } else { // perform arbitrage here - Option #2 - Buy TUP LP External and Sell TUP LP Internal if (balanceInternalNative >= amountOutInternal && balanceExternalTUP >= amountOutExternal[1]) { operation = Operation.ETH_TO_TUP_EXTERNAL_TUP_TO_ETH_INTERNAL; if (!hasAlternativeSwap) { success = _startTraditionalSwap(weth, rangesWETH[i]); if (!success) { success = _startAlternativeSwap(rangesWETH[i], amountOutExternal[1]); } } else { success = _startAlternativeSwap(rangesWETH[i], amountOutExternal[1]); } if (success) { break; } } } } return success; } function pancakeCall(address _sender, uint256 _amount0, uint256 _amount1, bytes calldata _data) external { _commonCall(_sender, _data); } function pairTupEth() external view returns (address) { return _pairTupEth; } function uniswapV2Call(address _sender, uint256 _amount0, uint256 _amount1, bytes calldata _data) external { _commonCall(_sender, _data); } function queryRate() external view fromTup returns (uint256) { address weth = CELO; uint256 ethBalance = IERC20(weth).balanceOf(_pairTupEth); return (ethBalance == 0) ? FACTOR : tup.balanceOf(_pairTupEth).mulDiv(FACTOR, ethBalance); } function queryPoolAddress() external view virtual returns (address) { return address(0); } function setTup(address tupAddress) external virtual onlyOwner { tup = ITimeIsUp(payable(tupAddress)); _pairTupEth = _createPair(address(tup), CELO); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.10; interface ITimeIsUp { function FLASH_MINT_FEE() external view returns (uint256); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function accountShareBalance(address account) external view returns (uint256); function burn(uint256 amount) external; function mint(uint256 timeAmount) external payable; function queryAmountExternalLP(uint256 amountNative) external view returns (uint256); function queryAmountInternalLP(uint256 amountNative) external view returns (uint256); function queryAmountOptimal(uint256 amountNative) external view returns (uint256); function queryNativeAmount(uint256 d2Amount) external view returns (uint256); function queryNativeFromTimeAmount(uint256 timeAmount) external view returns (uint256); function queryPriceNative(uint256 amountNative) external view returns (uint256); function queryPriceInverse(uint256 d2Amount) external view returns (uint256); function queryRate() external view returns (uint256); function queryPublicReward() external view returns (uint256); function returnNative() external payable returns (bool); function splitSharesWithReward() external; function buy() external payable returns (bool success); function sell(uint256 d2Amount) external returns (bool success); function flashMint(uint256 d2AmountToBorrow, bytes calldata data) external; function payFlashMintFee() external payable; function poolBalance() external view returns (uint256); function toBeShared() external view returns (uint256); function receiveProfit() external payable; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.10; interface IHelperBase { function addLiquidityNative(uint256 tupAmount) external payable returns (bool); function checkAndPerformArbitrage() external returns (bool); function pairTupEth() external view returns (address); function queryRate() external view returns (uint256); function queryPoolAddress() external view returns (address); function setTup(address tupAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; 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 swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactAVAXForTokensSupportingFeeOnTransferTokens( 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; function swapExactTokensForAVAXSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IWETH { function approve(address to, uint256 amount) external returns (bool); function deposit() external payable; function mint(address to, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IUniswapV2Router01 { function defaultFactory() external pure returns (address); function factory() external pure returns (address); function factoryV2() external pure returns (address); function WETH() external pure returns (address); function weth() external pure returns (address); function WCELO() external pure returns (address); function WETH9() external pure returns (address); function WAVAX() external pure returns (address); function WHT() 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); }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/", "hardhat/=node_modules/hardhat/", "@openzeppelin/=node_modules/@openzeppelin/", "@aave/=node_modules/@aave/", "@chainlink/=node_modules/@chainlink/", "@eth-optimism/=node_modules/@eth-optimism/", "@layerzerolabs/=node_modules/@layerzerolabs/", "@uniswap/=node_modules/@uniswap/", "RMPL/=lib/RMPL/", "ampl/=lib/ampl/", "base64-sol/=node_modules/base64-sol/", "hardhat-deploy/=node_modules/hardhat-deploy/", "rdnt/=lib/rdnt/" ], "optimizer": { "enabled": true, "runs": 5000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_addressProvider","type":"address"},{"internalType":"address","name":"_exchangeRouterAddress","type":"address"},{"internalType":"address","name":"_tupTokenAddress","type":"address"},{"internalType":"bool","name":"_hasAlternativeSwap","type":"bool"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"tupAmount","type":"uint256"}],"name":"addLiquidityNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"checkAndPerformArbitrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairTupEth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_amount0","type":"uint256"},{"internalType":"uint256","name":"_amount1","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"pancakeCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"queryPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tupAddress","type":"address"}],"name":"setTup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_amount0","type":"uint256"},{"internalType":"uint256","name":"_amount1","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6103606040526a295be96e6406697200000060a09081526a084595161401484a00000060c0526a0422ca8b0a00a42500000060e05269d3c21bcecceda1000000610100526969e10de76676d08000006101205269152d02c7e14af680000061014052690a968163f0a57b4000006101605269021e19e0c9bab24000006101805269010f0cf064dd592000006101a052683635c9adc5dea000006101c052681b1ae4d6e2ef5000006101e05268056bc75e2d63100000610200526802b5e3af16b188000061022052678ac7230489e8000061024052674563918244f4000061026052670de0b6b3a7640000610280526706f05b59d3b200006102a05267016345785d8a00006102c05266b1a2bc2ec500006102e052662386f26fc10000610300526611c37937e080006103205266038d7ea4c68000610340526200014790600590601662000386565b503480156200015557600080fd5b5060405162002f7838038062002f78833981016040819052620001789162000408565b620001833362000255565b600180546001600160a01b0319166001600160a01b0386169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020391906200047e565b600280546001600160a01b03199081166001600160a01b03938416179091556003805490911685831617905582151560805233908216146200024a576200024a81620002a5565b5050505050620004a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002af62000328565b6001600160a01b0381166200031a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620003258162000255565b50565b6000546001600160a01b03163314620003845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000311565b565b8260168101928215620003c2579160200282015b82811115620003c257825182906001600160581b03169055916020019190600101906200039a565b50620003d0929150620003d4565b5090565b5b80821115620003d05760008155600101620003d5565b80516001600160a01b03811681146200040357600080fd5b919050565b600080600080600060a086880312156200042157600080fd5b6200042c86620003eb565b94506200043c60208701620003eb565b93506200044c60408701620003eb565b9250606086015180151581146200046257600080fd5b91506200047260808701620003eb565b90509295509295909350565b6000602082840312156200049157600080fd5b6200049c82620003eb565b9392505050565b608051612ab2620004c66000396000818161206f01526121730152612ab26000f3fe6080604052600436106100c05760003560e01c80638480081211610074578063a840a4f51161004e578063a840a4f5146101ba578063c6cc93a1146101cf578063f2fde38b146101ed576100c7565b806384800812146101015780638da5cb5b1461017957806395d18a1314610197576100c7565b806315496ef5116100a557806315496ef5146101215780632ea7710314610144578063715018a614610164576100c7565b806303bc95a0146100d457806310d1e85c14610101576100c7565b366100c757005b36156100d257600080fd5b005b3480156100e057600080fd5b5060005b6040516001600160a01b0390911681526020015b60405180910390f35b34801561010d57600080fd5b506100d261011c366004612622565b61020d565b61013461012f3660046126b8565b61021f565b60405190151581526020016100f8565b34801561015057600080fd5b506100d261015f3660046126d1565b610579565b34801561017057600080fd5b506100d2610610565b34801561018557600080fd5b506000546001600160a01b03166100e4565b3480156101a357600080fd5b506101ac610624565b6040519081526020016100f8565b3480156101c657600080fd5b506101346107f3565b3480156101db57600080fd5b506004546001600160a01b03166100e4565b3480156101f957600080fd5b506100d26102083660046126d1565b610ca5565b610218858383610d4f565b5050505050565b6003546000906001600160a01b031633146102c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f48656c7065723a206f6e6c792054555020746f6b656e20636f6e74726163742060448201527f63616e2063616c6c20746869732066756e6374696f6e0000000000000000000060648201526084015b60405180910390fd5b6003546001546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af115801561032f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035391906126ee565b506001546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015234602482015273471ece3750da237f93b8e339c536989b8978a4389063095ea7b3906044016020604051808303816000875af11580156103d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f591906126ee565b506001546003546001600160a01b039182169163e8e337009173471ece3750da237f93b8e339c536989b8978a43891163486600080806104374261012c61273f565b60405160e08a901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156104e7575060408051601f3d908101601f191682019092526104e491810190612757565b60015b61056e57600360009054906101000a90046001600160a01b03166001600160a01b03166370471f73346040518263ffffffff1660e01b815260040160206040518083038185885af1158015610540573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061056591906126ee565b50600092915050565b506001949350505050565b6105816116ec565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556105d59073471ece3750da237f93b8e339c536989b8978a438611760565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6106186116ec565b61062260006118c5565b565b6003546000906001600160a01b031633146106c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f48656c7065723a206f6e6c792054555020746f6b656e20636f6e74726163742060448201527f63616e2063616c6c20746869732066756e6374696f6e0000000000000000000060648201526084016102b8565b600480546040516370a0823160e01b81526001600160a01b039091169181019190915273471ece3750da237f93b8e339c536989b8978a4389060009082906370a0823190602401602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190612785565b905080156107e157600354600480546040516370a0823160e01b81526001600160a01b03918216928101929092526107dc92670de0b6b3a7640000928592909116906370a0823190602401602060405180830381865afa1580156107b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d59190612785565b919061192d565b6107eb565b670de0b6b3a76400005b925050505b90565b600080547501000000000000000000000000000000000000000000900460ff166107f057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055600354336001600160a01b03909116146108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f48656c7065723a206f6e6c792054555020746f6b656e20636f6e74726163742060448201527f63616e2063616c6c20746869732066756e6374696f6e0000000000000000000060648201526084016102b8565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001781556002546003546040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015273471ece3750da237f93b8e339c536989b8978a438602482018190529392919091169063e6a4390590604401602060405180830381865afa1580156109b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109db919061279e565b90506000600360009054906101000a90046001600160a01b03166001600160a01b03166396365d446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a569190612785565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000918516906370a0823190602401602060405180830381865afa158015610aa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac69190612785565b6003546040516370a0823160e01b81526001600160a01b0390911660048201819052919250600091906370a0823190602401602060405180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190612785565b6003546040516370a0823160e01b81526001600160a01b038781166004830152929350600092909116906370a0823190602401602060405180830381865afa158015610b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bad9190612785565b9050831580610bba575082155b15610bce5760009650505050505050610c7a565b6000610be383670de0b6b3a76400008761192d565b90506000610bfa83670de0b6b3a76400008761192d565b9050801580610c07575081155b15610c1d57600098505050505050505050610c7a565b6000828211610c41576101f4610c3a612710856107d586826127bb565b1015610c58565b6101f4610c55612710846107d587826127bb565b10155b905080610c66576000610c6e565b610c6e611a01565b99505050505050505050505b600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff16905590565b610cad6116ec565b6001600160a01b038116610d43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102b8565b610d4c816118c5565b50565b6004546001600160a01b03163314156116bf576001600160a01b0383163014156116ba57600080610d82838501856127d2565b60035491935091506001600160a01b0380841691161415611163576003546040517fe4849b32000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063e4849b32906024016020604051808303816000875af1925050508015610e1d575060408051601f3d908101601f19168201909252610e1a918101906126ee565b60015b610e50575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055505050565b5060408051600280825260608201835260009260208301908036833701905050905073471ece3750da237f93b8e339c536989b8978a43881600081518110610e9a57610e9a61282d565b6001600160a01b039283166020918202929092010152600354825191169082906001908110610ecb57610ecb61282d565b6001600160a01b0392831660209182029290920101526001546040517f1f00ca740000000000000000000000000000000000000000000000000000000081526000929190911690631f00ca7490610f28908690869060040161285c565b600060405180830381865afa158015610f45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f6d91908101906128b3565b905081600081518110610f8257610f8261282d565b60200260200101516001600160a01b031663d0e30db082600081518110610fab57610fab61282d565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fde57600080fd5b505af1158015610ff2573d6000803e3d6000fd5b50505050508160008151811061100a5761100a61282d565b60200260200101516001600160a01b031663a9059cbb33836000815181106110345761103461282d565b60200260200101516040518363ffffffff1660e01b815260040161106d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b091906126ee565b50600360009054906101000a90046001600160a01b03166001600160a01b0316639c4da9d8476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b5050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16760100000000000000000000000000000000000000000000179055506102189350505050565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905273471ece3750da237f93b8e339c536989b8978a438908190632e1a7d4d90602401600060405180830381600087803b1580156111cb57600080fd5b505af11580156111df573d6000803e3d6000fd5b50505050600360009054906101000a90046001600160a01b03166001600160a01b031663a6f2ae3a836040518263ffffffff1660e01b815260040160206040518083038185885af193505050508015611255575060408051601f3d908101601f19168201909252611252918101906126ee565b60015b611289575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16905550505050565b50604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b0316918391506000906112cb576112cb61282d565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106112ff576112ff61282d565b6001600160a01b0392831660209182029290920101526001546040517f1f00ca740000000000000000000000000000000000000000000000000000000081526000929190911690631f00ca749061135c908790869060040161285c565b600060405180830381865afa158015611379573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a191908101906128b3565b9050816000815181106113b6576113b661282d565b60200260200101516001600160a01b031663a9059cbb33836000815181106113e0576113e061282d565b60200260200101516040518363ffffffff1660e01b81526004016114199291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145c91906126ee565b50600360009054906101000a90046001600160a01b03166001600160a01b03166370471f73476040518263ffffffff1660e01b815260040160206040518083038185885af1935050505080156114cf575060408051601f3d908101601f191682019092526114cc918101906126ee565b60015b611505575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055505050505050565b506003546040516370a0823160e01b81523060048201526001600160a01b039091169063e4849b329082906370a0823190602401602060405180830381865afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a9190612785565b6040518263ffffffff1660e01b815260040161159891815260200190565b6020604051808303816000875af19250505080156115d3575060408051601f3d908101601f191682019092526115d0918101906126ee565b60015b611609575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055505050505050565b50600360009054906101000a90046001600160a01b03166001600160a01b0316639c4da9d8476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b5050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905550505050505050505b505050565b5050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16905550565b6000546001600160a01b03163314610622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b8565b6002546040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152600092169063e6a4390590604401602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f0919061279e565b90506001600160a01b03811615801561181157506001600160a01b03831615155b801561182557506001600160a01b03821615155b156118bf576002546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284811660248301529091169063c9c65396906044016020604051808303816000875af19250505080156118b3575060408051601f3d908101601f191682019092526118b09181019061279e565b60015b6118bc57600080fd5b90505b92915050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600014156119865783828161197c5761197c612971565b04925050506119fa565b80841161199257600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b60408051600280825260608201835260009273471ece3750da237f93b8e339c536989b8978a43892849290916020830190803683370190505090508181600081518110611a5057611a5061282d565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611a8157611a8161282d565b6001600160a01b03929092166020928302919091018201526040805160028082526060820183526000939192909183019080368337505060035482519293506001600160a01b031691839150600090611adc57611adc61282d565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611b1057611b1061282d565b6001600160a01b0392831660209182029290920101526002546003546040517fe6a4390500000000000000000000000000000000000000000000000000000000815290831660048201528583166024820152606092600092839291169063e6a4390590604401602060405180830381865afa158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb7919061279e565b90506000600360009054906101000a90046001600160a01b03166001600160a01b03166396365d446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c329190612785565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000918916906370a0823190602401602060405180830381865afa158015611c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca29190612785565b6003546040516370a0823160e01b81526001600160a01b0390911660048201819052919250600091906370a0823190602401602060405180830381865afa158015611cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d159190612785565b6003546040516370a0823160e01b81526001600160a01b038781166004830152929350600092909116906370a0823190602401602060405180830381865afa158015611d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d899190612785565b905060005b601681101561222c576001546001600160a01b031663d06ca61f60058360168110611dbb57611dbb61282d565b01548c6040518363ffffffff1660e01b8152600401611ddb92919061285c565b600060405180830381865afa158015611df8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e2091908101906128b3565b60035481519199506001600160a01b03169063f3d33a0e908a906001908110611e4b57611e4b61282d565b60200260200101516040518263ffffffff1660e01b8152600401611e7191815260200190565b602060405180830381865afa158015611e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb29190612785565b96506000611ed360058360168110611ecc57611ecc61282d565b015461223a565b9050808811612100576003546001600160a01b0316639852787560058460168110611f0057611f0061282d565b01546040518263ffffffff1660e01b8152600401611f2091815260200190565b602060405180830381865afa158015611f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f619190612785565b6001546040517fd06ca61f0000000000000000000000000000000000000000000000000000000081529199506001600160a01b03169063d06ca61f90611fad908b908e9060040161285c565b600060405180830381865afa158015611fca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ff291908101906128b3565b985080896001815181106120085761200861282d565b602002602001015111156120fb57886001815181106120295761202961282d565b602002602001015185101580156120405750878410155b156120fb57600080547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff1690557f00000000000000000000000000000000000000000000000000000000000000006120d6576120a98c600584601681106105655761056561282d565b9c508c6120d1576120ce600583601681106120c6576120c661282d565b015489612254565b9c505b6120ef565b6120ec600583601681106120c6576120c661282d565b9c505b8c156120fb575061222c565b612219565b87861015801561212a57508860018151811061211e5761211e61282d565b60200260200101518310155b1561221957600080547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790557f00000000000000000000000000000000000000000000000000000000000000006121f4576121ad8c600584601681106105655761056561282d565b9c508c6121ef576121ec600583601681106121ca576121ca61282d565b01548a6001815181106121df576121df61282d565b6020026020010151612254565b9c505b61220d565b61220a600583601681106121ca576121ca61282d565b9c505b8c15612219575061222c565b5080612224816129cf565b915050611d8e565b505050505050505050505090565b600061224a82606461271061192d565b6118bf908361273f565b600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16815560045473471ece3750da237f93b8e339c536989b8978a438906001600160a01b0316600160005477010000000000000000000000000000000000000000000000900460ff1660018111156122d2576122d26129a0565b14156124c6576000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233c919061279e565b6003546001600160a01b0390811691161461235857600061235a565b845b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561239c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c0919061279e565b6003546001600160a01b039081169116146123dc5760006123de565b855b600354604080516001600160a01b03928316602082015290810189905291925084169063022c0d9f908490849030906060015b6040516020818303038152906040526040518563ffffffff1660e01b815260040161243f9493929190612a08565b600060405180830381600087803b15801561245957600080fd5b505af192505050801561246a575060015b61249a575050600054760100000000000000000000000000000000000000000000900460ff1692506118bf915050565b5050600054760100000000000000000000000000000000000000000000900460ff1692506118bf915050565b6000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a919061279e565b6001600160a01b0316836001600160a01b03161461254957600061254b565b855b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561258d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b1919061279e565b6001600160a01b0316846001600160a01b0316146125d05760006125d2565b865b9050826001600160a01b031663022c0d9f838330888c6040516020016124119291906001600160a01b03929092168252602082015260400190565b6001600160a01b0381168114610d4c57600080fd5b60008060008060006080868803121561263a57600080fd5b85356126458161260d565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561267057600080fd5b818801915088601f83011261268457600080fd5b81358181111561269357600080fd5b8960208285010111156126a557600080fd5b9699959850939650602001949392505050565b6000602082840312156126ca57600080fd5b5035919050565b6000602082840312156126e357600080fd5b81356118bc8161260d565b60006020828403121561270057600080fd5b815180151581146118bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561275257612752612710565b500190565b60008060006060848603121561276c57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561279757600080fd5b5051919050565b6000602082840312156127b057600080fd5b81516118bc8161260d565b6000828210156127cd576127cd612710565b500390565b600080604083850312156127e557600080fd5b82356127f08161260d565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156128a65784516001600160a01b031683529383019391830191600101612881565b5090979650505050505050565b600060208083850312156128c657600080fd5b825167ffffffffffffffff808211156128de57600080fd5b818501915085601f8301126128f257600080fd5b815181811115612904576129046127fe565b8060051b604051601f19603f83011681018181108582111715612929576129296127fe565b60405291825284820192508381018501918883111561294757600080fd5b938501935b828510156129655784518452938501939285019261294c565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a0157612a01612710565b5060010190565b8481526000602085818401526001600160a01b038516604084015260806060840152835180608085015260005b81811015612a515785810183015185820160a001528201612a35565b81811115612a6357600060a083870101525b50601f01601f19169290920160a001969550505050505056fea2646970667358221220f42c8b24826378bc57c85e7f1acb0e2a5ca59f8736815f0f44508a5b9638cc7c64736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3d8bd6aed4f159bc8000a9cd47cffdb95f9612100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000123e587f469fcb3c5992793d081be8d643fd78e1
Deployed Bytecode
0x6080604052600436106100c05760003560e01c80638480081211610074578063a840a4f51161004e578063a840a4f5146101ba578063c6cc93a1146101cf578063f2fde38b146101ed576100c7565b806384800812146101015780638da5cb5b1461017957806395d18a1314610197576100c7565b806315496ef5116100a557806315496ef5146101215780632ea7710314610144578063715018a614610164576100c7565b806303bc95a0146100d457806310d1e85c14610101576100c7565b366100c757005b36156100d257600080fd5b005b3480156100e057600080fd5b5060005b6040516001600160a01b0390911681526020015b60405180910390f35b34801561010d57600080fd5b506100d261011c366004612622565b61020d565b61013461012f3660046126b8565b61021f565b60405190151581526020016100f8565b34801561015057600080fd5b506100d261015f3660046126d1565b610579565b34801561017057600080fd5b506100d2610610565b34801561018557600080fd5b506000546001600160a01b03166100e4565b3480156101a357600080fd5b506101ac610624565b6040519081526020016100f8565b3480156101c657600080fd5b506101346107f3565b3480156101db57600080fd5b506004546001600160a01b03166100e4565b3480156101f957600080fd5b506100d26102083660046126d1565b610ca5565b610218858383610d4f565b5050505050565b6003546000906001600160a01b031633146102c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f48656c7065723a206f6e6c792054555020746f6b656e20636f6e74726163742060448201527f63616e2063616c6c20746869732066756e6374696f6e0000000000000000000060648201526084015b60405180910390fd5b6003546001546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af115801561032f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035391906126ee565b506001546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015234602482015273471ece3750da237f93b8e339c536989b8978a4389063095ea7b3906044016020604051808303816000875af11580156103d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f591906126ee565b506001546003546001600160a01b039182169163e8e337009173471ece3750da237f93b8e339c536989b8978a43891163486600080806104374261012c61273f565b60405160e08a901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156104e7575060408051601f3d908101601f191682019092526104e491810190612757565b60015b61056e57600360009054906101000a90046001600160a01b03166001600160a01b03166370471f73346040518263ffffffff1660e01b815260040160206040518083038185885af1158015610540573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061056591906126ee565b50600092915050565b506001949350505050565b6105816116ec565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556105d59073471ece3750da237f93b8e339c536989b8978a438611760565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6106186116ec565b61062260006118c5565b565b6003546000906001600160a01b031633146106c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f48656c7065723a206f6e6c792054555020746f6b656e20636f6e74726163742060448201527f63616e2063616c6c20746869732066756e6374696f6e0000000000000000000060648201526084016102b8565b600480546040516370a0823160e01b81526001600160a01b039091169181019190915273471ece3750da237f93b8e339c536989b8978a4389060009082906370a0823190602401602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190612785565b905080156107e157600354600480546040516370a0823160e01b81526001600160a01b03918216928101929092526107dc92670de0b6b3a7640000928592909116906370a0823190602401602060405180830381865afa1580156107b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d59190612785565b919061192d565b6107eb565b670de0b6b3a76400005b925050505b90565b600080547501000000000000000000000000000000000000000000900460ff166107f057600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055600354336001600160a01b03909116146108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f48656c7065723a206f6e6c792054555020746f6b656e20636f6e74726163742060448201527f63616e2063616c6c20746869732066756e6374696f6e0000000000000000000060648201526084016102b8565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001781556002546003546040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015273471ece3750da237f93b8e339c536989b8978a438602482018190529392919091169063e6a4390590604401602060405180830381865afa1580156109b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109db919061279e565b90506000600360009054906101000a90046001600160a01b03166001600160a01b03166396365d446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a569190612785565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000918516906370a0823190602401602060405180830381865afa158015610aa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac69190612785565b6003546040516370a0823160e01b81526001600160a01b0390911660048201819052919250600091906370a0823190602401602060405180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190612785565b6003546040516370a0823160e01b81526001600160a01b038781166004830152929350600092909116906370a0823190602401602060405180830381865afa158015610b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bad9190612785565b9050831580610bba575082155b15610bce5760009650505050505050610c7a565b6000610be383670de0b6b3a76400008761192d565b90506000610bfa83670de0b6b3a76400008761192d565b9050801580610c07575081155b15610c1d57600098505050505050505050610c7a565b6000828211610c41576101f4610c3a612710856107d586826127bb565b1015610c58565b6101f4610c55612710846107d587826127bb565b10155b905080610c66576000610c6e565b610c6e611a01565b99505050505050505050505b600080547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff16905590565b610cad6116ec565b6001600160a01b038116610d43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102b8565b610d4c816118c5565b50565b6004546001600160a01b03163314156116bf576001600160a01b0383163014156116ba57600080610d82838501856127d2565b60035491935091506001600160a01b0380841691161415611163576003546040517fe4849b32000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063e4849b32906024016020604051808303816000875af1925050508015610e1d575060408051601f3d908101601f19168201909252610e1a918101906126ee565b60015b610e50575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055505050565b5060408051600280825260608201835260009260208301908036833701905050905073471ece3750da237f93b8e339c536989b8978a43881600081518110610e9a57610e9a61282d565b6001600160a01b039283166020918202929092010152600354825191169082906001908110610ecb57610ecb61282d565b6001600160a01b0392831660209182029290920101526001546040517f1f00ca740000000000000000000000000000000000000000000000000000000081526000929190911690631f00ca7490610f28908690869060040161285c565b600060405180830381865afa158015610f45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f6d91908101906128b3565b905081600081518110610f8257610f8261282d565b60200260200101516001600160a01b031663d0e30db082600081518110610fab57610fab61282d565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fde57600080fd5b505af1158015610ff2573d6000803e3d6000fd5b50505050508160008151811061100a5761100a61282d565b60200260200101516001600160a01b031663a9059cbb33836000815181106110345761103461282d565b60200260200101516040518363ffffffff1660e01b815260040161106d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b091906126ee565b50600360009054906101000a90046001600160a01b03166001600160a01b0316639c4da9d8476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b5050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16760100000000000000000000000000000000000000000000179055506102189350505050565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905273471ece3750da237f93b8e339c536989b8978a438908190632e1a7d4d90602401600060405180830381600087803b1580156111cb57600080fd5b505af11580156111df573d6000803e3d6000fd5b50505050600360009054906101000a90046001600160a01b03166001600160a01b031663a6f2ae3a836040518263ffffffff1660e01b815260040160206040518083038185885af193505050508015611255575060408051601f3d908101601f19168201909252611252918101906126ee565b60015b611289575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16905550505050565b50604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b0316918391506000906112cb576112cb61282d565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106112ff576112ff61282d565b6001600160a01b0392831660209182029290920101526001546040517f1f00ca740000000000000000000000000000000000000000000000000000000081526000929190911690631f00ca749061135c908790869060040161285c565b600060405180830381865afa158015611379573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a191908101906128b3565b9050816000815181106113b6576113b661282d565b60200260200101516001600160a01b031663a9059cbb33836000815181106113e0576113e061282d565b60200260200101516040518363ffffffff1660e01b81526004016114199291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145c91906126ee565b50600360009054906101000a90046001600160a01b03166001600160a01b03166370471f73476040518263ffffffff1660e01b815260040160206040518083038185885af1935050505080156114cf575060408051601f3d908101601f191682019092526114cc918101906126ee565b60015b611505575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055505050505050565b506003546040516370a0823160e01b81523060048201526001600160a01b039091169063e4849b329082906370a0823190602401602060405180830381865afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a9190612785565b6040518263ffffffff1660e01b815260040161159891815260200190565b6020604051808303816000875af19250505080156115d3575060408051601f3d908101601f191682019092526115d0918101906126ee565b60015b611609575050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055505050505050565b50600360009054906101000a90046001600160a01b03166001600160a01b0316639c4da9d8476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b5050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905550505050505050505b505050565b5050600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16905550565b6000546001600160a01b03163314610622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102b8565b6002546040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152600092169063e6a4390590604401602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f0919061279e565b90506001600160a01b03811615801561181157506001600160a01b03831615155b801561182557506001600160a01b03821615155b156118bf576002546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284811660248301529091169063c9c65396906044016020604051808303816000875af19250505080156118b3575060408051601f3d908101601f191682019092526118b09181019061279e565b60015b6118bc57600080fd5b90505b92915050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600014156119865783828161197c5761197c612971565b04925050506119fa565b80841161199257600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b60408051600280825260608201835260009273471ece3750da237f93b8e339c536989b8978a43892849290916020830190803683370190505090508181600081518110611a5057611a5061282d565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611a8157611a8161282d565b6001600160a01b03929092166020928302919091018201526040805160028082526060820183526000939192909183019080368337505060035482519293506001600160a01b031691839150600090611adc57611adc61282d565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611b1057611b1061282d565b6001600160a01b0392831660209182029290920101526002546003546040517fe6a4390500000000000000000000000000000000000000000000000000000000815290831660048201528583166024820152606092600092839291169063e6a4390590604401602060405180830381865afa158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb7919061279e565b90506000600360009054906101000a90046001600160a01b03166001600160a01b03166396365d446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c329190612785565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000918916906370a0823190602401602060405180830381865afa158015611c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca29190612785565b6003546040516370a0823160e01b81526001600160a01b0390911660048201819052919250600091906370a0823190602401602060405180830381865afa158015611cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d159190612785565b6003546040516370a0823160e01b81526001600160a01b038781166004830152929350600092909116906370a0823190602401602060405180830381865afa158015611d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d899190612785565b905060005b601681101561222c576001546001600160a01b031663d06ca61f60058360168110611dbb57611dbb61282d565b01548c6040518363ffffffff1660e01b8152600401611ddb92919061285c565b600060405180830381865afa158015611df8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e2091908101906128b3565b60035481519199506001600160a01b03169063f3d33a0e908a906001908110611e4b57611e4b61282d565b60200260200101516040518263ffffffff1660e01b8152600401611e7191815260200190565b602060405180830381865afa158015611e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb29190612785565b96506000611ed360058360168110611ecc57611ecc61282d565b015461223a565b9050808811612100576003546001600160a01b0316639852787560058460168110611f0057611f0061282d565b01546040518263ffffffff1660e01b8152600401611f2091815260200190565b602060405180830381865afa158015611f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f619190612785565b6001546040517fd06ca61f0000000000000000000000000000000000000000000000000000000081529199506001600160a01b03169063d06ca61f90611fad908b908e9060040161285c565b600060405180830381865afa158015611fca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ff291908101906128b3565b985080896001815181106120085761200861282d565b602002602001015111156120fb57886001815181106120295761202961282d565b602002602001015185101580156120405750878410155b156120fb57600080547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff1690557f00000000000000000000000000000000000000000000000000000000000000016120d6576120a98c600584601681106105655761056561282d565b9c508c6120d1576120ce600583601681106120c6576120c661282d565b015489612254565b9c505b6120ef565b6120ec600583601681106120c6576120c661282d565b9c505b8c156120fb575061222c565b612219565b87861015801561212a57508860018151811061211e5761211e61282d565b60200260200101518310155b1561221957600080547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790557f00000000000000000000000000000000000000000000000000000000000000016121f4576121ad8c600584601681106105655761056561282d565b9c508c6121ef576121ec600583601681106121ca576121ca61282d565b01548a6001815181106121df576121df61282d565b6020026020010151612254565b9c505b61220d565b61220a600583601681106121ca576121ca61282d565b9c505b8c15612219575061222c565b5080612224816129cf565b915050611d8e565b505050505050505050505090565b600061224a82606461271061192d565b6118bf908361273f565b600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16815560045473471ece3750da237f93b8e339c536989b8978a438906001600160a01b0316600160005477010000000000000000000000000000000000000000000000900460ff1660018111156122d2576122d26129a0565b14156124c6576000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233c919061279e565b6003546001600160a01b0390811691161461235857600061235a565b845b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561239c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c0919061279e565b6003546001600160a01b039081169116146123dc5760006123de565b855b600354604080516001600160a01b03928316602082015290810189905291925084169063022c0d9f908490849030906060015b6040516020818303038152906040526040518563ffffffff1660e01b815260040161243f9493929190612a08565b600060405180830381600087803b15801561245957600080fd5b505af192505050801561246a575060015b61249a575050600054760100000000000000000000000000000000000000000000900460ff1692506118bf915050565b5050600054760100000000000000000000000000000000000000000000900460ff1692506118bf915050565b6000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a919061279e565b6001600160a01b0316836001600160a01b03161461254957600061254b565b855b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561258d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b1919061279e565b6001600160a01b0316846001600160a01b0316146125d05760006125d2565b865b9050826001600160a01b031663022c0d9f838330888c6040516020016124119291906001600160a01b03929092168252602082015260400190565b6001600160a01b0381168114610d4c57600080fd5b60008060008060006080868803121561263a57600080fd5b85356126458161260d565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561267057600080fd5b818801915088601f83011261268457600080fd5b81358181111561269357600080fd5b8960208285010111156126a557600080fd5b9699959850939650602001949392505050565b6000602082840312156126ca57600080fd5b5035919050565b6000602082840312156126e357600080fd5b81356118bc8161260d565b60006020828403121561270057600080fd5b815180151581146118bc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561275257612752612710565b500190565b60008060006060848603121561276c57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561279757600080fd5b5051919050565b6000602082840312156127b057600080fd5b81516118bc8161260d565b6000828210156127cd576127cd612710565b500390565b600080604083850312156127e557600080fd5b82356127f08161260d565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156128a65784516001600160a01b031683529383019391830191600101612881565b5090979650505050505050565b600060208083850312156128c657600080fd5b825167ffffffffffffffff808211156128de57600080fd5b818501915085601f8301126128f257600080fd5b815181811115612904576129046127fe565b8060051b604051601f19603f83011681018181108582111715612929576129296127fe565b60405291825284820192508381018501918883111561294757600080fd5b938501935b828510156129655784518452938501939285019261294c565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a0157612a01612710565b5060010190565b8481526000602085818401526001600160a01b038516604084015260806060840152835180608085015260005b81811015612a515785810183015185820160a001528201612a35565b81811115612a6357600060a083870101525b50601f01601f19169290920160a001969550505050505056fea2646970667358221220f42c8b24826378bc57c85e7f1acb0e2a5ca59f8736815f0f44508a5b9638cc7c64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3d8bd6aed4f159bc8000a9cd47cffdb95f9612100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000123e587f469fcb3c5992793d081be8d643fd78e1
-----Decoded View---------------
Arg [0] : _addressProvider (address): 0x0000000000000000000000000000000000000000
Arg [1] : _exchangeRouterAddress (address): 0xE3D8bd6Aed4F159bc8000a9cD47CffDb95F96121
Arg [2] : _tupTokenAddress (address): 0x0000000000000000000000000000000000000000
Arg [3] : _hasAlternativeSwap (bool): True
Arg [4] : _owner (address): 0x123E587F469fCB3c5992793d081bE8D643FD78e1
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000e3d8bd6aed4f159bc8000a9cd47cffdb95f96121
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000123e587f469fcb3c5992793d081be8d643fd78e1
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.