From a74a956af08c8892d97c9ff5d008a55e4fac8cb0 Mon Sep 17 00:00:00 2001 From: happenwah Date: Mon, 7 Apr 2025 17:17:05 +0100 Subject: [PATCH 1/2] chore: lending module script updates + update README --- README.md | 73 +++++++++++++++++++++++++++- img/Valantis_Banner.png | Bin 0 -> 9833 bytes scripts/LendingModuleProposal.s.sol | 43 ++++++++++++---- 3 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 img/Valantis_Banner.png diff --git a/README.md b/README.md index c83ec19..46c3121 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,75 @@ -## Stake Exchange AMM +![Valantis](img/Valantis_Banner.png) + +## Valantis Stake Exchange AMM (STEX AMM) + +STEX AMM is a novel AMM uniquely designed for redeemable assets such as Liquid Staking Tokens (LSTs). + +LSTs are backed 1:1 by an equivalent amount of native asset (in the absence of slashing). However, generic AMMs fail to account for this simple fact, forcing LPs to sell the LST for less than fair value, resulting in significant cumulative losses to arbitrageurs. Moreover, there are times where excess liquidity can be put to earn extra yield on external protocols (e.g. lending markets like AAVE and Euler) and only be brought back into the AMM if needed to absorb incoming swap volume. + +STEX AMM solves these two structural inefficiencies by integrating with the LST's protocol native withdrawal queue, hence converting any desired about of LST back into native token at 1:1 rate after a waiting period (e.g. 1-7 days on HyperEVM). Moreover, a portion of native token's unused reserves can be put to earn yield on a lending market. Swap fees are dynamic, going as low as 1 basis-point, and growing higher depending on how congested the LST protocol's withdrawal queue is, providing attractive exchange rates for swaps with clearly defined pricing bounds. + +[Docs](https://docs.valantis.xyz/staked-amm) +[Whitepaper](https://github.com/ValantisLabs/stex-amm-whitepaper/blob/main/STEX_AMM_WHITEPAPER.pdf) + +## Folder structure description + +### src/ + +Contains STEX AMM's core contracts, Module dependencies and Mock contracts used for testing. + +**AaveLendingModule.sol**: This is a dedicated module, compatible with AAVE V3's `supply` and `withdraw` functions. Its owner can deposit and withdraw a portion of Wrapped Native Token's pool reserves, with the goal of optimizing overall yield. + +**STEXAMM.sol**: The main contract which implements the core mechanisms of STEX AMM, built as a Valantis [Liquidity Module](https://docs.valantis.xyz/sovereign-pool-subpages/modules/liquidity-module). + +**STEXLens.sol**: Helper contract that contains read-only functions which are useful to simulate state updates in `STEXAMM`. + +**STEXRatioSwapFeeModule.sol**: Contains a dynamic fee mechanism for swaps on STEX AMM, built as a Valantis [Swap Fee Module](https://docs.valantis.xyz/sovereign-pool-subpages/modules/swap-fee-module). + +**stHYPEWithdrawalModule.sol**: Module that manages all of STEX AMM's interactions with [stakedHYPE](https://www.stakedhype.fi/), a leading LST protocol on HyperEVM developed by [Thunderhead](https://thunderhead.xyz/). + +**owner/WithdrawalModuleManager.sol\***: Custom contract that has the `owner` role in `stHYPEWithdrawalModule`. It is controlled by a multi-sig. + +**owner/WithdrawalModuleKeeper.sol**: A sub-role in `WithdrawalModuleManager`, executing smart contract calls that require automation but which are not mission critical. + +**interfaces/**: Contains all relevant interfaces. + +**structs/**: Contains all relevant structs. + +**mocks/**: Contains mock contracts required for testing. + +### test/ + +Contains the foundry tests. + +### scripts/ + +Contains the scripts to deploy STEX AMM and all its respective module dependencies, execute swaps, deposits or withdrawals, and update specific parameters of the modules. + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Test coverage + +```shell +$ bash coverage.sh +``` + +### Deploy + +Copy .env.example file to .env and set the variables. + +**Note:** All deployment bash scripts are, by default, in simulation mode. Add `--broadcast` flag to trigger deployments, and `--verify` for block explorer contract verification. ### License diff --git a/img/Valantis_Banner.png b/img/Valantis_Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e68dd60b31b749dafc202a128f15aebc9fc852 GIT binary patch literal 9833 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 R=z`_~9^TVZErwgZ{x5k~M-2b~ literal 0 HcmV?d00001 diff --git a/scripts/LendingModuleProposal.s.sol b/scripts/LendingModuleProposal.s.sol index b9e5b2b..bd73a29 100644 --- a/scripts/LendingModuleProposal.s.sol +++ b/scripts/LendingModuleProposal.s.sol @@ -14,8 +14,6 @@ contract LendingModuleProposalScript is Script, Test { function run() external { if (block.chainid != 999) revert("Chain ID not Hyper EVM mainnet"); - console.log("Deployer address: ", deployerAddress); - // Address of owner multi-sig wallet address ownerMultisig = 0xe26dA5cBf101bDA4028E2B3208c32424f5D09421; @@ -59,8 +57,8 @@ contract LendingModuleProposalScript is Script, Test { // Simulate proposal assertEq(lendingModule.assetBalance(), 0); - /*vm.startPrank(address(manager)); - withdrawalModule.proposeLendingModule(address(lendingModule), 3 days); + //vm.startPrank(address(manager)); + /*withdrawalModule.proposeLendingModule(address(lendingModule), 3 days); ( address lendingModuleProposed, uint256 startTimestamp @@ -68,19 +66,19 @@ contract LendingModuleProposalScript is Script, Test { assertEq(lendingModuleProposed, address(lendingModule)); assertEq(startTimestamp, block.timestamp + 3 days); - vm.warp(block.timestamp + 3 days); + vm.warp(block.timestamp + 3 days);*/ - withdrawalModule.setProposedLendingModule(); + /*withdrawalModule.setProposedLendingModule(); assertEq( address(withdrawalModule.lendingModule()), address(lendingModule) ); withdrawalModule.supplyToken1ToLendingPool(10 ether); - assertEq(lendingModule.assetBalance(), 10 ether); - vm.stopPrank();*/ + assertEq(lendingModule.assetBalance(), 10 ether);*/ + //vm.stopPrank(); - // Generate payload for proposal + // Generate payload for `proposeLendingModule` /*vm.startPrank(ownerMultisig); bytes memory payload = abi.encodeWithSelector( @@ -106,5 +104,32 @@ contract LendingModuleProposalScript is Script, Test { assertEq(startTimestamp, block.timestamp + 3 days); vm.stopPrank();*/ + + // Generate payload for `setProposedLendingModule` + vm.startPrank(ownerMultisig); + + bytes memory payload = abi.encodeWithSelector( + stHYPEWithdrawalModule.setProposedLendingModule.selector + ); + bytes memory managerPayload = abi.encodeWithSelector( + WithdrawalModuleManager.call.selector, + address(withdrawalModule), + payload + ); + console.log("payload to withdrawalModule manager: "); + console.logBytes(managerPayload); + + (bool success, ) = address(manager).call(managerPayload); + assertTrue(success); + + assertEq( + address(withdrawalModule.lendingModule()), + address(lendingModule) + ); + + vm.stopPrank(); + + //withdrawalModule.supplyToken1ToLendingPool(10 ether); + //assertEq(lendingModule.assetBalance(), 10 ether); } } From 229dbab79fc53d0edc72490965b148725b39b5bd Mon Sep 17 00:00:00 2001 From: happenwah Date: Mon, 7 Apr 2025 17:19:33 +0100 Subject: [PATCH 2/2] chore: update README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 46c3121..c86aef4 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ ## Valantis Stake Exchange AMM (STEX AMM) -STEX AMM is a novel AMM uniquely designed for redeemable assets such as Liquid Staking Tokens (LSTs). +STEX AMM is a novel AMM uniquely designed for redeemable assets such as Liquid Staking Tokens (LSTs), designed in collaboration with [Thunderhead](https://thunderhead.xyz/). LSTs are backed 1:1 by an equivalent amount of native asset (in the absence of slashing). However, generic AMMs fail to account for this simple fact, forcing LPs to sell the LST for less than fair value, resulting in significant cumulative losses to arbitrageurs. Moreover, there are times where excess liquidity can be put to earn extra yield on external protocols (e.g. lending markets like AAVE and Euler) and only be brought back into the AMM if needed to absorb incoming swap volume. STEX AMM solves these two structural inefficiencies by integrating with the LST's protocol native withdrawal queue, hence converting any desired about of LST back into native token at 1:1 rate after a waiting period (e.g. 1-7 days on HyperEVM). Moreover, a portion of native token's unused reserves can be put to earn yield on a lending market. Swap fees are dynamic, going as low as 1 basis-point, and growing higher depending on how congested the LST protocol's withdrawal queue is, providing attractive exchange rates for swaps with clearly defined pricing bounds. -[Docs](https://docs.valantis.xyz/staked-amm) -[Whitepaper](https://github.com/ValantisLabs/stex-amm-whitepaper/blob/main/STEX_AMM_WHITEPAPER.pdf) +- [Docs](https://docs.valantis.xyz/staked-amm) +- [Whitepaper](https://github.com/ValantisLabs/stex-amm-whitepaper/blob/main/STEX_AMM_WHITEPAPER.pdf) ## Folder structure description