Skip to content

Commit

Permalink
feat: adds ISavingsContractV4
Browse files Browse the repository at this point in the history
  • Loading branch information
doncesarts committed Apr 20, 2022
1 parent 9f4a05b commit 9a4c5f2
Show file tree
Hide file tree
Showing 11 changed files with 144 additions and 42 deletions.
73 changes: 73 additions & 0 deletions contracts/interfaces/ISavingsContract.sol
Expand Up @@ -2,6 +2,7 @@
pragma solidity 0.8.6;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC4626Vault } from "../interfaces/IERC4626Vault.sol";

interface ISavingsContractV1 {
function depositInterest(uint256 _amount) external;
Expand Down Expand Up @@ -104,3 +105,75 @@ interface ISavingsContractV3 {
address _referrer
) external returns (uint256 creditsIssued); // V3
}

interface ISavingsContractV4 is
IERC4626Vault // V4
{
// DEPRECATED but still backwards compatible
function redeem(uint256 _amount) external returns (uint256 massetReturned); // V1 (use IERC4626Vault.redeem)

function creditBalances(address) external view returns (uint256); // V1 & V2 (use balanceOf)

// --------------------------------------------
function depositInterest(uint256 _amount) external; // V1 & V2

/** @dev see IERC4626Vault.deposit(uint256 assets, address receiver)*/
function depositSavings(uint256 _amount) external returns (uint256 creditsIssued); // V1 & V2

/** @dev see IERC4626Vault.deposit(uint256 assets, address receiver)*/
function depositSavings(uint256 _amount, address _beneficiary)
external
returns (uint256 creditsIssued); // V2

/** @dev see IERC4626Vault.redeem(uint256 shares,address receiver,address owner)(uint256 assets);*/
function redeemCredits(uint256 _amount) external returns (uint256 underlyingReturned); // V2

/** @dev see IERC4626Vault.withdraw(uint256 assets,address receiver,address owner)(uint256 assets, address receiver)*/
function redeemUnderlying(uint256 _amount) external returns (uint256 creditsBurned); // V2

function exchangeRate() external view returns (uint256); // V1 & V2

function balanceOfUnderlying(address _user) external view returns (uint256 underlying); // V2

function underlyingToCredits(uint256 _underlying) external view returns (uint256 credits); // V2

function creditsToUnderlying(uint256 _credits) external view returns (uint256 underlying); // V2

/** @dev see IERC4626Vault.asset()(address assetTokenAddress);*/
function underlying() external view returns (IERC20 underlyingMasset); // V2

function redeemAndUnwrap(
uint256 _amount,
bool _isCreditAmt,
uint256 _minAmountOut,
address _output,
address _beneficiary,
address _router,
bool _isBassetOut
)
external
returns (
uint256 creditsBurned,
uint256 massetRedeemed,
uint256 outputQuantity
); // V3

function depositSavings(
uint256 _underlying,
address _beneficiary,
address _referrer
) external returns (uint256 creditsIssued); // V3

// -------------------------------------------- V4
function deposit(
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares);

function mint(
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets);
}
21 changes: 16 additions & 5 deletions contracts/legacy-upgraded/imbtc-mainnet-22.sol
Expand Up @@ -265,7 +265,7 @@ interface ISavingsManager {
function collectAndDistributeInterest(address _mAsset) external;
}

interface ISavingsContractV3 {
interface ISavingsContractV4 is IERC4626Vault {
// DEPRECATED but still backwards compatible
function redeem(uint256 _amount) external returns (uint256 massetReturned);

Expand Down Expand Up @@ -316,6 +316,18 @@ interface ISavingsContractV3 {
address _beneficiary,
address _referrer
) external returns (uint256 creditsIssued);

function deposit(
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares);

function mint(
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets);
}

/*
Expand Down Expand Up @@ -1076,8 +1088,7 @@ library StableMath {
* DATE: 2022-04-08
*/
contract SavingsContract_imbtc_mainnet_22 is
ISavingsContractV3,
IERC4626Vault,
ISavingsContractV4,
Initializable,
InitializableToken,
ImmutableModule
Expand Down Expand Up @@ -1886,7 +1897,7 @@ contract SavingsContract_imbtc_mainnet_22 is
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares) {
) external override returns (uint256 shares) {
shares = _transferAndMint(assets, receiver, true);
emit Referral(referrer, receiver, assets);
}
Expand Down Expand Up @@ -1936,7 +1947,7 @@ contract SavingsContract_imbtc_mainnet_22 is
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets) {
) external override returns (uint256 assets) {
(assets, ) = _creditsToUnderlying(shares);
_transferAndMint(assets, receiver, true);
emit Referral(referrer, receiver, assets);
Expand Down
17 changes: 15 additions & 2 deletions contracts/legacy-upgraded/imusd-mainnet-22.sol
Expand Up @@ -202,7 +202,7 @@ interface ISavingsContractV1 {
function creditBalances(address) external view returns (uint256);
}

interface ISavingsContractV3 {
interface ISavingsContractV4 {
// DEPRECATED but still backwards compatible
function redeem(uint256 _amount) external returns (uint256 massetReturned);

Expand Down Expand Up @@ -253,6 +253,19 @@ interface ISavingsContractV3 {
address _beneficiary,
address _referrer
) external returns (uint256 creditsIssued);

// -------------------------------------------- V4
function deposit(
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares);

function mint(
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets);
}

/*
Expand Down Expand Up @@ -1273,7 +1286,7 @@ library StableMath {
*/
contract SavingsContract_imusd_mainnet_22 is
ISavingsContractV1,
ISavingsContractV3,
ISavingsContractV4,
IERC4626Vault,
Initializable,
InitializableToken,
Expand Down
26 changes: 19 additions & 7 deletions contracts/legacy-upgraded/imusd-polygon-22.sol
Expand Up @@ -268,7 +268,9 @@ interface ISavingsManager {
function lastBatchCollected(address _mAsset) external view returns (uint256);
}

interface ISavingsContractV3 {
interface ISavingsContractV4 is
IERC4626Vault // V4
{
// DEPRECATED but still backwards compatible
function redeem(uint256 _amount) external returns (uint256 massetReturned);

Expand Down Expand Up @@ -296,8 +298,6 @@ interface ISavingsContractV3 {

function creditsToUnderlying(uint256 _underlying) external view returns (uint256 credits); // V2

// --------------------------------------------

function redeemAndUnwrap(
uint256 _amount,
bool _isCreditAmt,
Expand All @@ -319,6 +319,19 @@ interface ISavingsContractV3 {
address _beneficiary,
address _referrer
) external returns (uint256 creditsIssued);

// -------------------------------------------- V4
function deposit(
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares);

function mint(
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets);
}

/*
Expand Down Expand Up @@ -1122,8 +1135,7 @@ library YieldValidator {
* DATE: 2022-04-08
*/
contract SavingsContract_imusd_polygon_22 is
ISavingsContractV3,
IERC4626Vault,
ISavingsContractV4,
Initializable,
InitializableToken,
ImmutableModule
Expand Down Expand Up @@ -1903,7 +1915,7 @@ contract SavingsContract_imusd_polygon_22 is
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares) {
) external override returns (uint256 shares) {
shares = _transferAndMint(assets, receiver, true);
emit Referral(referrer, receiver, assets);
}
Expand Down Expand Up @@ -1953,7 +1965,7 @@ contract SavingsContract_imusd_polygon_22 is
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets) {
) external override returns (uint256 assets) {
(assets, ) = _creditsToUnderlying(shares);
_transferAndMint(assets, receiver, true);
emit Referral(referrer, receiver, assets);
Expand Down
4 changes: 2 additions & 2 deletions contracts/rewards/boosted-staking/BoostedDualVault.sol
Expand Up @@ -4,7 +4,7 @@ pragma solidity 0.8.6;
// Internal
import { IRewardsRecipientWithPlatformToken } from "../../interfaces/IRewardsDistributionRecipient.sol";
import { IBoostedDualVaultWithLockup } from "../../interfaces/IBoostedDualVaultWithLockup.sol";
import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { ISavingsContractV4 } from "../../interfaces/ISavingsContract.sol";
import { IRewardsDistributionRecipient, InitializableRewardsDistributionRecipient } from "../InitializableRewardsDistributionRecipient.sol";
import { BoostedTokenWrapper } from "./BoostedTokenWrapper.sol";
import { PlatformTokenVendor } from "../staking/PlatformTokenVendor.sol";
Expand Down Expand Up @@ -331,7 +331,7 @@ contract BoostedDualVault is
_reduceRaw(_amount);

// Unwrap `stakingToken` into `output` and send to `beneficiary`
(, , outputQuantity) = ISavingsContractV3(address(stakingToken)).redeemAndUnwrap(
(, , outputQuantity) = ISavingsContractV4(address(stakingToken)).redeemAndUnwrap(
_amount,
true,
_minAmountOut,
Expand Down
4 changes: 2 additions & 2 deletions contracts/rewards/boosted-staking/BoostedVault.sol
Expand Up @@ -3,7 +3,7 @@ pragma solidity 0.8.6;

// Internal
import { IBoostedVaultWithLockup } from "../../interfaces/IBoostedVaultWithLockup.sol";
import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { ISavingsContractV4 } from "../../interfaces/ISavingsContract.sol";
import { InitializableRewardsDistributionRecipient } from "../InitializableRewardsDistributionRecipient.sol";
import { BoostedTokenWrapper } from "./BoostedTokenWrapper.sol";
import { Initializable } from "../../shared/@openzeppelin-2.5/Initializable.sol";
Expand Down Expand Up @@ -287,7 +287,7 @@ contract BoostedVault is
_reduceRaw(_amount);

// Unwrap `stakingToken` into `output` and send to `beneficiary`
(, , outputQuantity) = ISavingsContractV3(address(stakingToken)).redeemAndUnwrap(
(, , outputQuantity) = ISavingsContractV4(address(stakingToken)).redeemAndUnwrap(
_amount,
true,
_minAmountOut,
Expand Down
4 changes: 2 additions & 2 deletions contracts/rewards/staking/StakingRewards.sol
Expand Up @@ -4,7 +4,7 @@ pragma solidity 0.8.6;
// Internal
import { StakingTokenWrapper } from "./StakingTokenWrapper.sol";
import { InitializableRewardsDistributionRecipient } from "../InitializableRewardsDistributionRecipient.sol";
import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { ISavingsContractV4 } from "../../interfaces/ISavingsContract.sol";
import { StableMath } from "../../shared/StableMath.sol";

// Libs
Expand Down Expand Up @@ -203,7 +203,7 @@ contract StakingRewards is
_reduceRaw(_amount);

// Unwrap `stakingToken` into `output` and send to `beneficiary`
(, , outputQuantity) = ISavingsContractV3(address(stakingToken)).redeemAndUnwrap(
(, , outputQuantity) = ISavingsContractV4(address(stakingToken)).redeemAndUnwrap(
_amount,
true,
_minAmountOut,
Expand Down
4 changes: 2 additions & 2 deletions contracts/rewards/staking/StakingRewardsWithPlatformToken.sol
Expand Up @@ -5,7 +5,7 @@ pragma solidity 0.8.6;
import { IRewardsDistributionRecipient, IRewardsRecipientWithPlatformToken } from "../../interfaces/IRewardsDistributionRecipient.sol";
import { IStakingRewardsWithPlatformToken } from "../../interfaces/IStakingRewardsWithPlatformToken.sol";
import { InitializableRewardsDistributionRecipient } from "../InitializableRewardsDistributionRecipient.sol";
import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { ISavingsContractV4 } from "../../interfaces/ISavingsContract.sol";
import { StakingTokenWrapper } from "./StakingTokenWrapper.sol";
import { PlatformTokenVendor } from "./PlatformTokenVendor.sol";
import { StableMath } from "../../shared/StableMath.sol";
Expand Down Expand Up @@ -218,7 +218,7 @@ contract StakingRewardsWithPlatformToken is
_reduceRaw(_amount);

// Unwrap `stakingToken` into `output` and send to `beneficiary`
(, , outputQuantity) = ISavingsContractV3(address(stakingToken)).redeemAndUnwrap(
(, , outputQuantity) = ISavingsContractV4(address(stakingToken)).redeemAndUnwrap(
_amount,
true,
_minAmountOut,
Expand Down
15 changes: 4 additions & 11 deletions contracts/savings/SavingsContract.sol
Expand Up @@ -5,9 +5,8 @@ pragma solidity 0.8.6;
import { ISavingsManager } from "../interfaces/ISavingsManager.sol";

// Internal
import { ISavingsContractV3 } from "../interfaces/ISavingsContract.sol";
import { ISavingsContractV4 } from "../interfaces/ISavingsContract.sol";
import { IUnwrapper } from "../interfaces/IUnwrapper.sol";
import { IERC4626Vault } from "../interfaces/IERC4626Vault.sol";
import { InitializableToken } from "../shared/InitializableToken.sol";
import { ImmutableModule } from "../shared/ImmutableModule.sol";
import { IConnector } from "./peripheral/IConnector.sol";
Expand All @@ -27,13 +26,7 @@ import { YieldValidator } from "../shared/YieldValidator.sol";
* @dev VERSION: 2.2
* DATE: 2022-04-08
*/
contract SavingsContract is
ISavingsContractV3,
IERC4626Vault,
Initializable,
InitializableToken,
ImmutableModule
{
contract SavingsContract is ISavingsContractV4, Initializable, InitializableToken, ImmutableModule {
using StableMath for uint256;

// Core events for depositing and withdrawing
Expand Down Expand Up @@ -819,7 +812,7 @@ contract SavingsContract is
uint256 assets,
address receiver,
address referrer
) external returns (uint256 shares) {
) external override returns (uint256 shares) {
shares = _transferAndMint(assets, receiver, true);
emit Referral(referrer, receiver, assets);
}
Expand Down Expand Up @@ -869,7 +862,7 @@ contract SavingsContract is
uint256 shares,
address receiver,
address referrer
) external returns (uint256 assets) {
) external override returns (uint256 assets) {
(assets, ) = _creditsToUnderlying(shares);
_transferAndMint(assets, receiver, true);
emit Referral(referrer, receiver, assets);
Expand Down
10 changes: 5 additions & 5 deletions contracts/savings/peripheral/SaveWrapper.sol
Expand Up @@ -7,7 +7,7 @@ import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.s
import { IBoostedVaultWithLockup } from "../../interfaces/IBoostedVaultWithLockup.sol";
import { IFeederPool } from "../../interfaces/IFeederPool.sol";
import { IMasset } from "../../interfaces/IMasset.sol";
import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { ISavingsContractV4 } from "../../interfaces/ISavingsContract.sol";
import { IUniswapV2Router02 } from "../../peripheral/Uniswap/IUniswapV2Router02.sol";
import { IBasicToken } from "../../shared/IBasicToken.sol";
import { ImmutableModule } from "../../shared/ImmutableModule.sol";
Expand Down Expand Up @@ -306,19 +306,19 @@ contract SaveWrapper is ImmutableModule {
address _referrer
) internal {
if (_stake && _referrer != address(0)) {
uint256 credits = ISavingsContractV3(_save).depositSavings(
uint256 credits = ISavingsContractV4(_save).depositSavings(
_amount,
address(this),
_referrer
);
IBoostedVaultWithLockup(_vault).stake(msg.sender, credits);
} else if (_stake && _referrer == address(0)) {
uint256 credits = ISavingsContractV3(_save).depositSavings(_amount, address(this));
uint256 credits = ISavingsContractV4(_save).depositSavings(_amount, address(this));
IBoostedVaultWithLockup(_vault).stake(msg.sender, credits);
} else if (!_stake && _referrer != address(0)) {
ISavingsContractV3(_save).depositSavings(_amount, msg.sender, _referrer);
ISavingsContractV4(_save).depositSavings(_amount, msg.sender, _referrer);
} else {
ISavingsContractV3(_save).depositSavings(_amount, msg.sender);
ISavingsContractV4(_save).depositSavings(_amount, msg.sender);
}
}

Expand Down

0 comments on commit 9a4c5f2

Please sign in to comment.