Skip to content

Commit

Permalink
change impact tolerance, implement isReadyForHardWork, remove getRewa…
Browse files Browse the repository at this point in the history
…rds, change forking block, fixes
  • Loading branch information
a17 committed Mar 3, 2024
1 parent 71ac9d2 commit 0d0a5ea
Show file tree
Hide file tree
Showing 21 changed files with 78 additions and 73 deletions.
1 change: 0 additions & 1 deletion src/core/libs/ConstantsLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
pragma solidity ^0.8.23;

library ConstantsLib {
uint internal constant SWAP_REVENUE_PRICE_IMPACT_TOLERANCE = 3_000;
uint internal constant DENOMINATOR = 100_000;
address internal constant DEAD_ADDRESS = 0xdEad000000000000000000000000000000000000;
}
3 changes: 3 additions & 0 deletions src/interfaces/IStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ interface IStrategy is IERC165 {
/// @return Description in free form
function description() external view returns (string memory);

/// @notice Is HardWork on vault deposits can be enabled
function isHardWorkOnDepositAllowed() external view returns (bool);

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* WRITE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
Expand Down
12 changes: 6 additions & 6 deletions src/strategies/CompoundFarmStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ contract CompoundFarmStrategy is FarmingStrategyBase {
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc IControllable
string public constant VERSION = "1.0.0";
string public constant VERSION = "1.1.0";

// keccak256(abi.encode(uint256(keccak256("erc7201:stability.CompoundFarmStrategy")) - 1)) & ~bytes32(uint256(0xff));
bytes32 private constant COMPOUNDFARMSTRATEGY_STORAGE_LOCATION =
Expand Down Expand Up @@ -97,8 +97,6 @@ contract CompoundFarmStrategy is FarmingStrategyBase {
__assets[0] = _$_._assets[0];
amounts = new uint[](1);
amounts[0] = $.comet.balanceOf(address(this)) - _$_.total;
// just for coverage
_getRewards();
}

/// @inheritdoc IStrategy
Expand Down Expand Up @@ -152,13 +150,15 @@ contract CompoundFarmStrategy is FarmingStrategyBase {
}
}

/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return true;
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* FARMING STRATEGY BASE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc FarmingStrategyBase
function _getRewards() internal view override returns (uint[] memory amounts) {}

/// @inheritdoc IFarmingStrategy
function canFarm() external pure override returns (bool) {
return true;
Expand Down
14 changes: 4 additions & 10 deletions src/strategies/DefiEdgeQuickSwapMerklFarmStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ contract DefiEdgeQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBa
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc IControllable
string public constant VERSION = "1.0.1";
string public constant VERSION = "1.1.0";

address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

Expand Down Expand Up @@ -97,8 +97,6 @@ contract DefiEdgeQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBa
for (uint i; i < len; ++i) {
amounts[i] = StrategyLib.balance(__assets[i]);
}
// just for covergage
_getRewards();
}

/// @inheritdoc IStrategy
Expand Down Expand Up @@ -174,13 +172,9 @@ contract DefiEdgeQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBa
return DQMFLib.generateDescription(farm, $lp.ammAdapter);
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* FARMING STRATEGY BASE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc FarmingStrategyBase
function _getRewards() internal view override returns (uint[] memory amounts) {
// calculated in getRevenue()
/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return false;

Check warning on line 177 in src/strategies/DefiEdgeQuickSwapMerklFarmStrategy.sol

View check run for this annotation

Codecov / codecov/patch

src/strategies/DefiEdgeQuickSwapMerklFarmStrategy.sol#L177

Added line #L177 was not covered by tests
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
Expand Down
14 changes: 4 additions & 10 deletions src/strategies/GammaQuickSwapMerklFarmStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ contract GammaQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc IControllable
string public constant VERSION = "1.0.1";
string public constant VERSION = "1.1.0";

uint internal constant _PRECISION = 1e36;

Expand Down Expand Up @@ -107,8 +107,6 @@ contract GammaQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase
for (uint i; i < len; ++i) {
amounts[i] = StrategyLib.balance(__assets[i]);
}
// just for covergage
_getRewards();
}

/// @inheritdoc IStrategy
Expand Down Expand Up @@ -183,13 +181,9 @@ contract GammaQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase
return _generateDescription(farm, $lp.ammAdapter);
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* FARMING STRATEGY BASE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc FarmingStrategyBase
function _getRewards() internal view override returns (uint[] memory amounts) {
// empty
/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return false;

Check warning on line 186 in src/strategies/GammaQuickSwapMerklFarmStrategy.sol

View check run for this annotation

Codecov / codecov/patch

src/strategies/GammaQuickSwapMerklFarmStrategy.sol#L186

Added line #L186 was not covered by tests
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
Expand Down
14 changes: 4 additions & 10 deletions src/strategies/IchiQuickSwapMerklFarmStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ contract IchiQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase {
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc IControllable
string public constant VERSION = "1.0.1";
string public constant VERSION = "1.1.0";

uint internal constant PRECISION = 10 ** 18;

Expand Down Expand Up @@ -110,8 +110,6 @@ contract IchiQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase {
for (uint i; i < len; ++i) {
amounts[i] = StrategyLib.balance(__assets[i]);
}
// just for covergage
_getRewards();
}

/// @inheritdoc IStrategy
Expand Down Expand Up @@ -167,13 +165,9 @@ contract IchiQuickSwapMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase {
return (shortAddr, true);
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* FARMING STRATEGY BASE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc FarmingStrategyBase
function _getRewards() internal view override returns (uint[] memory amounts) {
// calculated in getRevenue()
/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return false;

Check warning on line 170 in src/strategies/IchiQuickSwapMerklFarmStrategy.sol

View check run for this annotation

Codecov / codecov/patch

src/strategies/IchiQuickSwapMerklFarmStrategy.sol#L170

Added line #L170 was not covered by tests
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
Expand Down
17 changes: 8 additions & 9 deletions src/strategies/IchiRetroMerklFarmStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ contract IchiRetroMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase {
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc IControllable
string public constant VERSION = "1.0.1";
string public constant VERSION = "1.1.0";

uint internal constant PRECISION = 10 ** 18;

Expand Down Expand Up @@ -110,8 +110,6 @@ contract IchiRetroMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase {
for (uint i; i < len; ++i) {
amounts[i] = StrategyLib.balance(__assets[i]);
}
// just for covergage
_getRewards();
}

/// @inheritdoc IStrategy
Expand Down Expand Up @@ -167,13 +165,14 @@ contract IchiRetroMerklFarmStrategy is LPStrategyBase, FarmingStrategyBase {
return (shortAddr, true);
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* FARMING STRATEGY BASE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return false;

Check warning on line 170 in src/strategies/IchiRetroMerklFarmStrategy.sol

View check run for this annotation

Codecov / codecov/patch

src/strategies/IchiRetroMerklFarmStrategy.sol#L170

Added line #L170 was not covered by tests
}

/// @inheritdoc FarmingStrategyBase
function _getRewards() internal view override returns (uint[] memory amounts) {
// calculated in getRevenue()
/// @dev this special method used to fix forge coverage issue
function t() external pure returns (bool) {
return true;
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
Expand Down
20 changes: 11 additions & 9 deletions src/strategies/QuickswapV3StaticFarmStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import "../adapters/libs/AmmAdapterIdLib.sol";
import "../interfaces/ICAmmAdapter.sol";

/// @title Earning QuickSwapV3 farm rewards and swap fees by static liquidity position
/// @dev DEPRECATED - strategy outdated in jan 2024
/// @author Alien Deployer (https://github.com/a17)
/// @author JodsMigel (https://github.com/JodsMigel)
contract QuickSwapV3StaticFarmStrategy is LPStrategyBase, FarmingStrategyBase {
Expand All @@ -25,7 +26,7 @@ contract QuickSwapV3StaticFarmStrategy is LPStrategyBase, FarmingStrategyBase {
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc IControllable
string public constant VERSION = "1.0.2";
string public constant VERSION = "1.1.0";

// keccak256(abi.encode(uint256(keccak256("erc7201:stability.QuickswapV3StaticFarmStrategy")) - 1)) & ~bytes32(uint256(0xff));
bytes32 private constant QUICKSWAPV3STATICFARMSTRATEGY_STORAGE_LOCATION =
Expand Down Expand Up @@ -214,14 +215,9 @@ contract QuickSwapV3StaticFarmStrategy is LPStrategyBase, FarmingStrategyBase {
return QuickswapLib.generateDescription(farm, $lp.ammAdapter);
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* FARMING STRATEGY BASE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @inheritdoc FarmingStrategyBase
function _getRewards() internal view override returns (uint[] memory amounts) {
QuickswapLib.QuickSwapV3StaticFarmStrategyStorage storage $ = _getQuickStaticFarmStorage();
return QuickswapLib.getRewards($._tokenId, $._farmingCenter, _getIncentiveKey());
/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return false;

Check warning on line 220 in src/strategies/QuickswapV3StaticFarmStrategy.sol

View check run for this annotation

Codecov / codecov/patch

src/strategies/QuickswapV3StaticFarmStrategy.sol#L220

Added line #L220 was not covered by tests
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
Expand Down Expand Up @@ -456,4 +452,10 @@ contract QuickSwapV3StaticFarmStrategy is LPStrategyBase, FarmingStrategyBase {
FarmingStrategyBaseStorage storage _$ = _getFarmingStrategyBaseStorage();
QuickswapLib.collectRewardsToState($, _$, tokenId, key);
}

function _getRewards() internal view returns (uint[] memory amounts) {
QuickswapLib.QuickSwapV3StaticFarmStrategyStorage storage $ = _getQuickStaticFarmStorage();
return QuickswapLib.getRewards($._tokenId, $._farmingCenter, _getIncentiveKey());
}

}
9 changes: 1 addition & 8 deletions src/strategies/base/FarmingStrategyBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ abstract contract FarmingStrategyBase is StrategyBase, IFarmingStrategy {
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @dev Version of FarmingStrategyBase implementation
string public constant VERSION_FARMING_STRATEGY_BASE = "1.0.1";
string public constant VERSION_FARMING_STRATEGY_BASE = "1.1.0";

// keccak256(abi.encode(uint256(keccak256("erc7201:stability.FarmingStrategyBase")) - 1)) & ~bytes32(uint256(0xff));
bytes32 private constant FARMINGSTRATEGYBASE_STORAGE_LOCATION =
Expand Down Expand Up @@ -48,13 +48,6 @@ abstract contract FarmingStrategyBase is StrategyBase, IFarmingStrategy {
return _getFarmingStrategyBaseStorage().farmId;
}

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* Must be implemented by derived contracts */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

/// @dev Calculation of rewards available for claim
function _getRewards() internal view virtual returns (uint[] memory amounts);

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* Providing farm data to derived contracts */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
Expand Down
10 changes: 6 additions & 4 deletions src/strategies/libs/LPStrategyLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import "../../interfaces/IRVault.sol";
library LPStrategyLib {
using SafeERC20 for IERC20;

uint internal constant SWAP_ASSETS_PRICE_IMPACT_TOLERANCE = 4_000;

struct ProcessRevenueVars {
string vaultYpe;
uint compoundRatio;
Expand Down Expand Up @@ -134,7 +136,7 @@ library LPStrategyLib {
assets_[exchangeAssetIndex],
vars.bbToken,
exchangeAssetBBAmount,
ConstantsLib.SWAP_REVENUE_PRICE_IMPACT_TOLERANCE
SWAP_ASSETS_PRICE_IMPACT_TOLERANCE
);
}
} else {
Expand All @@ -148,7 +150,7 @@ library LPStrategyLib {
assets_[otherAssetIndex],
vars.bbToken,
otherAssetBBAmount,
ConstantsLib.SWAP_REVENUE_PRICE_IMPACT_TOLERANCE
SWAP_ASSETS_PRICE_IMPACT_TOLERANCE
);
}
} else {
Expand Down Expand Up @@ -209,7 +211,7 @@ library LPStrategyLib {
// swap assets[0] to assets[1]
if (toSwapAsset0 > vars.threshold0) {
vars.swapper.swap(
assets[0], assets[1], toSwapAsset0, ConstantsLib.SWAP_REVENUE_PRICE_IMPACT_TOLERANCE
assets[0], assets[1], toSwapAsset0, SWAP_ASSETS_PRICE_IMPACT_TOLERANCE
);
}
} else if (prop0Pool > 0) {
Expand All @@ -221,7 +223,7 @@ library LPStrategyLib {
// swap assets[1] to assets[0]
if (toSwapAsset1 > vars.threshold1) {
vars.swapper.swap(
assets[1], assets[0], toSwapAsset1, ConstantsLib.SWAP_REVENUE_PRICE_IMPACT_TOLERANCE
assets[1], assets[0], toSwapAsset1, SWAP_ASSETS_PRICE_IMPACT_TOLERANCE
);
}
}
Expand Down
5 changes: 4 additions & 1 deletion src/strategies/libs/StrategyLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ import "../../interfaces/IFarmingStrategy.sol";
library StrategyLib {
using SafeERC20 for IERC20;

/// @dev Reward pools may have low liquidity and 1% fees
uint internal constant SWAP_REWARDS_PRICE_IMPACT_TOLERANCE = 7_000;

struct ExtractFeesVars {
IPlatform platform;
uint feePlatform;
Expand Down Expand Up @@ -157,7 +160,7 @@ library StrategyLib {
for (uint i; i < len; ++i) {
if (rewardAmounts_[i] > swapper.threshold(rewardAssets_[i])) {
swapper.swap(
rewardAssets_[i], exchangeAsset, rewardAmounts_[i], ConstantsLib.SWAP_REVENUE_PRICE_IMPACT_TOLERANCE
rewardAssets_[i], exchangeAsset, rewardAmounts_[i], SWAP_REWARDS_PRICE_IMPACT_TOLERANCE
);
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/test/MockStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ contract MockStrategy is LPStrategyBase {
_depositReturnZero = !_depositReturnZero;
}

/// @inheritdoc IStrategy
function isHardWorkOnDepositAllowed() external pure returns (bool) {
return true;
}

function initVariants(address)
public
pure
Expand Down
1 change: 0 additions & 1 deletion src/test/MockVaultUpgrade.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ contract MockVaultUpgrade is Controllable, ERC20Upgradeable, IVault {
using SafeERC20 for IERC20;

string public constant VERSION = "10.99.99";
address internal constant DEAD_ADDRESS = 0xdEad000000000000000000000000000000000000;

IStrategy public strategy;
uint public maxSupply;
Expand Down
5 changes: 5 additions & 0 deletions test/base/UniversalTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,11 @@ abstract contract UniversalTest is Test, ChainSetup, Utils {
vars.withdrawnUsdValue += balNow * price / 10 ** IERC20Metadata(assets[j]).decimals();
}
assertGe(vars.withdrawnUsdValue, vars.depositUsdValue - vars.depositUsdValue / 1000);

/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* COVERAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
strategy.isHardWorkOnDepositAllowed();
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion test/base/chains/PolygonSetup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ abstract contract PolygonSetup is ChainSetup {
constructor() {
vm.selectFork(vm.createFork(vm.envString("POLYGON_RPC_URL")));
// vm.rollFork(48098000); // Sep-01-2023 03:23:25 PM +UTC
vm.rollFork(51800000); // Jan-01-2024 02:33:32 AM +UTC
// vm.rollFork(51800000); // Jan-01-2024 02:33:32 AM +UTC
vm.rollFork(54000000); // Feb-27-2024 12:56:05 AM +UTC
}

function testPolygonSetupStub() external {}
Expand Down
1 change: 1 addition & 0 deletions test/core/Vault.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ contract VaultTest is Test, FullMockSetup {
strategy.getRevenue();
strategy.description();
strategy.initVariants(address(0));
strategy.isHardWorkOnDepositAllowed();
}

function testDepositWithdrawHardWork() public {
Expand Down
2 changes: 1 addition & 1 deletion test/strategies/DQMF.Polygon.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ contract DefiEdgeQuickSwapMerklFarmStrategyTest is PolygonSetup, UniversalTest {
address internal constant USD = address(840);

constructor() {
vm.rollFork(52400000); // Jan-16-2024 05:22:08 PM +UTC
// vm.rollFork(52400000); // Jan-16-2024 05:22:08 PM +UTC
}

function testDQMF() public universalTest {
Expand Down
File renamed without changes.
Loading

0 comments on commit 0d0a5ea

Please sign in to comment.