LRTDepositPool

Créé Le diff n'expire jamais
34 suppressions
622 lignes
45 ajouts
625 lignes
// SPDX-License-Identifier: BUSL-1.1
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.27;
pragma solidity 0.8.27;


import { UtilLib } from "./utils/UtilLib.sol";
import { UtilLib } from "./utils/UtilLib.sol";
import { LRTConstants } from "./utils/LRTConstants.sol";
import { LRTConstants } from "./utils/LRTConstants.sol";


import { LRTConfigRoleChecker, ILRTConfig } from "./utils/LRTConfigRoleChecker.sol";
import { LRTConfigRoleChecker, ILRTConfig } from "./utils/LRTConfigRoleChecker.sol";
import { IRSETH } from "./interfaces/IRSETH.sol";
import { IRSETH } from "./interfaces/IRSETH.sol";
import { ILRTOracle } from "./interfaces/ILRTOracle.sol";
import { ILRTOracle } from "./interfaces/ILRTOracle.sol";
import { INodeDelegator } from "./interfaces/INodeDelegator.sol";
import { INodeDelegator } from "./interfaces/INodeDelegator.sol";
import { ILRTDepositPool } from "./interfaces/ILRTDepositPool.sol";
import { ILRTDepositPool } from "./interfaces/ILRTDepositPool.sol";
import { ILRTUnstakingVault } from "./interfaces/ILRTUnstakingVault.sol";
import { ILRTUnstakingVault } from "./interfaces/ILRTUnstakingVault.sol";
import { ILRTConverter } from "./interfaces/ILRTConverter.sol";
import { ILRTConverter } from "./interfaces/ILRTConverter.sol";


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


import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
import {
ReentrancyGuardUpgradeable
} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { ILido } from "./external/lido/ILido.sol";
import { ILido } from "./external/lido/ILido.sol";


/// @title LRTDepositPool - Deposit Pool Contract for LSTs
/// @title LRTDepositPool - Deposit Pool Contract for LSTs
/// @notice Handles LST asset deposits
/// @notice Handles LST asset deposits
contract LRTDepositPool is ILRTDepositPool, LRTConfigRoleChecker, PausableUpgradeable, ReentrancyGuardUpgradeable {
contract LRTDepositPool is ILRTDepositPool, LRTConfigRoleChecker, PausableUpgradeable, ReentrancyGuardUpgradeable {
using SafeERC20 for IERC20;
using SafeERC20 for IERC20;


uint256 public maxNodeDelegatorLimit;
uint256 public maxNodeDelegatorLimit;
uint256 public minAmountToDeposit;
uint256 public minAmountToDeposit;


mapping(address => uint256) public isNodeDelegator; // 0: not a node delegator, 1: is a node delegator
mapping(address => uint256) public isNodeDelegator; // 0: not a node delegator, 1: is a node delegator
address[] public nodeDelegatorQueue;
address[] public nodeDelegatorQueue;


/// @notice maximum amount that can be ignored
/// @notice maximum amount that can be ignored
uint256 public maxNegligibleAmount;
uint256 public maxNegligibleAmount;


/// @custom:oz-upgrades-unsafe-allow constructor
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
constructor() {
_disableInitializers();
_disableInitializers();
}
}


/// @dev Initializes the contract
/// @dev Initializes the contract
/// @param lrtConfigAddr LRT config address
/// @param lrtConfigAddr LRT config address
function initialize(address lrtConfigAddr) external initializer {
function initialize(address lrtConfigAddr) external initializer {
UtilLib.checkNonZeroAddress(lrtConfigAddr);
UtilLib.checkNonZeroAddress(lrtConfigAddr);
__Pausable_init();
__Pausable_init();
__ReentrancyGuard_init();
__ReentrancyGuard_init();
maxNodeDelegatorLimit = 10;
maxNodeDelegatorLimit = 10;
lrtConfig = ILRTConfig(lrtConfigAddr);
lrtConfig = ILRTConfig(lrtConfigAddr);
emit UpdatedLRTConfig(lrtConfigAddr);
emit UpdatedLRTConfig(lrtConfigAddr);
}
}


/*//////////////////////////////////////////////////////////////
/*//////////////////////////////////////////////////////////////
receive functions
receive functions
//////////////////////////////////////////////////////////////*/
//////////////////////////////////////////////////////////////*/


receive() external payable { }
receive() external payable { }


/// @dev receive from RewardReceiver
/// @dev receive from RewardReceiver
function receiveFromRewardReceiver() external payable { }
function receiveFromRewardReceiver() external payable { }


/// @dev receive from LRTConverter
/// @dev receive from LRTConverter
function receiveFromLRTConverter() external payable { }
function receiveFromLRTConverter() external payable { }


/// @dev receive from NodeDelegator
/// @dev receive from NodeDelegator
function receiveFromNodeDelegator() external payable { }
function receiveFromNodeDelegator() external payable { }


/*//////////////////////////////////////////////////////////////
/*//////////////////////////////////////////////////////////////
user interactions
user interactions
//////////////////////////////////////////////////////////////*/
//////////////////////////////////////////////////////////////*/


/// @notice Allows user to deposit ETH to the protocol
/// @notice Allows user to deposit ETH to the protocol
/// @param minRSETHAmountExpected Minimum amount of rseth to receive
/// @param minRSETHAmountExpected Minimum amount of rseth to receive
/// @param referralId referral id
/// @param referralId referral id
function depositETH(
function depositETH(
uint256 minRSETHAmountExpected,
uint256 minRSETHAmountExpected,
string calldata referralId
string calldata referralId
)
)
external
external
payable
payable
nonReentrant
nonReentrant
whenNotPaused
whenNotPaused
onlySupportedAsset(LRTConstants.ETH_TOKEN)
{
{
// checks
// checks
uint256 rsethAmountToMint = _beforeDeposit(LRTConstants.ETH_TOKEN, msg.value, minRSETHAmountExpected);
uint256 rsethAmountToMint = _beforeDeposit(LRTConstants.ETH_TOKEN, msg.value, minRSETHAmountExpected);


// interactions
// interactions
_mintRsETH(rsethAmountToMint);
_mintRsETH(rsethAmountToMint);


emit ETHDeposit(msg.sender, msg.value, rsethAmountToMint, referralId);
emit ETHDeposit(msg.sender, msg.value, rsethAmountToMint, referralId);
}
}


/// @notice helps user stake LST to the protocol
/// @notice helps user stake LST to the protocol
/// @param asset LST asset address to stake
/// @param asset LST asset address to stake
/// @param depositAmount LST asset amount to stake
/// @param depositAmount LST asset amount to stake
/// @param minRSETHAmountExpected Minimum amount of rseth to receive
/// @param minRSETHAmountExpected Minimum amount of rseth to receive
function depositAsset(
function depositAsset(
address asset,
address asset,
uint256 depositAmount,
uint256 depositAmount,
uint256 minRSETHAmountExpected,
uint256 minRSETHAmountExpected,