As of 2 Nov 2026, Neutra Finance has 2 audit reports by 2 security firms on Trustblock; the latest is by CertiK, dated 10 Apr 2023. Those reports list no open critical findings.
Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Neutra - audit | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
| Neutra Finance | Security firm: SolidProof | Date: | Scope: Repository at commit 04d177a | No open critical findings | Open · IPFS |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 2 |
| Medium | 0 | 4 | 4 |
| Low | 11 | 0 | 7 |
The function `__claimStakedNeuGlp()` or `__claimWant()` is used to calculate the claimable `want` or `snGlp` and transfer them to the users. ```solidity=248 uint256 totalBalance = totalSnGlpPerRound[round]; uint256 totalReceived = totalWantReceivedPerRound[round]; uint256 claimAmount = totalReceived * balance / totalBalance; ``` ```solidity=277 uint256 claimAmount = totalSnGlpReceivedPerRound[round] * balance / totalWantPerRound[round]; ``` ```solidity=306 function executeBatchPositions(bool _isWithdraw, bytes[] calldata _params, uint256 _dealAmount) external payable onlyHandlerAndAbove { require(msg.value >= executionFee * 2, "BatchRouter: not enough execution Fee"); uint256 amountIn = _isWithdraw ? totalSnGlpPerRound[currentWithdrawRound] : totalWantPerRound[currentDepositRound]; IRouter(router).executePositionsBeforeDealGlp{value: msg.value}(amountIn, _params, _isWithdraw); pendingDealAmount = _dealAmount; lastExecutionStatus = _isWithdraw; executed = true; emit ExecuteBatchPositions(_isWithdraw, amountIn); } ``` ```solidity=319 function confirmAndDealGlp() external onlyHandlerAndAbove { require(executed, "BatchRouter: executes positions first"); if (!lastExecutionStatus) { uint256 amountOut = IRouter(router).confirmAndBuy(pendingDealAmount, address(this)); _updateRewards(); totalSnGlpReceivedPerRound[currentDepositRound] = amountOut; ... } else { uint256 amountOut = IRouter(router).confirmAndSell(pendingDealAmount, address(this)); totalWantReceivedPerRound[currentWithdrawRound] = amountOut; ... } executed = false; } ``` As per the claimable amount calculation formula, the value of `totalWantReceivedPerRound[round]` or `totalSnGlpReceivedPerRound[round]` has a significant impact on the claimable amount. The amount of `totalWantReceivedPerRound[round]` or `totalSnGlpReceivedPerRound[round]` is ultimately determined by the `_dealAmount` parameter of the `executeBatchPositions` function. If the `_dealAmount` is insufficient, users may risk losing money, and it is essential to determine the appropriate quantity of `_dealAmount` to ensure that users can obtain the expected claimable tokens without any losses. Before proceeding, we would like to request confirmation from our customers on the correct approach for determining the right quantity of `_dealAmount`.
Open the reportPerforming integer division before multiplication truncates the low bits, losing the precision of the calculation. ```solidity=277 uint256 claimAmount = totalSnGlpReceivedPerRound[round] * balance / totalWantPerRound[round]; ``` ```solidity=284 uint256 esNeuClaimable = claimAmount * (cumulativeEsNeuRewardPerToken - cumulativeEsNeuRewardPerRound[round]) / PRECISION; ``` --- ```solidity=387 uint256 wbtcRatio = (aums[0] * MAX_BPS) / totalAum; ``` ```solidity=394 wbtcAmountIn = remainingAmount * wbtcRatio / (wbtcRatio + wethRatio); ``` --- ```solidity=404 uint256 sizeDelta = positionParam.size * _amount / _totalSupply; ``` ```solidity=408 uint256 usdOut = profitParam.hasProfit ? sizeDelta * profitParam.pnl / positionParam.size : 0; ```
Open the reportThe `StrategyVault` contract is responsible for using the `want` asset to purchase `glp` tokens for rebalancing. However, when `glp` tokens are sold, the `recipient` address that receives the `want` asset is specified by the input parameter instead of using the original address that paid for the `want` asset. Therefore, we would like to confirm with the client whether this current implementation aligns with the original project design.
Open the reportWhen transferring deflationary ERC20 tokens, the input amount may not be equal to the received amount due to the charged transaction fee. For example, if a user sends 100 deflationary tokens (with a 10% transaction fee), only 90 tokens actually arrived to the contract. However, a failure to discount such fees may allow the same user to withdraw 100 tokens from the contract, which causes the contract to lose 10 tokens in such a transaction.
Open the reportThe variables `_executionFee`, `_fee`, and `_bps` do not have reasonable boundaries, so they can be given arbitrary values after deploying.
Open the reportThere is no storage gap preserved in the logic contract. Any logic contract that acts as a base contract that needs to be inherited by another upgradeable child should have a reasonable size of storage gap preserved for the new state variable introduced by the future upgrades.
Open the reportThere is no validation to check whether the length of the array `_selectors` is the same length as each of the arrays `_params`. In the event that any of these lengths are less than the length of `_selectors`, there is no revert of the function.
Open the reportState variables that never change should be declared as `constant` to save gas.
Open the reportThe return value of the transfer()/transferFrom() call is not checked.
Open the reportThe return value of an external call is not stored in a local or state variable.
Open the reportThe report gives no description here.
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="neutra-finance"></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