Skip to content

Yak strategy v3 #212

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 67 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
1e87d6e
Update native balance check for other chains
snow-farmer Aug 11, 2023
6de40d9
yyAVAX Rate Provider
snow-farmer Aug 11, 2023
2eab619
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 11, 2023
f1cf578
Glacier deployments
snow-farmer Aug 11, 2023
34208f8
Luna redeemer
snow-farmer Aug 11, 2023
06e7c51
Joe redeemer
snow-farmer Aug 11, 2023
fa399b7
Baymax deployments
snow-farmer Aug 11, 2023
79855c2
Benqi deployments
snow-farmer Aug 11, 2023
841a666
Arbitrum helpers
snow-farmer Aug 11, 2023
da5c080
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 11, 2023
df45937
Migrate gmx v1 to crosschain
snow-farmer Aug 11, 2023
5f52895
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 11, 2023
a46f184
Synapse
snow-farmer Aug 11, 2023
66dfffb
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 11, 2023
d594134
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 17, 2023
293fc4c
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 17, 2023
ea10914
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 20, 2023
f7b2b45
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Aug 30, 2023
fe9a8ed
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Sep 11, 2023
b9a267c
Update PairHelper for auto pool
snow-farmer Sep 11, 2023
70b714b
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Sep 14, 2023
42bca92
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Nov 9, 2023
176f9a7
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Nov 17, 2023
f82b76e
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Nov 18, 2023
c1d3a53
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Nov 20, 2023
2fa28b9
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Dec 20, 2023
512c0fb
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Jan 8, 2024
d75b644
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Jan 10, 2024
494aac7
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Jan 16, 2024
e438d23
Arbitrum deployments
snow-farmer Jan 28, 2024
3f038e9
Mantle deployments
snow-farmer Jan 28, 2024
bc6d7d7
Update verifier package
snow-farmer Jan 28, 2024
084489f
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Feb 19, 2024
0aff608
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Mar 21, 2024
8d3b9c4
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Mar 22, 2024
80f85c5
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer Apr 20, 2024
71bbf24
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer May 2, 2024
7738079
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer May 5, 2024
f4fd5e5
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer May 5, 2024
f9734a3
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer May 6, 2024
9db25b2
Arbitrum deployments
snow-farmer May 6, 2024
cc97e7d
Mantle deployments
snow-farmer May 6, 2024
f39589f
Avalanche deployments
snow-farmer May 6, 2024
4f824f0
Remove check for min tokens in constructor
snow-farmer May 6, 2024
1a1fa8a
K3C strategy
snow-farmer May 6, 2024
59f8c43
Avalanche deployments
snow-farmer May 6, 2024
ddea557
Avalanche deployments
snow-farmer May 6, 2024
2c4d4fb
Avalanche deployments
snow-farmer May 7, 2024
f04f2be
Update BayDepositor
snow-farmer May 7, 2024
33cab3a
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer May 23, 2024
555ed15
Mantle deployments
snow-farmer May 23, 2024
124f3e7
Merge remote-tracking branch 'origin' into yak-strategy-v3
snow-farmer May 23, 2024
1e29935
PENDLE deployments
snow-farmer May 25, 2024
31d2d6b
Mantle deployment
snow-farmer May 25, 2024
6d9707f
Merge branch 'master' of github.com-yak:yieldyak/smart-contracts into…
snow-farmer May 29, 2024
d1fffb0
Merge remote-tracking branch 'origin' into yak-strategy-v3
snow-farmer Jun 5, 2024
631d2c0
Merge remote-tracking branch 'origin' into yak-strategy-v3
snow-farmer Jun 5, 2024
05c6707
Zap
snow-farmer Jun 19, 2024
d2fcf47
Update Zap
snow-farmer Jun 19, 2024
f446e2d
Merge remote-tracking branch 'origin' into yak-strategy-v3
snow-farmer Nov 27, 2024
d2c9ebe
Latest avalanche deployments
snow-farmer Nov 27, 2024
43515fd
Latest arbitrum deployments
snow-farmer Nov 27, 2024
f056e0c
Latest mantle deployments
snow-farmer Nov 27, 2024
51d6a45
Cleanup old deployments
snow-farmer Nov 28, 2024
0ed686e
Merge remote-tracking branch 'origin' into yak-strategy-v3
snow-farmer Nov 28, 2024
27309f5
Merge remote-tracking branch 'origin' into yak-strategy-v3
snow-farmer Nov 28, 2024
276df19
Recent avalanche deployments
snow-farmer Dec 1, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 25 additions & 21 deletions contracts/helpers/PairHelper.sol
Original file line number Diff line number Diff line change
@@ -1,32 +1,14 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
pragma experimental ABIEncoderV2;

interface IPair {
function symbol() external view returns (string memory);

function decimals() external view returns (uint8);

function totalSupply() external view returns (uint256);

function token0() external view returns (address);

function token1() external view returns (address);

function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
}
import "./interfaces/IPair.sol";
import "./interfaces/IOracleVault.sol";

contract PairHelper {
struct PairInfo {
string symbol;
uint256 totalSupply;
uint8 decimals;
address token0;
address token1;
string token0Symbol;
Expand All @@ -44,6 +26,7 @@ contract PairHelper {
PairInfo memory info;
info.symbol = pair.symbol();
info.totalSupply = pair.totalSupply();
info.decimals = pair.decimals();
info.token0 = pair.token0();
info.token1 = pair.token1();

Expand All @@ -58,4 +41,25 @@ contract PairHelper {
info.reserve1 = reserve1;
return info;
}

function oracleVaultInfo(address pairAddress) public view returns (PairInfo memory) {
IOracleVault pair = IOracleVault(pairAddress);
PairInfo memory info;
info.symbol = pair.symbol();
info.totalSupply = pair.totalSupply();
info.decimals = pair.decimals();
info.token0 = pair.getTokenX();
info.token1 = pair.getTokenY();

info.token0Symbol = IPair(info.token0).symbol();
info.token1Symbol = IPair(info.token1).symbol();

info.token0Decimals = IPair(info.token0).decimals();
info.token1Decimals = IPair(info.token1).decimals();

(uint256 amountX, uint256 amountY) = pair.getBalances();
info.reserve0 = amountX;
info.reserve1 = amountY;
return info;
}
}
84 changes: 84 additions & 0 deletions contracts/helpers/ZapForSimpleRouter.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "../lib/Ownable.sol";
import "../lib/SafeERC20.sol";
import "./../interfaces/ISimpleRouter.sol";
import "./../interfaces/IYakStrategy.sol";

contract ZapForSimpleRouter is Ownable {
using SafeERC20 for IERC20;

address public immutable simpleRouter;

event Recovered(address token, uint256 amount);

constructor(
address _simpleRouter
) {
simpleRouter = _simpleRouter;
}

function _swap(address _tokenIn, uint256 _amountIn, address _tokenOut, uint256 _minAmountOut) internal returns (uint256) {
IERC20(_tokenIn).approve(simpleRouter, _amountIn);
FormattedOffer memory trade = ISimpleRouter(simpleRouter).query(_amountIn, _tokenIn, _tokenOut);
uint256 amountOut = ISimpleRouter(simpleRouter).swap(trade);
require(amountOut > _minAmountOut, "ZapForSimpleRouter::amountOut too low");
return amountOut;
}

function swap(address _tokenIn, uint256 _amountIn, address _tokenOut, uint256 _minAmountOut) external returns (uint256) {
return _swap(_tokenIn, _amountIn, _tokenOut, _minAmountOut);
}

function zapIn(address _strategy, address _tokenIn, uint256 _amountIn, uint256 _minAmountOut) external {
// Swap
address depositToken = IYakStrategy(_strategy).depositToken();
uint256 amountOut = _swap(_tokenIn, _amountIn, depositToken, _minAmountOut);

// Deposit
IERC20(depositToken).approve(_strategy, amountOut);
IYakStrategy(_strategy).depositFor(msg.sender, amountOut);
}

function zapOut(address _strategy, address _tokenOut, uint256 _sharesOut, uint256 _minAmountOut) external {
// Transfer shares
require(IERC20(_strategy).transferFrom(msg.sender, address(this), _sharesOut), "ZapForSimpleRouter::transferFrom failed");

// Withdraw
address depositToken = IYakStrategy(_strategy).depositToken();
uint256 balanceBefore = IERC20(depositToken).balanceOf(address(this));
IYakStrategy(_strategy).withdraw(_sharesOut);
uint256 balanceAfter = IERC20(depositToken).balanceOf(address(this));
uint256 amountIn = balanceAfter - balanceBefore;
require(amountIn > 0, "ZapForSimpleRouter::amountIn too low");

// Swap
uint256 amountOut = _swap(depositToken, amountIn, _tokenOut, _minAmountOut);

// Transfer
require(IERC20(_tokenOut).transfer(msg.sender, amountOut), "ZapForSimpleRouter::transfer failed");

}

/**
* @notice Recover ERC20 from contract
* @param tokenAddress token address
* @param tokenAmount amount to recover
*/
function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner {
require(tokenAmount > 0);
IERC20(tokenAddress).safeTransfer(msg.sender, tokenAmount);
emit Recovered(tokenAddress, tokenAmount);
}

/**
* @notice Recover GAS from contract
* @param amount amount
*/
function recoverGas(uint256 amount) external onlyOwner {
require(amount > 0);
payable(msg.sender).transfer(amount);
emit Recovered(address(0), amount);
}
}
1 change: 0 additions & 1 deletion contracts/helpers/interfaces/IGAvax.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

interface IGAvax {
Expand Down
22 changes: 22 additions & 0 deletions contracts/helpers/interfaces/IOracleVault.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

interface IOracleVault {
function symbol() external view returns (string memory);

function decimals() external view returns (uint8);

function totalSupply() external view returns (uint256);

function getTokenX() external view returns (address);

function getTokenY() external view returns (address);

function getBalances()
external
view
returns (
uint256 amountX,
uint256 amountY
);
}
23 changes: 23 additions & 0 deletions contracts/helpers/interfaces/IPair.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

interface IPair {
function symbol() external view returns (string memory);

function decimals() external view returns (uint8);

function totalSupply() external view returns (uint256);

function token0() external view returns (address);

function token1() external view returns (address);

function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
}
1 change: 0 additions & 1 deletion contracts/helpers/interfaces/IRateProvider.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

interface IRateProvider {
Expand Down
2 changes: 2 additions & 0 deletions contracts/interfaces/IYakStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ interface IYakStrategy {
function depositToken() external view returns (address);

function depositFor(address account, uint256 amount) external;

function withdraw(uint256 _amount) external;
}
2 changes: 0 additions & 2 deletions contracts/strategies/BaseStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ abstract contract BaseStrategy is YakStrategyV3 {

simpleRouter = ISimpleRouter(_settings.simpleRouter);

require(_strategySettings.minTokensToReinvest > 0, "BaseStrategy::Invalid configuration");

emit Reinvest(0, 0);
}

Expand Down
2 changes: 1 addition & 1 deletion contracts/strategies/avalanche/baymax/BayDepositor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ contract BayDepositor is IBayDepositor, Ownable {
address public proxy;

modifier onlyGmxProxy() {
require(msg.sender == proxy, "GmxDepositor::onlyGmxProxy");
require(msg.sender == proxy, "BayDepositor::onlyGmxProxy");
_;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

import "../../MasterChefStrategy.sol";

import "./interfaces/IKassandraPool.sol";
import "./interfaces/IKassandraStaking.sol";

contract KassandraIndexStrategyK3C is MasterChefStrategy {
using SafeMath for uint256;

IKassandraStaking public stakingContract;
IKassandraPool public kassandraPool;

constructor(
string memory _name,
address _depositToken,
address _poolRewardToken,
address _swapPairPoolReward,
address _stakingContract,
uint256 _pid,
address _timelock,
StrategySettings memory _strategySettings
)
MasterChefStrategy(
_name,
_poolRewardToken,
_swapPairPoolReward,
address(0),
_timelock,
_pid,
_strategySettings
)
{
stakingContract = IKassandraStaking(_stakingContract);
kassandraPool = IKassandraPool(_depositToken);
}

function _getDepositFeeBips(
uint256 /* pid */
) internal pure override returns (uint256) {
return 0;
}

function _getWithdrawFeeBips(
uint256 /* pid */
) internal pure override returns (uint256) {
return 0;
}

function _depositMasterchef(uint256 _pid, uint256 _amount) internal override {
depositToken.approve(address(stakingContract), _amount);
stakingContract.stake(_pid, _amount, address(this), address(this));
}

function _withdrawMasterchef(uint256 _pid, uint256 _amount) internal override {
stakingContract.withdraw(_pid, _amount);
}

function _pendingRewards(uint256 _pid, address _user)
internal
view
override
returns (
uint256,
uint256,
address
)
{
uint256 pendingReward = stakingContract.earned(_pid, address(_user));
return (pendingReward, 0, address(0));
}

function _getRewards(uint256 _pid) internal override {
stakingContract.getReward(_pid);
}

function _getDepositBalance(uint256 pid, address user) internal view override returns (uint256 amount) {
return stakingContract.balanceOf(pid, user);
}

function _bip() internal pure override returns (uint256) {
return 10000;
}

function _convertRewardTokenToDepositToken(uint256 fromAmount) internal override returns (uint256 toAmount) {
rewardToken.approve(address(kassandraPool), fromAmount);
return kassandraPool.joinswapExternAmountIn(address(rewardToken), fromAmount, 0);
}

function _emergencyWithdraw(uint256 _pid) internal override {
depositToken.approve(address(stakingContract), 0);
stakingContract.exit(_pid);
}
}
Loading