Skip to content

Commit ab98181

Browse files
feat: Check from in hub.add (#402)
* fix: check from in hub.add * feat: update gas snapshots * fix: test * fix: comments * fix: comments * Update tests/unit/LiquidityHub/LiquidityHub.Supply.t.sol Co-authored-by: miguelmtz <[email protected]> * fix: tests --------- Co-authored-by: miguelmtz <[email protected]>
1 parent d39185f commit ab98181

File tree

7 files changed

+34
-21
lines changed

7 files changed

+34
-21
lines changed

snapshots/Hub.Operations.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"add": "186415",
2+
"add": "186460",
33
"draw": "122714",
44
"remove: full": "79984",
55
"remove: partial": "96270",

snapshots/Spoke.Operations.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
"borrow": "481646",
33
"repay: full": "221830",
44
"repay: partial": "290042",
5-
"supply: 0 debt, collateralDisabled": "171802",
6-
"supply: 0 debt, collateralEnabled": "171778",
7-
"supply: 1 debt": "171826",
8-
"supply: 2 debt": "171837",
9-
"supply: 3 debt": "171790",
5+
"supply: 0 debt, collateralDisabled": "171847",
6+
"supply: 0 debt, collateralEnabled": "171823",
7+
"supply: 1 debt": "171871",
8+
"supply: 2 debt": "171882",
9+
"supply: 3 debt": "171835",
1010
"updateUserRiskPremium": "172555",
1111
"updateUserRiskPremium: 2 debts": "213546",
1212
"usingAsCollateral": "50661",

src/contracts/LiquidityHub.sol

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ contract LiquidityHub is ILiquidityHub {
114114
DataTypes.SpokeData storage spoke = _spokes[assetId][msg.sender];
115115

116116
asset.accrue();
117-
_validateSupply(asset, spoke, amount);
117+
_validateSupply(asset, spoke, amount, from);
118118

119119
asset.updateBorrowRate({liquidityAdded: amount, liquidityTaken: 0});
120120

@@ -387,9 +387,11 @@ contract LiquidityHub is ILiquidityHub {
387387
function _validateSupply(
388388
DataTypes.Asset storage asset,
389389
DataTypes.SpokeData storage spoke,
390-
uint256 amount
390+
uint256 amount,
391+
address from
391392
) internal view {
392393
require(amount != 0, InvalidSupplyAmount());
394+
require(from != address(this), InvalidAddFromHub());
393395
require(asset.config.active, AssetNotActive());
394396
require(!asset.config.paused, AssetPaused());
395397
require(!asset.config.frozen, AssetFrozen());

src/interfaces/ILiquidityHub.sol

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ interface ILiquidityHub {
2020
uint256 supplyCap
2121
);
2222

23-
event DrawnIndexUpdate(
24-
uint256 indexed assetId,
25-
uint256 drawnIndex,
26-
uint256 lastUpdateTimestamp
27-
);
23+
event DrawnIndexUpdate(uint256 indexed assetId, uint256 drawnIndex, uint256 lastUpdateTimestamp);
2824
event Add(
2925
uint256 indexed assetId,
3026
address indexed spoke,
@@ -60,6 +56,7 @@ interface ILiquidityHub {
6056
error MismatchedConfigs();
6157
error InvalidSharesAmount();
6258
error InvalidSupplyAmount();
59+
error InvalidAddFromHub();
6360
error AssetNotListed();
6461
error AssetNotActive();
6562
error SupplyCapExceeded(uint256 supplyCap);

tests/unit/LiquidityHub/LiquidityHub.Supply.t.sol

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,19 +311,26 @@ contract LiquidityHubSupplyTest is LiquidityHubBase {
311311
}
312312

313313
/// @dev User makes a first supply, shares and assets amounts are correct, no precision loss
314-
function test_supply_fuzz_single_asset(uint256 assetId, uint256 amount) public {
314+
function test_supply_fuzz_single_asset(uint256 assetId, address user, uint256 amount) public {
315+
vm.assume(user != address(0) && user != address(hub));
316+
315317
assetId = bound(assetId, 0, hub.assetCount() - 2); // Exclude duplicated DAI
316318
amount = bound(amount, 1, MAX_SUPPLY_AMOUNT);
317319

318320
uint256 expectedSupplyShares = hub.convertToSuppliedShares(daiAssetId, amount);
319321
IERC20 asset = hub.assetsList(assetId);
322+
323+
deal(address(asset), user, MAX_SUPPLY_AMOUNT);
324+
vm.prank(user);
325+
asset.approve(address(hub), amount);
326+
320327
vm.expectEmit(address(asset));
321-
emit IERC20.Transfer(alice, address(hub), amount);
328+
emit IERC20.Transfer(user, address(hub), amount);
322329
vm.expectEmit(address(hub));
323330
emit ILiquidityHub.Add(assetId, address(spoke1), amount, amount);
324331

325332
vm.prank(address(spoke1));
326-
hub.add(assetId, amount, alice);
333+
hub.add(assetId, amount, user);
327334

328335
// hub
329336
assertEq(hub.getAssetSuppliedAmount(assetId), amount, 'hub asset suppliedAmount after');
@@ -344,7 +351,7 @@ contract LiquidityHubSupplyTest is LiquidityHubBase {
344351
);
345352
assertEq(hub.getAsset(assetId).lastUpdateTimestamp, vm.getBlockTimestamp());
346353
// token balance
347-
assertEq(asset.balanceOf(alice), MAX_SUPPLY_AMOUNT - amount, 'user token balance post-supply');
354+
assertEq(asset.balanceOf(user), MAX_SUPPLY_AMOUNT - amount, 'user token balance post-supply');
348355
assertEq(asset.balanceOf(address(spoke1)), 0, 'spoke token balance post-supply');
349356
assertEq(asset.balanceOf(address(hub)), amount, 'hub token balance post-supply');
350357
}
@@ -508,6 +515,13 @@ contract LiquidityHubSupplyTest is LiquidityHubBase {
508515
hub.add(daiAssetId, supplyAmount, alice);
509516
}
510517

518+
function test_supply_revertsWith_InvalidAddFromHub() public {
519+
vm.expectRevert(ILiquidityHub.InvalidAddFromHub.selector, address(hub));
520+
521+
vm.prank(address(spoke1));
522+
hub.add(daiAssetId, 100e18, address(hub));
523+
}
524+
511525
function test_supply_with_increased_index() public {
512526
uint256 daiAmount = 100e18;
513527

tests/unit/Spoke/Spoke.Repay.Scenario.t.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,7 +1308,7 @@ contract SpokeRepayScenarioTest is SpokeBase {
13081308
address caller,
13091309
uint256 assets
13101310
) public {
1311-
vm.assume(caller != address(0));
1311+
vm.assume(caller != address(0) && caller != address(hub));
13121312
reserveId = bound(reserveId, 0, spoke1.reserveCount() - 1);
13131313
userBorrowing = bound(userBorrowing, 0, MAX_SUPPLY_AMOUNT / 2 - 1); // Allow some buffer from borrow cap
13141314
skipTime = uint40(bound(skipTime, 0, MAX_SKIP_TIME));
@@ -1361,7 +1361,7 @@ contract SpokeRepayScenarioTest is SpokeBase {
13611361
uint256 assets
13621362
) public {
13631363
uint256 MAX_BORROW_AMOUNT = MAX_SUPPLY_AMOUNT / 2;
1364-
vm.assume(caller != address(0));
1364+
vm.assume(caller != address(0) && caller != address(hub));
13651365
reserveId = bound(reserveId, 0, spoke1.reserveCount() - 1);
13661366
userBorrowing = bound(userBorrowing, 0, MAX_BORROW_AMOUNT - 2); // Allow some buffer from borrow cap
13671367
skipTime = uint40(bound(skipTime, 0, MAX_SKIP_TIME));

tests/unit/Spoke/Spoke.Withdraw.Scenario.t.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ contract SpokeWithdrawScenarioTest is SpokeBase {
306306
address caller,
307307
uint256 assets
308308
) public {
309-
vm.assume(caller != address(0));
309+
vm.assume(caller != address(0) && caller != address(hub));
310310
reserveId = bound(reserveId, 0, spoke1.reserveCount() - 1);
311311
protocolStartingBalance = bound(protocolStartingBalance, 1, MAX_SUPPLY_AMOUNT - 1); // Allow some buffer from supply cap
312312
assets = bound(assets, 1, MAX_SUPPLY_AMOUNT - protocolStartingBalance);
@@ -353,7 +353,7 @@ contract SpokeWithdrawScenarioTest is SpokeBase {
353353
address caller,
354354
uint256 assets
355355
) public {
356-
vm.assume(caller != address(0));
356+
vm.assume(caller != address(0) && caller != address(hub));
357357
reserveId = bound(reserveId, 0, spoke1.reserveCount() - 1);
358358
protocolStartingBalance = bound(protocolStartingBalance, 1, MAX_SUPPLY_AMOUNT - 1); // Allow some buffer from supply cap
359359
assets = bound(assets, 1, MAX_SUPPLY_AMOUNT - protocolStartingBalance);

0 commit comments

Comments
 (0)