Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion snapshots/Hub.Operations.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"refreshPremium": "71999",
"remove: full": "76993",
"remove: partial": "81640",
"reportDeficit": "115225",
"reportDeficit": "115076",
"restore: full": "80471",
"restore: full - with transfer": "173377",
"restore: partial": "89137",
Expand Down
1 change: 0 additions & 1 deletion src/hub/Hub.sol
Original file line number Diff line number Diff line change
Expand Up @@ -886,7 +886,6 @@ contract Hub is IHub, AccessManaged {
uint256 premiumAmountRay
) internal view {
require(spoke.active, SpokeNotActive());
require(!spoke.paused, SpokePaused());
require(drawnAmount > 0 || premiumAmountRay > 0, InvalidAmount());
uint256 drawn = _getSpokeDrawn(asset, spoke);
uint256 premiumRay = _getSpokePremiumRay(asset, spoke);
Expand Down
17 changes: 12 additions & 5 deletions tests/Base.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import {console2 as console} from 'forge-std/console2.sol';

// dependencies
import {AggregatorV3Interface} from 'src/dependencies/chainlink/AggregatorV3Interface.sol';
import {TransparentUpgradeableProxy, ITransparentUpgradeableProxy} from 'src/dependencies/openzeppelin/TransparentUpgradeableProxy.sol';
import {
TransparentUpgradeableProxy,
ITransparentUpgradeableProxy
} from 'src/dependencies/openzeppelin/TransparentUpgradeableProxy.sol';
import {IERC20Metadata} from 'src/dependencies/openzeppelin/IERC20Metadata.sol';
import {SafeCast} from 'src/dependencies/openzeppelin/SafeCast.sol';
import {IERC20Errors} from 'src/dependencies/openzeppelin/IERC20Errors.sol';
Expand Down Expand Up @@ -44,7 +47,11 @@ import {AccessManagerEnumerable} from 'src/access/AccessManagerEnumerable.sol';
import {HubConfigurator, IHubConfigurator} from 'src/hub/HubConfigurator.sol';
import {Hub, IHub, IHubBase} from 'src/hub/Hub.sol';
import {SharesMath} from 'src/hub/libraries/SharesMath.sol';
import {AssetInterestRateStrategy, IAssetInterestRateStrategy, IBasicInterestRateStrategy} from 'src/hub/AssetInterestRateStrategy.sol';
import {
AssetInterestRateStrategy,
IAssetInterestRateStrategy,
IBasicInterestRateStrategy
} from 'src/hub/AssetInterestRateStrategy.sol';

// spoke
import {Spoke, ISpoke, ISpokeBase} from 'src/spoke/Spoke.sol';
Expand Down Expand Up @@ -967,7 +974,7 @@ abstract contract Base is Test {
assertEq(hub.getAssetConfig(assetId), config);
}

function updateReserveFrozenFlag(
function _updateReserveFrozenFlag(
ISpoke spoke,
uint256 reserveId,
bool newFrozenFlag
Expand Down Expand Up @@ -1097,7 +1104,7 @@ abstract contract Base is Test {
assertEq(_getLatestDynamicReserveConfig(spoke, reserveId), config);
}

function updateReserveBorrowableFlag(
function _updateReserveBorrowableFlag(
ISpoke spoke,
uint256 reserveId,
bool newBorrowable
Expand Down Expand Up @@ -1206,7 +1213,7 @@ abstract contract Base is Test {
assertEq(hub.getSpokeConfig(assetId, spoke), spokeConfig);
}

function updateSpokeActive(
function _updateSpokeActive(
IHub hub,
uint256 assetId,
address spoke,
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/Hub/Hub.Add.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ contract HubAddTest is HubBase {
}

function test_add_revertsWith_SpokeNotActive() public {
updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
_updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
vm.startPrank(address(spoke1));
tokenList.dai.transferFrom(alice, address(hub1), 100e18);

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/Hub/Hub.Config.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ contract HubConfigTest is HubBase {
_drawLiquidity(assetId, amount, true);
skip(365 days);

updateSpokeActive(hub1, assetId, _getFeeReceiver(hub1, assetId), false);
_updateSpokeActive(hub1, assetId, _getFeeReceiver(hub1, assetId), false);
IHub.AssetConfig memory config = hub1.getAssetConfig(assetId);
config.feeReceiver = makeAddr('newFeeReceiver');

Expand All @@ -650,7 +650,7 @@ contract HubConfigTest is HubBase {

Utils.mintFeeShares(hub1, assetId, ADMIN);

updateSpokeActive(hub1, assetId, _getFeeReceiver(hub1, assetId), false);
_updateSpokeActive(hub1, assetId, _getFeeReceiver(hub1, assetId), false);
IHub.AssetConfig memory config = hub1.getAssetConfig(assetId);
config.feeReceiver = makeAddr('newFeeReceiver');

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/Hub/Hub.Draw.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ contract HubDrawTest is HubBase {
}

function test_draw_revertsWith_SpokeNotActive() public {
updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
_updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
vm.expectRevert(IHub.SpokeNotActive.selector);
vm.prank(address(spoke1));
hub1.draw(daiAssetId, 100e18, alice);
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/Hub/Hub.EliminateDeficit.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ contract HubEliminateDeficitTest is HubBase {
_createDeficit(_assetId, _coveredSpoke, _deficitAmountRay);
Utils.add(hub1, _assetId, _callerSpoke, _deficitAmountRay.fromRayUp() + 1, alice);

updateSpokeActive(hub1, _assetId, _callerSpoke, true);
_updateSpokeActive(hub1, _assetId, _callerSpoke, true);
_updateSpokePaused(hub1, _assetId, _callerSpoke, true);

vm.prank(_callerSpoke);
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/Hub/Hub.MintFeeShares.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ contract HubMintFeeSharesTest is HubBase {
skipTime: 365 days
});

updateSpokeActive(hub1, daiAssetId, _getFeeReceiver(hub1, daiAssetId), false);
_updateSpokeActive(hub1, daiAssetId, _getFeeReceiver(hub1, daiAssetId), false);
vm.expectRevert(IHub.SpokeNotActive.selector, address(hub1));
Utils.mintFeeShares(hub1, daiAssetId, ADMIN);
}
Expand Down Expand Up @@ -99,7 +99,7 @@ contract HubMintFeeSharesTest is HubBase {
IHub.Asset memory asset = hub1.getAsset(daiAssetId);

// pausing the fee receiver does not revert the action since no shares are minted
updateSpokeActive(hub1, daiAssetId, _getFeeReceiver(hub1, daiAssetId), false);
_updateSpokeActive(hub1, daiAssetId, _getFeeReceiver(hub1, daiAssetId), false);

vm.expectEmit(address(hub1));
emit IHub.UpdateAsset(daiAssetId, asset.drawnIndex, asset.drawnRate, 0);
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/Hub/Hub.PayFee.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ contract HubPayFeeTest is HubBase {
}

function test_payFee_revertsWith_SpokeNotActive() public {
updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
_updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
vm.expectRevert(IHub.SpokeNotActive.selector, address(hub1));
vm.prank(address(spoke1));
hub1.payFeeShares(daiAssetId, 1);
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/Hub/Hub.RefreshPremium.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ contract HubRefreshPremiumTest is HubBase {

function test_refreshPremium_revertsWith_SpokeNotActive() public {
IHubBase.PremiumDelta memory premiumDelta;
updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
_updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
vm.expectRevert(IHub.SpokeNotActive.selector);
vm.prank(address(spoke1));
hub1.refreshPremium(daiAssetId, premiumDelta);
Expand Down Expand Up @@ -166,7 +166,7 @@ contract HubRefreshPremiumTest is HubBase {

/// @dev paused but active spokes are allowed to refresh premium
function test_refreshPremium_pausedSpokesAllowed() public {
updateSpokeActive(hub1, daiAssetId, address(spoke1), true);
_updateSpokeActive(hub1, daiAssetId, address(spoke1), true);
_updateSpokePaused(hub1, daiAssetId, address(spoke1), true);

vm.expectEmit(address(hub1));
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/Hub/Hub.Remove.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ contract HubRemoveTest is HubBase {
}

function test_remove_revertsWith_SpokeNotActive() public {
updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
_updateSpokeActive(hub1, daiAssetId, address(spoke1), false);
vm.expectRevert(IHub.SpokeNotActive.selector);
vm.prank(address(spoke1));
hub1.remove(daiAssetId, 100e18, alice);
Expand Down
26 changes: 25 additions & 1 deletion tests/unit/Hub/Hub.ReportDeficit.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,13 @@ contract HubReportDeficitTest is HubBase {
drawnAmount = bound(drawnAmount, 1, MAX_SUPPLY_AMOUNT);

// draw usdx liquidity to be restored
_drawLiquidity(usdxAssetId, drawnAmount, true, true, address(spoke1));
_drawLiquidity({
assetId: usdxAssetId,
amount: drawnAmount,
withPremium: true,
skipTime: true,
spoke: address(spoke1)
});

(uint256 drawn, uint256 premium) = hub1.getSpokeOwed(usdxAssetId, address(spoke1));
assertGt(drawn, 0);
Expand Down Expand Up @@ -130,6 +136,24 @@ contract HubReportDeficitTest is HubBase {
);
}

/// @dev paused spoke can still report deficit
function test_reportDeficit_paused() public {
// draw usdx liquidity to be restored
_drawLiquidity({
assetId: usdxAssetId,
amount: 1,
withPremium: true,
skipTime: true,
spoke: address(spoke1)
});

_updateSpokePaused(hub1, usdxAssetId, address(spoke1), true);

// even if spoke is paused, it can report deficit
vm.prank(address(spoke1));
hub1.reportDeficit(usdxAssetId, 1, ZERO_PREMIUM_DELTA);
}

function test_reportDeficit_with_premium() public {
uint256 drawnAmount = 10_000e6;
test_reportDeficit_fuzz_with_premium({
Expand Down
Loading
Loading