UnstakeStETH

Creato Il diff non scade mai
11 rimozioni
67 linee
8 aggiunte
67 linee
// SPDX-License-Identifier: BUSL-1.1
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.21;
pragma solidity 0.8.27;


import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";


interface ILidoWithdrawalQueue {
interface ILidoWithdrawalQueue {
function requestWithdrawals(
function requestWithdrawals(
uint256[] calldata _amounts,
uint256[] calldata _amounts,
address _owner
address _owner
)
)
external
external
returns (uint256[] memory requestIds);
returns (uint256[] memory requestIds);


/// Usage: findCheckpointHints(_requestIds, 1, getLastCheckpointIndex())
/// Usage: findCheckpointHints(_requestIds, 1, getLastCheckpointIndex())
function findCheckpointHints(
function findCheckpointHints(
uint256[] calldata _requestIds,
uint256[] calldata _requestIds,
uint256 _firstIndex,
uint256 _firstIndex,
uint256 _lastIndex
uint256 _lastIndex
)
)
external
external
view
view
returns (uint256[] memory hintIds);
returns (uint256[] memory hintIds);


function getLastCheckpointIndex() external view returns (uint256);
function getLastCheckpointIndex() external view returns (uint256);


function claimWithdrawalsTo(
function claimWithdrawalsTo(uint256[] calldata _requestIds, uint256[] calldata _hints, address _recipient) external;
uint256[] calldata _requestIds,
uint256[] calldata _hints,
address _recipient
)
external;
function finalize(uint256 _lastRequestIdToBeFinalized, uint256 _maxShareRate) external payable;
function finalize(uint256 _lastRequestIdToBeFinalized, uint256 _maxShareRate) external payable;


function getLastRequestId() external view returns (uint256);
function getLastRequestId() external view returns (uint256);
}
}


/// @dev Upgradeable base contract without storage gaps; adding variables in upgrades can collide with inheritors.
abstract contract UnstakeStETH is Initializable {
abstract contract UnstakeStETH is Initializable {
using SafeERC20 for IERC20;

ILidoWithdrawalQueue public withdrawalQueue;
ILidoWithdrawalQueue public withdrawalQueue;
IERC20 public stETH;
IERC20 public stETH;


event UnstakeStETHStarted(uint256 tokenId);
event UnstakeStETHStarted(uint256 tokenId);


function __initializeStETH(address _withdrawalQueue, address _stETHAddress) internal onlyInitializing {
function __initializeStETH(address _withdrawalQueue, address _stETHAddress) internal onlyInitializing {
withdrawalQueue = ILidoWithdrawalQueue(_withdrawalQueue);
withdrawalQueue = ILidoWithdrawalQueue(_withdrawalQueue);
stETH = IERC20(_stETHAddress);
stETH = IERC20(_stETHAddress);
}
}


function _unstakeStEth(uint256 amountToUnstake) internal {
function _unstakeStEth(uint256 amountToUnstake) internal {
stETH.approve(address(withdrawalQueue), amountToUnstake);
stETH.safeIncreaseAllowance(address(withdrawalQueue), amountToUnstake);


uint256[] memory amounts = new uint256[](1);
uint256[] memory amounts = new uint256[](1);
amounts[0] = amountToUnstake;
amounts[0] = amountToUnstake;


uint256[] memory requestIds = withdrawalQueue.requestWithdrawals(amounts, address(this));
uint256[] memory requestIds = withdrawalQueue.requestWithdrawals(amounts, address(this));


emit UnstakeStETHStarted(requestIds[0]);
emit UnstakeStETHStarted(requestIds[0]);
}
}


function _claimStEth(uint256 _requestId, uint256 _hint) internal {
function _claimStEth(uint256 _requestId, uint256 _hint) internal {
uint256[] memory requestIds = new uint256[](1);
uint256[] memory requestIds = new uint256[](1);
uint256[] memory hints = new uint256[](1);
uint256[] memory hints = new uint256[](1);
requestIds[0] = _requestId;
requestIds[0] = _requestId;
hints[0] = _hint;
hints[0] = _hint;
withdrawalQueue.claimWithdrawalsTo(requestIds, hints, address(this));
withdrawalQueue.claimWithdrawalsTo(requestIds, hints, address(this));
}
}
}
}