编译器
0.8.19+commit.7dd6d404
文件 1 的 11:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 11:IAggregationRouterV5.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IAggregationExecutor {
function execute(address msgSender) external payable;
}
interface IAggregationRouterV5 {
struct SwapDescription {
IERC20 srcToken;
IERC20 dstToken;
address payable srcReceiver;
address payable dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
}
function swap(
IAggregationExecutor executor,
SwapDescription calldata desc,
bytes calldata permit,
bytes calldata data
) external payable returns (uint256 returnAmount, uint256 spentAmount);
function uniswapV3Swap(uint256 amount, uint256 minReturn, uint256[] calldata pools)
external
payable
returns (uint256 returnAmount);
function unoswap(IERC20 srcToken, uint256 amount, uint256 minReturn, uint256[] calldata pools)
external
payable
returns (uint256 returnAmount);
}
文件 3 的 11:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 4 的 11:IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 5 的 11:IStrategyVault.sol
pragma solidity ^0.8.0;
interface IStrategyVault {
function totalSupply() external view returns (uint256);
function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_);
function withdraw(uint256 assets_, address receiver_, address owner_) external returns (uint256 shares_);
function mint(uint256 shares_, address receiver_) external returns (uint256 assets_);
function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assetsAfterFee_);
function getWithdrawFee(uint256 _amount) external view returns (uint256 amount);
}
文件 6 的 11:IUniswapV3Pool.sol
pragma solidity ^0.8.0;
interface IUniswapV3Pool {
function swap(
address recipient,
bool zeroForOne,
int256 amountSpecified,
uint160 sqrtPriceLimitX96,
bytes calldata data
) external returns (int256 amount0, int256 amount1);
function token0() external view returns (address);
function token1() external view returns (address);
function fee() external view returns (uint24);
}
文件 7 的 11:IWETH.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IWETH is IERC20 {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
文件 8 的 11:IWstETH.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IWstETH is IERC20 {
function wrap(uint256 _stETHAmount) external returns (uint256);
function unwrap(uint256 _wstETHAmount) external returns (uint256);
function tokensPerStEth() external view returns (uint256);
function stEthPerToken() external view returns (uint256);
function getStETHByWstETH(uint256 _wstETHAmount) external view returns (uint256);
function getWstETHByStETH(uint256 _stETHAmount) external view returns (uint256);
}
文件 9 的 11:OneinchCaller.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Address.sol";
import "../../interfaces/1inch/IAggregationRouterV5.sol";
import "../../interfaces/uniswapV3/IUniswapV3Pool.sol";
contract OneinchCaller {
address public constant ETH_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address public constant W_ETH_ADDR = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public constant oneInchRouter = 0x1111111254EEB25477B68fb85Ed929f73A960582;
uint256 private constant _UNIV3_ONE_FOR_ZERO_MASK = 1 << 255;
function parseSwapCalldata(bytes memory _swapData)
internal
pure
returns (bytes4 functionSignature_, bytes memory remainingBytes_)
{
functionSignature_ = bytes4(_swapData[0]) | (bytes4(_swapData[1]) >> 8) | (bytes4(_swapData[2]) >> 16)
| (bytes4(_swapData[3]) >> 24);
uint256 remainingLength_ = _swapData.length - 4;
remainingBytes_ = new bytes(remainingLength_);
assembly {
let src := add(_swapData, 0x24)
let dst := add(remainingBytes_, 0x20)
let size := remainingLength_
for {} gt(size, 31) {} {
mstore(dst, mload(src))
src := add(src, 0x20)
dst := add(dst, 0x20)
size := sub(size, 0x20)
}
let mask := sub(exp(2, mul(8, size)), 1)
mstore(dst, and(mload(src), mask))
}
}
function executeSwap(
uint256 _amount,
address _srcToken,
address _dstToken,
bytes memory _swapData,
uint256 _swapGetMin
) internal returns (uint256 returnAmount_, uint256 spentAmount_) {
(bytes4 functionSignature_, bytes memory remainingBytes_) = parseSwapCalldata(_swapData);
if (functionSignature_ == IAggregationRouterV5.swap.selector) {
(, IAggregationRouterV5.SwapDescription memory desc_,,) =
abi.decode(remainingBytes_, (IAggregationExecutor, IAggregationRouterV5.SwapDescription, bytes, bytes));
require(address(this) == desc_.dstReceiver, "1inch: Invalid receiver!");
require(IERC20(_srcToken) == desc_.srcToken && IERC20(_dstToken) == desc_.dstToken, "1inch: Invalid token!");
require(_amount >= desc_.amount, "1inch: Invalid input amount!");
bytes memory returnData_;
if (_srcToken == ETH_ADDR) {
returnData_ = Address.functionCallWithValue(oneInchRouter, _swapData, _amount);
} else {
returnData_ = Address.functionCall(oneInchRouter, _swapData);
}
(returnAmount_, spentAmount_) = abi.decode(returnData_, (uint256, uint256));
require(spentAmount_ <= desc_.amount, "1inch: unexpected spentAmount.");
require(returnAmount_ >= _swapGetMin, "1inch: unexpected returnAmount.");
} else if (functionSignature_ == IAggregationRouterV5.unoswap.selector) {
(IERC20 srcTokenFromCalldata_, uint256 inputAmount_,,) =
abi.decode(remainingBytes_, (IERC20, uint256, uint256, uint256[]));
require(_amount >= inputAmount_, "1inch: Invalid input amount!");
spentAmount_ = inputAmount_;
uint256 dstTokenBefore_ =
_dstToken == ETH_ADDR ? address(this).balance : IERC20(_dstToken).balanceOf(address(this));
if (_srcToken == ETH_ADDR) {
require(address(srcTokenFromCalldata_) == address(0), "1inch: Invalid token!");
Address.functionCallWithValue(oneInchRouter, _swapData, _amount);
} else {
require(_srcToken == address(srcTokenFromCalldata_), "1inch: Invalid token!");
Address.functionCall(oneInchRouter, _swapData);
}
returnAmount_ = _dstToken == ETH_ADDR
? (address(this).balance - dstTokenBefore_)
: (IERC20(_dstToken).balanceOf(address(this)) - dstTokenBefore_);
require(returnAmount_ > 0 && returnAmount_ >= _swapGetMin, "1inch: unexpected returnAmount.");
} else if (functionSignature_ == IAggregationRouterV5.uniswapV3Swap.selector) {
(uint256 inputAmount_,, uint256[] memory pools_) =
abi.decode(remainingBytes_, (uint256, uint256, uint256[]));
require(_amount >= inputAmount_, "1inch: Invalid input amount!");
spentAmount_ = inputAmount_;
address srcTokenFromCalldata_ = (pools_[0] & _UNIV3_ONE_FOR_ZERO_MASK == 0)
? IUniswapV3Pool(address(uint160(pools_[0]))).token0()
: IUniswapV3Pool(address(uint160(pools_[0]))).token1();
uint256 dstTokenBefore_ =
_dstToken == ETH_ADDR ? address(this).balance : IERC20(_dstToken).balanceOf(address(this));
if (_srcToken == ETH_ADDR) {
require(srcTokenFromCalldata_ == W_ETH_ADDR, "1inch: Invalid token!");
Address.functionCallWithValue(oneInchRouter, _swapData, _amount);
} else {
require(_srcToken == srcTokenFromCalldata_, "1inch: Invalid token!");
Address.functionCall(oneInchRouter, _swapData);
}
returnAmount_ = _dstToken == ETH_ADDR
? (address(this).balance - dstTokenBefore_)
: (IERC20(_dstToken).balanceOf(address(this)) - dstTokenBefore_);
require(returnAmount_ > 0 && returnAmount_ >= _swapGetMin, "1inch: unexpected returnAmount.");
} else {
revert("1inch: Invalid function signature!");
}
}
}
文件 10 的 11:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
文件 11 的 11:VaultStETHWrapper.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../interfaces/lido/IWstETH.sol";
import "../interfaces/weth/IWETH.sol";
import "../interfaces/IStrategyVault.sol";
import "./1inch/OneinchCaller.sol";
contract VaultStETHWrapper is OneinchCaller {
using SafeERC20 for IERC20;
using SafeERC20 for IWETH;
using SafeERC20 for IWstETH;
address public immutable vaultAddr;
IStrategyVault internal immutable vault;
address public constant WETH_ADDR = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public constant STETH_ADDR = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84;
address public constant WSTETH_ADDR = 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0;
IERC20 internal constant STETH_CONTRACT = IERC20(STETH_ADDR);
IWstETH internal constant WSTETH_CONTRACT = IWstETH(WSTETH_ADDR);
event Deposit(address sender, uint256 amount, uint256 swapGet, address receiver);
event Withdraw(address sender, uint256 stAmount, uint256 swapGet, address receiver);
event DepositWSTETH(address sender, uint256 stAmount, uint256 depositWst, address receiver);
event WithdrawWSTETH(address sender, uint256 stAmount, uint256 withdrawWst, address receiver);
constructor(address _vaultAddr) {
vaultAddr = _vaultAddr;
vault = IStrategyVault(_vaultAddr);
STETH_CONTRACT.safeIncreaseAllowance(_vaultAddr, type(uint256).max);
STETH_CONTRACT.safeIncreaseAllowance(WSTETH_ADDR, type(uint256).max);
}
function deposit(uint256 _wethAmount, bytes calldata _swapCalldata, uint256 _minStEthIn, address _receiver)
external
payable
returns (uint256 returnShares_)
{
uint256 deposit_ = msg.value;
if (_wethAmount > 0) {
IWETH(WETH_ADDR).safeTransferFrom(msg.sender, address(this), _wethAmount);
IWETH(WETH_ADDR).withdraw(_wethAmount);
deposit_ += _wethAmount;
}
(uint256 returnAmount_, uint256 inputAmount_) =
executeSwap(deposit_, ETH_ADDR, STETH_ADDR, _swapCalldata, _minStEthIn);
require(inputAmount_ == deposit_, "InputInsufficient");
returnShares_ = vault.deposit(returnAmount_, _receiver);
emit Deposit(msg.sender, deposit_, returnAmount_, _receiver);
}
function withdraw(
uint256 _amount,
bytes calldata _swapCalldata,
uint256 _minEthOut,
address _receiver,
bool _isWeth
) external returns (uint256 returnEthAmount_) {
uint256 stEthBalanceBefore_ = STETH_CONTRACT.balanceOf(address(this));
uint256 withdrawFee_ = vault.getWithdrawFee(_amount);
vault.withdraw(_amount, address(this), msg.sender);
uint256 withdrawnAmount_ = STETH_CONTRACT.balanceOf(address(this)) - stEthBalanceBefore_;
require(withdrawnAmount_ + withdrawFee_ <= _amount, "UnexpectedWithdrawAmount");
STETH_CONTRACT.safeIncreaseAllowance(oneInchRouter, withdrawnAmount_);
(returnEthAmount_,) = executeSwap(withdrawnAmount_, STETH_ADDR, ETH_ADDR, _swapCalldata, _minEthOut);
STETH_CONTRACT.safeApprove(oneInchRouter, 0);
if (_isWeth) {
IWETH(WETH_ADDR).deposit{value: returnEthAmount_}();
IWETH(WETH_ADDR).safeTransfer(_receiver, returnEthAmount_);
} else {
Address.sendValue(payable(_receiver), returnEthAmount_);
}
emit Withdraw(msg.sender, _amount, returnEthAmount_, _receiver);
}
function depositWstETH(uint256 _amount, address _receiver) external returns (uint256 returnShares_) {
WSTETH_CONTRACT.safeTransferFrom(msg.sender, address(this), _amount);
uint256 depositSt_ = WSTETH_CONTRACT.unwrap(_amount);
returnShares_ = vault.deposit(depositSt_, _receiver);
emit DepositWSTETH(msg.sender, depositSt_, _amount, _receiver);
}
function withdrawWstETH(uint256 _amount, address _receiver) external returns (uint256 wstAmount_) {
uint256 stEthBalanceBefore_ = STETH_CONTRACT.balanceOf(address(this));
vault.withdraw(_amount, address(this), msg.sender);
uint256 withdrawnAmount_ = STETH_CONTRACT.balanceOf(address(this)) - stEthBalanceBefore_;
require(withdrawnAmount_ <= _amount, "UnexpectedWithdrawAmount");
wstAmount_ = WSTETH_CONTRACT.wrap(withdrawnAmount_);
WSTETH_CONTRACT.safeTransfer(_receiver, wstAmount_);
emit WithdrawWSTETH(msg.sender, withdrawnAmount_, wstAmount_, _receiver);
}
function getWithdrawSwapAmount(uint256 amount_) external view returns (uint256 stEthSwapAmount_) {
uint256 withdrawFee = vault.getWithdrawFee(amount_);
stEthSwapAmount_ = amount_ - withdrawFee - 2;
}
receive() external payable {}
}
{
"compilationTarget": {
"contracts/main/VaultStETHWrapper.sol": "VaultStETHWrapper"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_vaultAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"stAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositWst","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DepositWSTETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"stAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"stAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawWst","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"WithdrawWSTETH","type":"event"},{"inputs":[],"name":"ETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WSTETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"W_ETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wethAmount","type":"uint256"},{"internalType":"bytes","name":"_swapCalldata","type":"bytes"},{"internalType":"uint256","name":"_minStEthIn","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"returnShares_","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"depositWstETH","outputs":[{"internalType":"uint256","name":"returnShares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"getWithdrawSwapAmount","outputs":[{"internalType":"uint256","name":"stEthSwapAmount_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneInchRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_swapCalldata","type":"bytes"},{"internalType":"uint256","name":"_minEthOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bool","name":"_isWeth","type":"bool"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"returnEthAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"withdrawWstETH","outputs":[{"internalType":"uint256","name":"wstAmount_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]