编译器
0.8.23+commit.f704f362
文件 1 的 6:IERC20.sol
pragma solidity ^0.8.20;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 2 的 6:ISimpleStakingERC20.sol
pragma solidity 0.8.23;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface ISimpleStakingERC20 {
struct Supported {
bool deposit;
bool withdraw;
}
error AMOUNT_NULL();
error ADDRESS_NULL();
error INSUFFICIENT_BALANCE();
error TOKEN_NOT_ALLOWED(IERC20 token);
event SupportedToken(IERC20 indexed token, Supported supported);
event Deposit(IERC20 indexed token, address indexed staker, uint256 amount);
event Withdraw(IERC20 indexed token, address indexed staker, uint256 amount);
function deposit(IERC20 _token, uint256 _amount, address _receiver) external;
function rescueERC20(IERC20 _token) external;
function supportToken(IERC20 _token, Supported calldata _supported) external;
function withdraw(IERC20 _token, uint256 _amount, address _receiver) external;
}
文件 3 的 6:IWETH.sol
pragma solidity 0.8.23;
interface IWETH {
function deposit() external payable;
function withdraw(uint256) external;
function approve(address, uint256) external returns (bool);
function transfer(address, uint256) external returns (bool);
function transferFrom(address, address, uint256) external returns (bool);
function balanceOf(address) external view returns (uint256);
}
文件 4 的 6:IWeETH.sol
pragma solidity 0.8.23;
interface IWeETH {
function approve(address _spender, uint256 _amount) external returns (bool);
function eETH() external view returns (address);
function liquidityPool() external view returns (address);
function wrap(uint256 _stETHAmount) external returns (uint256);
}
文件 5 的 6:IWstETH.sol
pragma solidity 0.8.23;
interface IWstETH {
function approve(address _spender, uint256 _amount) external returns (bool);
function getWstETHByStETH(uint256 _stETHAmount) external view returns (uint256);
function stETH() external view returns (address);
function wrap(uint256 _stETHAmount) external returns (uint256);
}
文件 6 的 6:Zap.sol
pragma solidity 0.8.23;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IWETH} from "./interfaces/IWETH.sol";
import {IWeETH} from "./interfaces/IWeETH.sol";
import {IWstETH} from "./interfaces/IWstETH.sol";
import {ISimpleStakingERC20} from "./interfaces/ISimpleStakingERC20.sol";
contract Zap {
IWETH public immutable weth;
IERC20 public immutable eETH;
IERC20 public immutable stETH;
IWeETH public immutable weETH;
IWstETH public immutable wstETH;
ISimpleStakingERC20 public immutable stakingContract;
constructor(address payable _weth, address _wstETH, address _weETH, address _stakingContract) {
weth = IWETH(_weth);
weETH = IWeETH(_weETH);
wstETH = IWstETH(_wstETH);
eETH = IERC20(weETH.eETH());
stETH = IERC20(wstETH.stETH());
stakingContract = ISimpleStakingERC20(_stakingContract);
eETH.approve(address(weETH), type(uint256).max);
weth.approve(_stakingContract, type(uint256).max);
stETH.approve(address(wstETH), type(uint256).max);
weETH.approve(address(stakingContract), type(uint256).max);
wstETH.approve(address(stakingContract), type(uint256).max);
}
function ethZapIn() external payable {
if (msg.value == 0) revert ISimpleStakingERC20.AMOUNT_NULL();
weth.deposit{value: msg.value}();
stakingContract.deposit(IERC20(address(weth)), msg.value, msg.sender);
}
function stETHZapIn(uint256 _amount) external {
if (_amount == 0) revert ISimpleStakingERC20.AMOUNT_NULL();
stETH.transferFrom(msg.sender, address(this), _amount);
stakingContract.deposit(IERC20(address(wstETH)), wstETH.wrap(stETH.balanceOf(address(this))), msg.sender);
}
function eETHZapIn(uint256 _amount) external {
if (_amount == 0) revert ISimpleStakingERC20.AMOUNT_NULL();
eETH.transferFrom(msg.sender, address(this), _amount);
stakingContract.deposit(IERC20(address(weETH)), weETH.wrap(eETH.balanceOf(address(this))), msg.sender);
}
}
{
"compilationTarget": {
"src/Zap.sol": "Zap"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[{"internalType":"address payable","name":"_weth","type":"address"},{"internalType":"address","name":"_wstETH","type":"address"},{"internalType":"address","name":"_weETH","type":"address"},{"internalType":"address","name":"_stakingContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AMOUNT_NULL","type":"error"},{"inputs":[],"name":"eETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"eETHZapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethZapIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stETHZapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"contract ISimpleStakingERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weETH","outputs":[{"internalType":"contract IWeETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wstETH","outputs":[{"internalType":"contract IWstETH","name":"","type":"address"}],"stateMutability":"view","type":"function"}]