Saffron

QuantstampFiles named in the report

Quantstamp reviewed saffron.finance (Saffron) on 21 Mar 2023: 12 findings, 0 critical; 7 marked fixed, 5 acknowledged.

No open critical findings
Open the reportOpen saffron.finance’s security record

Report hosted on certificate.quantstamp.com.

Trustblock does not review code.

Findings12

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

SeverityOpenAcknowledgedFixed
Critical000
High000
Medium000
Low057
LowAdversary May Front-Run Fixed Side Depositor Causing High SlippageAcknowledged

When depositing fixed side liquidity in `deposit()` the function `deployCapital()` is invoked through `UniV3LimitedRangeAdapter` or `UniV3FullRangeAdapter`. In the `deployCapital()` function, the `amount0` and `amount1` required to provide `fixedSideCapacity` liquidity in Uniswap V3 are determined by `LiquidityAmounts.getAmountsForLiquidity()`. At `UniV3Vault.sol#77`, the fixed side depositor supplies `deployCapitalData` to `IUniV3Adapter.deployCapital()`. This data contains `amount0Min` and `amount1Min`, which determine the minimum amounts to be minted in the vault's position. However, allowing the fixed side depositor to set any value for these minimums may give them more control than advisable in determining the amount of each token deposited into the minted position. Therefore, the fixed side depositor may deposit amounts in either token that are substantially less than or greater than what was initially expected or intended. Allowing these minimums to be set to zero is also [described as a vulnerability in the Uniswap V3 documentation](https://docs.uniswap.org/contracts/v3/guides/providing-liquidity/mint-a-position#calling-mint).

LowDuplicated EventsAcknowledged

Setter functions can emit duplicated events that may confuse external systems when the new value is equal to the old value: 1. `VaultFactory.setDefaultDepositTolerance()` 2. `VaultFactory.setFeeReceiver()` 3. `VaultFactory.setFeeBps()`

LowIf the Variable Side Withdraws Before the Fixed Side Depositor, the Future Earnings of the Fixed Depositor Will Not Be Charged FeesAcknowledged

The `UniV3Vault.withdraw()` function allows variable side users to withdraw the profits made on the fixed side's deposit. It also allows the fixed bearer to withdraw their funds. However, earnings can be settled once and only once, and that is done when either the fixed bearer or a variable bearer makes the first withdrawal. If the party that makes the first withdrawal is a variable bearer, the fixed deposit will continue generating income until the fixed bearer withdraws, but the earnings are only determined at the time of the initial withdrawal and are not re-applied afterwards.

LowOne Fixed Side Depositor Can Front-Run Another Fixed Side Depositor Given a Lucrative VaultAcknowledged

When a vault is created, if the fixed side reward is of high value, another user can front-run the vault creator and become the fixed side depositor, hence stealing opportunity from the vault creator. This will create a race condition where users will try to take a lucrative vault, even if the vault creator intended it for himself.

LowSame Name and Symbol for All Vault Bearer TokensAcknowledged

When a new vault is created and initialized, three `VaultBearerTokens` are created. The name and symbol of these tokens are the same across vaults: - `Saffron Vault Senior Bearer Token, "SAFF-BTS"` - `Saffron Vault Junior Bearer Token", "SAFF-BTJ"` - `Saffron Vault Senior Claim Token", "SAFF-CT"` This naming scheme can be confusing for users when exploring their assets in external services or applications (i.e. Metamask).

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (22)

  • contracts/interfaces/IAdapter.sol
  • contracts/vendor/@uniswap/v3-core/contracts/libraries/Tick.sol
  • contracts/RestrictedVaultFactory_checked.sol
  • contracts/Vault.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/interfaces/INonfungibleTokenPositionDescriptor.sol
  • contracts/vendor/@uniswap/v3-core/contracts/libraries/TickMath.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/libraries/LiquidityAmounts.sol
  • contracts/adapters/AdapterBase.sol
  • contracts/adapters/UniV3LimitedRangeAdapter.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/libraries/PoolAddress.sol
  • contracts/interfaces/IVault.sol
  • contracts/UniV3Vault.sol
  • contracts/vendor/@uniswap/v3-core/contracts/libraries/SafeCast.sol
  • contracts/VaultFactory.sol
  • contracts/Math_checked.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/libraries/FullMath.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/libraries/PositionKey.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/libraries/PositionValue.sol
  • contracts/VaultBearerToken_checked.sol
  • contracts/adapters/UniV3FullRangeAdapter.sol
  • contracts/vendor/@uniswap/v3-periphery/contracts/libraries/ChainId.sol

Part of saffron.finance’s security record

saffron.finance
Audits3 audits by 2 firmsLast audit Dec 2025, by ChainSecurity.
Critical findingsNo open critical findingsAcross 3 reports.
Open saffron.finance’s security record

Security firm

Quantstamp

236 projects reviewed · 332 reports · latest Oct 2026

See Quantstamp’s audits

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