52 lines
1.7 KiB
Solidity
52 lines
1.7 KiB
Solidity
// SPDX-License-Identifier: AGPL-3.0-only
|
|
pragma solidity ^0.8.0;
|
|
|
|
import "./Timer.sol";
|
|
|
|
/**
|
|
* @title Base class that provides time overrides, but only if being run in test mode.
|
|
*/
|
|
abstract contract Testable {
|
|
// If the contract is being run in production, then `timerAddress` will be the 0x0 address.
|
|
// Note: this variable should be set on construction and never modified.
|
|
address public timerAddress;
|
|
|
|
/**
|
|
* @notice Constructs the Testable contract. Called by child contracts.
|
|
* @param _timerAddress Contract that stores the current time in a testing environment.
|
|
* Must be set to 0x0 for production environments that use live time.
|
|
*/
|
|
constructor(address _timerAddress) {
|
|
timerAddress = _timerAddress;
|
|
}
|
|
|
|
/**
|
|
* @notice Reverts if not running in test mode.
|
|
*/
|
|
modifier onlyIfTest {
|
|
require(timerAddress != address(0x0));
|
|
_;
|
|
}
|
|
|
|
/**
|
|
* @notice Sets the current time.
|
|
* @dev Will revert if not running in test mode.
|
|
* @param time timestamp to set current Testable time to.
|
|
*/
|
|
function setCurrentTime(uint256 time) external onlyIfTest {
|
|
Timer(timerAddress).setCurrentTime(time);
|
|
}
|
|
|
|
/**
|
|
* @notice Gets the current time. Will return the last time set in `setCurrentTime` if running in test mode.
|
|
* Otherwise, it will return the block timestamp.
|
|
* @return uint for the current Testable timestamp.
|
|
*/
|
|
function getCurrentTime() public view virtual returns (uint256) {
|
|
if (timerAddress != address(0x0)) {
|
|
return Timer(timerAddress).getCurrentTime();
|
|
} else {
|
|
return block.timestamp; // solhint-disable-line not-rely-on-time
|
|
}
|
|
}
|
|
} |