As of 21 Oct 2026, Celer Network has 3 audit reports by 2 security firms on Trustblock; the latest is by PeckShield, dated 15 Feb 2023. Those reports list no open critical findings.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Celer: Celer MultiBridge audit | Security firm: PeckShield | Date: | Scope: Not recorded (see the report) | No open critical findings | Open · GitHub |
| Celer Layer2 Finance v2 | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
| Celer Network | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 0 |
| Medium | 0 | 0 | 0 |
| Low | 30 | 0 | 43 |
The linked address parameters are not verified to be non-zero before assigning them to state variable which cannot be modified in the future.
Open the reportThe external `withdraw` and `withdrawETH` functions in the `RollupChain` contract both take an arbitrary `_account` address parameter instead of utilizing `msg.sender`, which allows anyone to request a withdraw for a particular account without permission for `msg.sender` to do so, which may be undesired by the account owning the funds.
Open the reportThe linked lines contain arbitrary address parameters which are intended to represent the wETH address.
Open the reportThe external `drainToken` function in the `RollupChain` contract does not verify if the supplied `_asset` address exists within the `registry` prior to the transfer.
Open the reportThe external `setBlockChallengePeriod` function in the `RollupChain` contract allows the owner to change the period in which blocks are allowed to be challenged at any time.
Open the reportThe external `setMaxPriorityTxDelay` function in the `RollupChain` contract allows the owner to change the maximum priority transaction delay at any time.
Open the reportThe owner of the contract can change the implementation address associated with the supplied `_strategyId` at any time
Open the reportThe external `drainToken` function in the `RollupChain` contract allows the owner of the contract to drain any specified ERC-20 token when the contract is in a paused state.
Open the reportThe external `drainETH` function in the `RollupChain` contract allows the owner of the contract to drain any ETH sent to the contract when the contract is in a paused state.
Open the reportThe external `setNetDepositLimit` function in the `RollupChain` contract allow the owner to set the net deposit limit for the supplied `_asset` at any time.
Open the reportThe linked lines read state variables from storage redundantly, which is inefficient.
Open the reportThe linked lines may truncate due to casting `uint` values with a higher bit count into `uint` values with a lower bit count without verifying that the `uint` values with higher bit counts are valid within the bounds of a `uint` value with a lower bit count.
Open the reportThe receive function in the `RollupChain` contract allows anyone to send ETH to the contract, which can be unintentional.
Open the reportThe private `_withdraw` function in the `RollupChain` contract allows the `pendingWithdraws` value for the supplied `_account` and `_asset` to be larger than what is available in `netDeposits` for the supplied `_asset`. This is possible due to setting the `netDeposits` for the supplied `_asset` to zero on L526 and setting the `pendingWithdraws` for the supplied `_account` and `_asset` to zero on L530, effectively truncating the withdraw to only what is available in `netDeposits` for the supplied `_asset` without emitting an event or tracking how much the withdraw was truncated by. The function also returns the amount that was requested in `pendingWithdraws` instead of the actual amount that was available in `netDeposits`, which can affect any functionality relying on the result of the function.
Open the reportThe function on the aforementioned line allows the owner of contract to withdraw celerToken funds at will. Although, it does not compromise the security of the system in any way but the owner has to be trusted to maintain the funds of the contract.
Open the reportThe function on the aforementioned line allows the owner of contract to withdraw celerToken funds at will. Although, it does not compromise the security of the system in any way but the owner has to be trusted to maintain the funds of the contract.
Open the reportThe structure of the codebase does not conform to the official Solidity style guide of v0.5.x .
Open the reportThe if statements on the aforementioned lines have hardcoded false conditional as predicate which makes the if statement and its block ineffectual. As the comment at the top of library indicates that it is a code generated library and the rectification may require changes in the tool used to generate this library. The exhibit is informational and can be safely ignored.
Open the reportThe for-loop on the aforementioned lines makes use of inefficient storage read operations on the lines L767 and L768 with the use of d.intentStartIndex . Although, the enclosing function is a view type and is never called from within the contract but a possible call from another contract will be gas inefficient.
Open the reportThe require statements on the aforementioned lines do not specify reason string . The reason string s should be provided to require statements to aid debugging and readability of the code.
Open the reportThe functions on the aforementioned lines has parameter lock end time . There are no checks in the function to assert against a valid value of it which should be greater than block.number .
Open the reportThe addition of idx and len is Unsafe and can potentially overflow resulting in the followed require check potentially passing despite the overflow. Additionally, The require statements on the aforementioned lines check against that the current read index idx should not exceed the length of buf , which is of type bytes . As the idx starts from 0 and the length of buf starts from 1 , if in any case idx is equal to length of buf , the require statement evaluates to true and the memory read in that case would not be a part of buf as the idx would have oveflown
Open the reportThe aforementioned lines declare variables of type uint256 and initialize it with 0 . In Solidity, all un-initialized variables have a default value which for the uint256 variable is 0 , hence the initialization part is redundant and can be removed.
Open the reportThe code on the aforementioned lines update storage after making an external call which violates the checkseffects-interactions pattern and poses threat for reentrancy attack. Reference the Check Effects Interactions pattern: https://fravoll.github.io/solidity-patterns/checks_effects_interactions.html
Open the reportThe code on the aforementioned lines update storage after making an external call which violates the checkseffects-interactions pattern and poses threat for reentrancy attack. Reference the Check Effects Interactions pattern: https://fravoll.github.io/solidity-patterns/checks_effects_interactions.html
Open the reportThe `require` statement on the aforementioned lines can be converted into a modifier to avoid code duplication and increase the legibility of the code.
Open the reportThe require statement on the aforementioned lines can be converted into a modifier to avoid code duplication and increase the legibility of the code.
Open the reportThe require statement on the aforementioned lines can be converted into a modifier to avoid code duplication and increase the legibility of the code.
Open the reportThe library is using uint to declare 256-bit unsigned integers. Although, uint is an alias for uint256 and both represent the same underlying integer allocation. It is advisable that for clean coding practices the complete form uint256 should be used instead of the alias uint .
Open the reportThe library is using uint to declare 256-bit unsigned integers. Although, uint is an alias for uint256 and both represent the same underlying integer allocation. It is advisable that for clean coding practices the complete form uint256 should be used instead of the alias uint . As the comment at the top of library indicates that it is a code generated library and the rectification may require changes in the tool used to generate this library. The exhibit is informational and can be safely ignored.
Open the reportThe reports name a repository or files. Open a report to see its scope.
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.
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.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-tb-project-slug="celer-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