Source Code
Multichain Info
Latest 25 from a total of 62 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 43115488 | 166 days ago | IN | 0 CELO | 0.10750533 | ||||
| Claim | 43113875 | 166 days ago | IN | 0 CELO | 0.11012183 | ||||
| Claim | 30251703 | 352 days ago | IN | 0 CELO | 0.04062714 | ||||
| Claim | 29251253 | 410 days ago | IN | 0 CELO | 0.04327069 | ||||
| Claim | 29099994 | 419 days ago | IN | 0 CELO | 0.04323685 | ||||
| Claim | 28982021 | 426 days ago | IN | 0 CELO | 0.04376935 | ||||
| Claim | 28975208 | 426 days ago | IN | 0 CELO | 0.05847134 | ||||
| Claim | 28965241 | 427 days ago | IN | 0 CELO | 0.05734856 | ||||
| Claim | 28928220 | 429 days ago | IN | 0 CELO | 0.05757588 | ||||
| Claim | 28810301 | 436 days ago | IN | 0 CELO | 0.0578339 | ||||
| Claim | 28327481 | 464 days ago | IN | 0 CELO | 0.05794912 | ||||
| Claim | 28250362 | 468 days ago | IN | 0 CELO | 0.04765293 | ||||
| Claim | 28220024 | 470 days ago | IN | 0 CELO | 0.04344638 | ||||
| Claim | 28134802 | 475 days ago | IN | 0 CELO | 0.0584965 | ||||
| Claim | 27764724 | 496 days ago | IN | 0 CELO | 0.05760391 | ||||
| Claim | 27453863 | 514 days ago | IN | 0 CELO | 0.04268007 | ||||
| Claim | 26613937 | 563 days ago | IN | 0 CELO | 0.04325193 | ||||
| Claim | 26408180 | 575 days ago | IN | 0 CELO | 0.04314985 | ||||
| Claim | 26351692 | 578 days ago | IN | 0 CELO | 0.04323774 | ||||
| Claim | 26252971 | 584 days ago | IN | 0 CELO | 0.06076821 | ||||
| Claim | 25830734 | 608 days ago | IN | 0 CELO | 0.06092629 | ||||
| Claim | 25714044 | 615 days ago | IN | 0 CELO | 0.04308098 | ||||
| Claim | 25713989 | 615 days ago | IN | 0 CELO | 0.04457265 | ||||
| Claim | 25630198 | 620 days ago | IN | 0 CELO | 0.04445765 | ||||
| Claim | 25628588 | 620 days ago | IN | 0 CELO | 0.04437295 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 43115488 | 166 days ago | 0.00051909 CELO | ||||
| 43115488 | 166 days ago | 0.00051909 CELO | ||||
| 43113875 | 166 days ago | 0.00000923 CELO | ||||
| 43113875 | 166 days ago | 0.00000923 CELO | ||||
| 30251703 | 352 days ago | 0.0001502 CELO | ||||
| 30251703 | 352 days ago | 0.0001502 CELO | ||||
| 29502740 | 396 days ago | 0.00008405 CELO | ||||
| 29502740 | 396 days ago | 0.00008405 CELO | ||||
| 29295034 | 408 days ago | 0.00005235 CELO | ||||
| 29295034 | 408 days ago | 0.00005235 CELO | ||||
| 29251253 | 410 days ago | 0.0000036 CELO | ||||
| 29251253 | 410 days ago | 0.0000036 CELO | ||||
| 29099994 | 419 days ago | 0.00000002 CELO | ||||
| 29099994 | 419 days ago | 0.00000002 CELO | ||||
| 28982021 | 426 days ago | 0.00069609 CELO | ||||
| 28982021 | 426 days ago | 0.00069609 CELO | ||||
| 28975208 | 426 days ago | 0.00010013 CELO | ||||
| 28975208 | 426 days ago | 0.00010013 CELO | ||||
| 28965241 | 427 days ago | 0.00072748 CELO | ||||
| 28965241 | 427 days ago | 0.00072748 CELO | ||||
| 28928220 | 429 days ago | 0 CELO | ||||
| 28928220 | 429 days ago | 0 CELO | ||||
| 28810301 | 436 days ago | 0 CELO | ||||
| 28810301 | 436 days ago | 0 CELO | ||||
| 28327481 | 464 days ago | 0.00038623 CELO |
Cross-Chain Transactions
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
Contract ABI
API[{"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
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.