Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions src/modules/interfaces/IModuleAMO.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,7 @@ interface IModuleAMO {

// Tracks earned amount per user
function earned(address account) external view returns (uint256);

// amount the user has staked in the AMO
function stakedAmount(address account) external view returns (uint256);
}
164 changes: 75 additions & 89 deletions src/modules/liquityModule/LiquityDepositModule.sol
Original file line number Diff line number Diff line change
@@ -1,89 +1,75 @@
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.8.13;

import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../interfaces/IModuleAMO.sol";
import "./LiquityModuleAMO.sol";
import "@modules/stablecoinDepositModule/StablecoinDepositModuleBase.sol";

/// @title LiquityDepositModule
/// @author Ekonomia: https://github.com/ekonomia-tech
/// @notice Accepts LUSD 1:1 and uses Liquity StabilityPool for AMO
contract LiquityDepositModule is StablecoinDepositModuleBase {
using SafeERC20 for IERC20Metadata;

/// Errors
error CannotDepositZero();
error CannotRedeemZeroTokens();

/// Events
event Deposited(address indexed depositor, uint256 depositAmount, uint256 phoMinted);
event Redeemed(address indexed redeemer, uint256 redeemAmount);

/// State vars
address public liquityModuleAMO;
address public stakingToken = 0x5f98805A4E8be255a32880FDeC7F6728C6568bA0; // LUSD
address rewardToken = 0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D; // LQTY

IStabilityPool public stabilityPool = IStabilityPool(0x66017D22b0f8556afDd19FC67041899Eb65a21bb);

/// Constructor
constructor(address _moduleManager, address _stablecoin, address _pho)
StablecoinDepositModuleBase(_moduleManager, _stablecoin, _pho)
{
LiquityModuleAMO liquityModuleAMOInstance = new LiquityModuleAMO(
"LQTY-AMO",
"LQTYAMO",
stakingToken,
rewardToken,
msg.sender,
address(this),
_stablecoin
);

liquityModuleAMO = address(liquityModuleAMOInstance);
}

/// @notice user deposits their stablecoin
/// @param depositAmount deposit amount (in stablecoin decimals)
function deposit(uint256 depositAmount) external override nonReentrant {
if (depositAmount == 0) {
revert CannotDepositZero();
}
uint256 scaledDepositAmount = depositAmount;

// Call AMO - which transfers LUSD from caller
IModuleAMO(liquityModuleAMO).stakeFor(msg.sender, depositAmount);

issuedAmount[msg.sender] += scaledDepositAmount;

// mint PHO
moduleManager.mintPHO(msg.sender, scaledDepositAmount);

emit Deposited(msg.sender, depositAmount, scaledDepositAmount);
}

/// @notice user redeems PHO for LUSD
function redeem() external nonReentrant {
uint256 redeemAmount = issuedAmount[msg.sender];
if (redeemAmount == 0) {
revert CannotRedeemZeroTokens();
}

issuedAmount[msg.sender] -= redeemAmount;

// burn PHO
moduleManager.burnPHO(msg.sender, redeemAmount);

// scale if decimals < 18
uint256 scaledRedeemAmount = redeemAmount;
scaledRedeemAmount = redeemAmount / (10 ** (18 - stablecoinDecimals));

// Note: Always a full withdrawal
IModuleAMO(liquityModuleAMO).withdrawAllFor(msg.sender);

emit Redeemed(msg.sender, redeemAmount);
}
}
// // SPDX-License-Identifier: GPL-3.0-or-later

// pragma solidity ^0.8.13;

// import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
// import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
// import "../interfaces/IModuleAMO.sol";
// import "./LiquityModuleAMO.sol";
// import "@modules/stablecoinDepositModule/StablecoinDepositModuleBase.sol";

// /// @title LiquityDepositModule
// /// @author Ekonomia: https://github.com/ekonomia-tech
// /// @notice Accepts LUSD 1:1 and uses Liquity StabilityPool for AMO
// contract LiquityDepositModule is StablecoinDepositModuleBase {
// using SafeERC20 for IERC20Metadata;

// /// Errors
// error CannotDepositZero();
// error CannotRedeemZeroTokens();

// /// Events
// event Deposited(address indexed depositor, uint256 depositAmount, uint256 phoMinted);
// event Redeemed(address indexed redeemer, uint256 redeemAmount);

// /// State vars
// IModuleAMO public liquityModuleAMO;

// /// Constructor
// constructor(
// address _moduleManager,
// address _stablecoin,
// address _pho,
// address _stakingToken,
// address _rewardToken
// ) StablecoinDepositModuleBase(_moduleManager, _stablecoin, _pho) {
// liquityModuleAMO = new LiquityModuleAMO(
// "Photon Liquity AMO",
// "LQTY-AMO",
// _stakingToken,
// _rewardToken,
// msg.sender,
// address(this),
// _stablecoin
// );
// }

// /// @notice user deposits their stablecoin
// /// @param depositAmount deposit amount (in stablecoin decimals)
// function deposit(uint256 depositAmount) external override nonReentrant {
// if (depositAmount == 0) {
// revert CannotDepositZero();
// }
// // Call AMO - which transfers LUSD from caller
// liquityModuleAMO.stakeFor(msg.sender, depositAmount);
// issuedAmount[msg.sender] += depositAmount;
// moduleManager.mintPHO(msg.sender, depositAmount);

// // pho minted == depositAmount, since 1 to 1 with LUSD
// emit Deposited(msg.sender, depositAmount, depositAmount);
// }

// /// @notice user redeems PHO for LUSD
// function redeem() external nonReentrant {
// uint256 redeemAmount = issuedAmount[msg.sender];
// if (redeemAmount == 0) {
// revert CannotRedeemZeroTokens();
// }
// issuedAmount[msg.sender] -= redeemAmount;
// moduleManager.burnPHO(msg.sender, redeemAmount);

// // Note: Always a full withdrawal
// liquityModuleAMO.withdrawAllFor(msg.sender);
// emit Redeemed(msg.sender, redeemAmount);
// }
// }
Loading