Skip to content

Commit

Permalink
formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
trmid committed Sep 26, 2023
1 parent 8115ebc commit c0d3611
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 108 deletions.
54 changes: 24 additions & 30 deletions src/VaultBooster.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ error OnlyLiquidationPair();
/// @notice Emitted when the liquidator attempts to liquidate more than the available balance
error InsufficientAvailableBalance(uint256 amountOut, uint256 available);

/// @notice Emitted when the liquidator attempts to liquidate for a token other than the prize token
/// @notice Emitted when the liquidator attempts to liquidate for a token other than the prize token
error UnsupportedTokenIn();

/// @notice Emitted when a withdraw of zero amount is initiated.
Expand Down Expand Up @@ -76,21 +76,13 @@ contract VaultBooster is Ownable, ILiquidationSource {
/// @param token The token that they deposited
/// @param from The account that deposited the tokens
/// @param amount The amount that was deposited.
event Deposited(
IERC20 indexed token,
address indexed from,
uint256 amount
);
event Deposited(IERC20 indexed token, address indexed from, uint256 amount);

/// @notice Emitted when tokens are withdrawn by the owner
/// @param token The token that was withdrawn
/// @param from The account that withdraw the tokens
/// @param amount The amount of tokens that were withdrawn
event Withdrawn(
IERC20 indexed token,
address indexed from,
uint256 amount
);
event Withdrawn(IERC20 indexed token, address indexed from, uint256 amount);

/// @notice Emitted when tokens are liquidated
/// @param token The token that was sold
Expand All @@ -109,17 +101,14 @@ contract VaultBooster is Ownable, ILiquidationSource {
/// @notice Emitted when boost tokens are accrued
/// @param token The token that accrued
/// @param availableBoostBalance The new available balance
event BoostAccrued(
IERC20 indexed token,
uint256 availableBoostBalance
);
event BoostAccrued(IERC20 indexed token, uint256 availableBoostBalance);

/// @notice The prize pool that this booster will contribute to
PrizePool public immutable prizePool;

/// @notice The prize pool's twab controller; copied here to save gas
TwabController public immutable twabController;

/// @notice The vault that the VaultBooster is boosting
address public immutable vault;

Expand All @@ -130,11 +119,7 @@ contract VaultBooster is Ownable, ILiquidationSource {
/// @param _prizePool The prize pool to contribute to
/// @param _vault The vault to boost
/// @param _owner The owner of the VaultBooster contract
constructor(
PrizePool _prizePool,
address _vault,
address _owner
) Ownable() {
constructor(PrizePool _prizePool, address _vault, address _owner) Ownable() {
if (address(0) == _vault) revert VaultZeroAddress();
if (address(0) == _owner) revert OwnerZeroAddress();
_transferOwnership(_owner);
Expand Down Expand Up @@ -196,11 +181,11 @@ contract VaultBooster is Ownable, ILiquidationSource {
);
}

/// @notice Deposits tokens into this contract.
/// @notice Deposits tokens into this contract.
/// @dev Useful because it ensures `accrue` is called before depositing
/// @param _token The token to deposit
/// @param _amount The amount to deposit
function deposit(IERC20 _token, uint256 _amount) onlyBoosted(_token) external {
function deposit(IERC20 _token, uint256 _amount) external onlyBoosted(_token) {
if (0 == _amount) revert ZeroAmountDeposit();
_accrue(_token);
_token.safeTransferFrom(msg.sender, address(this), _amount);
Expand Down Expand Up @@ -261,19 +246,28 @@ contract VaultBooster is Ownable, ILiquidationSource {
address tokenIn,
uint256 amountIn,
bytes calldata transferTokensOutData
) external onlyPrizeToken(tokenIn) onlyLiquidationPair(abi.decode(transferTokensOutData, (address))) {
)
external
onlyPrizeToken(tokenIn)
onlyLiquidationPair(abi.decode(transferTokensOutData, (address)))
{
prizePool.contributePrizeTokens(vault, amountIn);
}

/// @inheritdoc ILiquidationSource
function isLiquidationPair(address tokenOut, address liquidationPair) external view returns (bool) {
function isLiquidationPair(
address tokenOut,
address liquidationPair
) external view returns (bool) {
return liquidationPair == _boosts[IERC20(tokenOut)].liquidationPair;
}

/// @inheritdoc ILiquidationSource
/// @dev Reverts if `_tokenIn` it isn't the prize token.
/// @dev Always returns the prize pool address.
function targetOf(address _tokenIn) external view override onlyPrizeToken(_tokenIn) returns (address) {
function targetOf(
address _tokenIn
) external view override onlyPrizeToken(_tokenIn) returns (address) {
return address(prizePool);
}

Expand Down Expand Up @@ -309,9 +303,10 @@ contract VaultBooster is Ownable, ILiquidationSource {
uint32(boost.lastAccruedAt),
uint32(block.timestamp)
);
deltaAmount += convert(boost.multiplierOfTotalSupplyPerSecond.intoUD60x18()
.mul(convert(deltaTime))
.mul(convert(totalSupply))
deltaAmount += convert(
boost.multiplierOfTotalSupplyPerSecond.intoUD60x18().mul(convert(deltaTime)).mul(
convert(totalSupply)
)
);
}
uint256 actualBalance = _tokenOut.balanceOf(address(this));
Expand Down Expand Up @@ -345,5 +340,4 @@ contract VaultBooster is Ownable, ILiquidationSource {
}
_;
}

}
80 changes: 36 additions & 44 deletions test/VaultBooster.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,16 @@ pragma solidity 0.8.19;

import "forge-std/Test.sol";

import {
VaultBooster,
Boost,
UD60x18,
UD2x18,
OnlyLiquidationPair,
UnsupportedTokenIn,
InsufficientAvailableBalance,
ZeroAmountWithdraw,
ZeroAmountDeposit,
VaultZeroAddress,
OwnerZeroAddress,
CannotDepositWithoutBoost,
TokenZeroAddress,
LiquidationPairZeroAddress,
InsufficientAvailableBalance
} from "../src/VaultBooster.sol";
import { VaultBooster, Boost, UD60x18, UD2x18, OnlyLiquidationPair, UnsupportedTokenIn, InsufficientAvailableBalance, ZeroAmountWithdraw, ZeroAmountDeposit, VaultZeroAddress, OwnerZeroAddress, CannotDepositWithoutBoost, TokenZeroAddress, LiquidationPairZeroAddress, InsufficientAvailableBalance } from "../src/VaultBooster.sol";

import { IFlashSwapCallback } from "pt-v5-liquidator-interfaces/IFlashSwapCallback.sol";
import { PrizePool, TwabController, IERC20 } from "pt-v5-prize-pool/PrizePool.sol";

/// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge.
/// https://book.getfoundry.sh/forge/writing-tests
contract VaultBoosterTest is Test {

event LiquidationPairSet(address indexed tokenOut, address indexed liquidationPair);

event SetBoost(
IERC20 indexed _token,
address indexed _liquidationPair,
Expand All @@ -39,17 +22,9 @@ contract VaultBoosterTest is Test {
uint48 lastAccruedAt
);

event Deposited(
IERC20 indexed _token,
address indexed _from,
uint256 _amount
);
event Deposited(IERC20 indexed _token, address indexed _from, uint256 _amount);

event Withdrawn(
IERC20 indexed _token,
address indexed _from,
uint256 _amount
);
event Withdrawn(IERC20 indexed _token, address indexed _from, uint256 _amount);

event Liquidated(
IERC20 indexed token,
Expand All @@ -59,10 +34,7 @@ contract VaultBoosterTest is Test {
uint256 availableBoostBalance
);

event BoostAccrued(
IERC20 indexed token,
uint256 availableBoostBalance
);
event BoostAccrued(IERC20 indexed token, uint256 availableBoostBalance);

VaultBooster booster;

Expand All @@ -81,8 +53,16 @@ contract VaultBoosterTest is Test {
vault = makeAddr("vault");
prizePool = PrizePool(makeAddr("prizePool"));
twabController = TwabController(makeAddr("twabController"));
vm.mockCall(address(prizePool), abi.encodeWithSelector(prizePool.twabController.selector), abi.encode(twabController));
vm.mockCall(address(prizePool), abi.encodeWithSelector(prizePool.prizeToken.selector), abi.encode(prizeToken));
vm.mockCall(
address(prizePool),
abi.encodeWithSelector(prizePool.twabController.selector),
abi.encode(twabController)
);
vm.mockCall(
address(prizePool),
abi.encodeWithSelector(prizePool.prizeToken.selector),
abi.encode(prizeToken)
);

booster = new VaultBooster(prizePool, vault, address(this));
}
Expand Down Expand Up @@ -131,7 +111,11 @@ contract VaultBoosterTest is Test {
}

function testSetBoost_available() public {
vm.mockCall(address(boostToken), abi.encodeWithSelector(IERC20.balanceOf.selector, address(booster)), abi.encode(1e18));
vm.mockCall(
address(boostToken),
abi.encodeWithSelector(IERC20.balanceOf.selector, address(booster)),
abi.encode(1e18)
);
booster.setBoost(boostToken, liquidationPair, UD2x18.wrap(0.001e18), 0.03e18, 1e18);
Boost memory boost = booster.getBoost(boostToken);
assertEq(boost.available, 1e18);
Expand All @@ -157,7 +141,11 @@ contract VaultBoosterTest is Test {
function testDeposit_success() public {
mockBoostTokenBalance(1e18);
booster.setBoost(boostToken, liquidationPair, UD2x18.wrap(0), 0, 1e18);
vm.mockCall(address(boostToken), abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(booster), 2e18), abi.encode(true));
vm.mockCall(
address(boostToken),
abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(booster), 2e18),
abi.encode(true)
);
vm.warp(1 days);

vm.expectEmit(true, true, true, true);
Expand All @@ -171,7 +159,11 @@ contract VaultBoosterTest is Test {
function testDeposit_ZeroAmountDeposit() public {
mockBoostTokenBalance(1e18);
booster.setBoost(boostToken, liquidationPair, UD2x18.wrap(0), 0, 1e18);
vm.mockCall(address(boostToken), abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(booster), 2e18), abi.encode(true));
vm.mockCall(
address(boostToken),
abi.encodeWithSelector(IERC20.transferFrom.selector, address(this), address(booster), 2e18),
abi.encode(true)
);
vm.warp(1 days);

vm.expectRevert(abi.encodeWithSelector(ZeroAmountDeposit.selector));
Expand Down Expand Up @@ -371,10 +363,7 @@ contract VaultBoosterTest is Test {
function testVerifyTokensIn() public {
vm.mockCall(
address(prizePool),
abi.encodeCall(
prizePool.contributePrizeTokens,
(address(vault), 1000e18)
),
abi.encodeCall(prizePool.contributePrizeTokens, (address(vault), 1000e18)),
abi.encode(0)
);

Expand Down Expand Up @@ -403,7 +392,10 @@ contract VaultBoosterTest is Test {
/** =========== MOCKS ============= */

function mockBoostTokenBalance(uint256 _balance) public {
vm.mockCall(address(boostToken), abi.encodeWithSelector(IERC20.balanceOf.selector, address(booster)), abi.encode(_balance));
vm.mockCall(
address(boostToken),
abi.encodeWithSelector(IERC20.balanceOf.selector, address(booster)),
abi.encode(_balance)
);
}

}
50 changes: 16 additions & 34 deletions test/VaultBoosterFactory.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,13 @@ pragma solidity 0.8.19;

import "forge-std/Test.sol";

import {
VaultBoosterFactory,
VaultBooster
} from "../src/VaultBoosterFactory.sol";
import { VaultBoosterFactory, VaultBooster } from "../src/VaultBoosterFactory.sol";

import { PrizePool, TwabController, IERC20 } from "pt-v5-prize-pool/PrizePool.sol";

/// @dev See the "Writing Tests" section in the Foundry Book if this is your first time with Forge.
/// https://book.getfoundry.sh/forge/writing-tests
contract VaultBoosterTest is Test {

event CreatedVaultBooster(
VaultBooster indexed vaultBooster,
PrizePool indexed _prizePool,
Expand All @@ -38,38 +34,33 @@ contract VaultBoosterTest is Test {
vault = makeAddr("vault");
prizePool = PrizePool(makeAddr("prizePool"));
twabController = TwabController(makeAddr("twabController"));
vm.mockCall(address(prizePool), abi.encodeWithSelector(prizePool.twabController.selector), abi.encode(twabController));
vm.mockCall(address(prizePool), abi.encodeWithSelector(prizePool.prizeToken.selector), abi.encode(prizeToken));
vm.mockCall(
address(prizePool),
abi.encodeWithSelector(prizePool.twabController.selector),
abi.encode(twabController)
);
vm.mockCall(
address(prizePool),
abi.encodeWithSelector(prizePool.prizeToken.selector),
abi.encode(prizeToken)
);

factory = new VaultBoosterFactory();
}

function testCreateVaultBooster() public {
vm.expectEmit(false, true, true, false);
emit CreatedVaultBooster(
VaultBooster(address(0xdeadbeef)),
prizePool,
vault,
address(this)
);
emit CreatedVaultBooster(VaultBooster(address(0xdeadbeef)), prizePool, vault, address(this));
VaultBooster booster = factory.createVaultBooster(prizePool, vault, address(this));
assertEq(address(booster.prizePool()), address(prizePool));
assertEq(booster.vault(), vault);
assertEq(booster.owner(), address(this));
}

function testCreateVaultBooster_secondDeployShouldHaveDiffAddress() public {
VaultBooster _vault1 = factory.createVaultBooster(
prizePool,
vault,
address(this)
);
VaultBooster _vault1 = factory.createVaultBooster(prizePool, vault, address(this));

VaultBooster _vault2 = factory.createVaultBooster(
prizePool,
vault,
address(this)
);
VaultBooster _vault2 = factory.createVaultBooster(prizePool, vault, address(this));

assertNotEq(address(_vault1), address(_vault2));
}
Expand All @@ -79,22 +70,13 @@ contract VaultBoosterTest is Test {
address _addr2 = makeAddr("addr2");

vm.startPrank(_addr1);
VaultBooster _vault1 = factory.createVaultBooster(
prizePool,
vault,
address(this)
);
VaultBooster _vault1 = factory.createVaultBooster(prizePool, vault, address(this));
vm.stopPrank();

vm.startPrank(_addr2);
VaultBooster _vault2 = factory.createVaultBooster(
prizePool,
vault,
address(this)
);
VaultBooster _vault2 = factory.createVaultBooster(prizePool, vault, address(this));
vm.stopPrank();

assertNotEq(address(_vault1), address(_vault2));
}

}

0 comments on commit c0d3611

Please sign in to comment.