As of 30 Oct 2026, Solv Protocol has 6 audit reports by 3 security firms on Trustblock; the latest is by Quantstamp, dated 15 Dec 2025. Those reports list no open critical findings. It also holds 2 deployed contracts on 1 chain.
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 |
|---|---|---|---|---|---|
| Solv Protocol - BTC Redemption | Security firm: Quantstamp | Date: | Scope: Not recorded (see the report) | No open critical findings | Open · certificate.quantstamp.com |
| Audit Report (SolvBTC) | Security firm: Paladin | Date: | Scope: 2 addresses on Ethereum | No open critical findings | Open · IPFS |
| Solv Protocol - SolvBTC | Security firm: Quantstamp | Date: | Scope: Repository at commit eafc741 | No open critical findings | Open · certificate.quantstamp.com |
| Solv Yield - Bearing Tokens | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
| Solv Protocol- Vault Guardian | Security firm: Quantstamp | Date: | Scope: Repository at commit 80300ac | No open critical findings | Open · certificate.quantstamp.com |
| Solv Protocol stUSD - Audit | 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 | 2 | 1 | 4 |
| Medium | 3 | 0 | 3 |
| Low | 7 | 10 | 25 |
The `SftWrapRouter` contract inherits upgradeable contracts, indicating that it is part of an upgradeable system. Upgradeable contracts often pair with a proxy contract that is responsible for managing contract upgrades. The privileged roles of the proxy often have the authority to update the implementation contract. Any compromise to the privileged account may allow a hacker to take advantage of this authority and change the implementation contract which is pointed by proxy and therefore execute potential malicious functionality in the implementation contract.
Open the reportThe report gives no description here.
Open the reportThe report gives no description here.
Open the reportThe `getNav()` function of `SolvBTCYieldTokenOracleForSFT` returns the latest NAV of the specified ERC-20 token but ignores the latest set NAV time. Without validating that the returned NAV time is within a reasonable range, there may be risks of using outdated information. An outdated NAV value may affect the conversion rate between shares and assets of a `SolvBTCYieldToken`.
Open the reportWhen calling `importProductProxy()`, the `productTypes[productType_].beacon` may be different from the beacon address used by the imported proxy. Therefore, the imported proxy may not upgrade since it is pointing to a different beacon.
Open the reportAccording to the protocol design, the `SolvBTCMultiAssetPool` contract may receive ERC-3525 tokens. Therefore, it is best practice to implement the ERC-165 interface and define the `onERC721Received()` and `onERC3525Received()` functions to return the corresponding magic values. Some SFT implementations, such as `OpenFundShareDelegate`, allow the ERC-3525 receiver to revert on the ERC-165 `supportsInterface()` call and consider the receiver capable of receiving ERC-3525 tokens. However, this behavior is not guaranteed in other SFT implementations.
Open the reportThe `FunctionAuthorization._checkSingleTx()` of the Solv Vault Guardian relies on a static mapping of function selectors before proceeding with ACL checks to validate transactions. This design does not accommodate the mutable design of upgradeable contracts, where function selectors might change after upgrades. Particularly for upgradeable contracts with payable fallback functions, this static mapping approach can lead to erroneous behavior, as the guardian may authorize or block transactions based on outdated information. Additionally, if an upgradeable contract were approved, the implementation of the approved function is subject to change.
Open the reportThe Solv Vault Guardian implements a mechanism to validate native token transfers, through the `_checkNativeTransfer()` function to validate transactions based on a list of approved receivers `nativeTokenReceiver`. This check is invoked only when the transaction's calldata is empty. However, this approach does not account for payable functions where the calldata is non empty, thereby bypassing the `_checkNativeTransfer()` validation when `msg.value` is sent alongside calldata. This design choice introduces a discrepancy in how native token transfers are validated, potentially allowing for native token disbursements without proper authorization checks when calldata is present.
Open the reportThe Solv protocol introduces guardian checks through the Authorization mechanism before transactions of the Safe are executed. These checks, depending on the protocol the Safe is interacting with, primarily focus on assessing tokens in, tokens out, and the recipients of swapped funds. The aim is to ensure transactions comply with the allowed types and adhere to the rules set by the Authorization contract. However, the framework does not effectively guard against slippage attacks. It allows Safe owners to set potentially exploitative transaction parameters, such as a zero minimum for tokens out during swaps, potentially bypassing the protective intent of the Authorization checks.
Open the reportCurrently, some of the ACL implementations that allow token whitelisting only allow them to be added via `_addTokenWhitelist()` during deployment. There is no way to modify this token whitelist following deployment. This could be an issue if one of the tokens becomes compromised or is no longer supported, or, if there are additional tokens that would want to be supported by Solv in the future.
Open the reportSmart contracts will often have `owner` variables to designate the person with special privileges to make modifications to the smart contract. Although all of the functions below can be invoked by the Governor role, we would like to note that actually invoking the functions that are added to the guard still has to go through the multisig process, which significantly mitigates the privilege this Governor has. The Governor can invoke the following functions on the Solv Vault Guard defined in `SolvVaultGaurdianForSafe`: - `setGuardAllowed()` to toggle whether an address for the Guard of the Safe can be assigned or not. - `setNativeTokenTransferAllowed()` to toggle whether direct native token transfers can be invoked from the Safe or not. - `addNativeTokenReceiver()` and `removeNativeTokenReceiver()` to define the set of addresses can be transferred native token directly. - `addAuthorizations()` and `removeAuthorizations()` to define the set of Authorizations stored in the contract. - `setAuthorizationEnabled()` allowing the Governor to specify which of the Authorizations stored in the contract will be enabled and therefore enforced. - `transferGovernance()` to a new address. - `forbidGovernance()` preventing any Governor privileged calls to ever be called again. <br> For all Authorizations reviewed, the Governor can invoke the following functions: - `addContractFuncs()`, `removeContractFuncs()`, `addContractFuncSig()`, and `removeContractFuncSig()` to define a set of contracts and functions in those contracts that can be invoked by the Safe. - `setContractACL()` to define the address of the ACL that will be used to further verify transactions. - `transferGovernance()` to a new address. - `forbidGovernance()` preventing any Governor privileged calls to ever be called again. <br> In `SolvMasterFundAuthorizationACL`, the Governor can invoke the following functions: - `addPoolIdWhitelist()` and `removePoolIdWhitelist()` to define the set of Solv pool Ids that will be supported by the Guard. <br> In `ERC3525ApproveAuthorization` and `ERC20ApproveAuthorization` the Governor can invoke the following functions to change the state of the ACL: - `addTokenSpenders()` and `removeTokenSpenders()`to define the set of addresses that can be approved to spend tokens from the Safe. <br> In `ERC20TransferAuthorization` the Governor can invoke the following functions: - `addTokenReceivers()` and `removeTokenReceivers()` to define the set of which tokens can be transferred to which addresses from the Safe.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0x2265…8a680x2265a8e449ea5ff78ee4c115370e9b5957358a68 | Chain: Ethereum | Source code: Verified source |
| 0xb129…6e8e0xb12979ff302ac903849948037a51792cf7186e8e | Chain: Ethereum | Source code: Verified source |
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="solv-protocol"></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