Skip to content

Commit

Permalink
Feat/ FlashDeposit gas optimization (#727)
Browse files Browse the repository at this point in the history
* refactor twap external call

* remove external call, smol gas optimizations

* lint

Co-authored-by: Haythem Sellami <[email protected]>
Co-authored-by: Haythem Sellami <[email protected]>
  • Loading branch information
3 people authored Nov 13, 2022
1 parent 626f696 commit 5f0b777
Showing 1 changed file with 32 additions and 20 deletions.
52 changes: 32 additions & 20 deletions packages/bull-vault/src/FlashBull.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { UniFlash } from "./UniFlash.sol";
import { StrategyMath } from "squeeth-monorepo/strategy/base/StrategyMath.sol"; // StrategyMath licensed under AGPL-3.0-only
import { Address } from "openzeppelin/utils/Address.sol";
import { UniOracle } from "./UniOracle.sol";
import { VaultLib } from "squeeth-monorepo/libs/VaultLib.sol";

/**
* @notice FlashBull contract
Expand Down Expand Up @@ -52,6 +53,8 @@ contract FlashBull is UniFlash {
address private immutable ethUSDCPool;
/// @dev bull stratgey address
address public immutable bullStrategy;
/// @dev power perp controller address
address private immutable powerTokenController;

/// @dev data structs from Uni v3 callback
struct FlashDepositCrabData {
Expand Down Expand Up @@ -100,6 +103,7 @@ contract FlashBull is UniFlash {
constructor(address _bull, address _factory) UniFlash(_factory) {
bullStrategy = _bull;
crab = IBullStrategy(_bull).crab();
powerTokenController = IBullStrategy(_bull).powerTokenController();
wPowerPerp = IController(IBullStrategy(_bull).powerTokenController()).wPowerPerp();
weth = IController(IBullStrategy(_bull).powerTokenController()).weth();
usdc = IController(IBullStrategy(_bull).powerTokenController()).quoteCurrency();
Expand All @@ -126,14 +130,11 @@ contract FlashBull is UniFlash {
uint256 ethInCrab;
uint256 squeethInCrab;
{
(ethInCrab, squeethInCrab) = IBullStrategy(bullStrategy).getCrabVaultDetails();
(ethInCrab, squeethInCrab) = _getCrabVaultDetails();

uint256 ethFee;
uint256 squeethEthPrice =
UniOracle._getTwap(ethWSqueethPool, wPowerPerp, weth, TWAP, false);
(wSqueethToMint, ethFee) = _calcWsqueethToMintAndFee(
_params.ethToCrab, squeethInCrab, ethInCrab, squeethEthPrice
);
(wSqueethToMint, ethFee) =
_calcWsqueethToMintAndFee(_params.ethToCrab, squeethInCrab, ethInCrab);
crabAmount = _calcSharesToMint(
_params.ethToCrab.sub(ethFee), ethInCrab, IERC20(crab).totalSupply()
);
Expand All @@ -150,7 +151,7 @@ contract FlashBull is UniFlash {
abi.encodePacked(_params.ethToCrab)
);

(ethInCrab, squeethInCrab) = IBullStrategy(bullStrategy).getCrabVaultDetails();
(ethInCrab, squeethInCrab) = _getCrabVaultDetails();
uint256 share;
if (IERC20(bullStrategy).totalSupply() == 0) {
share = ONE;
Expand Down Expand Up @@ -190,9 +191,8 @@ contract FlashBull is UniFlash {
{
uint256 bullShare = _params.bullAmount.wdiv(IERC20(bullStrategy).totalSupply());
crabToRedeem = bullShare.wmul(IBullStrategy(bullStrategy).getCrabBalance());
(, uint256 squeethInCrab) = IBullStrategy(bullStrategy).getCrabVaultDetails();
uint256 crabTotalSupply = IERC20(crab).totalSupply();
wPowerPerpToRedeem = crabToRedeem.wmul(squeethInCrab).wdiv(crabTotalSupply);
(, uint256 squeethInCrab) = _getCrabVaultDetails();
wPowerPerpToRedeem = crabToRedeem.wmul(squeethInCrab).wdiv(IERC20(crab).totalSupply());
usdcToRepay = IBullStrategy(bullStrategy).calcUsdcToRepay(bullShare);
}

Expand Down Expand Up @@ -285,17 +285,22 @@ contract FlashBull is UniFlash {
function _calcWsqueethToMintAndFee(
uint256 _depositedEthAmount,
uint256 _strategyDebtAmount,
uint256 _strategyCollateralAmount,
uint256 _squeethEthPrice
uint256 _strategyCollateralAmount
) internal view returns (uint256, uint256) {
uint256 feeRate = IController(IBullStrategy(bullStrategy).powerTokenController()).feeRate();
uint256 feeAdjustment = _squeethEthPrice.mul(feeRate).div(10000);
uint256 wSqueethToMint = _depositedEthAmount.wmul(_strategyDebtAmount).wdiv(
_strategyCollateralAmount.add(_strategyDebtAmount.wmul(feeAdjustment))
);
uint256 fee = wSqueethToMint.wmul(feeAdjustment);

return (wSqueethToMint, fee);
uint256 feeRate = IController(powerTokenController).feeRate();
if (feeRate != 0) {
uint256 squeethEthPrice =
UniOracle._getTwap(ethWSqueethPool, wPowerPerp, weth, TWAP, false);
uint256 feeAdjustment = squeethEthPrice.mul(feeRate).div(10000);
uint256 wSqueethToMint = _depositedEthAmount.wmul(_strategyDebtAmount).wdiv(
_strategyCollateralAmount.add(_strategyDebtAmount.wmul(feeAdjustment))
);
uint256 fee = wSqueethToMint.wmul(feeAdjustment);
return (wSqueethToMint, fee);
}
uint256 wSqueethToMint =
_depositedEthAmount.wmul(_strategyDebtAmount).wdiv(_strategyCollateralAmount);
return (wSqueethToMint, 0);
}

/**
Expand All @@ -318,4 +323,11 @@ contract FlashBull is UniFlash {

return _amount;
}

function _getCrabVaultDetails() internal view returns (uint256, uint256) {
VaultLib.Vault memory strategyVault =
IController(powerTokenController).vaults(ICrabStrategyV2(crab).vaultId());

return (strategyVault.collateralAmount, strategyVault.shortAmount);
}
}

1 comment on commit 5f0b777

@vercel
Copy link

@vercel vercel bot commented on 5f0b777 Nov 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.