Async withdrawal + mint(uint256) cleanup#2813
Merged
clement-ux merged 9 commits intomasterfrom Feb 24, 2026
Merged
Conversation
…n IVault Update the IVault interface to use the new single-param mint signature and fix all contract callers: MockNonRebasing, MockRebornMinter, AbstractOTokenZapper, OSonicZapper, and PlumeBridgeHelperModule.
…lume Remove all Plume/LayerZero bridging code and replace synchronous vault redeem with async withdrawal pattern (requestWithdrawal + claimWithdrawal). Add unwrapAndRequestWithdrawal, claimAndBridgeToBase, and claimWithdrawal.
Replace synchronous vault redeem with async withdrawal pattern. Remove depositWOETHAndBridgeWETH (no longer single-TX). Add depositWOETHAndRequestWithdrawal, claimWithdrawal, and claimAndBridgeWETH.
Replace all vault.mint(asset, amount, minAmount) calls with vault.mint(amount) across test files. Update bridge helper tests to match new async withdrawal API. Remove unused variable declarations.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #2813 +/- ##
==========================================
+ Coverage 43.61% 45.06% +1.45%
==========================================
Files 104 105 +1
Lines 4464 4500 +36
Branches 1218 1228 +10
==========================================
+ Hits 1947 2028 +81
+ Misses 2514 2469 -45
Partials 3 3 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
…elperModule Deploy scripts for the updated bridge helper modules on mainnet and Base. Both enable the module on the Safe when running on a fork.
The deployed Plume vault won't be upgraded, so hardcode the old mint(address,uint256,uint256) selector in PlumeBridgeHelperModule and use a legacy ABI contract in fork tests for mint and redeem calls.
- Add missing require(success) on wOETH approve in BaseBridgeHelperModule._depositWOETH - Un-skip Base bridge helper tests and rewrite for async withdrawal flow - Remove unused _asset param from MockNonRebasing.mintOusd - Point MockRebornMinter.redeem() at requestWithdrawal instead of reverting
shahthepro
reviewed
Feb 24, 2026
shahthepro
approved these changes
Feb 24, 2026
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The synchronous
redeem(uint256,uint256)on VaultCore has been removed in favor of the async withdrawal queue (requestWithdrawal+claimWithdrawal). This gives the vault time to source liquidity from strategies before honoring withdrawals, avoiding the need to hold large idle WETH buffers and protecting against bank-run scenarios. Similarly, the legacymint(address,uint256,uint256)has been superseded bymint(uint256)since all vaults are now single-asset.This PR migrates all bridge helper modules and downstream callers (zappers, mocks, tests) to the new signatures, and removes Plume bridging from the Ethereum module since Plume is no longer serviced from mainnet.
Changes
Contracts
mint(address,uint256,uint256),redeem(uint256,uint256),calculateRedeemOutputs,calculateRedeemOutput,dripper(),weth(). Addmint(uint256).unwrapAndRedeemwith two-stepunwrapAndRequestWithdrawal+claimWithdrawal. Remove all Plume/LayerZero code (bridgeWOETHToPlume,bridgeWETHToPlume,mintWrapAndBridgeToPlume,unwrapRedeemAndBridgeToPlume). DropAbstractLZBridgeHelperModuleinheritance.depositWOETHAndBridgeWETHwithdepositWOETHAndRequestWithdrawal+claimAndBridgeWETH/claimWithdrawal. Add missingrequire(success)on wOETH approve.mint(address,uint256,uint256)andredeem(uint256,uint256)selectors since the deployed Plume vault won't be upgraded.vault.mint()calls to new single-param signature. PointMockRebornMinter.redeem()atrequestWithdrawalfor reentrancy testing. Clean up unused_assetparam inMockNonRebasing.mintOusd.Deployment
deploy/mainnet/178_bridge_helper_module.js(EthereumBridgeHelperModule)deploy/base/044_bridge_helper_module.js(BaseBridgeHelperModule)Tests
vault.mint()calls to new signature across ~30 test filesOperator workflow (post-change)
Ethereum → Base (unwrap wOETH and bridge WETH):
Base → Ethereum (deposit wOETH and bridge WETH):