Solv Yield - Bearing Tokens

CertiKFiles named in the report

CertiK reviewed Solv Protocol (Solv Yield - Bearing Tokens) on 8 Apr 2024: 9 findings, 0 critical; 6 marked fixed, 1 acknowledged, 2 open.

No open critical findings
Open the reportOpen Solv Protocol’s security record

Report hosted on skynet.certik.com.

Trustblock does not review code.

Findings9

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

SeverityOpenAcknowledgedFixed
Critical000
High010
Medium001
Low205
MediumMissing validation on `swtAddress`Fixed

The `swtAddress_` parameter of `unstake()` function is missing a check to ensure it is deployed by the `SftWrappedTokenFactory`, allowing users to specify an arbitrary address as the `swtAddress_`. Calling a user provided address is not safe, especially in a public function with no access control restriction. For example, if a non-standard ERC3525 token is transferred to the router without triggering `onERC3525Received` or `onERC721Received`, a malicious `swtAddress_` contract could be used to transfer the token to the attacker (L149).

LowInconsistent support for the native tokenFixed

The `createSubscription()` is a payable function, indicating it allows users to transfer native tokens to the router. Line 164 of the contract calls the function `ERC20TransferHelper.doTransferIn()` to transfer native tokens to the router if `poolInfo.currency` being equal to `ETH_ADDRESS`. However, the router contact does not deposit the received native tokens to the designated contract `IOpenFundMarket(openFundMarket)` (L167), and the `IOpenFundMarket::subscribe()` is not a payable function.

LowInherited Contracts Not Initialized In InitializeFixed

Contract `SftWrapRouter` extends `ReentrancyGuardUpgradeable`, but the extended contract is not initialized by the current contract. Generally, the initializer function of a contract should always call all the initializer functions of the contracts that it extends.

LowNon-zero amount check not performed in the correcFixed

The `stake()` function ensures the token amount to be wrapped cannot be zero: ```solidity=117 require(amount_ > 0, "SftWrapRouter: stake amount cannot be 0"); ``` Users can transfer tokens directly to the router without triggering the `stake()` function, thereby bypassing the zero-amount check.

LowTest Code should be RemovedFixed

Test code should be removed prior to on-chain deployment: ```solidity=15 import "../lib/forge-std/src/console. Sol"; ```

LowUnprotected InitializerFixed

The `SftWrapRouter` contract does not protect their initializers. An attacker can call the initializer and assume ownership of the logic contract, whereby she can perform privileged operations that trick unsuspecting users into believing that she is the owner of the upgradeable contract.

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 (1)

  • contracts/SftWrapRouter.sol

Part of Solv Protocol’s security record

Solv Protocol
Audits6 audits by 3 firmsLast audit Dec 2025, by Quantstamp.
Critical findingsNo open critical findingsAcross 6 reports.
Open Solv Protocol’s security record

Security firm

CertiK

1,044 projects reviewed · 1,375 reports · latest May 2025

See CertiK’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