Sample report

Sample report

A full report in the format a customer receives. Illustrative: the data is invented, not the output of a real run.

Page by page

2 / 8

Page 2 of 8

Summary

Findings by severity and status, with Agreement N of M.

  1. Agreement
  2. Evidence level

SHA-256 of the PDF: 281297a1590e3ebb74bf45df5080f96cdaeaa4275796233323c421e201f38ac3

SAMPLE

Web version

About this sample. Illustrative sample. The repository, commit, findings and numbers below are invented to show the report format. They are not the output of a real run. Tools are listed with their real upstream pins; findings, repository and numbers are invented.

Run ID
SAMPLE-0001
Repository
oddsequence-demo/vault-core (demo repository)
Commit
8f3a2c1000000000000000000000000000000000 (invented sample value)
Preset
Deep (3 tools)
Model pin
PENDING: dated model snapshot id is written here for every real run

Summary

All findings. Agreement counts tools; all three run on one model family.
IDTitleSeverityEvidenceAgreementStatus
F-1Share price manipulation via a direct donation to the vault
src/Vault.sol:214
Highpoc-pass-fork2 of 3 toolsconfirmed
F-2Stale oracle price is not checked
src/oracle/PriceOracle.sol:77
Highstatic-confirmed3 of 3 toolsconfirmed
F-3No slippage limit when exiting the strategy
src/strategies/AaveStrategy.sol:131
Mediumnot-verified1 of 3 toolslead
F-4Admin can replace the strategy without a timelock
src/Vault.sol:402
Mediumnot-verified2 of 3 toolsreported
F-5Rounding down on withdrawal leaves dust
src/Vault.sol:288
Mediumnot-verified1 of 3 toolslead
F-6No event when the fee changes
src/VaultFactory.sol:66
Lowstatic-confirmed3 of 3 toolsconfirmed
F-7Unused variable
src/libraries/Math.sol:12
Lowstatic-confirmed1 of 3 toolsconfirmed
F-8Pin the pragma to a fixed version
src/Vault.sol:2
Lowstatic-confirmed3 of 3 toolsconfirmed

Method and tools

ToolPinned commitLicenseModel familyStatus
solidity-auditor v3c9ce8cf7300385eb0f02e15b3749059e4e8f6ec5MIT
Copyright (c) 2024 AI Skills Contributors
Anthropic Claudecompleted (sample)
krait v8.276e5ac7b74ce5517409870c2974e6baaddc8f99eMIT
Copyright (c) 2025-2026 Zealynx Security
Anthropic Claudecompleted (sample)
plamen 2.2.4795962b96e254f2e423a2635fe7f8cb8ea1e6d69MIT (root)
Copyright (c) 2025-2026 Plamen Contributors
Anthropic Claudepartial: timed out on 1 file (sample)

Scope and coverage

FilenSLOCCoverage
src/Vault.sol612read by 3 of 3 tools
src/VaultFactory.sol148read by 3 of 3 tools
src/strategies/AaveStrategy.sol301read by 3 of 3 tools
src/oracle/PriceOracle.sol205read by 2 of 3 tools; plamen timed out

Excluded from scope

  • src/libraries/Math.sol (96 nSLOC): possible vendored copy, excluded by the customer
  • src/interfaces/IVault.sol (44), test/Vault.t.sol (480), script/Deploy.s.sol (72): interfaces, tests and scripts
  • lib/openzeppelin-contracts (5,400): external dependency

Findings in detail

F-1 Share price manipulation via a direct donation to the vault

High · Likelihood: Medium. Impact: High.

Found by: solidity-auditor v3, krait v8.2 (2 of 3 tools, 1 model family)

Evidence: poc-pass-fork: a proof of concept ran on a fork and passed (sample).

convertToShares divides by a total that includes assets sent straight to the vault. Sending assets directly raises the share price before the next user deposits.

Attack path: 1) Attacker deposits 1 wei. 2) Attacker donates X assets directly. 3) A victim who deposits less than X receives 0 shares.

function convertToShares(uint256 assets) public view returns (uint256) {
    uint256 supply = totalSupply();
    return supply == 0 ? assets : assets * supply / totalAssets();
}

Hypothesis, verify it: use virtual shares and assets (an offset) or track total assets internally instead of reading the token balance.

F-2 Stale oracle price is not checked

High · Likelihood: Medium. Impact: High.

Found by: solidity-auditor v3, krait v8.2, plamen 2.2.4 (3 of 3 tools, 1 model family)

Evidence: static-confirmed: a static check backs the finding (sample).

latestRoundData() is read without checking updatedAt. If the feed stops, the vault keeps using the old price.

Attack path: Feed halts, the price goes stale, withdrawals use a wrong price.

(, int256 price,,,) = feed.latestRoundData();
return uint256(price);

Hypothesis, verify it: check updatedAt and answeredInRound, and cap the allowed age.

F-3 No slippage limit when exiting the strategy

Medium · Likelihood: Low. Impact: Medium.

Found by: solidity-auditor v3 (1 of 3 tools)

Evidence: not-verified: no independent check. Listed as a lead because one tool reported it.

withdraw() accepts any amount returned by the pool.

Attack path: Sandwich attack on a withdrawal.

pool.withdraw(asset, amount, address(this));

Hypothesis, verify it: add a minimum-out parameter and verify the received amount.

Discarded findings

IDTitleReasonRaised by
D-1Reentrancy in deposit()likely_false: a nonReentrant guard is present. Reviewer: different model.solidity-auditor v3
D-2Overflow in Math.mulDivlikely_false: Solidity 0.8 has checked arithmetic.krait v8.2
D-3tx.origin in the factoryneeds_human: it is not used for authorization.solidity-auditor v3

What was not checked

  • Off-chain components, keys and key management
  • Front end and infrastructure
  • Economic model and parameter choices
  • Dependency updates after the audited commit
  • Integrations beyond the files in scope, and token behavior not listed in the scope

Disclaimer

  1. This report is not a guarantee of security. It is limited in time and in resources and does not replace a human audit.
  2. Zero findings does not prove the absence of vulnerabilities.
  3. AI tools are not deterministic: a repeat run can return a different set of findings.
  4. Agreement between tools is not confirmation. Tools built on one model can make the same mistake. We call a finding confirmed only with a passing proof of concept or a static check.
  5. The report applies to the stated commit. Later changes are not covered.
  6. Recommendations were not tested unless stated.
  7. Third-party tools are listed for transparency. Names belong to their owners and do not imply endorsement or affiliation.
  8. This is not legal or investment advice.