-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #157 from yieldnest/qa-script
feat: QA deposit script
- Loading branch information
Showing
5 changed files
with
199 additions
and
112 deletions.
There are no files selected for viewing
Submodule forge-std
updated
38 files
+1 −0 | .gitattributes | |
+6 −12 | .github/workflows/ci.yml | |
+3 −1 | .github/workflows/sync.yml | |
+0 −3 | .gitmodules | |
+1 −1 | README.md | |
+3 −3 | foundry.toml | |
+0 −1 | lib/ds-test | |
+1 −1 | package.json | |
+635 −0 | scripts/vm.py | |
+518 −225 | src/StdAssertions.sol | |
+25 −10 | src/StdChains.sol | |
+2 −2 | src/StdCheats.sol | |
+18 −3 | src/StdInvariant.sol | |
+7 −11 | src/StdJson.sol | |
+202 −107 | src/StdStorage.sol | |
+179 −0 | src/StdToml.sol | |
+1 −1 | src/StdUtils.sol | |
+4 −4 | src/Test.sol | |
+1,534 −480 | src/Vm.sol | |
+401 −382 | src/console.sol | |
+1 −1,555 | src/console2.sol | |
+51 −33 | src/mocks/MockERC20.sol | |
+46 −36 | src/mocks/MockERC721.sol | |
+693 −4 | src/safeconsole.sol | |
+39 −909 | test/StdAssertions.t.sol | |
+36 −26 | test/StdChains.t.sol | |
+19 −11 | test/StdCheats.t.sol | |
+3 −1 | test/StdError.t.sol | |
+49 −0 | test/StdJson.t.sol | |
+8 −8 | test/StdMath.t.sol | |
+167 −11 | test/StdStorage.t.sol | |
+49 −0 | test/StdToml.t.sol | |
+20 −20 | test/StdUtils.t.sol | |
+3 −3 | test/Vm.t.sol | |
+8 −0 | test/fixtures/test.json | |
+6 −0 | test/fixtures/test.toml | |
+1 −1 | test/mocks/MockERC20.t.sol | |
+1 −1 | test/mocks/MockERC721.t.sol |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
|
||
// SPDX-License-Identifier: BSD 3-Clause License | ||
pragma solidity ^0.8.24; | ||
|
||
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; | ||
import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; | ||
|
||
import {IwstETH} from "../../src/external/lido/IwstETH.sol"; | ||
import {IynEigen} from "../../src/interfaces/IynEigen.sol"; | ||
import {ImETHStaking} from "../../src/external/mantle/ImETHStaking.sol"; | ||
import {IfrxMinter} from "../../src/external/frax/IfrxMinter.sol"; | ||
|
||
import {ContractAddresses} from "../ContractAddresses.sol"; | ||
|
||
import "../BaseYnEigenScript.s.sol"; | ||
|
||
interface IRocketPoolDepositPool { | ||
function deposit() external payable; | ||
} | ||
|
||
contract DepositToYnLSDe is BaseYnEigenScript { | ||
|
||
uint256 public privateKey; // dev: assigned in test setup | ||
|
||
bool public shouldInit = true; | ||
|
||
address public broadcaster; | ||
|
||
Deployment deployment; | ||
ActorAddresses.Actors actors; | ||
ContractAddresses.ChainAddresses chainAddresses; | ||
|
||
uint256 public constant AMOUNT = 0.1 ether; | ||
|
||
function tokenName() internal override pure returns (string memory) { | ||
return "YnLSDe"; | ||
} | ||
|
||
function run() public { | ||
|
||
if (shouldInit) _init(); | ||
|
||
address token = _getTokenAddress(vm.prompt("Token (`sfrxETH`, `wstETH`, `mETH` and `rETH` (holesky only))")); | ||
uint256 path = vm.parseUint(vm.prompt("Path (`0` for deposit or `1` for send")); | ||
run(path, token); | ||
} | ||
|
||
function run(uint256 path, address token) public { | ||
uint256 deployerPrivateKey = privateKey == 0 ? vm.envUint("PRIVATE_KEY") : privateKey; | ||
broadcaster = vm.addr(deployerPrivateKey); | ||
console.log("Default Signer Address:", broadcaster); | ||
console.log("Current Block Number:", block.number); | ||
console.log("Current Chain ID:", block.chainid); | ||
console.log("Token Address:", token); | ||
console.log("Path:", path); | ||
|
||
vm.startBroadcast(deployerPrivateKey); | ||
|
||
uint256 _amount = _getToken(token); | ||
if (path == 0) { | ||
_deposit(_amount, token); // deposit to ynEIGEN | ||
} else if (path == 1) { | ||
_send(_amount, token); // send to broadcaster | ||
} else { | ||
revert("Invalid path"); | ||
} | ||
|
||
vm.stopBroadcast(); | ||
|
||
console.log("Deposit successful"); | ||
} | ||
|
||
function _getTokenAddress(string memory n) internal returns (address) { | ||
if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("sfrxETH")) && block.chainid == 1) { | ||
return chainAddresses.lsd.SFRXETH_ADDRESS; | ||
} else if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("wstETH"))) { | ||
return chainAddresses.lsd.WSTETH_ADDRESS; | ||
} else if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("mETH"))) { | ||
return chainAddresses.lsd.METH_ADDRESS; | ||
} else if (keccak256(abi.encodePacked(n)) == keccak256(abi.encodePacked("rETH")) && block.chainid == 17000) { | ||
return chainAddresses.lsd.RETH_ADDRESS; | ||
} else { | ||
revert("Invalid token name"); | ||
} | ||
} | ||
|
||
function _getToken(address token) internal returns (uint256 _amount) { | ||
if (token == chainAddresses.lsd.SFRXETH_ADDRESS) { | ||
_amount = _getSFRXETH(); | ||
} else if (token == chainAddresses.lsd.WSTETH_ADDRESS) { | ||
_amount = _getWSTETH(); | ||
} else if (token == chainAddresses.lsd.METH_ADDRESS) { | ||
_amount = _getMETH(); | ||
} else if (token == chainAddresses.lsd.RETH_ADDRESS) { | ||
_amount = _getRETH(); | ||
} else { | ||
revert("Invalid token address"); | ||
} | ||
} | ||
|
||
// NOTE: not deployed on holesky | ||
function _getSFRXETH() internal returns (uint256) { | ||
return IfrxMinter(0xbAFA44EFE7901E04E39Dad13167D089C559c1138).submitAndDeposit{value: AMOUNT}(broadcaster); | ||
} | ||
|
||
function _getWSTETH() internal returns (uint256) { | ||
uint256 balanceBefore = IERC20(chainAddresses.lsd.STETH_ADDRESS).balanceOf(broadcaster); | ||
(bool sent, ) = chainAddresses.lsd.STETH_ADDRESS.call{value: AMOUNT}(""); | ||
require(sent, "Failed to send Ether"); | ||
|
||
uint256 amount = IERC20(chainAddresses.lsd.STETH_ADDRESS).balanceOf(broadcaster) - balanceBefore; | ||
IERC20(chainAddresses.lsd.STETH_ADDRESS).approve(chainAddresses.lsd.WSTETH_ADDRESS, amount); | ||
return IwstETH(chainAddresses.lsd.WSTETH_ADDRESS).wrap(amount); | ||
} | ||
|
||
// NOTE: fails if AMOUNT < 0.1 ether | ||
function _getMETH() internal returns (uint256) { | ||
ImETHStaking mETHStaking = block.chainid == 1 | ||
? ImETHStaking(0xe3cBd06D7dadB3F4e6557bAb7EdD924CD1489E8f) | ||
: ImETHStaking(0xbe16244EAe9837219147384c8A7560BA14946262); | ||
IERC20 mETH = IERC20(chainAddresses.lsd.METH_ADDRESS); | ||
uint256 _balanceBefore = mETH.balanceOf(broadcaster); | ||
mETHStaking.stake{value: AMOUNT}(mETHStaking.ethToMETH(AMOUNT)); | ||
return mETH.balanceOf(broadcaster) - _balanceBefore; | ||
} | ||
|
||
function _getRETH() internal returns (uint256) { // NOTE: only holesky | ||
IRocketPoolDepositPool depositPool = IRocketPoolDepositPool(0x320f3aAB9405e38b955178BBe75c477dECBA0C27); | ||
uint256 _balanceBefore = IERC20(chainAddresses.lsd.RETH_ADDRESS).balanceOf(broadcaster); | ||
// NOTE: only works if pool is not at max capacity (it may be) | ||
depositPool.deposit{value: AMOUNT}(); | ||
return IERC20(chainAddresses.lsd.RETH_ADDRESS).balanceOf(broadcaster) - _balanceBefore; | ||
} | ||
|
||
function _deposit(uint256 amount, address token) internal { | ||
IERC20(token).approve(chainAddresses.ynEigen.YNEIGEN_ADDRESS, amount); | ||
IynEigen(chainAddresses.ynEigen.YNEIGEN_ADDRESS).deposit(IERC20(token), amount, broadcaster); | ||
} | ||
|
||
function _send(uint256 amount, address token) internal { | ||
IERC20(token).transfer(actors.eoa.DEFAULT_SIGNER, amount); | ||
} | ||
|
||
function _init() internal { | ||
ContractAddresses contractAddresses = new ContractAddresses(); | ||
chainAddresses = contractAddresses.getChainAddresses(block.chainid); | ||
deployment = loadDeployment(); | ||
actors = getActors(); | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// SPDX-License-Identifier: BSD 3-Clause License | ||
pragma solidity ^0.8.24; | ||
|
||
import "../../../script/commands/DepositToYnLSDe.s.sol"; | ||
|
||
import "forge-std/Test.sol"; | ||
import "forge-std/console.sol"; | ||
|
||
contract DepositToYnLSDeScript is DepositToYnLSDe, Test { | ||
|
||
function setUp() public { | ||
address _deployer; | ||
(_deployer, privateKey) = makeAddrAndKey("deployer"); | ||
vm.deal({ account: _deployer, newBalance: 100 ether }); | ||
|
||
shouldInit = false; | ||
_init(); | ||
} | ||
|
||
function testSfrxETHDeposit() public { | ||
if (block.chainid != 1) return; | ||
run(0, chainAddresses.lsd.SFRXETH_ADDRESS); | ||
} | ||
|
||
function testSfrxETHSend() public { | ||
if (block.chainid != 1) return; | ||
run(1, chainAddresses.lsd.SFRXETH_ADDRESS); | ||
} | ||
|
||
function testMETHDeposit() public { | ||
run(0, chainAddresses.lsd.METH_ADDRESS); | ||
} | ||
|
||
function testMETHSend() public { | ||
run(1, chainAddresses.lsd.METH_ADDRESS); | ||
} | ||
|
||
function testRETHDeposit() public { | ||
if (block.chainid != 17000) return; | ||
run(0, chainAddresses.lsd.RETH_ADDRESS); | ||
} | ||
|
||
function testRETHSend() public { | ||
if (block.chainid != 17000) return; | ||
run(1, chainAddresses.lsd.RETH_ADDRESS); | ||
} | ||
} |