From 2efc4da95964e84b45bdd3f2a638737f66726481 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Thu, 5 Sep 2024 16:57:12 -0700 Subject: [PATCH 1/8] delete sweep assets and integrate token transfer into redeem repo tokens --- src/Strategy.sol | 42 ++++++++---------------------------------- 1 file changed, 8 insertions(+), 34 deletions(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index cb3a4860..04cecd94 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -652,16 +652,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { (cumulativeAmount + liquidBalance); } - /** - * @notice Deposits all available asset tokens into the liquid vault - * - * @dev This function transfers the entire balance of the asset token held by this contract - * into the associated liquid vault. - */ - function _sweepAsset() private { - YEARN_VAULT.deposit(IERC20(asset).balanceOf(address(this)), address(this)); - } - /** * @notice Checks if a term contract is marked as deployed in either the current or previous term controller * @param termContract The address of the term contract to check @@ -689,36 +679,26 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { * optimizing asset allocation. */ function _redeemRepoTokens(uint256 liquidAmountRequired) private { - uint256 liquidityBefore = IERC20(asset).balanceOf(address(this)); - // Remove completed auction offers - termAuctionListData.removeCompleted( - repoTokenListData, - discountRateAdapter, - address(asset) - ); + termAuctionListData.removeCompleted(repoTokenListData, discountRateAdapter, address(asset)); // Remove and redeem matured repoTokens repoTokenListData.removeAndRedeemMaturedTokens(); - uint256 liquidityAfter = IERC20(asset).balanceOf(address(this)); - uint256 liquidityDiff = liquidityAfter - liquidityBefore; + uint256 liquidity = IERC20(asset).balanceOf(address(this)); // Deposit excess underlying balance into Yearn Vault - if (liquidityDiff > liquidAmountRequired) { + if (liquidity > liquidAmountRequired) { unchecked { - YEARN_VAULT.deposit( - liquidityDiff - liquidAmountRequired, - address(this) - ); + YEARN_VAULT.deposit(liquidity - liquidAmountRequired, address(this)); } - // Withdraw shortfall from Yearn Vault to meet required liquidity - } else if (liquidityDiff < liquidAmountRequired) { + // Withdraw shortfall from Yearn Vault to meet required liquidity + } else if (liquidity < liquidAmountRequired) { unchecked { - _withdrawAsset(liquidAmountRequired - liquidityDiff); + _withdrawAsset(liquidAmountRequired - liquidity); } } - } +} /*////////////////////////////////////////////////////////////// STRATEGIST FUNCTIONS @@ -801,7 +781,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { ); // Sweep assets, redeem matured repoTokens and ensure liquid balances up to date - _sweepAsset(); _redeemRepoTokens(0); bytes32 offerId = _generateOfferId(idHash, address(offerLocker)); @@ -962,7 +941,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { ); // Sweep any remaining assets and redeem repoTokens - _sweepAsset(); _redeemRepoTokens(0); } @@ -983,7 +961,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { * @notice Close the auction */ function auctionClosed() external { - _sweepAsset(); _redeemRepoTokens(0); } @@ -1017,7 +994,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { ); // Sweep assets and redeem repoTokens, if needed - _sweepAsset(); _redeemRepoTokens(0); // Retrieve total liquid balance and ensure it's greater than zero @@ -1127,7 +1103,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { revert DepositPaused(); } - _sweepAsset(); _redeemRepoTokens(0); } @@ -1184,7 +1159,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { whenNotPaused returns (uint256 _totalAssets) { - _sweepAsset(); _redeemRepoTokens(0); return _totalAssetValue(_totalLiquidBalance()); } From 916b05d54f782342f97db6d9fddefe84380227e9 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 18:27:56 -0700 Subject: [PATCH 2/8] miscellaneous audit fixes --- src/RepoTokenList.sol | 2 +- src/RepoTokenUtils.sol | 34 ---------------- src/Strategy.sol | 52 +++++------------------- src/TermAuctionList.sol | 7 ++-- src/TermVaultEventEmitter.sol | 1 + src/interfaces/term/ITermVaultEvents.sol | 2 + src/periphery/StrategyAprOracle.sol | 2 +- 7 files changed, 19 insertions(+), 81 deletions(-) diff --git a/src/RepoTokenList.sol b/src/RepoTokenList.sol index 1767a323..4339d388 100644 --- a/src/RepoTokenList.sol +++ b/src/RepoTokenList.sol @@ -324,7 +324,7 @@ library RepoTokenList { (redemptionTimestamp, purchaseToken, , collateralManager) = repoToken.config(); // Validate purchase token - if (purchaseToken != address(asset)) { + if (purchaseToken != asset) { revert InvalidRepoToken(address(repoToken)); } diff --git a/src/RepoTokenUtils.sol b/src/RepoTokenUtils.sol index 1376f403..6ed920d4 100644 --- a/src/RepoTokenUtils.sol +++ b/src/RepoTokenUtils.sol @@ -12,40 +12,6 @@ library RepoTokenUtils { uint256 public constant THREESIXTY_DAYCOUNT_SECONDS = 360 days; uint256 public constant RATE_PRECISION = 1e18; - /*////////////////////////////////////////////////////////////// - PURE FUNCTIONS - //////////////////////////////////////////////////////////////*/ - - /** - * @notice Convert repoToken amount to purchase token precision - * @param repoTokenPrecision The precision of the repoToken - * @param purchaseTokenPrecision The precision of the purchase token - * @param purchaseTokenAmountInRepoPrecision The amount of purchase token in repoToken precision - * @return The amount in purchase token precision - */ - function repoToPurchasePrecision( - uint256 repoTokenPrecision, - uint256 purchaseTokenPrecision, - uint256 purchaseTokenAmountInRepoPrecision - ) internal pure returns (uint256) { - return (purchaseTokenAmountInRepoPrecision * purchaseTokenPrecision) / repoTokenPrecision; - } - - /** - * @notice Convert purchase token amount to repoToken precision - * @param repoTokenPrecision The precision of the repoToken - * @param purchaseTokenPrecision The precision of the purchase token - * @param repoTokenAmount The amount of repoToken - * @return The amount in repoToken precision - */ - function purchaseToRepoPrecision( - uint256 repoTokenPrecision, - uint256 purchaseTokenPrecision, - uint256 repoTokenAmount - ) internal pure returns (uint256) { - return (repoTokenAmount * repoTokenPrecision) / purchaseTokenPrecision; - } - /*////////////////////////////////////////////////////////////// VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ diff --git a/src/Strategy.sol b/src/Strategy.sol index 57e41094..8741c3d4 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -53,6 +53,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { IERC4626 public immutable YEARN_VAULT; /// @notice State variables + bool public depositLock; /// @dev Previous term controller ITermController public prevTermController; /// @dev Current term controller @@ -62,10 +63,9 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { TermAuctionListData internal termAuctionListData; uint256 public timeToMaturityThreshold; // seconds uint256 public requiredReserveRatio; // 1e18 - uint256 public discountRateMarkup; // 1e18 (TODO: check this) + uint256 public discountRateMarkup; // 1e18 uint256 public repoTokenConcentrationLimit; // 1e18 mapping(address => bool) public repoTokenBlacklist; - bool public depositLock; modifier notBlacklisted(address repoToken) { if (repoTokenBlacklist[repoToken]) { @@ -344,7 +344,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { uint256 proceeds; if (repoToken != address(0)) { if (!_isTermDeployed(repoToken)) { - revert RepoTokenList.InvalidRepoToken(address(repoToken)); + revert RepoTokenList.InvalidRepoToken(repoToken); } uint256 redemptionTimestamp = repoTokenListData.validateRepoToken( @@ -743,7 +743,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { revert InvalidTermAuction(address(termAuction)); } if (!_isTermDeployed(repoToken)) { - revert RepoTokenList.InvalidRepoToken(address(repoToken)); + revert RepoTokenList.InvalidRepoToken(repoToken); } require(termAuction.termRepoId() == ITermRepoToken(repoToken).termRepoId(), "repoToken does not match term repo ID"); @@ -976,7 +976,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { } /** - * @notice Close the auction + * @notice Required for post-processing after auction clos */ function auctionClosed() external { _sweepAsset(); @@ -1001,7 +1001,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { // Make sure repo token is valid and deployed by Term if (!_isTermDeployed(repoToken)) { - revert RepoTokenList.InvalidRepoToken(address(repoToken)); + revert RepoTokenList.InvalidRepoToken(repoToken); } // Validate and insert the repoToken into the list, retrieve auction rate and redemption timestamp @@ -1101,6 +1101,11 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { discountRateAdapter = ITermDiscountRateAdapter(_discountRateAdapter); IERC20(_asset).safeApprove(_yearnVault, type(uint256).max); + + timeToMaturityThreshold = 45 days; + requiredReserveRatio = 0.2e18; + discountRateMarkup = 0.005e18; + repoTokenConcentrationLimit = 0.1e18; } /*////////////////////////////////////////////////////////////// @@ -1213,38 +1218,6 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { return _totalLiquidBalance(); } - /** - * @notice Gets the max amount of `asset` that an address can deposit. - * @dev Defaults to an unlimited amount for any address. But can - * be overridden by strategists. - * - * This function will be called before any deposit or mints to enforce - * any limits desired by the strategist. This can be used for either a - * traditional deposit limit or for implementing a whitelist etc. - * - * EX: - * if(isAllowed[_owner]) return super.availableDepositLimit(_owner); - * - * This does not need to take into account any conversion rates - * from shares to assets. But should know that any non max uint256 - * amounts may be converted to shares. So it is recommended to keep - * custom amounts low enough as not to cause overflow when multiplied - * by `totalSupply`. - * - * @param . The address that is depositing into the strategy. - * @return . The available amount the `_owner` can deposit in terms of `asset` - * - function availableDepositLimit( - address _owner - ) public view override returns (uint256) { - TODO: If desired Implement deposit limit logic and any needed state variables . - - EX: - uint256 totalAssets = TokenizedStrategy.totalAssets(); - return totalAssets >= depositLimit ? 0 : depositLimit - totalAssets; - } - */ - /** * @dev Optional function for strategist to override that can * be called in between reports. @@ -1300,12 +1273,9 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { * @param _amount The amount of asset to attempt to free. * function _emergencyWithdraw(uint256 _amount) internal override { - TODO: If desired implement simple logic to free deployed funds. - EX: _amount = min(_amount, aToken.balanceOf(address(this))); _freeFunds(_amount); } - */ } diff --git a/src/TermAuctionList.sol b/src/TermAuctionList.sol index 672b3b75..17564a41 100644 --- a/src/TermAuctionList.sol +++ b/src/TermAuctionList.sol @@ -210,7 +210,7 @@ library TermAuctionList { removeNode = true; bytes32[] memory offerIds = new bytes32[](1); offerIds[0] = current; - offer.offerLocker.unlockOffers(offerIds); // unlocking offer in this scenario withdraws offer ammount + offer.offerLocker.unlockOffers(offerIds); // unlocking offer in this scenario withdraws offer amount } } @@ -226,7 +226,6 @@ library TermAuctionList { } if (insertRepoToken) { - // TODO: do we need to validate termDeployed(repoToken) here? // Auction still open => include offerAmount in totalValue // (otherwise locked purchaseToken will be missing from TV) @@ -286,7 +285,7 @@ library TermAuctionList { // Handle new or unseen repo tokens /// @dev offer processed, but auctionClosed not yet called and auction is new so repoToken not on List and wont be picked up /// checking repoTokendiscountRates to make sure we are not double counting on re-openings - if (offer.termAuction.auctionCompleted() && repoTokenListData.discountRates[offer.repoToken] == 0) { + if (repoTokenListData.discountRates[offer.repoToken] == 0 && offer.termAuction.auctionCompleted()) { if (!offer.isRepoTokenSeen) { uint256 repoTokenAmountInBaseAssetPrecision = RepoTokenUtils.getNormalizedRepoTokenAmount( offer.repoToken, @@ -355,7 +354,7 @@ library TermAuctionList { // Handle new repo tokens or reopening auctions /// @dev offer processed, but auctionClosed not yet called and auction is new so repoToken not on List and wont be picked up /// checking repoTokendiscountRates to make sure we are not double counting on re-openings - if (offer.termAuction.auctionCompleted() && repoTokenListData.discountRates[offer.repoToken] == 0) { + if (repoTokenListData.discountRates[offer.repoToken] == 0 && offer.termAuction.auctionCompleted()) { // use normalized repoToken amount if repoToken is not in the list if (!offer.isRepoTokenSeen) { offerAmount = RepoTokenUtils.getNormalizedRepoTokenAmount( diff --git a/src/TermVaultEventEmitter.sol b/src/TermVaultEventEmitter.sol index 84240332..d5716c36 100644 --- a/src/TermVaultEventEmitter.sol +++ b/src/TermVaultEventEmitter.sol @@ -33,6 +33,7 @@ contract TermVaultEventEmitter is Initializable, UUPSUpgradeable, AccessControlU function pairVaultContract(address vaultContract) external onlyRole(ADMIN_ROLE){ _grantRole(VAULT_CONTRACT, vaultContract); + emit VaultContractPaired(vaultContract); } function emitTermControllerUpdated(address oldController, address newController) external onlyRole(VAULT_CONTRACT) { diff --git a/src/interfaces/term/ITermVaultEvents.sol b/src/interfaces/term/ITermVaultEvents.sol index 5ebb1076..c7ec9e79 100644 --- a/src/interfaces/term/ITermVaultEvents.sol +++ b/src/interfaces/term/ITermVaultEvents.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.18; interface ITermVaultEvents { + event VaultContractPaired(address vault); + event TermControllerUpdated(address oldController, address newController); event TimeToMaturityThresholdUpdated(uint256 oldThreshold, uint256 newThreshold); diff --git a/src/periphery/StrategyAprOracle.sol b/src/periphery/StrategyAprOracle.sol index 1c0bfb8f..96d0f8ab 100644 --- a/src/periphery/StrategyAprOracle.sol +++ b/src/periphery/StrategyAprOracle.sol @@ -28,7 +28,7 @@ contract StrategyAprOracle is AprOracleBase { function aprAfterDebtChange( address _strategy, int256 _delta - ) external view override returns (uint256) { + ) external pure override returns (uint256) { // TODO: Implement any necessary logic to return the most accurate // APR estimation for the strategy. return 1e17; From eca56c444d732f3222b7e7c1cb85886bf81fd5b1 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 19:06:59 -0700 Subject: [PATCH 3/8] cache total asset value --- src/Strategy.sol | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index 57e41094..3c0c6645 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -545,7 +545,12 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { * @param liquidBalanceToRemove The amount of liquid balance to be removed from the strategy * * @dev This function calculates the concentration ratio of the specified repoToken - * and compares it against the predefined concentration limit. It reverts with a + * and compares it against the simulatedRepoTokenConcentrationRatio = _getRepoTokenConcentrationRatio( + repoToken, + repoTokenAmountInBaseAssetPrecision, + _totalAssetValue(liquidBalance), + proceeds + );predefined concentration limit. It reverts with a * RepoTokenConcentrationTooHigh error if the concentration exceeds the limit. */ function _validateRepoTokenConcentration( @@ -830,9 +835,11 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { // Retrieve the total liquid balance uint256 liquidBalance = _totalLiquidBalance(); + uint256 totalAssetValue = _totalAssetValue(liquidBalance); + uint256 liquidReserveRatio = totalAssetValue == 0 ? 0 : liquidBalance * 1e18 / totalAssetValue; // Check that new offer does not violate reserve ratio constraint - if (_liquidReserveRatio(liquidBalance) < requiredReserveRatio) { + if (liquidReserveRatio < requiredReserveRatio) { revert BalanceBelowRequiredReserveRatio(); } @@ -850,7 +857,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { } // Passing in 0 amount and 0 liquid balance adjustment because offer and balance already updated - _validateRepoTokenConcentration(repoToken, 0, _totalAssetValue(liquidBalance), 0); + _validateRepoTokenConcentration(repoToken, 0, totalAssetValue, 0); } /** @@ -1016,9 +1023,11 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { _sweepAsset(); _redeemRepoTokens(0); - // Retrieve total liquid balance and ensure it's greater than zero + // Retrieve total asset value and liquid balance and ensure they are greater than zero uint256 liquidBalance = _totalLiquidBalance(); require(liquidBalance > 0); + uint256 totalAssetValue = _totalAssetValue(liquidBalance); + require(totalAssetValue > 0); // Calculate the repoToken amount in base asset precision uint256 repoTokenPrecision = 10 ** ERC20(repoToken).decimals(); @@ -1052,8 +1061,8 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { } // Ensure the remaining liquid balance is above the liquidity threshold - uint256 newLiquidBalance = liquidBalance - proceeds; - if (_liquidReserveRatio(newLiquidBalance) < requiredReserveRatio) { + uint256 newLiquidReserveRatio = ( liquidBalance - proceeds ) * 1e18 / totalAssetValue; + if (newLiquidReserveRatio < requiredReserveRatio) { revert BalanceBelowRequiredReserveRatio(); } @@ -1061,7 +1070,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { _validateRepoTokenConcentration( repoToken, repoTokenAmountInBaseAssetPrecision, - _totalAssetValue(liquidBalance), + totalAssetValue, proceeds ); From 9316f4debaea2357aa48bc330b24d816b3d5bcf1 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 19:08:41 -0700 Subject: [PATCH 4/8] docs error --- src/Strategy.sol | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index 3c0c6645..d3128228 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -545,12 +545,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { * @param liquidBalanceToRemove The amount of liquid balance to be removed from the strategy * * @dev This function calculates the concentration ratio of the specified repoToken - * and compares it against the simulatedRepoTokenConcentrationRatio = _getRepoTokenConcentrationRatio( - repoToken, - repoTokenAmountInBaseAssetPrecision, - _totalAssetValue(liquidBalance), - proceeds - );predefined concentration limit. It reverts with a + * and compares it against the predefined concentration limit. It reverts with a * RepoTokenConcentrationTooHigh error if the concentration exceeds the limit. */ function _validateRepoTokenConcentration( From 6c266ac4bda5bb9a7dcda8d65ca19820489fc7f3 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 19:10:43 -0700 Subject: [PATCH 5/8] require total asset value > 0 in submitAuctionOffer --- src/Strategy.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index d3128228..429f9262 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -831,7 +831,8 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { // Retrieve the total liquid balance uint256 liquidBalance = _totalLiquidBalance(); uint256 totalAssetValue = _totalAssetValue(liquidBalance); - uint256 liquidReserveRatio = totalAssetValue == 0 ? 0 : liquidBalance * 1e18 / totalAssetValue; + require(totalAssetValue > 0); + uint256 liquidReserveRatio = liquidBalance * 1e18 / totalAssetValue; // NOTE: we require totalAssetValue > 0 above // Check that new offer does not violate reserve ratio constraint if (liquidReserveRatio < requiredReserveRatio) { @@ -1056,7 +1057,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { } // Ensure the remaining liquid balance is above the liquidity threshold - uint256 newLiquidReserveRatio = ( liquidBalance - proceeds ) * 1e18 / totalAssetValue; + uint256 newLiquidReserveRatio = ( liquidBalance - proceeds ) * 1e18 / totalAssetValue; // note we require totalAssetValue > 0 above if (newLiquidReserveRatio < requiredReserveRatio) { revert BalanceBelowRequiredReserveRatio(); } From 90298bf84bd9b173eeb5dbfc1c629a7315d0b808 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 19:11:42 -0700 Subject: [PATCH 6/8] align comments --- src/Strategy.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index 429f9262..71fc9c00 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -1057,7 +1057,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { } // Ensure the remaining liquid balance is above the liquidity threshold - uint256 newLiquidReserveRatio = ( liquidBalance - proceeds ) * 1e18 / totalAssetValue; // note we require totalAssetValue > 0 above + uint256 newLiquidReserveRatio = ( liquidBalance - proceeds ) * 1e18 / totalAssetValue; // NOTE: we require totalAssetValue > 0 above if (newLiquidReserveRatio < requiredReserveRatio) { revert BalanceBelowRequiredReserveRatio(); } From ce3758d37741db9d3facc5a6676efc2204f8ef30 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 19:19:19 -0700 Subject: [PATCH 7/8] sweep if funds freed --- src/Strategy.sol | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index 57e41094..67cbcb24 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -901,7 +901,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { address(repoServicer.termRepoLocker()), offerDebit ); - } + } // Submit the offer and get the offer IDs offerIds = offerLocker.lockOffers(offerSubmissions); @@ -925,6 +925,11 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { PendingOffer storage pendingOffer = termAuctionListData.offers[offerIds[0]]; pendingOffer.offerAmount = offer.amount; } + + if (newOfferAmount < currentOfferAmount) { + YEARN_VAULT.deposit(IERC20(asset).balanceOf(address(this)), address(this)); + } + } /** From 0cc51aaa3ef66ac5dd68476584d58dedecc3617f Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Mon, 9 Sep 2024 19:20:17 -0700 Subject: [PATCH 8/8] remove extra space --- src/Strategy.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Strategy.sol b/src/Strategy.sol index 67cbcb24..014ef75f 100644 --- a/src/Strategy.sol +++ b/src/Strategy.sol @@ -901,7 +901,7 @@ contract Strategy is BaseStrategy, Pausable, ReentrancyGuard { address(repoServicer.termRepoLocker()), offerDebit ); - } + } // Submit the offer and get the offer IDs offerIds = offerLocker.lockOffers(offerSubmissions);