Incident,
65 million dollars.
Source: De.Fi incident database.
- Audits before it
- 2.
- Audits since
- None on Trustblock.
As of 30 Oct 2026, dForce has 2 audit reports by 2 security firms on Trustblock; the latest is by Consensys, dated 1 Mar 2021. Those reports list no open critical findings. It also holds 1 incident (latest 9 Feb 2023).
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 |
|---|---|---|---|---|---|
| dForce Lending Protocol Review | Security firm: Consensys | Date: | Scope: Files named in the report | No open critical findings | Open · diligence.security |
| dForce | 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 | 2 | 0 | 0 |
| Medium | 4 | 3 | 1 |
| Low | 6 | 8 | 0 |
When updating the interest provider in `USR.updateInterestProvider` the inherited fee recipient from `Chargeable` is not updated. (The address might be the same, however, nothing guarantees it.) Please note that in `USR.initialize` the fee recipient address it taken from `IInterestProvider(_interestProvider).funds()` which is not done inside `updateInterestProvider` when updating the provider.
Open the reportThe check in lines 203-206 implemented in `migrateOldPool()` assumes the new contract does not hold any token balance, when tokens can be sent to the contract. The usage of such strict equality can deny access to that specific function.
Open the reportSome functions make implicit assumptions that tokens remain constant in their supply during transactions. There exist tokens that add rewards or add fees, and hence their supply does not have to stay constant. We identified the following problematic pieces of code: * In `DFCollateral.sol`: line 18, * In `DFFunds.sol`: line 18, * In `DFPool.sol`: lines 23, 35, 47, 59, * In `DFPoolV2.sol`: lines 29, 41, 59, 77, 187, 203, * In `DFEngineV2.sol`: functions `deposit()` and `withdraw()`. Also the function `checkUSDXTotalAndColTotal()` in line 329; consequently all other operations that rely on it would fail.
Open the reportAs it presently is constructed, the contract is vulnerable to the [allowance double-spend exploit](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/b4f87bb8fc25fb07f73099701e39e167a3d36465/contracts/token/ERC20/ERC20.sol#L71-L78), as with other ERC20 tokens. It applies to the following: * `approve()`/`transferFrom()` in `Collaterals_t.sol`, and * `approve()`/`transferFrom()` in `DSTokenBase.sol`.
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.
Open the reportGas usage is a main concern for smart contract developers and users, since high gas costs may prevent users from wanting to use the smart contract. Even worse, some gas usage issues may prevent the contract from providing services entirely. For example, if a `for` loop requires too much gas to exit, then it may prevent the contract from functioning correctly entirely. It is best to break such loops into individual functions as possible.
Open the reportThere are no non-zero checks for arguments of type address in the following: * `DFPool.constructor()`, * `DFPoolV2.constructor()`, `DFPoolV2.initialize()`, `DFPoolV2.migrateOldPool()`, * `Collaterals_t.constructor()`, * `DSWrappedToken.constructor()`, * `DFSetting.constructor()`, * `DFProtocolView.constructor()`, * `DFEngine.constructor()`, * `InterestProvider.initialize()`, * `Chargeable.initialize()`, * `USR.initialize()`. Furthermore, `DFStore._setSection()` does not check that `_wrappedTokens` is a list of unique tokens.
Open the reportThe function `_setSection()` adds tokens. Malicious token may lead to a DoS attack. Similar observation applies to the function `withdrawInterest()`.
Open the reportSmart contracts will often have `owner` variables to designate the person with special privileges to make modifications to the smart contract.
Open the reportIf the value of `minimalBurnAmount` is too large, it will prevent users from redeeming tokens.
Open the reportEvery Solidity file specifies in the header a version number of the format `pragma solidity (^)0.4.*`. 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 reportAttached through a shared contract address. Our incident data ends in Oct 2026.
65 million dollars.
Source: De.Fi incident database.
The 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="dforce"></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