Skip to content

Commit 9db06c3

Browse files
committed
Added yieldtoken as tokenin & out. Added exchange rate & underlying for MidasSY
1 parent 2f6ed9d commit 9db06c3

7 files changed

Lines changed: 77 additions & 43 deletions

File tree

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,130 @@
11
// SPDX-License-Identifier: GPL-3.0-or-later
22
pragma solidity ^0.8.23;
33

4-
import "../../SYBase.sol";
5-
import "../../../../interfaces/Midas/IDepositVault.sol";
6-
import "../../../../interfaces/Midas/IRedemptionVault.sol";
4+
import "../../SYBaseUpg.sol";
5+
import "../../../../interfaces/Midas/IMidasDepositVault.sol";
6+
import "../../../../interfaces/Midas/IMidasRedemptionVault.sol";
77
import "./libraries/DecimalsCorrectionLibrary.sol";
88
import "./libraries/MidasAdapterLib.sol";
99

10-
contract PendleMidasSY is SYBase {
10+
contract PendleMidasSY is SYBaseUpg {
1111
using DecimalsCorrectionLibrary for uint256;
1212
using PMath for uint256;
1313

14-
bytes32 constant PENDLE_REFERRER_ID = keccak256("midas.referrers.pendle");
1514

15+
bytes32 public constant PENDLE_REFERRER_ID = keccak256("midas.referrers.pendle");
16+
17+
// solhint-disable immutable-vars-naming
1618
address public immutable depositVault;
1719
address public immutable redemptionVault;
1820
address public immutable mTokenDataFeed;
21+
address public immutable underlying;
22+
23+
uint256 public immutable yieldTokenUnit;
24+
uint256 public immutable underlyingUnit;
1925

2026
constructor(
21-
string memory _name,
22-
string memory _symbol,
2327
address _mToken,
2428
address _depositVault,
2529
address _redemptionVault,
26-
address _mTokenDataFeed
27-
) SYBase(_name, _symbol, _mToken) {
30+
address _mTokenDataFeed,
31+
address _underlying
32+
) SYBaseUpg(_mToken) {
2833
depositVault = _depositVault;
2934
redemptionVault = _redemptionVault;
3035
mTokenDataFeed = _mTokenDataFeed;
36+
underlying = _underlying;
3137

32-
_safeApproveInf(_mToken, redemptionVault);
38+
yieldTokenUnit = 10 ** MidasAdapterLib.getTokenDecimals(_mToken);
39+
underlyingUnit = 10 ** MidasAdapterLib.getTokenDecimals(_underlying);
40+
}
41+
42+
function initialize(string memory _name, string memory _symbol) external initializer {
43+
__SYBaseUpg_init(_name, _symbol);
44+
_safeApproveInf(yieldToken, redemptionVault);
3345
}
3446

3547
function _deposit(
3648
address tokenIn,
3749
uint256 amountDeposited
3850
) internal virtual override returns (uint256 /*amountSharesOut*/) {
39-
uint256 balanceBefore = _selfBalance(IERC20(yieldToken));
51+
if (tokenIn == yieldToken) {
52+
return amountDeposited;
53+
}
54+
55+
uint256 balanceBefore = _selfBalance(yieldToken);
4056
_safeApproveInf(tokenIn, depositVault);
41-
IDepositVault(depositVault).depositInstant(
57+
IMidasDepositVault(depositVault).depositInstant(
4258
tokenIn,
4359
MidasAdapterLib.tokenAmountToBase18(tokenIn, amountDeposited),
4460
0,
4561
PENDLE_REFERRER_ID
4662
);
47-
return _selfBalance(IERC20(yieldToken)) - balanceBefore;
63+
return _selfBalance(yieldToken) - balanceBefore;
4864
}
4965

5066
function _redeem(
5167
address receiver,
5268
address tokenOut,
5369
uint256 amountSharesToRedeem
5470
) internal override returns (uint256 amountTokenOut) {
55-
uint256 balanceBefore = _selfBalance(IERC20(tokenOut));
56-
// no need to approve as it was already done in the constructor
57-
IRedemptionVault(redemptionVault).redeemInstant(tokenOut, amountSharesToRedeem, 0);
58-
amountTokenOut = balanceBefore - _selfBalance(IERC20(tokenOut));
71+
72+
if (tokenOut == yieldToken) {
73+
_transferOut(tokenOut, receiver, amountSharesToRedeem);
74+
return amountSharesToRedeem;
75+
}
76+
77+
uint256 balanceBefore = _selfBalance(tokenOut);
78+
IMidasRedemptionVault(redemptionVault).redeemInstant(tokenOut, amountSharesToRedeem, 0);
79+
amountTokenOut = balanceBefore - _selfBalance(tokenOut);
5980
_transferOut(tokenOut, receiver, amountTokenOut);
6081
}
6182

6283
function exchangeRate() public view virtual override returns (uint256) {
63-
return PMath.ONE;
84+
return IMidasDataFeed(mTokenDataFeed).getDataInBase18() * underlyingUnit / yieldTokenUnit;
6485
}
6586

6687
function _previewDeposit(
6788
address tokenIn,
6889
uint256 amountTokenToDeposit
6990
) internal view override returns (uint256 /*amountSharesOut*/) {
91+
if (tokenIn == yieldToken) {
92+
return amountTokenToDeposit;
93+
}
94+
95+
// amountTokenToDeposit is converted to base 18 inside lib
7096
return MidasAdapterLib.estimateAmountOutDeposit(depositVault, mTokenDataFeed, tokenIn, amountTokenToDeposit);
7197
}
7298

7399
function _previewRedeem(
74100
address tokenOut,
75101
uint256 amountSharesToRedeem
76102
) internal view override returns (uint256 /*amountTokenOut*/) {
103+
if (tokenOut == yieldToken) {
104+
return amountSharesToRedeem;
105+
}
106+
107+
// amountTokenOut is converted back to original decimals inside lib
77108
return MidasAdapterLib.estimateAmountOutRedeem(redemptionVault, mTokenDataFeed, tokenOut, amountSharesToRedeem);
78109
}
79110

80111
function getTokensIn() public view override returns (address[] memory res) {
81-
return IManageableVault(depositVault).getPaymentTokens();
112+
return ArrayLib.append(IMidasManageableVault(depositVault).getPaymentTokens(), yieldToken);
82113
}
83114

84115
function getTokensOut() public view override returns (address[] memory res) {
85-
return IManageableVault(redemptionVault).getPaymentTokens();
116+
return ArrayLib.append(IMidasManageableVault(redemptionVault).getPaymentTokens(), yieldToken);
86117
}
87118

88119
function isValidTokenIn(address token) public view override returns (bool) {
89-
return IManageableVault(depositVault).tokensConfig(token).dataFeed != address(0);
120+
return token == yieldToken || IMidasManageableVault(depositVault).tokensConfig(token).dataFeed != address(0);
90121
}
91122

92123
function isValidTokenOut(address token) public view override returns (bool) {
93-
return IManageableVault(redemptionVault).tokensConfig(token).dataFeed != address(0);
124+
return token == yieldToken || IMidasManageableVault(redemptionVault).tokensConfig(token).dataFeed != address(0);
94125
}
95126

96127
function assetInfo() external view returns (AssetType assetType, address assetAddress, uint8 assetDecimals) {
97-
return (AssetType.TOKEN, yieldToken, MidasAdapterLib.getTokenDecimals(yieldToken));
128+
return (AssetType.TOKEN, underlying, MidasAdapterLib.getTokenDecimals(underlying));
98129
}
99130
}

contracts/core/StandardizedYield/implementations/Midas/libraries/MidasAdapterLib.sol

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ pragma solidity ^0.8.0;
33

44
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
55

6-
import "../../../../../interfaces/Midas/IDepositVault.sol";
7-
import "../../../../../interfaces/Midas/IRedemptionVault.sol";
8-
import "../../../../../interfaces/Midas/IDataFeed.sol";
6+
import "../../../../../interfaces/Midas/IMidasManageableVault.sol";
7+
import "../../../../../interfaces/Midas/IMidasDataFeed.sol";
98
import "../../../../libraries/math/PMath.sol";
109
import "./DecimalsCorrectionLibrary.sol";
1110

@@ -25,7 +24,9 @@ library MidasAdapterLib {
2524
uint8 tokenDecimals = getTokenDecimals(tokenIn);
2625
uint256 amountTokenInBase18 = tokenAmountToBase18(amountTokenIn, tokenDecimals);
2726

28-
IManageableVault.TokenConfig memory tokenConfig = IManageableVault(depositVault).tokensConfig(tokenIn);
27+
IMidasManageableVault.TokenConfig memory tokenConfig = IMidasManageableVault(depositVault).tokensConfig(
28+
tokenIn
29+
);
2930

3031
uint256 tokenInRate = getTokenRate(tokenConfig.dataFeed, tokenConfig.stable);
3132
require(tokenInRate > 0, "tokenInRate zero");
@@ -54,7 +55,9 @@ library MidasAdapterLib {
5455
address tokenOut,
5556
uint256 amountMTokenIn
5657
) internal view returns (uint256 amountTokenOut) {
57-
IManageableVault.TokenConfig memory tokenConfig = IManageableVault(redemptionVault).tokensConfig(tokenOut);
58+
IMidasManageableVault.TokenConfig memory tokenConfig = IMidasManageableVault(redemptionVault).tokensConfig(
59+
tokenOut
60+
);
5861

5962
uint256 mTokenRate = getTokenRate(mTokenDataFeed, false);
6063
require(mTokenRate > 0, "mTokenRate zero");
@@ -72,7 +75,7 @@ library MidasAdapterLib {
7275
}
7376

7477
function getTokenRate(address dataFeed, bool stable) internal view returns (uint256) {
75-
uint256 rate = IDataFeed(dataFeed).getDataInBase18();
78+
uint256 rate = IMidasDataFeed(dataFeed).getDataInBase18();
7679
if (stable) return STABLECOIN_RATE;
7780
return rate;
7881
}
@@ -95,16 +98,16 @@ library MidasAdapterLib {
9598

9699
function _getFeeAmount(
97100
address vault,
98-
IManageableVault.TokenConfig memory tokenConfig,
101+
IMidasManageableVault.TokenConfig memory tokenConfig,
99102
uint256 amount
100103
) private view returns (uint256) {
101-
if (IManageableVault(vault).waivedFeeRestriction(address(this))) return 0;
104+
if (IMidasManageableVault(vault).waivedFeeRestriction(address(this))) return 0;
102105

103106
uint256 feePercent;
104107

105108
feePercent = tokenConfig.fee;
106109

107-
feePercent += IManageableVault(vault).instantFee();
110+
feePercent += IMidasManageableVault(vault).instantFee();
108111

109112
if (feePercent > ONE_HUNDRED_PERCENT) feePercent = ONE_HUNDRED_PERCENT;
110113

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.0;
33

4-
interface IDataFeed {
4+
interface IMidasDataFeed {
55
function getDataInBase18() external view returns (uint256 answer);
66
}

contracts/interfaces/Midas/IDepositVault.sol renamed to contracts/interfaces/Midas/IMidasDepositVault.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.0;
33

4-
import "./IManageableVault.sol";
4+
import "./IMidasManageableVault.sol";
55

6-
interface IDepositVault is IManageableVault {
6+
interface IMidasDepositVault is IMidasManageableVault {
77
function depositInstant(
88
address tokenIn,
99
uint256 amountToken,

contracts/interfaces/Midas/IManageableVault.sol renamed to contracts/interfaces/Midas/IMidasManageableVault.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.0;
33

4-
interface IManageableVault {
4+
interface IMidasManageableVault {
55
struct TokenConfig {
66
address dataFeed;
77
uint256 fee;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.0;
33

4-
import "./IManageableVault.sol";
4+
import "./IMidasManageableVault.sol";
55

6-
interface IRedemptionVault is IManageableVault {
6+
interface IMidasRedemptionVault is IMidasManageableVault {
77
function redeemInstant(address tokenOut, uint256 amountMTokenIn, uint256 minReceiveAmount) external;
88
}

tsconfig.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"compilerOptions": {
3-
"module": "NodeNext",
4-
"moduleResolution": "NodeNext"
5-
}
6-
}
2+
"compilerOptions": {
3+
"module": "NodeNext",
4+
"moduleResolution": "NodeNext"
5+
}
6+
}

0 commit comments

Comments
 (0)