Skip to content

Commit a0ed475

Browse files
authored
fix: retain active/paused flag on old feeReceiver (#967)
1 parent f1672e8 commit a0ed475

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

src/hub/Hub.sol

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ contract Hub is IHub, AccessManaged {
140140
require(irData.length == 0, InvalidInterestRateStrategy());
141141
}
142142

143-
if (asset.feeReceiver != config.feeReceiver) {
144-
_updateSpokeConfig(
145-
assetId,
146-
asset.feeReceiver,
147-
SpokeConfig({addCap: 0, drawCap: 0, riskPremiumThreshold: 0, active: true, paused: false})
148-
);
143+
address oldFeeReceiver = asset.feeReceiver;
144+
if (oldFeeReceiver != config.feeReceiver) {
145+
IHub.SpokeConfig memory spokeConfig;
146+
spokeConfig.active = _spokes[assetId][oldFeeReceiver].active;
147+
spokeConfig.paused = _spokes[assetId][oldFeeReceiver].paused;
148+
_updateSpokeConfig(assetId, oldFeeReceiver, spokeConfig);
149149
asset.feeReceiver = config.feeReceiver;
150150
_addFeeReceiver(assetId, config.feeReceiver);
151151
}

tests/unit/Hub/Hub.Config.t.sol

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,11 +425,27 @@ contract HubConfigTest is HubBase {
425425
uint256 liquidity = hub1.getAssetLiquidity(assetId);
426426
(uint256 drawn, ) = hub1.getAssetOwed(assetId);
427427

428+
address oldFeeReceiver = _getFeeReceiver(hub1, assetId);
429+
IHub.SpokeConfig memory oldFeeReceiverConfig = hub1.getSpokeConfig(assetId, oldFeeReceiver);
430+
428431
// new spoke is added only if it is different from the old one and not yet listed
429432
if (
430433
newConfig.feeReceiver != _getFeeReceiver(hub1, assetId) &&
431434
!hub1.isSpokeListed(assetId, newConfig.feeReceiver)
432435
) {
436+
vm.expectEmit(address(hub1));
437+
emit IHub.UpdateSpokeConfig(
438+
assetId,
439+
oldFeeReceiver,
440+
IHub.SpokeConfig({
441+
active: oldFeeReceiverConfig.active,
442+
paused: oldFeeReceiverConfig.paused,
443+
addCap: 0,
444+
drawCap: 0,
445+
riskPremiumThreshold: 0
446+
})
447+
);
448+
433449
vm.expectEmit(address(hub1));
434450
emit IHub.AddSpoke(assetId, newConfig.feeReceiver);
435451
vm.expectEmit(address(hub1));
@@ -530,6 +546,45 @@ contract HubConfigTest is HubBase {
530546
assertEq(spokeConfig.drawCap, 0, 'old fee receiver draw cap');
531547
}
532548

549+
/// Updates the fee receiver to a new spoke; old fee receiver active/paused flags are preserved
550+
function test_updateAssetConfig_oldFeeReceiver_flags() public {
551+
_test_updateAssetConfig_oldFeeReceiver_flags({active: true, paused: true});
552+
_test_updateAssetConfig_oldFeeReceiver_flags({active: true, paused: false});
553+
_test_updateAssetConfig_oldFeeReceiver_flags({active: false, paused: true});
554+
_test_updateAssetConfig_oldFeeReceiver_flags({active: false, paused: false});
555+
}
556+
557+
function _test_updateAssetConfig_oldFeeReceiver_flags(bool active, bool paused) internal {
558+
uint256 assetId = _randomAssetId(hub1);
559+
560+
address oldFeeReceiver = _getFeeReceiver(hub1, assetId);
561+
IHub.SpokeConfig memory oldFeeReceiverConfig = hub1.getSpokeConfig(assetId, oldFeeReceiver);
562+
oldFeeReceiverConfig.active = active;
563+
oldFeeReceiverConfig.paused = paused;
564+
565+
// update old fee receiver config flags
566+
Utils.updateSpokeConfig(hub1, ADMIN, assetId, oldFeeReceiver, oldFeeReceiverConfig);
567+
assertEq(hub1.getSpokeConfig(assetId, oldFeeReceiver).active, active);
568+
assertEq(hub1.getSpokeConfig(assetId, oldFeeReceiver).paused, paused);
569+
570+
// update asset config to new fee receiver; old fee receiver paused/active flags should be unchanged
571+
IHub.AssetConfig memory config = hub1.getAssetConfig(assetId);
572+
config.feeReceiver = makeAddr('newFeeReceiver');
573+
test_updateAssetConfig_fuzz(assetId, config);
574+
575+
assertEq(_getFeeReceiver(hub1, assetId), config.feeReceiver, 'new fee receiver');
576+
assertEq(
577+
hub1.getSpokeConfig(assetId, oldFeeReceiver).active,
578+
active,
579+
'old fee receiver active'
580+
);
581+
assertEq(
582+
hub1.getSpokeConfig(assetId, oldFeeReceiver).paused,
583+
paused,
584+
'old fee receiver paused'
585+
);
586+
}
587+
533588
/// Updates the fee receiver by reusing a previously assigned spoke, with no impact on accrued fees
534589
function test_updateAssetConfig_fuzz_ReuseFeeReceiver_revertsWith_SpokeAlreadyListed(
535590
uint256 assetId

0 commit comments

Comments
 (0)