saffron.finance security record

As of 30 Oct 2026, saffron.finance has 3 audit reports by 2 security firms on Trustblock; the latest is by ChainSecurity, dated 11 Dec 2025. Those reports list no open critical findings.

Critical findings
No open critical findings
Across 3 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.

Audits3

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Saffron Fixed Income VaultsSecurity firm: ChainSecurityDate: Scope: Files named in the reportNo open critical findingsOpen · chainsecurity.com
SaffronSecurity firm: QuantstampDate: Scope: Files named in the reportNo open critical findingsOpen · certificate.quantstamp.com
Saffron Staking V2Security firm: QuantstampDate: Scope: Files named in the reportNo open critical findingsOpen · certificate.quantstamp.com

Findings25

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

SeverityOpenAcknowledgedFixed
Critical000
High000
Medium002
Low0914
MediumDuplicate LP Token Pools AllowedSaffron Staking V2 · Quantstamp · 21 Sep 2021Fixed

`SaffronStakingV2.add()` allows adding more than once the same `LPToken`. This issue will dilute the user's rewards since `updatePool()` relies on `pool.lpToken.balanceOf(address(this))` to get the pool supposed balance, that will return the total value held by both pools (or more), which will dilute the user's rewards.

Open the report
MediumPossible Un-updated Pool State After Reward Allocation UpdateSaffron Staking V2 · Quantstamp · 21 Sep 2021Fixed

`set()` and `add()` functions members should always be executed with `massUpdatePools()` to avoid errors when computing the user's rewards since the total allocation points will change. However, both functions have a boolean (`_withUpdate`) input that will allow the owner or governance to modify the allocation point of a pool or to add a new pool with new allocation points without updating the accumulated reward per block for each pool. This can lead to distributing more or less reward than the amount expected.

Open the report
LowInconsistency in Vault and Adapter RevocationSaffron Fixed Income Vaults · ChainSecurity · 11 Dec 2025Fixed

The report gives no description here.

Open the report
LowPrecision Loss in Nested muldivSaffron Fixed Income Vaults · ChainSecurity · 11 Dec 2025Fixed

The report gives no description here.

Open the report
LowrenounceOwnership() Should RevertSaffron Fixed Income Vaults · ChainSecurity · 11 Dec 2025Fixed

The report gives no description here.

Open the report
LowUnused and Duplicated CodeSaffron Fixed Income Vaults · ChainSecurity · 11 Dec 2025Fixed

The report gives no description here.

Open the report
LowClone-and-OwnSaffron · Quantstamp · 21 Mar 2023Fixed

The clone-and-own approach involves copying and adjusting open source code at one's own discretion. From the development perspective, it is initially beneficial as it reduces the amount of effort. However, from the security perspective, it involves some risks as the code may not follow the best practices, may contain a security vulnerability, or may include intentionally or unintentionally modified upstream libraries. Use Uniswap's `FullMath.sol` instead of `Math.sol` to avoid maintaining the code.

Open the report
LowMissing Input ValidationSaffron · Quantstamp · 21 Mar 2023Fixed

It is crucial to validate inputs, even if the inputs come from trusted addresses, to avoid human error. Following is the list of places that can potentially benefit from a stricter input validation: 1. `VaultFactory.addVaultType()` it is worth checking if that exact `bytecode` already exists. 2. `UniV3LimitedRangeAdapter.initialize()` does not validate `params.minTick` to be less than `params.maxTick`. 3. `VaultFactory.sol#154`: the `_adapterInfo.vaultAddress` of the `createVault()` function should be zero address. Otherwise, it is not possible to invoke `initializeVault()` if a vault is already attached to the specified `adapter`. 4. `VaultFactory.sol#162`: the `vaultAddress` of the `createVault()` function should not be zero. The assembly `create` function returns a zero address upon error. 5. `VaultFactory.sol#251`: the `adapterAddress` of the `createAdapter()` function should not be zero. The assembly `create` function returns a zero address upon error.

Open the report
LowMissing RequirementsSaffron · Quantstamp · 21 Mar 2023Fixed

`UniV3LimitedRangeAdapter.removeLiquidity()` should require that earning have been settled. Safety checks must be implemented at the smart contract level to prevent future breaking changes. Similarly, `UniV3LimitedRangeAdapter.deployCapital()` should require that the token ID is not set in order to safely execute the transaction..

Open the report
LowOutdated Solidity VersionSaffron · Quantstamp · 21 Mar 2023Fixed

As security standards develop, so does the Solidity language. To stay up to date with current practices, it's important to use a recent version of Solidity and recent conventions.

Open the report
Show 6 more
LowProvide Liquidity Lower than `fixedSideCapacity `Saffron · Quantstamp · 21 Mar 2023Fixed

Within the `deployCapital()` function implementation, the `uint256 fixedSideCapacity` gets cast to `uint128` from `uint256`. Therefore, if `fixedSideCapacity` exceeds `uint128`, `fixedSideCapacity` will be truncated during the conversion. This is problematic because this allows a depositor to deposit less than expected liquidity. The current implementation has a check inside `setVault()`, but it is a good practice to add the check in the `deployCapital()` function in case of code restructuring.

Open the report
LowUnclear Variable NamingSaffron · Quantstamp · 21 Mar 2023Fixed

Local variable naming in `UniV3LimitedRangeAdapter.mintToken()` is confusing: ``` (..., uint256 minted0, uint256 minted1) = positionManager.mint(params); ``` `minted0` and `minted1` do not represent minted amounts but the amount used as liquidity for the Uniswap pool.

Open the report
LowUnlocked PragmaSaffron · Quantstamp · 21 Mar 2023Fixed

Every Solidity file specifies in the header a version number of the format `pragma solidity (^)0.8.*`. The caret (`^`) before the version number implies an unlocked pragma, meaning that the compiler will use the specified version _and above_, hence the term "unlocked".

Open the report
LowLack of Validation in _allocPoint/totalAllocPointSaffron Staking V2 · Quantstamp · 21 Sep 2021Fixed

The value of allocation point value is not validated in both `set()` and `add()` functions. The input validation, in this case, is important since it can impact `totalAllocPoint`. For example, if `totalAllocPoint` is equal to zero then both `updatePool` and `pendingSFI` will most likely throw.

Open the report
LowLoss of Precision in `accSFIPerShare`Saffron Staking V2 · Quantstamp · 21 Sep 2021Fixed

The `accSFIPerShare` variable (see `pendingSFI()` and `updatePool()`) is updated by `sfiReward * 1e18 / lpSupply` and `sfiReward` uses integer division when dividing by `totalAllocPoint`. This leads to `sfiReward` being truncated and `accSFIPerShare` potentially losing precision.

Open the report
LowMissing Pool Existance ChecksSaffron Staking V2 · Quantstamp · 21 Sep 2021Fixed

The `set` function works on pools that have not been created yet. The owner can allocate points to non-existant pools.

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

The repositories and 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="saffronfinance"
></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