Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Zap compliant with Liquidity Provider Cap #32

Merged
merged 3 commits into from
Oct 10, 2024
Merged

Conversation

clement-ux
Copy link
Contributor

Current issue

The current zap implementation allows users to bypass checks on the Liquidity Provider Cap.

How can we fix it

We can add a new function that can be called only by the zap contract, with the liquidity provider address as an argument.

By modifying a bit the logic of deposit function, we can do 2 extra things:

  • send shares directly to the liquidity provider (instead of msg.sender)
  • check the liquidity provider cap of the liquidity provider (instead of msg.sender)

Downside

This increases the complexity of the deposit logic, and once the accountCapEnabled is disabled, this complexity will not be necessary anymore (except for gas optimization). So maybe it's not worth it to add it now and add a simple Zapper once accountCapEnabled is disabled.

@clement-ux clement-ux changed the base branch from main to nicka/lp October 9, 2024 10:15
Copy link
Collaborator

@naddison36 naddison36 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@naddison36 naddison36 merged commit 299be9d into nicka/lp Oct 10, 2024
2 checks passed
@naddison36 naddison36 deleted the clement/zap branch October 10, 2024 00:11
naddison36 added a commit that referenced this pull request Oct 17, 2024
* WIP MultiLP

* forge install: openzeppelin-contracts

v5.0.2

* WIP

* forge install: openzeppelin-contracts-upgradeable

v5.0.2

* WIP redeem queue

* PeggedARM now support one sided and double sided trades
Made the AbstractARM more generic
Improved OETH ARM tests

* Added Lido ARM

* Added Lido ARM fork tests

* Added a Multi LP version of the Lido ARM

* Updated diagrams

* Added convertToShares and convertToAssets to MultiLP
Added donation attack protection to MultiLP

* Added performance fee to MultiLP

* Changed implementation of the performance fee

* Add support for multiple tranches

* Added admin functions to update tranche prices and allocations

* Generated latest diagrams

* Add _claimHook to add liquidity back

* Added AccessControlLP
Made it clear the deposit and withdraw hooks are post function

* Added AccessControlShares

* Split performance fee logic into PerformanceFee contract
Moved calc of perf fee to LP deposit and withdraw instead of swaps

* Fixed saving of new total assets to after asset transfers

* Natspec updates

* Generated new contract diagrams

* Added _gap in inherited contracts

* Changed timestamp that was storing the request time in WithdrawalRequest to claimTimestamp
Fixed compilation of contracts using PerformanceFee

* Refactor PerformanceFee
Renamed liquidityToken to liquidityAsset
Renamed _assetsInWithdrawalQueue to _externalWithdrawQueue

* Generated latest contract diagrams

* Fixed OETH ARM fork tests

* Refactor MultiPriceARM
Started LidoMultiPriceMultiLpARM fork test

* Updated contract diagrams

* Fixes to MultiPriceARM

* More LidoMultiPriceMultiLpARM fork tests

* Added whitelist controls to LidoFixedPriceMultiLpARM
Started LidoFixedPriceMultiLpARM fork tests

* Updated Natspec

* Generated latest contract code

* Removed minimumFunds logic for LP version

* Fix Napspec

* changed setLiquidityProviderCaps to bulk set lp caps
Removed increasing the LP's cap on withdrawals

* Added LiquidityProviderCap event when decrementing the lp cap

* Moved the Liquidity Provider Controller out of the ARM

* Refactor test structure (#16)

* refactor test structur.

* feat: adjust tests for liquidityProviderController.

* forge fmt

* feat: add asOwner modifier

* bump forge version.

* feat: use random address.

* Switch from gitmodules to Soldeer. (#17)

* chore: switch from gitmodules to soldeer.

* chore: update Makefile.

* try to fix CI

* chore: use rpc_endpoints for forking.

* Added Lido ARM deploy script

* Changed the Lido ARM owner to be the mainnet 5/8 multisig

* Anyone can now call collectFees

* Updated README

* Added operator to LiquidityProviderController which will be a Defender Relayer

* Add test for Swaps in LidoFixedPriceMultiLpARM.sol. (#18)

* fix: rename `lidoARM` in `lidoFixedPriceMulltiLpARM` for tests.

* feat: add badToken.

* [WIP] test: add tests for `SwapExactTokensForTokens`.

* test: finalize `swapExactTokensForTokens()`.

* chore: set fuzz runs in config.

* fix: transfer to address dead steth when dealing 0.

* test: add tests for `swapTokensForExactTokens()`.

* fix: adjust `swapExactTokensForTokens()` tests.

* Refactor setPrices for FixedPriceARM

* Renamed MAX_FEE to FEE_SCALE

* Removed old Make upgrade actions

* Changed the _gap's so each contract uses 50 slots

* Updated Lido ARM deploy script

* Updated deploy script

* Added postDeploy Hardhat task

* Merge latest tests (#19)

* [WIP] test: add reverting test for `deposit()`.

* fix: update `lastTotalAssets` before checking caps.

* [WIP] test: add more test for deposit.

* fix: cleanup tests.

* test: add failing test.

* test: add failling test.

---------

Co-authored-by: Clément <clemmoller@gmail.com>

* Added address of ARMBuyback

* Moved initializing lastTotalAssets to _initPerformanceFee

* Moved burn of shares down in requestRedeem

* Fixed applying the performance fee twice on deposits

* fix: increase global queued amount when requestRedeem.

* [WIP] test: add tests for `requestRedeem()`.

* Fixed applying the performance fee twice on deposits

* test: add tests for `requestRedeem()` when ARM profit/loss.

* Updated deposit assertions

* Fix requestRedeem which now stored the updated queued amount

* Updated deploy script

* Added Lido smoke test that uses the deploy script

* Removed experimentation code

* generated contract docs

* Add more tests. (#21)

* chore: add coverage files to gitignore.

* test: add tests for claimRedeem and TotalAssets.

* test: add more tests for setters.

* forge fmt

* Deposit now adds to the withdrawal queue
Added test of deposit with outstanding withdrawal request

* Changed requestRedeem to use convertToAssets instead of previewRedeem

* Add more tests. (#22)

* test: add more test for `totalAssets()`.

* feat: add modifiers to simulate gain or loss assets in ARM.

* fix: use boolean instead of int256.

* fix: use Foundry stdError lib for expectRevert.

* test: add setter test for LCP.

* chore: fix lcov name in .gitignore

* test: add tests for collectFees().

* Fix performance fee calc not removing new perf fee from lastTotalAssets

* Write to storage once in requestStETHWithdrawalForETH

* Changed the preview functions to be external now that are no longer being used internally

* Generated latest contract diagram

* Added more detail to the invalid token error

* Fix compile warning in test

* Ensure swaps don't use withdrawal queue liquidity (#23)

* Ensure swaps don't use WETH reserved for the withdrawal queue

* Fund the withdrawal queue when WETH is swapped into the ARM

* More refactoring of MultiLP
deposit and swap not longer add to the withdrawal queue. Its only need on claim

* Refactor withdrawal queue storage to optimize swap gas usage

* Generated latest contract diagrams

* Removed _postClaimHook as it's no longer needed

* Added more Natspec

* Add more Natspec

* Changed the _postWithdrawHook to _postRequestRedeemHook

* Generated latest contract diagrams

* Minor change to constructor param

* Don't allow prices to cross 1

* Bring in the latest tests (#24)

* test: add test for requestStETHWithdrawamForETH.

* chore: use last version of forge for `mockFunction()`.

* feat: create a fake Lido Withdraw to mock it when testing.

* [WIP] test: add test for `claimStETHWithdrawalForWETH()`.

* fix: tests for claimWithdrawals.

* fix: typo on variable name.

---------

Co-authored-by: Clément <clemmoller@gmail.com>

* Flatten the LidoARM inheritance (#25)

* Flatten LidoARM's inheritance

* Renamed LidoARM contract

* Changed to LidoARM name in tests

* Generated new contract diagrams

* Minor changes to the LidoARM

* Renamed lidoARM variable in tests

* Updated deposit test comments

* Updated setPrice tests

* Small change to setPrices test

* test: add extra tests for deposit while lido withdraw.

* test: add extra test for swap with withdrawQueue full.

* Added switch to LiquidityProviderController so the account level caps can be disabled

* Changed setAccountCapEnabled to only be called by Owner

* fix: use approx eq for steth balance.

* Added accountCapEnabled tests

* fix: use approx eq for steth balance (again).

* More setter tests

* Added setTotalAssetsCap tests

* Added setLiquidityProviderCaps tests

* Updated assertions of initial deploy

* Generated latest contract diagrams

* feat: return true when running test against tenderly testnet.

* Added parseDeployedAddress

* Updated postDeploy Hardhat task

* WIP Broadcast fork section of deploy script

* Added liquidity provider Hardhat tasks

* Fixed setting of token0 and token1 in LidoARM (#27)

* Restore deploy script so fork section uses prank

* Fix hardhat postDeploy task

* Added HH task to snap Lido ARM

* Add Hardhat tasks snapLido, swapLido, submitLido
Renamed the depositLido task

* Added Deposit event
LidoARM was setting token0 and token1 the wrong way around
Used PRICE_SCALE in setPrices
Improved smoke tests

* Generated latest LidoARM contract diagram

* Handler Tenderly testnet (#26)

* fix: handler better tenderly testnet

* fix: use -unlocked keywork to broadcast & impersonate

* feat: add initial deployer test address.

* fix: give enough gas to deployer for Tenderly test.

---------

Co-authored-by: Nicholas Addison <nick@addisonbrown.com.au>

* Fixed ARM acronym in Natspec

* Removed postDeploy Hardhat task now the forge script is working

* Simplified deposit to WETH

* Fixed deploy script when run as a fork

* Removed approveStETH as its in the initializer

* changes to setPrices to make it easier to understand

* Fix bug in _rawTotalAssets not checking feesAccrued before subtraction

* Renamed total assets to available assets (#28)

* Renamed _rawTotalAssets to _availableAssets
Renamed lastTotalAssets to lastAvailableAssets

* Generated new LidoARM diagrams

* Update Natspec

* Added Lido contract dependency diagram

* Added Hardhat tasks requestRedeemLido and claimRedeemLido

* Adjust lastAvailableAssets post deposit and redeem so lastAvailableAssets is up only

* Reordered the storage slots for fee variables

* Save gas on WETH balanceOf call on swaps of WETH out if no outstanding withdrawals

* Only accrued fees when they are collected (#30)

* Only accrue fees when the fees are collected

* packed fee and lastAvailableAssets back into a single slot

* Generated latest LidoARM contract diagram

* Simplification of claimRedeem

* Generated latest LidoARM contract diagram

* Aligned the storage slot gap

* Changed isClaimable to claimable

* Limit performance fee to 50%

* Fixed visibility of fee functions

* Natspec update

* Return 0 on early exit

* emit at end of the function

* Collapsed LidoLiquidityManager into LidoARM

* Fixed claimRedeem tests with new event order

* Removed LidoLiquidityManager as it's now in LidoARM

* Generated latest contract diagrams

* Clean up _availableAssets

* cleanup claimRedeem

* Renamed LiquidityProviderController to CapManager

* Renamed outstandingEther to lidoWithdrawalQueueAmount

* Updated contract diagram

* Updated _transferAsset to use seth

* simplified _transferAsset

* Fixed collectFees so it doesn't use WETH reserved for the withdrawal queue

* changed _liquidityAvailable to _requireLiquidityAvailable

* Limited prices to crossing 2 basis point past 1.0

* Changed so buy price has to be below 1

* Increases initial total cap

* Made claim delay immutable and only 1 minute for Testnet

* Generate latest LidoARM diagram

* Add Zapper for LidoARM (#31)

* feat: create Zapper contract.

* test: add tests for Zapper.

* test: add extra test for rescue tokens.

* Added assets (ETH) to Zapper's Zap event

* Added ZapperLidoARM to deploy script

* Updated deploy script for Testnet

---------

Co-authored-by: Nicholas Addison <nick@addisonbrown.com.au>

* updated snapLido Hardhat task

* Added collectFees Hardhat task

* Update Natspec

* Updated contract diagrams

* Added crossPrice to check when Operator sets prices

* Set cross price in fork section fo deploy script

* Safety check in setCrossPrice so no stETH in ARM when cross price reduced

* Allow the cross price to be 20 basis points below 1

* totalAssets returns MIN_TOTAL_SUPPLY if fees > available assets
setPrice enforcement of crossPrice also applies to Owner to ensure no asset losses
remove old Price cross check as that's replaced by the crossPrice check

* Generated latest LidoARM contract diagram

* Updated Natspec

* Now pricing the base assets, stETH, using the crossPrice

* fix: make proxy falback payable.

* Price stETH in the withdrawal queue at 1.0 as it can't be sold for any less

* Fixed when fees = available assets in totalAssets

* Natspec updates

* Add Zap compliant with Liquidity Provider Cap (#32)

* feat: add zap to deposit.

* Updated Natspec

---------

Co-authored-by: Nicholas Addison <nick@addisonbrown.com.au>

* Generated latest contract diagrams

* standardizes deal in smoke tests

* Renamed request and claim Lido withdrawals

* Natspec update

* More info to snapLido Hardhat task

* Added requestLidoWithdrawals, lidoClaimWithdraw and lidoWithdrawStatus Hardhat tasks

* Added setZap to deploy script

* depositLido now supports depositing ETH using the Zapper
Added setZapper Hardhat task

* fix deploy script

* Added more logs to the deploy script

* Made claimable external as it's not used internally

* Renamed withdrawalQueue to lidoWithdrawalQueue so its not confused with the ARM withdrawal queue

* Updated contract dependency diagram

* Removed te extra logic that transfers and extra 2 wei for stETH

* snapLido now compares against 1Inch, Curve and Uniswap

* Change Zap integration in ARM. (#33)

* fix: remove zap restricted method..

* style: change liquidity provider param name.

* fix: change state then write call.

* fix: state change then transfer token.

* fix: use `fees` instead of `fee` when collecting fees.

* fix: move up `nextWithdrawalIndex` increase.

* fix: avoid code duplication.

* fix: pack variable action (read & write).

* Added gas costs to lidoSnap

* Added RequestLidoWithdrawals and ClaimLidoWithdrawals events

* put nextWithdrawalIndex into its own slot

* Updated comments for setCrossPrice

* Clearer setPrices comments
Fixed comment typos

* Generated latest LidoARM contract diagrams

* Pre launch changes (#34)

* Set buy and sell prices in initialize function
setCrossPrice also validates buy and sell prices against the new cross price

* fix: use `newCrossPrice` instead of `crossPrice`.

* fix: use `<=` instead of `<` for `setCrossPrice`.

* test: add reverting test for `setCrossPrice`.

* fix: revert commit `a7947f3`.

* fix: move `setCrossPrice` test to new file.

* test: add more test for `setCrossPrice`.

* feat: allow anyone to call claimLidoWithdrawals.

* fix: adjust failing test

* fix: remove testing stuff.

---------

Co-authored-by: Clément <clemmoller@gmail.com>

---------

Co-authored-by: Clément <55331875+clement-ux@users.noreply.github.com>
Co-authored-by: Clément <clemmoller@gmail.com>
Co-authored-by: Daniel Von Fange <daniel@leancoder.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants