# Upgrades

**Kelp L2 Smart Contract Changes - 10th April 2026**

Goal: Kelp protocol is implementing a set of changes to the RSETHPoolV3ExternalBridge contract on Base, primarily aimed at adding native L2→L1 bridging as an alternative to LayerZero/Stargate, introducing an operator-driven reverse swap mechanism, and hardening access controls and safety checks across the contract.<br>

Changes Summary:

* Added native L2→L1 ETH bridging via Base native messenger and bridge contracts, giving bridgers a second path to move ETH to L1 without relying on LayerZero/Stargate. Native bridging path accepts an explicit amount parameter, allowing the bridger to control exactly how much ETH is moved per call.
* Added reverse swap functionality (swapAssetToPremintedRsETH) allowing an operator to swap rsETH back into pool assets (ETH or wstETH). This enables rebalancing of pool liquidity without requiring external market operations.
* Importantly, native L2→L1 ETH bridging and reverse swap functionality are not net-new code. Both features already exist in production on the RSETHPoolV2ExternalBridge contract, which is already live on Linea mainnet. The Base pool (V3) adopts the same proven logic with minimal adaptation for the V3 contract structure.
* Added OPERATOR\_ROLE  a new dedicated role for executing reverse swaps, keeping this capability separate from bridger and admin permissions.
* Added PAUSER\_ROLE a dedicated role for pausing the contract, separated from DEFAULT\_ADMIN\_ROLE. Unpausing remains admin-only (higher privilege).
* Changed setFeeBps access from TIMELOCK\_ROLE to DEFAULT\_ADMIN\_ROLE for faster fee adjustments without timelock delay.
* Fixed slippage precision in getMinAmount(): validation threshold changed from > 100 (percentage) to > 10,000 (basis points), and the formula now divides by 10,000 instead of 100, enabling finer-grained slippage control.
* Hardened bridgeAssets(): tightened native fee check from msg.value < nativeFee to msg.value != nativeFee, rejecting both underpayment and overpayment. Also excluded msg.value from the available balance check to prevent accidental fee consumption.
* Hardened bridgeTokens() changed from raw balanceOf to getTokenBalanceMinusFees() to prevent accidentally bridging earned fees to L1.
* Added balance guard on removeSupportedToken() prevents removing a token that still has a non-zero balance in the pool, avoiding stranded funds.
* Solidity version upgrade from 0.8.21 to 0.8.34.

Code Changes:

* RSETHPoolV3ExternalBridge: <https://www.diffchecker.com/oDnkm3k9/>&#x20;

Network: Base (Chain ID: 8453)

Timelock: Applicable, 3-day delay

**\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_**

**Kelp Core Smart Contracts Upgrade - January 2026**<br>

Goal: Kelp protocol is implementing a set of changes primarily aimed at increasing the security of the protocol, along with some new features:

* Added Aave V3 integration to enable earning interest on idle ETH that’s ready for user withdrawals, but has not been withdrawn yet.
* Added the functionality necessary for per-address 24-hour transfer hold and recovery in the rsETH token contract so we can quickly freeze and sweep funds from compromised or hacker addresses to custody, while keeping key partners like major DeFi protocols, exchanges and market makers permanently exempt. This lets us respond to exploits without pausing the entire token, reducing user disruption and keeping fund protection transparent on chain.
* Added a new role for internal asset transfers between different contracts in the core protocol (ASSET\_TRANSFER\_ROLE).
* Added a new role specifically for pausing the core protocol contracts individually (PAUSER\_ROLE), as well as the pauseAll functionality to pause the entire protocol at once in case of an emergency.
* Refactored daily minting limits for rsETH, as well as fee mint limits in LRTOracle to be aligned with each other and reset at a set time for better UX.
* Removed legacy code, including legacy EigenLayer withdrawals support.
* Added the ability to set the custom instant withdrawal fee recipient.
* Minor code quality and documentation improvements throughout the codebase.
* Importantly, no supporting changes from partners or UI are required.<br>

Code changes:

* LRTConfig: <https://www.diffchecker.com/nY3d7rCk/>&#x20;
* LRTConfigRoleChecker: <https://www.diffchecker.com/qpZxCmjf/>&#x20;
* LRTConverter: <https://www.diffchecker.com/WfCGMvUM/>&#x20;
* LRTDepositPool: <https://www.diffchecker.com/B3pGhs2a/>&#x20;
* LRTOracle: <https://www.diffchecker.com/5dpUHWhc/>&#x20;
* LRTUnstakingVault: <https://www.diffchecker.com/uueiX3y8/>&#x20;
* LRTWithdrawalManager: <https://www.diffchecker.com/lhVMHR4F/>&#x20;
* NodeDelegator: <https://www.diffchecker.com/RWMJh5wV/>&#x20;
* rsETH: <https://www.diffchecker.com/WipHsz1D/>&#x20;

Network: ETH Mainnet

Audit Report: <https://kerneldao.com/kelp/audits/smartcontracts/Bailsec_rsETH_december_2025.pdf>\
\
Timelock: Applicable, 10-day delay\
\
Date of upgrade: 24th Jan'26

**\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_**

**Kelp Core Smart Contracts Upgrade - December 2025**<br>

Goal: Kelp protocol is implementing a set of changes primarily aimed at increasing the security of the protocol, along with some new features:

* Withdrawal intents and max whitelisted allowance for stETH unstaking requests.
* Maximum cap in terms of rsETH minted by users per day.
* Maximum cap in terms of rsETH minted as fee per day.
* Safer rsETH price updates: If a price update is within bounds, it's permissionless, otherwise the protocol gets paused and the team can promptly react to help fix any possible issues before unpausing the protocol.
* New feature: Instant withdrawals can be enabled and users will be able to withdraw their assets instantly with a fee. There is also a queued withdrawals buffer in place in order to not disrupt the standard withdrawal process.
* Minor code quality and documentation improvements.
* Importantly, no supporting changes from partners or UI are required.

Code changes:

* LRTConfig: <https://www.diffchecker.com/KbgBWg2R/>&#x20;
* LRTConverter: <https://www.diffchecker.com/z0uwgrk6/>
* LRTDepositPool: <https://www.diffchecker.com/AqwEOhm5/>
* LRTOracle: <https://www.diffchecker.com/FACh5QJf/>
* LRTUnstakingVault: <https://www.diffchecker.com/MvgC1VAC/>
* LRTWithdrawalManager: <https://www.diffchecker.com/HJh7xe3N/>
* NodeDelegator: <https://www.diffchecker.com/a0L3c4B5/>
* UnstakeStETH: <https://www.diffchecker.com/4b1ytTNf/>
* FeeReceiver:[ https://www.diffchecker.com/yePLkHDA/](https://www.diffchecker.com/yePLkHDA/)
* rsETH: <https://www.diffchecker.com/WLDBs2qF/>

<br>

Network: ETH Mainnet

Audit Report: <https://kerneldao.com/kelp/audits/smartcontracts/Bailsec_rsETH_november.pdf>

Timelock: Applicable, 10-day delay

Date of upgrade: 20th Dec'25<br>
