Skip to content

Commit

Permalink
Add LUSD-3CRV + 3CRV + 2CRV staker (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeNervoXS authored Feb 21, 2023
1 parent 048b819 commit e881cc7
Show file tree
Hide file tree
Showing 104 changed files with 6,104 additions and 1,810 deletions.
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,6 @@ jobs:
run: yarn foundry:test
env:
ETH_NODE_URI_MAINNET: ${{ secrets.ETH_NODE_URI_MAINNET }}
ETH_NODE_URI_ARBITRUM: ${{ secrets.ETH_NODE_URI_ARBITRUM }}
ETH_NODE_URI_POLYGON: ${{ secrets.ETH_NODE_URI_POLYGON }}
ETH_NODE_URI_GOERLI: ${{ secrets.ETH_NODE_URI_GOERLI }}
21 changes: 21 additions & 0 deletions contracts/interfaces/external/convex/IBaseRewardPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

pragma solidity ^0.8.17;

struct EarnedData {
address token;
uint256 amount;
}

//solhint-disable
interface IConvexBaseRewardPool {
function balanceOf(address account) external view returns (uint256);
Expand Down Expand Up @@ -52,3 +57,19 @@ interface IConvexBaseRewardPool {

function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool);
}

interface IConvexBaseRewardPoolSideChain {
function getReward(address) external;

function rewardLength() external view returns (uint256);

function earnedView(address _account) external view returns (EarnedData[] memory claimable);

function earned(address _account) external returns (EarnedData[] memory claimable);

function stakeFor(address _for, uint256 _amount) external returns (bool);

function withdraw(uint256 amount, bool claim) external returns (bool);

function withdrawAll(bool claim) external;
}
4 changes: 4 additions & 0 deletions contracts/interfaces/external/convex/IBooster.sol
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,8 @@ interface IConvexBooster {
uint256 _amount,
address _to
) external returns (bool);

// ============================= ARBITRUM INTERFACE ============================

function deposit(uint256 _pid, uint256 _amount) external returns (bool);
}
12 changes: 6 additions & 6 deletions contracts/interfaces/external/curve/IMetaPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -100,21 +100,21 @@ interface IMetaPool is IERC20 {
address _receiver
) external returns (uint256);

function remove_liquidity(uint256 _burn_amount, uint256[] memory _min_amounts) external returns (uint256[] memory);
function remove_liquidity(uint256 _burn_amount, uint256[] memory _min_amounts) external;

function remove_liquidity(
uint256 _burn_amount,
uint256[] memory _min_amounts,
address _receiver
) external returns (uint256[] memory);
) external;

function remove_liquidity_imbalance(uint256[] memory _amounts, uint256 _max_burn_amount) external returns (uint256);
function remove_liquidity_imbalance(uint256[] memory _amounts, uint256 _max_burn_amount) external;

function remove_liquidity_imbalance(
uint256[] memory _amounts,
uint256 _max_burn_amount,
address _receiver
) external returns (uint256);
) external;

function calc_withdraw_one_coin(uint256 _burn_amount, int128 i) external view returns (uint256);

Expand All @@ -128,14 +128,14 @@ interface IMetaPool is IERC20 {
uint256 _burn_amount,
int128 i,
uint256 _min_received
) external returns (uint256);
) external;

function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received,
address _receiver
) external returns (uint256);
) external;

function admin_balances(uint256 i) external view returns (uint256);

Expand Down
22 changes: 12 additions & 10 deletions contracts/interfaces/external/curve/IMetaPool2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ interface IMetaPool2 is IMetaPoolBase {
bool _previous
) external view returns (uint256);

function add_liquidity(uint256[N_COINS] memory _amounts, uint256 _min_mint_amount) external returns (uint256);
function add_liquidity(uint256[N_COINS] memory _amounts, uint256 _min_mint_amount) external;

function add_liquidity(
uint256[N_COINS] memory _amounts,
uint256 _min_mint_amount,
address _receiver
) external returns (uint256);
) external;

function get_dy(
int128 i,
Expand All @@ -55,23 +55,25 @@ interface IMetaPool2 is IMetaPoolBase {
uint256[N_COINS] memory _balances
) external view returns (uint256);

function remove_liquidity(uint256 _burn_amount, uint256[N_COINS] memory _min_amounts)
external
returns (uint256[N_COINS] memory);
function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received
) external;

function remove_liquidity(uint256 _burn_amount, uint256[N_COINS] memory _min_amounts) external;

function remove_liquidity(
uint256 _burn_amount,
uint256[N_COINS] memory _min_amounts,
address _receiver
) external returns (uint256[N_COINS] memory);
) external;

function remove_liquidity_imbalance(uint256[N_COINS] memory _amounts, uint256 _max_burn_amount)
external
returns (uint256);
function remove_liquidity_imbalance(uint256[N_COINS] memory _amounts, uint256 _max_burn_amount) external;

function remove_liquidity_imbalance(
uint256[N_COINS] memory _amounts,
uint256 _max_burn_amount,
address _receiver
) external returns (uint256);
) external;
}
36 changes: 36 additions & 0 deletions contracts/interfaces/external/curve/IMetaPool2WithReturn.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.17;

import "./IMetaPoolBase.sol";

uint256 constant N_COINS = 2;

//solhint-disable
interface IMetaPool2WithReturn is IMetaPoolBase {
function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received
) external returns (uint256);

function remove_liquidity(uint256 _burn_amount, uint256[N_COINS] memory _min_amounts)
external
returns (uint256[N_COINS] memory);

function remove_liquidity(
uint256 _burn_amount,
uint256[N_COINS] memory _min_amounts,
address _receiver
) external returns (uint256[N_COINS] memory);

function remove_liquidity_imbalance(uint256[N_COINS] memory _amounts, uint256 _max_burn_amount)
external
returns (uint256);

function remove_liquidity_imbalance(
uint256[N_COINS] memory _amounts,
uint256 _max_burn_amount,
address _receiver
) external returns (uint256);
}
24 changes: 13 additions & 11 deletions contracts/interfaces/external/curve/IMetaPool3.sol
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ interface IMetaPool3 is IMetaPoolBase {
bool _previous
) external view returns (uint256);

function add_liquidity(uint256[N_COINS] memory _amounts, uint256 _min_mint_amount) external returns (uint256);
function add_liquidity(uint256[N_COINS] memory _amounts, uint256 _min_mint_amount) external;

function add_liquidity(
uint256[N_COINS] memory _amounts,
Expand All @@ -59,27 +59,29 @@ interface IMetaPool3 is IMetaPoolBase {
uint256 j,
uint256 dx,
uint256 min_dy
) external returns (uint256);
) external;

function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received
) external;

function remove_liquidity(uint256 _burn_amount, uint256[N_COINS] memory _min_amounts)
external
returns (uint256[N_COINS] memory);
function remove_liquidity(uint256 _burn_amount, uint256[N_COINS] memory _min_amounts) external;

function remove_liquidity(
uint256 _burn_amount,
uint256[N_COINS] memory _min_amounts,
address _receiver
) external returns (uint256[N_COINS] memory);
) external;

function remove_liquidity_imbalance(uint256[N_COINS] memory _amounts, uint256 _max_burn_amount)
external
returns (uint256);
function remove_liquidity_imbalance(uint256[N_COINS] memory _amounts, uint256 _max_burn_amount) external;

function remove_liquidity_imbalance(
uint256[N_COINS] memory _amounts,
uint256 _max_burn_amount,
address _receiver
) external returns (uint256);
) external;

// overload functions because some pools requires i to be an int128 or an uint256
function calc_withdraw_one_coin(uint256 _burn_amount, uint256 i) external view returns (uint256);
Expand All @@ -88,5 +90,5 @@ interface IMetaPool3 is IMetaPoolBase {
uint256 _burn_amount,
uint256 i,
uint256 _min_received
) external returns (uint256);
) external;
}
42 changes: 42 additions & 0 deletions contracts/interfaces/external/curve/IMetaPool3WithReturn.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.17;

import "./IMetaPoolBase.sol";

uint256 constant N_COINS = 3;

//solhint-disable
interface IMetaPool3WithReturn is IMetaPoolBase {
function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received
) external returns (uint256);

function remove_liquidity(uint256 _burn_amount, uint256[N_COINS] memory _min_amounts)
external
returns (uint256[N_COINS] memory);

function remove_liquidity(
uint256 _burn_amount,
uint256[N_COINS] memory _min_amounts,
address _receiver
) external returns (uint256[N_COINS] memory);

function remove_liquidity_imbalance(uint256[N_COINS] memory _amounts, uint256 _max_burn_amount)
external
returns (uint256);

function remove_liquidity_imbalance(
uint256[N_COINS] memory _amounts,
uint256 _max_burn_amount,
address _receiver
) external returns (uint256);

function remove_liquidity_one_coin(
uint256 _burn_amount,
uint256 i,
uint256 _min_received
) external returns (uint256);
}
12 changes: 3 additions & 9 deletions contracts/interfaces/external/curve/IMetaPoolBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ interface IMetaPoolBase is IERC20 {
int128 j,
uint256 dx,
uint256 min_dy
) external returns (uint256);
) external;

function exchange(
int128 i,
int128 j,
uint256 dx,
uint256 min_dy,
address _receiver
) external returns (uint256);
) external;

function exchange_underlying(
int128 i,
Expand All @@ -64,18 +64,12 @@ interface IMetaPoolBase is IERC20 {
bool _previous
) external view returns (uint256);

function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received
) external returns (uint256);

function remove_liquidity_one_coin(
uint256 _burn_amount,
int128 i,
uint256 _min_received,
address _receiver
) external returns (uint256);
) external;

function admin_balances(uint256 i) external view returns (uint256);

Expand Down
6 changes: 5 additions & 1 deletion contracts/interfaces/external/stakeDAO/IStakeCurveVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ interface IStakeCurveVault {

function setWithdrawnFee(uint256 _newFee) external;

function withdrawalFee() external returns (uint256);
function withdrawalFee() external view returns (uint256);

function accumulatedFee() external returns (uint256);

// ============================= ARBITRUM INTERFACE ============================

function deposit(address _staker, uint256 _amount) external;
}
2 changes: 1 addition & 1 deletion contracts/mock/MockBaseLevSwapper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,5 @@ contract MockBaseLevSwapper is BaseLevSwapper {
}

/// @inheritdoc BaseLevSwapper
function _remove(uint256, bytes memory) internal override returns (uint256 amountOut) {}
function _remove(uint256, bytes memory) internal override {}
}
2 changes: 2 additions & 0 deletions contracts/mock/MockBorrowStaker.sol
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ contract MockBorrowStaker is BorrowStaker {
function setRewardAmount(uint256 amount) public {
rewardAmount = amount;
}

function _claimGauges() internal override {}
}

/// @title MockBorrowStakerReset
Expand Down
30 changes: 30 additions & 0 deletions contracts/mock/MockCurveLevSwapper2TokensWithBP.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.17;

import "../swapper/LevSwapper/curve/implementations/mainnet/CurveLevSwapperFullLUSDv3CRV.sol";

/// @title MockCurveLevSwapper2TokensWithBP
/// @author Angle Labs, Inc.
/// @notice Implements a leverage swapper to gain/reduce exposure to the LUSD-3CRV Curve LP token
contract MockCurveLevSwapper2TokensWithBP is CurveLevSwapperFullLUSDv3CRV {
IBorrowStaker internal _angleStaker;

constructor(
ICoreBorrow _core,
IUniswapV3Router _uniV3Router,
address _oneInch,
IAngleRouterSidechain _angleRouter,
IBorrowStaker angleStaker_
) CurveLevSwapperFullLUSDv3CRV(_core, _uniV3Router, _oneInch, _angleRouter) {
_angleStaker = angleStaker_;
}

/// @inheritdoc BaseLevSwapper
function angleStaker() public view override returns (IBorrowStaker) {
return _angleStaker;
}

function setAngleStaker(IBorrowStaker angleStaker_) public {
_angleStaker = angleStaker_;
}
}
6 changes: 1 addition & 5 deletions contracts/mock/MockCurveStaker3TokensWithBP.sol
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,8 @@ contract MockCurveStaker3TokensWithBP is BorrowStaker {

/// @inheritdoc BorrowStaker
/// @dev Should be overriden by the implementation if there are more rewards
function _claimContractRewards() internal virtual override {
uint256 prevBalanceCRV = fakeReward.balanceOf(address(this));
function _claimGauges() internal virtual override {
liquidityGauge().claim_rewards(address(this), address(0));
uint256 crvRewards = fakeReward.balanceOf(address(this)) - prevBalanceCRV;
// Do the same thing for additional rewards
_updateRewards(fakeReward, crvRewards);
}

/// @inheritdoc BorrowStaker
Expand Down
Loading

0 comments on commit e881cc7

Please sign in to comment.