Skip to content

Commit

Permalink
🤡 mocks: add MockBalancerVault contract
Browse files Browse the repository at this point in the history
  • Loading branch information
santichez committed Jun 1, 2023
1 parent 75c50dd commit 0bc8f01
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 21 deletions.
43 changes: 22 additions & 21 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -15,45 +15,46 @@ InterestRateModelTest:testFloatingBorrowRate() (gas: 6236)
InterestRateModelTest:testMinFixedRate() (gas: 7610)
InterestRateModelTest:testRevertFixedMaxUtilizationLowerThanWad() (gas: 81593)
InterestRateModelTest:testRevertFloatingMaxUtilizationLowerThanWad() (gas: 81681)
LeveragerTest:testApproveMaliciousMarket() (gas: 24153)
LeveragerTest:testApproveMaliciousMarket() (gas: 24198)
LeveragerTest:testApproveMarket() (gas: 56626)
LeveragerTest:testAvailableLiquidity() (gas: 95129)
LeveragerTest:testCallReceiveFlashLoanFromAnyAddress() (gas: 25074)
LeveragerTest:testCallReceiveFlashLoanFromAnyAddress() (gas: 25030)
LeveragerTest:testDeleverage() (gas: 449866)
LeveragerTest:testDeleverageHalfBorrowPosition() (gas: 488966)
LeveragerTest:testDeleverageHalfBorrowPosition() (gas: 488989)
LeveragerTest:testFixedDeleverage() (gas: 429772)
LeveragerTest:testFixedRoll() (gas: 515399)
LeveragerTest:testFixedRollSameMaturityWithThreeLoops() (gas: 394620)
LeveragerTest:testFixedRollWithAccurateBorrowSlippage() (gas: 693262)
LeveragerTest:testFixedRollWithAccurateBorrowSlippageWithThreeLoops() (gas: 1026387)
LeveragerTest:testFixedRollWithAccurateRepaySlippage() (gas: 693033)
LeveragerTest:testFixedRollWithAccurateRepaySlippageWithThreeLoops() (gas: 1020923)
LeveragerTest:testFixedRollWithAccurateRepaySlippageWithThreeLoops() (gas: 1020901)
LeveragerTest:testFixedToFloatingRoll() (gas: 461239)
LeveragerTest:testFixedToFloatingRollHigherThanAvailableLiquidity() (gas: 528322)
LeveragerTest:testFixedToFloatingRollHigherThanAvailableLiquidity() (gas: 528278)
LeveragerTest:testFixedToFloatingRollHigherThanAvailableLiquidityWithSlippage() (gas: 722384)
LeveragerTest:testFixedToFloatingRollHigherThanAvailableLiquidityWithSlippageWithThreeLoops() (gas: 879457)
LeveragerTest:testFixedToFloatingRollWithAccurateSlippage() (gas: 601851)
LeveragerTest:testFlashloanFeeGreaterThanZero() (gas: 400935)
LeveragerTest:testFixedToFloatingRollHigherThanAvailableLiquidityWithSlippageWithThreeLoops() (gas: 879435)
LeveragerTest:testFixedToFloatingRollWithAccurateSlippage() (gas: 601833)
LeveragerTest:testFlashloanFeeGreaterThanZero() (gas: 400913)
LeveragerTest:testFloatingToFixedRoll() (gas: 506215)
LeveragerTest:testFloatingToFixedRollHigherThanAvailableLiquidity() (gas: 590990)
LeveragerTest:testFloatingToFixedRollHigherThanAvailableLiquidityWithSlippage() (gas: 895933)
LeveragerTest:testFloatingToFixedRollHigherThanAvailableLiquidityWithSlippageWithThreePools() (gas: 1105462)
LeveragerTest:testFloatingToFixedRollWithAccurateSlippage() (gas: 724462)
LeveragerTest:testFloatingToFixedRollWithAccurateSlippageWithPreviousPosition() (gas: 675363)
LeveragerTest:testFloatingToFixedRollHigherThanAvailableLiquidityWithSlippageWithThreePools() (gas: 1105440)
LeveragerTest:testFloatingToFixedRollWithAccurateSlippage() (gas: 724440)
LeveragerTest:testFloatingToFixedRollWithAccurateSlippageWithPreviousPosition() (gas: 675341)
LeveragerTest:testLateFixedDeleverage() (gas: 471140)
LeveragerTest:testLateFixedRoll() (gas: 526122)
LeveragerTest:testLateFixedRoll() (gas: 526100)
LeveragerTest:testLateFixedRollWithThreeLoops() (gas: 707888)
LeveragerTest:testLateFixedToFloatingRoll() (gas: 470476)
LeveragerTest:testLateFixedToFloatingRollWithThreeLoops() (gas: 633582)
LeveragerTest:testLeverage() (gas: 365861)
LeveragerTest:testLeverageShouldFailWhenHealthFactorNearOne() (gas: 719076)
LeveragerTest:testLeverageWithAlreadyDepositedAmount() (gas: 394241)
LeveragerTest:testLeverageWithInvalidBalancerVault() (gas: 2691948)
LeveragerTest:testPartialFixedDeleverage() (gas: 516098)
LeveragerTest:testPartialFixedRoll() (gas: 578654)
LeveragerTest:testLateFixedToFloatingRollWithThreeLoops() (gas: 633670)
LeveragerTest:testLeverage() (gas: 365839)
LeveragerTest:testLeverageShouldFailWhenHealthFactorNearOne() (gas: 719054)
LeveragerTest:testLeverageWithAlreadyDepositedAmount() (gas: 394197)
LeveragerTest:testLeverageWithInvalidBalancerVault() (gas: 2691971)
LeveragerTest:testMockBalancerVault() (gas: 3727680)
LeveragerTest:testPartialFixedDeleverage() (gas: 516121)
LeveragerTest:testPartialFixedRoll() (gas: 578742)
LeveragerTest:testPartialFixedToFloatingRoll() (gas: 539354)
LeveragerTest:testPartialLateFixedRoll() (gas: 571143)
LeveragerTest:testPartialLateFixedToFloatingRoll() (gas: 538030)
LeveragerTest:testPartialLateFixedRoll() (gas: 571121)
LeveragerTest:testPartialLateFixedToFloatingRoll() (gas: 538008)
MarketTest:testAccountLiquidityAdjustedDebt() (gas: 380765)
MarketTest:testAnotherUserRedeemWhenOwnerHasShortfall() (gas: 483813)
MarketTest:testAnotherUserWithdrawWhenOwnerHasShortfall() (gas: 472690)
Expand Down
53 changes: 53 additions & 0 deletions contracts/mocks/MockBalancerVault.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.17;

import { ERC20 } from "solmate/src/tokens/ERC20.sol";
import { ReentrancyGuard } from "solmate/src/utils/ReentrancyGuard.sol";
import { SafeTransferLib } from "solmate/src/utils/SafeTransferLib.sol";

contract MockBalancerVault is ReentrancyGuard {
using SafeTransferLib for ERC20;

function flashLoan(
IFlashLoanRecipient recipient,
ERC20[] memory tokens,
uint256[] memory amounts,
bytes memory userData
) external nonReentrant {
assert(tokens.length == amounts.length);

uint256[] memory preLoanBalances = new uint256[](tokens.length);

// Used to ensure `tokens` is sorted in ascending order, which ensures token uniqueness.
ERC20 previousToken = ERC20(address(0));

for (uint256 i = 0; i < tokens.length; ++i) {
ERC20 token = tokens[i];
uint256 amount = amounts[i];

require(token > previousToken, token == ERC20(address(0)) ? "Zero token" : "Unsorted tokens");
previousToken = token;

preLoanBalances[i] = token.balanceOf(address(this));

require(preLoanBalances[i] >= amount, "Insufficient flashloan balance");
token.safeTransfer(address(recipient), amount);
}

recipient.receiveFlashLoan(tokens, amounts, new uint256[](tokens.length), userData);

for (uint256 i = 0; i < tokens.length; ++i) {
uint256 postLoanBalance = tokens[i].balanceOf(address(this));
require(postLoanBalance >= preLoanBalances[i], "Invalid post flashloan balance");
}
}
}

interface IFlashLoanRecipient {
function receiveFlashLoan(
ERC20[] memory tokens,
uint256[] memory amounts,
uint256[] memory feeAmounts,
bytes memory userData
) external;
}
17 changes: 17 additions & 0 deletions test/solidity/Leverager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
InvalidOperation
} from "../../contracts/periphery/Leverager.sol";
import { Auditor, Market, InsufficientAccountLiquidity, MarketNotListed } from "../../contracts/Auditor.sol";
import { MockBalancerVault } from "../../contracts/mocks/MockBalancerVault.sol";
import { FixedLib } from "../../contracts/utils/FixedLib.sol";

contract LeveragerTest is Test {
Expand Down Expand Up @@ -590,6 +591,22 @@ contract LeveragerTest is Test {
assertEq(availableAssets[1].liquidity, usdc.balanceOf(address(leverager.balancerVault())));
}

function testMockBalancerVault() external {
MockBalancerVault mockBalancerVault = new MockBalancerVault();
leverager = new Leverager(leverager.auditor(), IBalancerVault(address(mockBalancerVault)));
marketUSDC.approve(address(leverager), type(uint256).max);
marketUSDC.deposit(100_000e6, address(this));
marketUSDC.borrow(50_000e6, address(this), address(this));

vm.expectRevert(bytes(""));
leverager.floatingRoll(marketUSDC, true, maturity, type(uint256).max, 1e18);

deal(address(usdc), address(mockBalancerVault), 50000000001);
leverager.floatingRoll(marketUSDC, true, maturity, type(uint256).max, 1e18);
(uint256 principal, ) = marketUSDC.fixedBorrowPositions(maturity, address(this));
assertEq(principal, 50_000e6 + 1);
}

function previewActualRepay(uint256 percentage) internal view returns (uint256 actualRepay) {
FixedLib.Position memory position;
(position.principal, position.fee) = marketUSDC.fixedBorrowPositions(maturity, address(this));
Expand Down

0 comments on commit 0bc8f01

Please sign in to comment.