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.
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 |
|---|---|---|---|---|---|
| Saffron Fixed Income Vaults | Security firm: ChainSecurity | Date: | Scope: Files named in the report | No open critical findings | Open · chainsecurity.com |
| Saffron | Security firm: Quantstamp | Date: | Scope: Files named in the report | No open critical findings | Open · certificate.quantstamp.com |
| Saffron Staking V2 | Security firm: Quantstamp | Date: | Scope: Files named in the report | No open critical findings | Open · certificate.quantstamp.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 | 2 |
| Low | 0 | 9 | 14 |
`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`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 reportThe report gives no description here.
Open the reportThe report gives no description here.
Open the reportThe report gives no description here.
Open the reportThe report gives no description here.
Open the reportThe 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 reportIt 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`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 reportAs 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 reportWithin 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 reportLocal 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 reportEvery 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 reportThe 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 reportThe `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 reportThe `set` function works on pools that have not been created yet. The owner can allocate points to non-existant pools.
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="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