@@ -43,6 +43,7 @@ contract Hub is IHub, AccessManaged {
4343 mapping (uint256 assetId = > Asset) internal _assets;
4444 mapping (uint256 assetId = > mapping (address spoke = > SpokeData)) internal _spokes;
4545 mapping (uint256 assetId = > EnumerableSet.AddressSet) internal _assetToSpokes;
46+ EnumerableSet.AddressSet internal _underlyingAssets;
4647
4748 /// @dev Constructor.
4849 /// @dev The authority contract must implement the `AccessManaged` interface for access control.
@@ -67,6 +68,7 @@ contract Hub is IHub, AccessManaged {
6768 MIN_ALLOWED_UNDERLYING_DECIMALS <= decimals && decimals <= MAX_ALLOWED_UNDERLYING_DECIMALS,
6869 InvalidAssetDecimals ()
6970 );
71+ require (! _underlyingAssets.contains (underlying), UnderlyingAlreadyListed ());
7072
7173 uint256 assetId = _assetCount++ ;
7274 IBasicInterestRateStrategy (irStrategy).setInterestRateData (assetId, irData);
@@ -100,6 +102,7 @@ contract Hub is IHub, AccessManaged {
100102 feeReceiver: feeReceiver,
101103 liquidityFee: 0
102104 });
105+ _underlyingAssets.add (underlying);
103106 _addFeeReceiver (assetId, feeReceiver);
104107
105108 emit AddAsset (assetId, underlying, decimals);
@@ -202,23 +205,26 @@ contract Hub is IHub, AccessManaged {
202205 }
203206
204207 /// @inheritdoc IHubBase
205- function add (uint256 assetId , uint256 amount , address from ) external returns (uint256 ) {
208+ function add (uint256 assetId , uint256 amount ) external returns (uint256 ) {
206209 Asset storage asset = _assets[assetId];
207210 SpokeData storage spoke = _spokes[assetId][msg .sender ];
208211
209212 asset.accrue ();
210- _validateAdd (asset, spoke, amount, from );
213+ _validateAdd (asset, spoke, amount);
211214
215+ uint256 liquidity = asset.liquidity + amount;
216+ require (
217+ asset.underlying.balanceOf (address (this )) >= liquidity,
218+ InsufficientLiquidity (liquidity)
219+ );
212220 uint120 shares = asset.toAddedSharesDown (amount).toUint120 ();
213221 require (shares > 0 , InvalidShares ());
214222 asset.addedShares += shares;
215223 spoke.addedShares += shares;
216- asset.liquidity += amount .toUint120 ();
224+ asset.liquidity = liquidity .toUint120 ();
217225
218226 asset.updateDrawnRate (assetId);
219227
220- asset.underlying.safeTransferFrom (from, address (this ), amount);
221-
222228 emit Add (assetId, msg .sender , shares, amount);
223229
224230 return shares;
@@ -279,25 +285,27 @@ contract Hub is IHub, AccessManaged {
279285 uint256 assetId ,
280286 uint256 drawnAmount ,
281287 uint256 premiumAmount ,
282- PremiumDelta calldata premiumDelta ,
283- address from
288+ PremiumDelta calldata premiumDelta
284289 ) external returns (uint256 ) {
285290 Asset storage asset = _assets[assetId];
286291 SpokeData storage spoke = _spokes[assetId][msg .sender ];
287292
288293 asset.accrue ();
289- _validateRestore (asset, spoke, drawnAmount, premiumAmount, from );
294+ _validateRestore (asset, spoke, drawnAmount, premiumAmount);
290295
291296 uint120 drawnShares = asset.toDrawnSharesDown (drawnAmount).toUint120 ();
292297 asset.drawnShares -= drawnShares;
293298 spoke.drawnShares -= drawnShares;
294299 _applyPremiumDelta (asset, spoke, premiumDelta, premiumAmount);
295- uint256 totalAmount = drawnAmount + premiumAmount;
296- asset.liquidity += totalAmount.toUint120 ();
297300
298- asset.updateDrawnRate (assetId);
301+ uint256 liquidity = asset.liquidity + drawnAmount + premiumAmount;
302+ require (
303+ asset.underlying.balanceOf (address (this )) >= liquidity,
304+ InsufficientLiquidity (liquidity)
305+ );
306+ asset.liquidity = liquidity.toUint120 ();
299307
300- asset.underlying. safeTransferFrom (from, address ( this ), totalAmount );
308+ asset.updateDrawnRate (assetId );
301309
302310 emit Restore (assetId, msg .sender , drawnShares, premiumDelta, drawnAmount, premiumAmount);
303311
@@ -441,6 +449,11 @@ contract Hub is IHub, AccessManaged {
441449 emit Reclaim (assetId, msg .sender , amount);
442450 }
443451
452+ /// @inheritdoc IHub
453+ function isUnderlyingListed (address underlying ) external view returns (bool ) {
454+ return _underlyingAssets.contains (underlying);
455+ }
456+
444457 /// @inheritdoc IHub
445458 function getAssetCount () external view returns (uint256 ) {
446459 return _assetCount;
@@ -776,10 +789,8 @@ contract Hub is IHub, AccessManaged {
776789 function _validateAdd (
777790 Asset storage asset ,
778791 SpokeData storage spoke ,
779- uint256 amount ,
780- address from
792+ uint256 amount
781793 ) internal view {
782- require (from != address (this ), InvalidAddress ());
783794 require (amount > 0 , InvalidAmount ());
784795 require (spoke.active, SpokeNotActive ());
785796 require (! spoke.paused, SpokePaused ());
@@ -823,10 +834,8 @@ contract Hub is IHub, AccessManaged {
823834 Asset storage asset ,
824835 SpokeData storage spoke ,
825836 uint256 drawnAmount ,
826- uint256 premiumAmount ,
827- address from
837+ uint256 premiumAmount
828838 ) internal view {
829- require (from != address (this ), InvalidAddress ());
830839 require (drawnAmount + premiumAmount > 0 , InvalidAmount ());
831840 require (spoke.active, SpokeNotActive ());
832841 require (! spoke.paused, SpokePaused ());
0 commit comments