Audit
33Labs reviewed the source of Recoup's lender pool and the contracts wired beside it, 7-22 September 2026. This page says what that covered, what it found, and what it does not tell you. The full report is at the bottom.
The lender pool was audited. The rest of the protocol was not, and no deployment was.
Six source files of the public repository thedelph/recoup-contracts at commit b66023d: the lender pool's accounting and withdrawals, the protocol wiring, the liquidity source, fee routing, configuration bounds and loan-to-value maths. The fixes were reviewed through commit f6893cb.
By 0x23r0 and PhantomOz of 33Labs ↗, an independent security research group.
- It is not an audit of the whole protocol. Nine other contracts, listed below, were outside the in-scope files.
- The Base Sepolia test deployment predates these fixes; the audit is not a statement about any deployment.
- The public lender pool stays closed. See Lend for where it stands.
- A review cannot prove there are no bugs left. The report says so itself, quoted below.
Statuses are the report's own. It classified 10 findings as fixed and 3 as acknowledged and accepted risk, judged against the code, the regression tests, the public risk disclosures and the maintainer and reviewer discussion, rather than whether a GitHub issue is open or closed.
AUDITED - IN SCOPE
- src/LenderPool.sol
- src/CreditWiring.sol
- src/TreasuryLiquiditySource.sol
- src/ProtocolFeeSplitter.sol
- src/Config.sol
- src/LtvMath.sol
NOT AUDITED - OUT OF SCOPE
- CollateralVault
- CreditManager
- LiquidationAuction
- EpochHarvester
- NAVOracle
- RiskParams
- DirectCallAdapter
- MintAttemptReceiver
- ReferralRegistry
Several findings trace paths from the pool into CreditManager and LiquidationAuction, and some fixes landed there, so the reviewers read parts of those contracts along the way. They were not in the in-scope file list, and this page does not call them audited.
| ID | FINDING | SEVERITY | STATUS | ISSUE |
|---|---|---|---|---|
| H-01 | Borrower-keyed recovery provenance redirects an earlier workout's recoveryHigh · Fixed | High | Fixed | #45 |
| H-02 | Auction replacement orphans a closed workout's recovery legHigh · Fixed | High | Fixed | #46 |
| H-03 | Repeated request service converts more than a requester's pro-rata cash into senior claimsHigh · Fixed | High | Fixed | #47 |
| H-04 | Manager migration strands post-close loss recoveries with no unblocked repair pathHigh · Fixed | High | Fixed | #53 |
| M-01 | Permissionless yield sweep can confiscate an open workout's borrower yieldMedium · Fixed | Medium | Fixed | #48 |
| M-02 | Realised open-workout yield bypasses the dedicated sweep protectionMedium · Fixed | Medium | Fixed | #49 |
| M-03 | First clean workout close captures shared residual yieldMedium · Fixed | Medium | Fixed | #50 |
| M-04 | Uncapped stream duration plus gross entry pricing lets a timed flush overcharge new lendersMedium · Fixed | Medium | Fixed | #51 |
| M-05 | A lender-yield backlog above the deposit-cap ceiling can never be deliveredMedium · Fixed | Medium | Fixed | #52 |
| M-06 | A request serviced down to one share-wei keeps the rest of its cash floor (maintainer-reported)Medium · Accepted risk | Medium | Accepted risk | #64 |
| L-01 | Permissionless settle discards a borrower's sub-unit yield accrualLow · Fixed | Low | Fixed | #54 |
| L-02 | After a raw cash loss, the request floors can lock the whole remaining cash until a repayment or a cancelLow · Accepted risk | Low | Accepted risk | #61 |
| L-03 | A paused or blacklisting USDC shuts every bond door, because the farm pays its pending USDC inside the same call (maintainer-reported)Low · Accepted risk | Low | Accepted risk | #68 |
Issue numbers are on the public repository's tracker, where each finding was filed and answered.
How much of "fixed" the reviewers re-ran
For H-01, H-02 and M-01 the report says the reviewers verified the fix on commit 68c0c26, and for H-03 that they verified the original High-severity routes there. For H-04, M-02, M-03, M-04, M-05 and L-01 it states the fix and its regression coverage without naming a verification commit. Those six are listed as fixed because the report lists them as fixed, not because this page has more evidence than the report does.
These are not fixed. They are acknowledged, disclosed, and carried by lenders and borrowers if they happen.
- M-06 · Medium · #64
A withdrawal request serviced down to its last share-wei can keep the rest of its cash floor reserved, locking other lenders' cash with no owner lever and no time limit. Accepted at the report date without a code change: the obvious fix trades directly against L-02 below, and the report treats the two as one design decision.
Since the report, a proposed fix has been opened for the reviewers as public PR #69. It is not merged and the reviewers have not yet reported on it, so M-06 is not counted as fixed here.
- L-02 · Low · #61
After a loss of the pool's own cash, queued withdrawal floors can lock all the remaining cash until a borrower repays or a floor holder cancels, with no guaranteed time. Kept by design: writing the floors down instead would make every queued lender permanently lose part of the amount she was quoted.
- L-03 · Low · #68
If Circle pauses USDC or blacklists the custody adapter while any farm reward is pending, bond deposits, withdrawals and harvests fail for as long as it lasts, because DexFi's farm pays out pending USDC inside the same call, and liquidation clocks keep running. Rated Low because no one in the protocol can cause a Circle pause or blacklist; the mechanism is unchanged.
“A smart contract security review cannot prove the complete absence of vulnerabilities. This assessment was bounded by the agreed scope, review period, available documentation, and referenced commits. Additional review, deployment verification, monitoring, and a public bug bounty are recommended before production use.”
“Before accepting third-party capital, 33Labs recommends revisiting M-06 together with the L-02 design trade-off, publishing the L-03 incident runbook, retaining the activation gate, and verifying deployment/source parity.”
From the report's conclusion.
Download the report (PDF, 2.87 MB) - “Recoup Security Audit Report”, 33Labs, dated 22 September 2026.
file 33labs-recoup-final-report-2026-09-22.pdf bytes 2,866,419 sha256 612fbe1adb22a9d9cd4425b391196a222557d43430b79e6c6140f2ad7c3e92db
To check your copy, run sha256sum 33labs-recoup-final-report-2026-09-22.pdf and compare the output with the hash above.