Swell security record

As of 30 Oct 2026, Swell has 10 audit reports by 6 security firms on Trustblock; the latest is by CODESPECT, dated 17 Apr 2025. Those reports list no open critical findings. It also holds 2 deployed contracts on 1 chain.

Critical findings
No open critical findings
Across 10 reports.
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.

Audits10

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Swell - Repricing Oracle UpdateSecurity firm: CODESPECTDate: Scope: 1 address on EthereumNo open critical findingsOpen · IPFS
Swell - Withdrawal UpdateSecurity firm: CODESPECTDate: Scope: 1 address on EthereumNo open critical findingsOpen · IPFS
swBTC Smart ContractsSecurity firm: ChainSecurityDate: Scope: Files named in the reportNo open critical findingsOpen · chainsecurity.com
Symbiotic-Aera AdapterSecurity firm: ChainSecurityDate: Scope: Not recorded (see the report)No open critical findingsOpen · chainsecurity.com
Swell L2 Pre Deposit security reviewSecurity firm: HexensDate: Scope: Not recorded (see the report)No open critical findingsOpen · GitHub
Swell security reviewSecurity firm: HexensDate: Scope: Not recorded (see the report)No open critical findingsOpen · GitHub
Swell Audit ReportSecurity firm: CyfrinDate: Scope: Not recorded (see the report)No open critical findingsOpen · GitHub
Swell security reviewSecurity firm: HexensDate: Scope: Not recorded (see the report)No open critical findingsOpen · GitHub
Barracuda security reviewSecurity firm: Sigma PrimeDate: Scope: Not recorded (see the report)No open critical findingsOpen · GitHub
Swell Network AddendumSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com

Findings42

Statuses are the security firm’s own, from each report.

SeverityOpenAcknowledgedFixed
Critical000
High011
Medium006
Low0826
HighInconsistencies in updates to `userRecords`Swell Network Addendum · CertiK · 28 Nov 2022Fixed

In the function `_registerDeposit()`, only the `balance` of a `_user` address is updated in the `userRecords` mapping. The struct variable `entryRPT` is not updated; this means that when the same `_user` address withdraws, their `record.entryRPT` will read as 0 (even if they deposited their tokens at a point in time when the sum was larger) and as a result, they will be privy to the all-time running sum `rewardPerToken` corresponding to the reward token address. Since their balance is updated, provided the `rpt` is positive, a user who goes through `_registerDeposit()` for their first deposit gets the full `rpt` value applied to the amount added to `unclaimedRewards`, either through a second deposit that goes through `_depositRewards()` or withdrawing through `_withdrawRewards()`. The function `_depositRewards()`, however, does not provide the same record-keeping for a first-time depositor. A user who deposits through `_depositRewards()` for the first time has an update to their `record.unclaimedRewards` that is 0 (since `record.balance` is 0 at that point). However, their `record.entryRPT` is updated to be the `rpt` value at the time of deposit. This means the next time this same user deposits or withdraws through `_depositRewards()` or `_withdrawRewards()`, their value for `record.unclaimedRewards` is only scaled by `rpt - record.entryRPT`, where `record.entryRPT` is nonzero. The issue appears to be that two users, both depositing for the first time, may have two different outcomes dependent upon whether the call to `auraBaseRewardPool.getReward()` yields a positive `tokenBalance` amount. It also appears possible that a user may both deposit tokens for a period of time and withdraw these tokens without ever receiving rewards. Such an instance appears to occur if the user happens to deposit tokens through the `_depositRewards()` function (in which case record.unclaimedRewards is still 0 after update), and then withdraws through the `_registerWithdraw()` function, where `record.unclaimedRewards` is also no updated for the user. Which functions are called is dependent upon whether `auraBaseRewardPool.getReward()` yields a nonzero `tokenBalance` for the contract.

Open the report
MediumDouble Accounting for SlashingSwell - Repricing Oracle Update · CODESPECT · 17 Apr 2025Fixed

The report gives no description here.

Open the report
MediumIncorrect Withdrawal Amount When Opening Multiple RequestsswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
MediumWithdrawals Can Be DOS by a Malicious UserswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
MediumSwellLib.BOT can delete active validators when bot methods are pausedSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
MediumSwellLib.BOT can subtly rug-pull withdrawals by setting _processedRate = 0 when calling swEXIT::processWithdrawalsSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
MediumERC721 safe mint reentrancy can lead to draining withdrawalsSwell security review · Hexens · 12 Feb 2024Fixed

The report gives no description here.

Open the report
LowAeraStrategy May Have Locked FundsswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
LowAllowances Not Updated When Changing VaultswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
LowLocked SharesswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
Show 10 more
LowSetting a Wrong Address as the vaultAera Can DOSswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
LowSlashing Penalties AvoidanceSymbiotic-Aera Adapter · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
LowVyper VersionswBTC Smart Contracts · ChainSecurity · 6 Sep 2024Fixed

The report gives no description here.

Open the report
LowZap balance check optimisationSwell L2 Pre Deposit security review · Hexens · 3 Apr 2024Fixed

The report gives no description here.

Open the report
LowChanging the cooldown time may result in funds being unexpectedly locked for a longer timeSwell security review · Hexens · 12 Mar 2024Fixed

The report gives no description here.

Open the report
LowGas inefficient way of handling user requestsSwell security review · Hexens · 12 Mar 2024Fixed

The report gives no description here.

Open the report
LowLack of upper limit check for lock duration allows freezing of assetsSwell security review · Hexens · 12 Mar 2024Fixed

The report gives no description here.

Open the report
LowAllowing anyone to finalize any withdrawal can lead to integration problems for smart contract allowed to receive ETHSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowCheck for staleness of data when fetching Proof of Reserves via Chainlink Swell ETH PoR OracleSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowMultiple attack paths to force swETH::reprice to revert by increasing or decreasing swETH total supplySwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
Show 10 more
LowNodeOperatorRegistry::updateOperatorControllingAddress allows to override _newOperatorAddress if its address is already assigned to an operator IDSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowPrecision loss in swETH::_deposit from unnecessary hidden division before multiplicationSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowRewards unable to be distributed when all active validators are deleted during repricingSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowswExit::getProcessedRateForTokenId returns true with valid processedRate for non-existent tokenId inputSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowswEXIT::setWithdrawRequestMaximum and setWithdrawRequestMinimum lacking validation can lead to a state where withdrawRequestMinimum > withdrawRequestMaximumSwell Audit Report · Cyfrin · 23 Feb 2024Fixed

The report gives no description here.

Open the report
LowChainLink data feed staleness is not checkedSwell security review · Hexens · 12 Feb 2024Fixed

The report gives no description here.

Open the report
LowNode operator reward distribution should be minted instead of transferredSwell security review · Hexens · 12 Feb 2024Fixed

The report gives no description here.

Open the report
LowNode operator reward per validator can be pre-calculated in repricingSwell security review · Hexens · 12 Feb 2024Fixed

The report gives no description here.

Open the report
LowUnused timestamp variable in withdrawal requestsSwell security review · Hexens · 12 Feb 2024Fixed

The report gives no description here.

Open the report
LowCheck Effect Interaction Pattern ViolatedSwell Network Addendum · CertiK · 28 Nov 2022Fixed

The order of external call/transfer and storage manipulation must follow the check-effect-interaction pattern. - In `_beforePositionChange()`: The function `_withdrawFromAura()` makes an external call before the updates to state performed in `_rewardsBeforeWithdraw()`. - In `_afterPositionChange()`: The function `_depositToAura()` makes an external call before the updates to state performed in function `_rewardsAfterDeposit()`.

Open the report
Show 3 more
LowLogic allows `_withdrawAmount` to be larger thanSwell Network Addendum · CertiK · 28 Nov 2022Fixed

In functions `_registerWithdraw()` and `_withdrawRewards()`, the `record.balance` for the input address `_user` is updated to subtract away the `_amount` to be withdrawn. However, the logic for updating the `record.balance` is as follows: ```solidity record.balance -= _amount > record.balance ? record.balance : _amount; ``` which allows `_amount` to be larger than the value for `record.balance` without causing a revert of the transaction. While in most cases, a user calling `withdraw()` with a higher value for `assets` than they own will cause a revert, if there is a difference in `msg.sender` and `tx.origin`, this facilitates `tx.origin` in using a call for a withdrawal transaction that may be larger than the recorded `record.balance` for `tx.origin` to gain rewards.

Open the report
LowMissing Input ValidationSwell Network Addendum · CertiK · 28 Nov 2022Fixed

There is no check that the input `_params.platformFee` for the constructor is in an acceptable range for its use as `platformFee` within the `SwellAuraVault` contract. Similarly, there is no check that the input `fee` for function `configurePlatformFee()` is within an acceptable range for its use as `platformFee`.

Open the report
LowMissing Zero Address ValidationSwell Network Addendum · CertiK · 28 Nov 2022Fixed

Addresses should be checked before assignment or external call to make sure they are not zero addresses. ```solidity=38 _params.asset; ``` - `_params.asset` is not zero-checked before being set.

Open the report

Contracts2

AddressChainSource code
0xc94cffd5249df4008a043ee61e13f19af16d0936Chain: EthereumSource code: Verified source
0xd5a73c748449a45cc7d9f21c7ed3ab9eb3d2e959Chain: EthereumSource code: Verified source

All 2 addresses and the files the reports name

Show this on your site

Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.

Content

Facts

Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="swell-network"
></div>
</body>

Paste the code where the label should appear. It uses no API credit and updates by itself.

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us