@@ -263,7 +263,7 @@ contract Hub is IHub, AccessManaged {
263263 uint128 drawnShares = previewRestoreByAssets (assetId, drawnAmount).toUint128 ();
264264 asset.drawnShares -= drawnShares;
265265 spoke.drawnShares -= drawnShares;
266- _applyPremiumDelta (asset, spoke, premiumDelta, premiumAmount);
266+ _applyPremiumDelta (assetId, asset, spoke, premiumDelta, premiumAmount);
267267 uint256 totalAmount = drawnAmount + premiumAmount;
268268 asset.liquidity += totalAmount.toUint128 ();
269269
@@ -293,7 +293,7 @@ contract Hub is IHub, AccessManaged {
293293 uint128 drawnShares = previewRestoreByAssets (assetId, drawnAmount).toUint128 ();
294294 asset.drawnShares -= drawnShares;
295295 spoke.drawnShares -= drawnShares;
296- _applyPremiumDelta (asset, spoke, premiumDelta, premiumAmount);
296+ _applyPremiumDelta (assetId, asset, spoke, premiumDelta, premiumAmount);
297297 uint256 totalDeficitAmount = drawnAmount + premiumAmount;
298298 asset.deficit += totalDeficitAmount.toUint128 ();
299299
@@ -335,7 +335,7 @@ contract Hub is IHub, AccessManaged {
335335 asset.accrue (assetId, _spokes[assetId][asset.feeReceiver]);
336336
337337 // no premium change allowed
338- _applyPremiumDelta (asset, spoke, premiumDelta, 0 );
338+ _applyPremiumDelta (assetId, asset, spoke, premiumDelta, 0 );
339339
340340 emit RefreshPremium (assetId, msg .sender , premiumDelta);
341341 }
@@ -522,12 +522,13 @@ contract Hub is IHub, AccessManaged {
522522 }
523523
524524 function getSpokeOwed (uint256 assetId , address spoke ) external view returns (uint256 , uint256 ) {
525- return _getSpokeOwed (_spokes[assetId][spoke], assetId);
525+ DataTypes.SpokeData storage spokeData = _spokes[assetId][spoke];
526+ return (_getSpokeDrawn (spokeData, assetId), _getSpokePremium (spokeData, assetId));
526527 }
527528
528529 function getSpokeTotalOwed (uint256 assetId , address spoke ) external view returns (uint256 ) {
529- ( uint256 drawn , uint256 premium ) = _getSpokeOwed ( _spokes[assetId][spoke], assetId) ;
530- return drawn + premium ;
530+ DataTypes.SpokeData storage spokeData = _spokes[assetId][spoke];
531+ return _getSpokeDrawn (spokeData, assetId) + _getSpokePremium (spokeData, assetId) ;
531532 }
532533
533534 function getAssetAddedAmount (uint256 assetId ) external view returns (uint256 ) {
@@ -603,15 +604,17 @@ contract Hub is IHub, AccessManaged {
603604
604605 /**
605606 * @dev Applies premium deltas on asset and spoke owed, and validates that total premium
606- * cannot decrease by more than `premiumAmount`.
607+ * and spoke premium cannot decrease by more than `premiumAmount`.
607608 */
608609 function _applyPremiumDelta (
610+ uint256 assetId ,
609611 DataTypes.Asset storage asset ,
610612 DataTypes.SpokeData storage spoke ,
611613 DataTypes.PremiumDelta calldata premium ,
612614 uint256 premiumAmount
613615 ) internal {
614- uint256 premiumBefore = asset.premium ();
616+ uint256 assetPremiumBefore = asset.premium ();
617+ uint256 spokePremiumBefore = _getSpokePremium (spoke, assetId);
615618
616619 asset.premiumShares = asset.premiumShares.add (premium.sharesDelta).toUint128 ();
617620 asset.premiumOffset = asset.premiumOffset.add (premium.offsetDelta).toUint128 ();
@@ -622,7 +625,9 @@ contract Hub is IHub, AccessManaged {
622625 spoke.realizedPremium = spoke.realizedPremium.add (premium.realizedDelta).toUint128 ();
623626
624627 // can increase due to precision loss on premium (drawn unchanged)
625- require (asset.premium () + premiumAmount - premiumBefore <= 2 , InvalidPremiumChange ());
628+ require (asset.premium () + premiumAmount - assetPremiumBefore <= 2 , InvalidPremiumChange ());
629+ uint256 spokePremiumAfter = _getSpokePremium (spoke, assetId);
630+ require (spokePremiumAfter + premiumAmount - spokePremiumBefore <= 2 , InvalidPremiumChange ());
626631 }
627632
628633 function _transferShares (
@@ -637,16 +642,20 @@ contract Hub is IHub, AccessManaged {
637642 receiver.addedShares += shares.toUint128 ();
638643 }
639644
640- function _getSpokeOwed (
645+ function _getSpokeDrawn (
646+ DataTypes.SpokeData storage spoke ,
647+ uint256 assetId
648+ ) internal view returns (uint256 ) {
649+ return previewRestoreByShares (assetId, spoke.drawnShares);
650+ }
651+
652+ function _getSpokePremium (
641653 DataTypes.SpokeData storage spoke ,
642654 uint256 assetId
643- ) internal view returns (uint256 , uint256 ) {
655+ ) internal view returns (uint256 ) {
644656 uint256 accruedPremium = previewRestoreByShares (assetId, spoke.premiumShares) -
645657 spoke.premiumOffset;
646- return (
647- previewRestoreByShares (assetId, spoke.drawnShares),
648- spoke.realizedPremium + accruedPremium
649- );
658+ return spoke.realizedPremium + accruedPremium;
650659 }
651660
652661 function _validateAdd (
@@ -691,7 +700,8 @@ contract Hub is IHub, AccessManaged {
691700 require (amount > 0 , InvalidAmount ());
692701 require (spoke.active, SpokeNotActive ());
693702 uint256 drawCap = spoke.drawCap;
694- (uint256 drawn , uint256 premium ) = _getSpokeOwed (spoke, assetId);
703+ uint256 drawn = _getSpokeDrawn (spoke, assetId);
704+ uint256 premium = _getSpokePremium (spoke, assetId);
695705 require (
696706 drawCap == Constants.MAX_CAP || drawCap * 10 ** asset.decimals >= drawn + premium + amount,
697707 DrawCapExceeded (drawCap)
@@ -708,7 +718,8 @@ contract Hub is IHub, AccessManaged {
708718 require (from != address (this ), InvalidAddress ());
709719 require (drawnAmount + premiumAmount > 0 , InvalidAmount ());
710720 require (spoke.active, SpokeNotActive ());
711- (uint256 drawn , uint256 premium ) = _getSpokeOwed (spoke, assetId);
721+ uint256 drawn = _getSpokeDrawn (spoke, assetId);
722+ uint256 premium = _getSpokePremium (spoke, assetId);
712723 require (drawnAmount <= drawn, SurplusAmountRestored (drawn));
713724 require (premiumAmount <= premium, SurplusAmountRestored (premium));
714725 }
@@ -721,7 +732,8 @@ contract Hub is IHub, AccessManaged {
721732 ) internal view {
722733 require (spoke.active, SpokeNotActive ());
723734 require (drawnAmount + premiumAmount > 0 , InvalidAmount ());
724- (uint256 drawn , uint256 premium ) = _getSpokeOwed (spoke, assetId);
735+ uint256 drawn = _getSpokeDrawn (spoke, assetId);
736+ uint256 premium = _getSpokePremium (spoke, assetId);
725737 require (drawnAmount <= drawn, SurplusDeficitReported (drawn));
726738 require (premiumAmount <= premium, SurplusDeficitReported (premium));
727739 }
0 commit comments