More Info
Private Name Tags
ContractCreator
Latest 24 from a total of 24 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 44449828 | 16 days ago | IN | 0 BNB | 0.00246321 | ||||
Claim | 44264856 | 22 days ago | IN | 0 BNB | 0.0021049 | ||||
Claim | 44106739 | 28 days ago | IN | 0 BNB | 0.00116083 | ||||
Claim | 43374651 | 53 days ago | IN | 0 BNB | 0.00242038 | ||||
Claim | 43071470 | 64 days ago | IN | 0 BNB | 0.00308044 | ||||
Claim | 42946724 | 68 days ago | IN | 0 BNB | 0.00460142 | ||||
Claim | 40190527 | 164 days ago | IN | 0 BNB | 0.00069932 | ||||
Claim | 39957182 | 172 days ago | IN | 0 BNB | 0.0036186 | ||||
Claim | 37793896 | 248 days ago | IN | 0 BNB | 0.00363801 | ||||
Claim | 37673593 | 252 days ago | IN | 0 BNB | 0.00142832 | ||||
Claim | 37591855 | 255 days ago | IN | 0 BNB | 0 | ||||
Claim | 37591855 | 255 days ago | IN | 0 BNB | 0 | ||||
Claim | 37571191 | 255 days ago | IN | 0 BNB | 0 | ||||
Claim | 37571191 | 255 days ago | IN | 0 BNB | 0 | ||||
Claim | 37495738 | 258 days ago | IN | 0 BNB | 0.00067178 | ||||
Claim | 37495644 | 258 days ago | IN | 0 BNB | 0.00335582 | ||||
Claim | 36919598 | 278 days ago | IN | 0 BNB | 0.01080255 | ||||
Claim | 35246019 | 336 days ago | IN | 0 BNB | 0.01067001 | ||||
Claim | 34209829 | 372 days ago | IN | 0 BNB | 0.00203979 | ||||
Claim | 33904020 | 383 days ago | IN | 0 BNB | 0.00824736 | ||||
Claim | 33698810 | 390 days ago | IN | 0 BNB | 0.01177823 | ||||
Claim | 33031691 | 413 days ago | IN | 0 BNB | 0.00793455 | ||||
Claim | 32715188 | 424 days ago | IN | 0 BNB | 0.00222062 | ||||
Enable Mining | 32688500 | 425 days ago | IN | 0.00088562 BNB | 0.00041312 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
44449828 | 16 days ago | 0.00000183 BNB | ||||
44449828 | 16 days ago | 0.00000183 BNB | ||||
44264856 | 22 days ago | 0.00000759 BNB | ||||
44264856 | 22 days ago | 0.00000759 BNB | ||||
43374651 | 53 days ago | 0.00000031 BNB | ||||
43374651 | 53 days ago | 0.00000031 BNB | ||||
43071470 | 64 days ago | 0.00003959 BNB | ||||
43071470 | 64 days ago | 0.00003959 BNB | ||||
42946724 | 68 days ago | 0.00001414 BNB | ||||
42946724 | 68 days ago | 0.00001414 BNB | ||||
40190527 | 164 days ago | 0.00000005 BNB | ||||
40190527 | 164 days ago | 0.00000005 BNB | ||||
39957182 | 172 days ago | 0.0000003 BNB | ||||
39957182 | 172 days ago | 0.0000003 BNB | ||||
37793896 | 248 days ago | 0.00000018 BNB | ||||
37793896 | 248 days ago | 0.00000018 BNB | ||||
37673593 | 252 days ago | 0.00000055 BNB | ||||
37673593 | 252 days ago | 0.00000055 BNB | ||||
37495738 | 258 days ago | 0.00002816 BNB | ||||
37495738 | 258 days ago | 0.00002816 BNB | ||||
37495644 | 258 days ago | 0.00000318 BNB | ||||
37495644 | 258 days ago | 0.00000318 BNB | ||||
37382012 | 262 days ago | 0.0000104 BNB | ||||
37382012 | 262 days ago | 0.0000104 BNB | ||||
36919598 | 278 days ago | 0.00000023 BNB |
Loading...
Loading
Contract Name:
Claimer
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 2000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; import "./TimeExchange.sol"; contract Claimer { using Math for uint256; uint256 public lastBlockTimeWasProduced; uint256 private constant FACTOR = 10 ** 18; TimeExchange public immutable timeExchange; ITimeIsUp public immutable tup; ITimeToken public immutable timeToken; event RewardClaimed(address claimer, uint256 amountInTup, uint256 amountInTime); constructor (address tupAddress, address timeTokenAddress, address timeExchangeAddress) { tup = ITimeIsUp(payable(tupAddress)); timeToken = ITimeToken(payable(timeTokenAddress)); timeExchange = TimeExchange(payable(timeExchangeAddress)); lastBlockTimeWasProduced = block.number; } receive() external payable { } fallback() external payable { require(msg.data.length == 0); } /// @notice Claims the public reward and convert it into TUP tokens to the user /// @dev The goal of this function is to avoid generic MEV bots. It also produces TIME tokens and send them to the informed address /// @param claimer Informs the address where the reward should be sent to function claim(address claimer) external { require(tup.queryPublicReward() > 0, "Claimer: there is not reward to claim"); try tup.splitSharesWithReward() { try timeExchange.swap{value: address(this).balance}(address(0), address(tup), address(this).balance) { uint256 amountInTup = tup.balanceOf(address(this)); try tup.transfer(claimer, amountInTup) { } catch { amountInTup = 0; } try timeToken.mining() { lastBlockTimeWasProduced = block.number; } catch { } uint256 amountInTime = timeToken.balanceOf(address(this)); if (amountInTime > 0) timeToken.transfer(claimer, amountInTime); if (amountInTup > 0 || amountInTime > 0) emit RewardClaimed(claimer, amountInTup, amountInTime); else revert("Claimer: not able to claim reward"); } catch { revert("Claimer: not able to claim reward"); } } catch { revert("Claimer: not able to claim reward"); } } /// @notice Enables the claimer contract to produce TIME Token to give as rewar function enableMining() external payable { require(msg.value >= timeToken.fee(), "Claimer: please send some amount to enable the contract to produce TIME"); timeToken.enableMining{value: msg.value}(); } /// @notice Queries an estimate of the public reward amount in terms of TUP tokens /// @dev It calculates the reward amount and return it to the user /// @return amountInTup The estimated amount in terms of TUP tokens /// @return amountInTime The estimated amount in terms of TIME tokens function queryPublicRewardEstimate() external view returns (uint256, uint256) { uint256 amount = tup.queryPublicReward(); (uint256 price,) = timeExchange.queryPrice(address(0), address(tup), amount); return (amount.mulDiv(price, FACTOR), (block.number - lastBlockTimeWasProduced).mulDiv(FACTOR, 1)); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "./ITimeToken.sol"; import "./ITimeIsUp.sol"; contract TimeExchange { using Math for uint256; uint256 private constant FACTOR = 10 ** 18; uint256 public constant FEE = 60; address public constant DEVELOPER_ADDRESS = 0x731591207791A93fB0Ec481186fb086E16A7d6D0; address public immutable timeAddress; address public immutable tupAddress; mapping (address => uint256) private _currentBlock; constructor(address time, address tup) { timeAddress = time; tupAddress = tup; } receive() external payable { } fallback() external payable { require(msg.data.length == 0); } /// @notice Modifier to make a function runs only once per block modifier onlyOncePerBlock() { require(block.number != _currentBlock[tx.origin], "Time Exchange: you cannot perform this operation again in this block"); _; _currentBlock[tx.origin] = block.number; } /// @notice Swaps native currency for another token /// @dev Please refer this function is called by swap() function /// @param tokenTo The address of the token to be swapped /// @param amount The native currency amount to be swapped function _swapFromNativeToToken(address tokenTo, uint256 amount) private { IERC20 token = IERC20(tokenTo); uint256 comission = amount.mulDiv(FEE, 10_000); amount -= comission; payable(tokenTo).call{value: amount}(""); payable(DEVELOPER_ADDRESS).call{value: comission / 2}(""); ITimeIsUp(payable(tupAddress)).receiveProfit{value: comission / 2}(); token.transfer(msg.sender, token.balanceOf(address(this))); } /// @notice Swaps token for native currency /// @dev Please refer this function is called by swap() function /// @param tokenFrom The address of the token to be swapped /// @param amount The token amount to be swapped function _swapFromTokenToNative(address tokenFrom, uint256 amount) private { IERC20 token = IERC20(tokenFrom); token.transferFrom(msg.sender, address(this), amount); uint256 balanceBefore = address(this).balance; token.transfer(tokenFrom, amount); uint256 balanceAfter = address(this).balance - balanceBefore; uint256 comission = balanceAfter.mulDiv(FEE, 10_000); balanceAfter -= comission; payable(msg.sender).call{value: balanceAfter}(""); payable(DEVELOPER_ADDRESS).call{value: comission / 2}(""); ITimeIsUp(payable(tupAddress)).receiveProfit{value: comission / 2}(); } /// @notice Swaps a token for another token /// @dev Please refer this function is called by swap() function /// @param tokenFrom The address of the token to be swapped /// @param tokenTo The address of the token to be swapped /// @param amount The token amount to be swapped function _swapFromTokenToToken(address tokenFrom, address tokenTo, uint256 amount) private { IERC20 tokenFrom_ = IERC20(tokenFrom); IERC20 tokenTo_ = IERC20(tokenTo); tokenFrom_.transferFrom(msg.sender, address(this), amount); uint256 balanceBefore = address(this).balance; tokenFrom_.transfer(tokenFrom, amount); uint256 balanceAfter = address(this).balance - balanceBefore; uint256 comission = balanceAfter.mulDiv(FEE, 10_000); balanceAfter -= comission; payable(tokenTo).call{value: balanceAfter}(""); payable(DEVELOPER_ADDRESS).call{value: comission / 2}(""); ITimeIsUp(payable(tupAddress)).receiveProfit{value: comission / 2}(); tokenTo_.transfer(msg.sender, tokenTo_.balanceOf(address(this))); } /// @notice Query the price of native currency in terms of an informed token /// @dev Please refer this function is called by queryPrice() function and it is only for viewing /// @param tokenTo The address of the token to be queried /// @param amount The native currency amount to be queried /// @return price The price of tokens to be obtained given some native currency amount function _queryPriceFromNativeToToken(address tokenTo, uint256 amount) private view returns (uint256) { uint256 price; if (tokenTo == timeAddress) price = ITimeToken(payable(tokenTo)).swapPriceNative(amount); else price = ITimeIsUp(payable(tokenTo)).queryPriceNative(amount); return price; } /// @notice Query the price of an informed token in terms of native currency /// @dev Please refer this function is called by queryPrice() function and it is only for viewing /// @param tokenFrom The address of the token to be queried /// @param amount The token amount to be queried /// @return price The price of native currency to be obtained given some token amount function _queryPriceFromTokenToNative(address tokenFrom, uint256 amount) private view returns (uint256) { uint256 price; if (tokenFrom == timeAddress) price = ITimeToken(payable(tokenFrom)).swapPriceTimeInverse(amount); else price = ITimeIsUp(payable(tokenFrom)).queryPriceInverse(amount); return price; } /// @notice Query the price of an informed token in terms of another informed token /// @dev Please refer this function is called by queryPrice() function and it is only for viewing /// @param tokenFrom The address of the token to be queried /// @param tokenTo The address of the token to be queried /// @param amount The token amount to be queried /// @return priceTo The price of tokens to be obtained given some another token amount /// @return nativeAmount The amount in native currency obtained from the query function _queryPriceFromTokenToToken(address tokenFrom, address tokenTo, uint256 amount) private view returns (uint256 priceTo, uint256 nativeAmount) { uint256 priceFrom = _queryPriceFromTokenToNative(tokenFrom, amount); nativeAmount = amount.mulDiv(priceFrom, FACTOR); if (tokenTo == timeAddress) priceTo = ITimeToken(payable(tokenTo)).swapPriceNative(nativeAmount); else priceTo = ITimeIsUp(payable(tokenTo)).queryPriceNative(nativeAmount); return (priceTo, nativeAmount); } /// @notice Clean the contract if it has any exceeding token or native amount /// @dev It should pass the tokenToClean contract address /// @param tokenToClean The address of token contract function clean(address tokenToClean) public { if (address(this).balance > 0) payable(DEVELOPER_ADDRESS).call{value: address(this).balance}(""); if (tokenToClean != address(0)) if (IERC20(tokenToClean).balanceOf(address(this)) > 0) IERC20(tokenToClean).transfer(DEVELOPER_ADDRESS, IERC20(tokenToClean).balanceOf(address(this))); } /// @notice Swaps token or native currency for another token or native currency /// @dev It should inform address(0) as tokenFrom or tokenTo when considering native currency /// @param tokenFrom The address of the token to be swapped /// @param tokenTo The address of the token to be swapped /// @param amount The token or native currency amount to be swapped function swap(address tokenFrom, address tokenTo, uint256 amount) external payable onlyOncePerBlock { if (tokenFrom == address(0)) { require(tokenTo != address(0) && (tokenTo == timeAddress || tokenTo == tupAddress), "Time Exchange: unallowed token"); require(msg.value > 0, "Time Exchange: please inform the amount to swap"); _swapFromNativeToToken(tokenTo, msg.value); clean(tokenFrom); clean(tokenTo); } else if (tokenTo == address(0)) { require(amount > 0, "Time Exchange: please inform the amount to swap"); require(tokenFrom == timeAddress || tokenFrom == tupAddress, "Time Exchange: unallowed token"); require(IERC20(tokenFrom).allowance(msg.sender, address(this)) >= amount, "Time Exchange: please approve the amount to swap"); _swapFromTokenToNative(tokenFrom, amount); clean(tokenFrom); clean(tokenTo); } else { require(amount > 0, "Time Exchange: please inform the amount to swap"); require(tokenTo == timeAddress || tokenTo == tupAddress, "Time Exchange: unallowed token"); require(tokenFrom == timeAddress || tokenFrom == tupAddress, "Time Exchange: unallowed token"); require(IERC20(tokenFrom).allowance(msg.sender, address(this)) >= amount, "Time Exchange: please approve the amount to swap"); _swapFromTokenToToken(tokenFrom, tokenTo, amount); clean(tokenFrom); clean(tokenTo); } } /// @notice Query the price of token or native currency in terms of another token or native currency /// @dev It should inform address(0) as tokenFrom or tokenTo when considering native currency /// @param tokenFrom The address of the token to be queried /// @param tokenTo The address of the token to be queried /// @param amount The token or native currency amount to be queried /// @return price The queried price /// @return nativeAmount The native amount in the middle of the query (if the case) function queryPrice(address tokenFrom, address tokenTo, uint256 amount) external view returns (uint256, uint256) { if (tokenFrom == address(0)) { require(tokenTo != address(0) && (tokenTo == timeAddress || tokenTo == tupAddress), "Time Exchange: unallowed token"); return (_queryPriceFromNativeToToken(tokenTo, amount), 0); } else if (tokenTo == address(0)) { require(tokenFrom == timeAddress || tokenFrom == tupAddress, "Time Exchange: unallowed token"); return (_queryPriceFromTokenToNative(tokenFrom, amount), 0); } else { require(tokenTo == timeAddress || tokenTo == tupAddress, "Time Exchange: unallowed token"); require(tokenFrom == timeAddress || tokenFrom == tupAddress, "Time Exchange: unallowed token"); return _queryPriceFromTokenToToken(tokenFrom, tokenTo, amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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 towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (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 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 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. uint256 twos = denominator & (0 - denominator); 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 (unsignedRoundsUp(rounding) && 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 * towards zero. * * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * 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 256, 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; interface ITimeToken { function DEVELOPER_ADDRESS() external view returns (address); function BASE_FEE() external view returns (uint256); function COMISSION_RATE() external view returns (uint256); function SHARE_RATE() external view returns (uint256); function TIME_BASE_LIQUIDITY() external view returns (uint256); function TIME_BASE_FEE() external view returns (uint256); function TOLERANCE() external view returns (uint256); function dividendPerToken() external view returns (uint256); function firstBlock() external view returns (uint256); function isMiningAllowed(address account) external view returns (bool); function liquidityFactorNative() external view returns (uint256); function liquidityFactorTime() external view returns (uint256); function numberOfHolders() external view returns (uint256); function numberOfMiners() external view returns (uint256); function sharedBalance() external view returns (uint256); function poolBalance() external view returns (uint256); function totalMinted() external view returns (uint256); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function burn(uint256 amount) external; function transfer(address to, uint256 amount) external returns (bool success); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool success); function averageMiningRate() external view returns (uint256); function donateEth() external payable; function enableMining() external payable; function enableMiningWithTimeToken() external; function fee() external view returns (uint256); function feeInTime() external view returns (uint256); function mining() external; function saveTime() external payable returns (bool success); function spendTime(uint256 timeAmount) external returns (bool success); function swapPriceNative(uint256 amountNative) external view returns (uint256); function swapPriceTimeInverse(uint256 amountTime) external view returns (uint256); function accountShareBalance(address account) external view returns (uint256); function withdrawableShareBalance(address account) external view returns (uint256); function withdrawShare() external; receive() external payable; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; 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; }
{ "remappings": [ "@layerzerolabs/=lib/solidity-examples/", "@aave/core-v3/=lib/aave-v3-core/", "@chainlink/=lib/chainlink/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "aave-v3-core/=lib/aave-v3-core/", "chainlink/=lib/chainlink/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "layerzero/=lib/layerzero/contracts/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "solidity-examples/=lib/solidity-examples/contracts/" ], "optimizer": { "enabled": true, "runs": 2000000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"tupAddress","type":"address"},{"internalType":"address","name":"timeTokenAddress","type":"address"},{"internalType":"address","name":"timeExchangeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountInTup","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountInTime","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMining","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"lastBlockTimeWasProduced","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryPublicRewardEstimate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeExchange","outputs":[{"internalType":"contract TimeExchange","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeToken","outputs":[{"internalType":"contract ITimeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tup","outputs":[{"internalType":"contract ITimeIsUp","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e060405234801561001057600080fd5b506040516110b93803806110b983398101604081905261002f9161006c565b6001600160a01b0392831660a05290821660c05216608052436000556100af565b80516001600160a01b038116811461006757600080fd5b919050565b60008060006060848603121561008157600080fd5b61008a84610050565b925061009860208501610050565b91506100a660408501610050565b90509250925092565b60805160a05160c051610f7a61013f6000396000818161017e015281816106d6015281816107880152818161085c015281816109c50152610b09015260008181610118015281816101c8015281816102e901528181610430015281816105720152818161064101528181610b910152610c6401526000818160ba0152818161045e0152610c970152610f7a6000f3fe6080604052600436106100745760003560e01c8063a3e7f6dd1161004e578063a3e7f6dd1461013a578063af6c7dbd14610142578063e27af3b91461016c578063f389a86e146101a05761007b565b80631e83409a146100885780637cff82d3146100a857806392c9b9ec146101065761007b565b3661007b57005b361561008657600080fd5b005b34801561009457600080fd5b506100866100a3366004610e40565b6101c4565b3480156100b457600080fd5b506100dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561011257600080fd5b506100dc7f000000000000000000000000000000000000000000000000000000000000000081565b6100866109c3565b34801561014e57600080fd5b50610157610b8a565b604080519283526020830191909152016100fd565b34801561017857600080fd5b506100dc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101ac57600080fd5b506101b660005481565b6040519081526020016100fd565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635e7c75456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102559190610e76565b116102e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f436c61696d65723a207468657265206973206e6f742072657761726420746f2060448201527f636c61696d00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ccb645966040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561034f57600080fd5b505af1925050508015610360575060015b6103ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f436c61696d65723a206e6f742061626c6520746f20636c61696d20726577617260448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016102de565b6040517fdf791e500000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248301524760448301527f0000000000000000000000000000000000000000000000000000000000000000169063df791e509047906064016000604051808303818588803b1580156104a357600080fd5b505af1935050505080156104b5575060015b610541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f436c61696d65723a206e6f742061626c6520746f20636c61696d20726577617260448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016102de565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156105ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f29190610e76565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af19250505080156106c6575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106c391810190610e8f565b60015b6106d2575060006106d4565b505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663662fac396040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561073c57600080fd5b505af192505050801561074d575060015b1561075757436000555b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108089190610e76565b905080156108cb576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c99190610e8f565b505b60008211806108da5750600081115b1561093b576040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018490529081018290527ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e27317439060600160405180910390a1505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f436c61696d65723a206e6f742061626c6520746f20636c61696d20726577617260448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016102de565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190610e76565b341015610b07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f436c61696d65723a20706c656173652073656e6420736f6d6520616d6f756e7460448201527f20746f20656e61626c652074686520636f6e747261637420746f2070726f647560648201527f63652054494d4500000000000000000000000000000000000000000000000000608482015260a4016102de565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a3e7f6dd346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b6f57600080fd5b505af1158015610b83573d6000803e3d6000fd5b5050505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635e7c75456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190610e76565b6040517ff8c7efa700000000000000000000000000000000000000000000000000000000815260006004820181905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116602484015260448301849052929350917f0000000000000000000000000000000000000000000000000000000000000000169063f8c7efa7906064016040805180830381865afa158015610cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d019190610eb1565b509050610d178282670de0b6b3a7640000610d44565b610d3a670de0b6b3a7640000600160005443610d339190610ed5565b9190610d44565b9350935050509091565b6000838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098281108382030391505080600003610d9957838281610d8f57610d8f610f15565b0492505050610e39565b808411610dd2576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b600060208284031215610e5257600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610e3957600080fd5b600060208284031215610e8857600080fd5b5051919050565b600060208284031215610ea157600080fd5b81518015158114610e3957600080fd5b60008060408385031215610ec457600080fd5b505080516020909101519092909150565b81810381811115610f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea264697066735822122085b8566330bd6a30a3f21f9a405e49d3e7545dc1d18da335949e15df3a96f36e64736f6c6343000815003300000000000000000000000057685ddbc1498f7873963cee5c186c7d95d916880000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b000000000000000000000000b46f8a90492d0d03b8c3ab112179c56f89a6f3e0
Deployed Bytecode
0x6080604052600436106100745760003560e01c8063a3e7f6dd1161004e578063a3e7f6dd1461013a578063af6c7dbd14610142578063e27af3b91461016c578063f389a86e146101a05761007b565b80631e83409a146100885780637cff82d3146100a857806392c9b9ec146101065761007b565b3661007b57005b361561008657600080fd5b005b34801561009457600080fd5b506100866100a3366004610e40565b6101c4565b3480156100b457600080fd5b506100dc7f000000000000000000000000b46f8a90492d0d03b8c3ab112179c56f89a6f3e081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561011257600080fd5b506100dc7f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d9168881565b6100866109c3565b34801561014e57600080fd5b50610157610b8a565b604080519283526020830191909152016100fd565b34801561017857600080fd5b506100dc7f0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b81565b3480156101ac57600080fd5b506101b660005481565b6040519081526020016100fd565b60007f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d9168873ffffffffffffffffffffffffffffffffffffffff16635e7c75456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102559190610e76565b116102e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f436c61696d65723a207468657265206973206e6f742072657761726420746f2060448201527f636c61696d00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b7f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d9168873ffffffffffffffffffffffffffffffffffffffff1663ccb645966040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561034f57600080fd5b505af1925050508015610360575060015b6103ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f436c61696d65723a206e6f742061626c6520746f20636c61696d20726577617260448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016102de565b6040517fdf791e500000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d91688811660248301524760448301527f000000000000000000000000b46f8a90492d0d03b8c3ab112179c56f89a6f3e0169063df791e509047906064016000604051808303818588803b1580156104a357600080fd5b505af1935050505080156104b5575060015b610541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f436c61696d65723a206e6f742061626c6520746f20636c61696d20726577617260448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016102de565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d9168873ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156105ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f29190610e76565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529192507f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d916889091169063a9059cbb906044016020604051808303816000875af19250505080156106c6575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526106c391810190610e8f565b60015b6106d2575060006106d4565b505b7f0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b73ffffffffffffffffffffffffffffffffffffffff1663662fac396040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561073c57600080fd5b505af192505050801561074d575060015b1561075757436000555b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b73ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108089190610e76565b905080156108cb576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b169063a9059cbb906044016020604051808303816000875af11580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c99190610e8f565b505b60008211806108da5750600081115b1561093b576040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018490529081018290527ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e27317439060600160405180910390a1505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f436c61696d65723a206e6f742061626c6520746f20636c61696d20726577617260448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016102de565b7f0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b73ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190610e76565b341015610b07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f436c61696d65723a20706c656173652073656e6420736f6d6520616d6f756e7460448201527f20746f20656e61626c652074686520636f6e747261637420746f2070726f647560648201527f63652054494d4500000000000000000000000000000000000000000000000000608482015260a4016102de565b7f0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b73ffffffffffffffffffffffffffffffffffffffff1663a3e7f6dd346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b6f57600080fd5b505af1158015610b83573d6000803e3d6000fd5b5050505050565b60008060007f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d9168873ffffffffffffffffffffffffffffffffffffffff16635e7c75456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190610e76565b6040517ff8c7efa700000000000000000000000000000000000000000000000000000000815260006004820181905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d916888116602484015260448301849052929350917f000000000000000000000000b46f8a90492d0d03b8c3ab112179c56f89a6f3e0169063f8c7efa7906064016040805180830381865afa158015610cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d019190610eb1565b509050610d178282670de0b6b3a7640000610d44565b610d3a670de0b6b3a7640000600160005443610d339190610ed5565b9190610d44565b9350935050509091565b6000838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098281108382030391505080600003610d9957838281610d8f57610d8f610f15565b0492505050610e39565b808411610dd2576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b600060208284031215610e5257600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610e3957600080fd5b600060208284031215610e8857600080fd5b5051919050565b600060208284031215610ea157600080fd5b81518015158114610e3957600080fd5b60008060408385031215610ec457600080fd5b505080516020909101519092909150565b81810381811115610f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea264697066735822122085b8566330bd6a30a3f21f9a405e49d3e7545dc1d18da335949e15df3a96f36e64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d916880000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b000000000000000000000000b46f8a90492d0d03b8c3ab112179c56f89a6f3e0
-----Decoded View---------------
Arg [0] : tupAddress (address): 0x57685Ddbc1498f7873963CEE5C186C7D95D91688
Arg [1] : timeTokenAddress (address): 0x0f8F39B92776D9136408280C7209BeBE4351123B
Arg [2] : timeExchangeAddress (address): 0xb46F8A90492D0d03b8c3ab112179c56F89A6f3e0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000057685ddbc1498f7873963cee5c186c7d95d91688
Arg [1] : 0000000000000000000000000f8f39b92776d9136408280c7209bebe4351123b
Arg [2] : 000000000000000000000000b46f8a90492d0d03b8c3ab112179c56f89a6f3e0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.