Skip to content

Commit bd8b09d

Browse files
committed
feat: notify module on boost config changes
1 parent 06cf683 commit bd8b09d

6 files changed

Lines changed: 79 additions & 6 deletions

File tree

src/ERC20LockBoostProvider.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ contract ERC20LockBoostProvider is Initializable, AccessControlEnumerableUpgrade
108108
}
109109

110110
emit LockBoostStepsSet(steps);
111+
META_REGISTRY.notifyWeightBoostProviderConfigChanged();
111112
}
112113

113114
/// @inheritdoc IERC20LockBoostProvider

src/MetaRegistry.sol

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ contract MetaRegistry is IMetaRegistry, Initializable, AccessControlEnumerableUp
152152

153153
$.bondCurveWeight[curveId] = weight;
154154
emit BondCurveWeightSet(curveId, weight);
155-
MODULE.requestFullDepositInfoUpdate();
155+
_requestFullDepositInfoUpdate();
156156
}
157157

158158
/// @inheritdoc IMetaRegistry
@@ -176,6 +176,7 @@ contract MetaRegistry is IMetaRegistry, Initializable, AccessControlEnumerableUp
176176
});
177177
$.weightBoostProviderIdByAddress[providerAddr] = providerId;
178178
emit WeightBoostProviderAdded(providerAddr, mode);
179+
_requestFullDepositInfoUpdate();
179180
}
180181

181182
/// @inheritdoc IMetaRegistry
@@ -193,6 +194,7 @@ contract MetaRegistry is IMetaRegistry, Initializable, AccessControlEnumerableUp
193194

194195
entry.enabled = enabled;
195196
emit WeightBoostProviderEnabledSet(providerAddr, enabled);
197+
_requestFullDepositInfoUpdate();
196198
}
197199

198200
/// @inheritdoc IMetaRegistry
@@ -214,6 +216,7 @@ contract MetaRegistry is IMetaRegistry, Initializable, AccessControlEnumerableUp
214216
--$.weightBoostProvidersCount;
215217

216218
emit WeightBoostProviderRemoved(providerAddr);
219+
_requestFullDepositInfoUpdate();
217220
}
218221

219222
/// @inheritdoc IMetaRegistry
@@ -230,6 +233,18 @@ contract MetaRegistry is IMetaRegistry, Initializable, AccessControlEnumerableUp
230233
_refreshGroupWeights(groupId);
231234
}
232235

236+
/// @inheritdoc IMetaRegistry
237+
function notifyWeightBoostProviderConfigChanged() external {
238+
MetaRegistryStorage storage $ = _storage();
239+
uint256 providerId = $.weightBoostProviderIdByAddress[msg.sender];
240+
if (providerId == 0) return;
241+
242+
if (!$.weightBoostProviders[providerId].enabled) return;
243+
244+
emit WeightBoostProviderConfigChanged(msg.sender);
245+
_requestFullDepositInfoUpdate();
246+
}
247+
233248
/// @inheritdoc IMetaRegistry
234249
function notifyWeightBoostChanged(uint256 nodeOperatorId) external {
235250
MetaRegistryStorage storage $ = _storage();
@@ -522,6 +537,10 @@ contract MetaRegistry is IMetaRegistry, Initializable, AccessControlEnumerableUp
522537
MODULE.notifyNodeOperatorWeightChange(nodeOperatorId, oldWeight, newWeight);
523538
}
524539

540+
function _requestFullDepositInfoUpdate() internal {
541+
MODULE.requestFullDepositInfoUpdate();
542+
}
543+
525544
function _storeOperatorMetadata(uint256 nodeOperatorId, OperatorMetadata memory metadata) internal {
526545
if (bytes(metadata.name).length > MAX_NAME_LENGTH) revert OperatorNameTooLong();
527546
if (bytes(metadata.description).length > MAX_DESCRIPTION_LENGTH) revert OperatorDescriptionTooLong();

src/interfaces/IERC20LockBoostProvider.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ interface IERC20LockBoostProvider is IWeightBoostProvider {
7878
/// @param steps Ordered lock amount thresholds with boost in basis points.
7979
/// @dev Each step applies from minAmount inclusive until the next step minAmount.
8080
/// Existing weights are not refreshed by this call;
81-
/// refresh affected operators explicitly in MetaRegistry.
81+
/// a full deposit info update is requested via MetaRegistry.
8282
/// Disable the boost provider in MetaRegistry to turn off the configured boosts.
8383
function setLockBoostSteps(LockBoostStep[] calldata steps) external;
8484

src/interfaces/IMetaRegistry.sol

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ interface IMetaRegistry {
5050
event WeightBoostProviderAdded(address indexed provider, WeightBoostProviderMode mode);
5151
event WeightBoostProviderRemoved(address indexed provider);
5252
event WeightBoostProviderEnabledSet(address indexed provider, bool enabled);
53+
event WeightBoostProviderConfigChanged(address indexed provider);
5354
event GroupWeightsRefreshed(uint256 indexed groupId);
5455
event OperatorMetadataSet(uint256 indexed nodeOperatorId, OperatorMetadata metadata);
5556
event NodeOperatorEffectiveWeightChanged(uint256 indexed nodeOperatorId, uint256 oldWeight, uint256 newWeight);
@@ -184,22 +185,22 @@ interface IMetaRegistry {
184185

185186
/// @notice Add a weight boost provider.
186187
/// @dev Adding a provider is expected to be a rare operation and does not refresh cached weights automatically.
187-
/// Affected groups must be refreshed asynchronously via refreshGroupWeights().
188+
/// A full deposit info update is requested and affected groups must be refreshed asynchronously.
188189
/// Added providers are enabled by default.
189190
/// @param provider Boost provider consumed during weight calculation.
190191
/// @param mode Provider aggregation mode.
191192
function addWeightBoostProvider(IWeightBoostProvider provider, WeightBoostProviderMode mode) external;
192193

193194
/// @notice Enable or disable a weight boost provider.
194195
/// @dev Enabling or disabling a provider does not refresh cached weights automatically.
195-
/// Affected groups must be refreshed asynchronously via refreshGroupWeights().
196+
/// A full deposit info update is requested and affected groups must be refreshed asynchronously.
196197
/// @param provider Boost provider to update.
197198
/// @param enabled Whether the provider should participate in weight calculations.
198199
function setWeightBoostProviderEnabled(IWeightBoostProvider provider, bool enabled) external;
199200

200201
/// @notice Remove a weight boost provider.
201202
/// @dev Removing a provider is expected to be a rare operation and does not refresh cached weights automatically.
202-
/// Affected groups must be refreshed asynchronously via refreshGroupWeights().
203+
/// A full deposit info update is requested and affected groups must be refreshed asynchronously.
203204
/// @param provider Boost provider to remove.
204205
function removeWeightBoostProvider(IWeightBoostProvider provider) external;
205206

@@ -236,10 +237,15 @@ interface IMetaRegistry {
236237
/// @notice Trigger the group weight update routine in the registry.
237238
/// @param groupId Operator group ID to trigger the update for.
238239
/// @dev Use this after asynchronous provider configuration changes such as addWeightBoostProvider(),
239-
/// setWeightBoostProviderEnabled(), and removeWeightBoostProvider().
240+
/// notifyWeightBoostProviderConfigChanged(), setWeightBoostProviderEnabled(), and removeWeightBoostProvider().
240241
function refreshGroupWeights(uint256 groupId) external;
241242

242243
/// @notice Notify the registry that a configured provider changed a node operator boost.
243244
/// @param nodeOperatorId Node operator ID whose provider boost changed.
244245
function notifyWeightBoostChanged(uint256 nodeOperatorId) external;
246+
247+
/// @notice Notify the registry that a configured provider changed global boost parameters.
248+
/// @dev Requests a full deposit info update when the sender is an enabled provider.
249+
/// Unregistered or disabled providers are ignored since cached weights do not depend on them.
250+
function notifyWeightBoostProviderConfigChanged() external;
245251
}

test/unit/ERC20LockBoostProvider.t.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,10 @@ contract ERC20LockBoostProviderAdminTest is ERC20LockBoostProviderBaseTest {
409409

410410
vm.expectEmit(address(provider));
411411
emit IERC20LockBoostProvider.LockBoostStepsSet(steps);
412+
vm.expectCall(
413+
address(registry),
414+
abi.encodeWithSelector(IMetaRegistry.notifyWeightBoostProviderConfigChanged.selector)
415+
);
412416
vm.prank(admin);
413417
provider.setLockBoostSteps(steps);
414418

test/unit/MetaRegistry.t.sol

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,7 @@ contract MetaRegistryWeightBoostProviderTest is MetaRegistryGroupsBaseTest {
11231123

11241124
provider.mock_setBoostBP(0, 1000);
11251125

1126+
vm.expectCall(address(module), abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector));
11261127
vm.expectEmit(address(registry));
11271128
emit IMetaRegistry.WeightBoostProviderAdded(address(provider), NODE_OPERATOR_MODE);
11281129
vm.prank(admin);
@@ -1156,6 +1157,7 @@ contract MetaRegistryWeightBoostProviderTest is MetaRegistryGroupsBaseTest {
11561157
secondProvider.mock_setBoostBP(0, 1000);
11571158
secondProvider.mock_setBoostBP(1, 2000);
11581159

1160+
vm.expectCall(address(module), abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector));
11591161
vm.expectEmit(address(registry));
11601162
emit IMetaRegistry.WeightBoostProviderAdded(address(secondProvider), GROUP_MAX_MODE);
11611163
vm.prank(admin);
@@ -1206,6 +1208,7 @@ contract MetaRegistryWeightBoostProviderTest is MetaRegistryGroupsBaseTest {
12061208
assertEq(registry.getNodeOperatorWeight(0), 11000);
12071209

12081210
vm.startPrank(admin);
1211+
vm.expectCall(address(module), abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector));
12091212
vm.expectEmit(address(registry));
12101213
emit IMetaRegistry.WeightBoostProviderRemoved(address(provider));
12111214
registry.removeWeightBoostProvider(provider);
@@ -1258,6 +1261,7 @@ contract MetaRegistryWeightBoostProviderTest is MetaRegistryGroupsBaseTest {
12581261
registry.refreshGroupWeights(groupId);
12591262
assertEq(registry.getNodeOperatorWeight(0), 11000);
12601263

1264+
vm.expectCall(address(module), abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector));
12611265
vm.expectEmit(address(registry));
12621266
emit IMetaRegistry.WeightBoostProviderEnabledSet(address(provider), false);
12631267
vm.prank(admin);
@@ -1283,6 +1287,7 @@ contract MetaRegistryWeightBoostProviderTest is MetaRegistryGroupsBaseTest {
12831287
_createGroup(_subOperatorsArr1(0, MAX_BP), _extOperatorsArr0());
12841288
assertEq(registry.getNodeOperatorWeight(0), CURVE_WEIGHT);
12851289

1290+
vm.expectCall(address(module), abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector));
12861291
vm.expectEmit(address(registry));
12871292
emit IMetaRegistry.WeightBoostProviderEnabledSet(address(provider), true);
12881293
vm.prank(admin);
@@ -1367,6 +1372,44 @@ contract MetaRegistryWeightBoostProviderTest is MetaRegistryGroupsBaseTest {
13671372
assertEq(registry.getNodeOperatorWeight(0), CURVE_WEIGHT);
13681373
}
13691374

1375+
function test_notifyWeightBoostProviderConfigChanged_RequestsFullDepositInfoUpdate() public {
1376+
vm.prank(admin);
1377+
registry.addWeightBoostProvider(provider, NODE_OPERATOR_MODE);
1378+
1379+
vm.expectCall(address(module), abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector));
1380+
vm.expectEmit(address(registry));
1381+
emit IMetaRegistry.WeightBoostProviderConfigChanged(address(provider));
1382+
vm.prank(address(provider));
1383+
registry.notifyWeightBoostProviderConfigChanged();
1384+
}
1385+
1386+
function test_notifyWeightBoostProviderConfigChanged_NoOpWhenProviderNotFound() public {
1387+
vm.mockCallRevert(
1388+
address(module),
1389+
abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector),
1390+
abi.encode("UNEXPECTED_REQUEST_FULL_DEPOSIT_INFO_UPDATE")
1391+
);
1392+
1393+
vm.prank(address(provider));
1394+
registry.notifyWeightBoostProviderConfigChanged();
1395+
}
1396+
1397+
function test_notifyWeightBoostProviderConfigChanged_NoOpWhenProviderDisabled() public {
1398+
vm.startPrank(admin);
1399+
registry.addWeightBoostProvider(provider, NODE_OPERATOR_MODE);
1400+
registry.setWeightBoostProviderEnabled(provider, false);
1401+
vm.stopPrank();
1402+
1403+
vm.mockCallRevert(
1404+
address(module),
1405+
abi.encodeWithSelector(IBaseModule.requestFullDepositInfoUpdate.selector),
1406+
abi.encode("UNEXPECTED_REQUEST_FULL_DEPOSIT_INFO_UPDATE")
1407+
);
1408+
1409+
vm.prank(address(provider));
1410+
registry.notifyWeightBoostProviderConfigChanged();
1411+
}
1412+
13701413
function test_createAndUpdateGroup_RecalculatesGroupMaxFromComposition() public {
13711414
_setBondCurveWeight(0, CURVE_WEIGHT);
13721415
provider.mock_setBoostBP(0, 1000);

0 commit comments

Comments
 (0)