As of 3 Nov 2026, Sherlock has 1 audit report on Trustblock, by Quantstamp, dated 10 Aug 2021. That report lists no open critical findings.
Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Sherlock | 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 | 0 | 0 | 1 |
| Medium | 0 | 4 | 1 |
| Low | 3 | 12 | 4 |
Staker funds are used as support for all protocols supported by Sherlock. Therefore, adding a new protocol may introduce a risk that one or more *stakers* are not comfortable with. For example, a *staker* might know the team behind a certain protocol that is newly added and believe that the risk of a hack of that protocol is too high to tolerate. Therefore, *stakers* should get a chance to withdraw their funds before a protocol starts being covered by Sherlock.
Open the reportWhen calling the `Payout.payout` function the governance address can choose the amount that is to be transferred from the `firstMoneyOut` pool for each token. This goes against the specification, which indicates that the `firstMoneyOut` pool will be emptied first in case of a valid claim.
Open the reportThe documentation states that: > Sherlock implements a buffer amount (20% currently) to account for currency fluctuations. So if Sherlock will cover a protocol for $100M, the staking pools need to be at least $120M in size ($100M we need to cover + 20% buffer). However, given that we have seen price drops of more than 50% in the past couple of months, this 20% buffer seems insufficient.
Open the reportThe Sherlock pool must hold at least the amount necessary to payout the largest protocol, plus a 20% buffer. However, if a large *staker* decides to withdraw their stake at some point and the size of the pool decreases below the amount needed by one or more of the largest platforms, then those platforms will overpay the amount of premium from that point onward until either the premium amount is adjusted by the governance or sufficient funds are staked to restore the pool size to the amount needed to cover the largest platforms.
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.
Open the reportThe governance can set the cooldown period to 25 million blocks, which (assuming a block time of 13 seconds) is over 10 years. This is an excessive amount of time for stakers to wait before they can withdraw their funds.
Open the reportThe contract does not declare any events, which makes it difficult for 3rd party integrators to monitor the actions performed by the smart contracts. The only exception is the `SherX.sol` file that defines and emits the `Harvest` event.
Open the reportThe following functions are missing input parameter validation: 1. The `GovDev.transferGovDev()` function does not check if the `_govDev` parameter is different from `address(0)`. 2. The `Payment.payment()` method does not check if the same token address is provided twice in the `_tokens` input array parameter. 3. The `_amounts` and `_firstMoneyOut` values are not checked to be less than the available amounts in the pools. There is an implicit check by using SafeMath functions which will fail if these conditions are false, but will not provide a proper error message. 4. The `_amount` input parameter of the `PoolBase.withdrawProtocolBalance` function is not explicitly checked to be less than `ps.protocolBalance[_protocol]`. This could lead to an error in the `sub()` function call on L292, without any error message. 5. The `PoolBase.setCooldownFee` function does not impose an upper limit on the `_fee` parameter value and this fee can be changed at any time by the governance account.
Open the report1. From the protocol overview: "Our claims committee will be the final arbiters in deciding whether a certain hack falls under coverage and therefore should be paid out." 2. Within `Gov.sol`, several protocol parameters may be changed, e.g., `unstakeWindow`. 3. The owner is responsible for setting token prices and protocol premiums. **No oracles are used for pricing.** 4. The diamond pattern would allow the owner to add arbitrary code to the solution as facets via `GovDev.updateSolution`. Also, other privileged roles should be documented, which can perform a series of actions that could affect end-users: * The main governance role can do the following: 1. Change the address of the main governance role at any time. 2. Change the Watson's address at any time. 3. Set the length of the unstake window to any value under 10 years, at any time. 4. Set the length of the cooldown period to any value under 10 years, at any time. 5. Add new protocols at any time. 6. Update the protocol agent at any time. 7. Add any ERC20 tokens the protocol is allowed to pay in at any time. 8. Remove protocols that do not have debt. 9. Initialize a new token. 10. Disable any of the added ERC20 tokens with 0 active weight, for staking. 11. Disable any covered protocol if the active premium and active underlying are 0. 12. Sell/swap ERC20 tokens from the pool at any time. 13. Remove ERC20 tokens from the pool if they are not used by stakers or protocols. 14. Set the price of any ERC20 token in USD at any time. 15. Set the premium amounts for a protocol using multiple ERC20 tokens. 16. Change the address of the payout governance, at any time. 17. Set initial SHERX distribution to Watsons, once. 18. Set the SHERX distribution (weights) to different ERC20 tokens at any time. * The GovDev role can do the following: 19. Set the initial main governance address, once. 20. Change the GovDev address, at any time. 21. Delete, update or add functions to the Sherlock smart contract. 22. Set the initial governance payout address, once. 23. Initialize the SherXERC20 token, once. 24. Stake in the `PoolDevOnly` contract. No other role can stake in this pool.
Open the reportThe `Manager.setProtocolPremium` and `Manager.setProtocolPremiumAndTokenPrice` functions are used to change the premium amount for one or more protocols. These functions all make a call to `LibPool.payOffDebtAll` which pays off the accrued debt of all whitelisted protocols that use a specific token. However, if any of these protocols do not have sufficient balance for the debt to be paid off, it will cause the whole transaction to revert and the protocol premium price will remain unchanged (for any unrelated protocol).
Open the reportThere is a conflict of interest between the protocols and the security team because the security team is paid a percentage out of the total premium that the protocol pays to Sherlock AND the security team determines the premium price as well. This means that the security team is in theory incentivized to provide a high premium price for a protocol, which would also be beneficial for the Sherlock treasury and for the stakers. However, in practice the premium prices need to be competitive on the DeFi insurance market, otherwise, protocols will not pay it.
Open the reportThe funds deposited by *stakers* with the purpose of covering platforms in case of a hack are reinvested on other DeFi platforms to increase *staker* yield. This puts the reinvested funds at risk of getting stolen by any hacks or insolvency of the DeFi platforms that are used for investing. At the moment the only platform that is used is Aave and therefore the risk is Low. However, if other (less secure) platforms will be used in the future, then the risk might increase.
Open the reportThere is a strong dependency on `block.number` for financial calculations in at least 31 places inside the code. Current trends of Dapps observe them migrated to Layer2 platforms compatible with Solidity contracts for speed and gas costs. Due to block times and `block.number` speed changes being totally different (usually much faster) in Layer2 chains, this can result in financials extremely disrupted in Layer2 if contracts are migrated in the current state to L2. A more certain impact, but of smaller size, will impact the deployed contracts on the future automated migration to Ethereum 2.0, as current block time is approximately 13.34 seconds but Ethereum 2.0 is designed for a block time of 12 seconds. This can result in tokenomics distorted for Ethereum 2.0 or malicious users leveraging a Layer2 deployments to obtain an unfair advantage over Layer1 users.
Open the reportFunctions `transferFrom()` and `transfer()` of `SherXERC20` allows for a valid transfer of a zero amount of token from any account to any account. This has not a severe impact but can generate false alerts on transferences from wallets, pollute logging systems, and generate wash trading to collect possible future rewards. This is allowed by the ERC20 specification. From [EIP-20](https://eips.ethereum.org/EIPS/eip-20): "Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event."
Open the reportThe `SherX.doYield` function allows the caller to specify an `amount` of tokens that should be transferred from the `from` address to the `to` address. However, there is no explicit check inside this function, which ensures that the `amount <= ps.lockToken.balanceOf(from)`. This could lead to an inappropriate amount of tokens being used for computations of the `ineglible_yield_amount`.
Open the reportFunctionality for `protocolManagers` and `protocolAgents` are set in L161-162 but never used. This makes the audit and maintenance of the code more difficult.
Open the reportThe 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="sherlock"></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