SolGuardian

Automated exploit hunting for Solidity (EVM & HyperEVM) and Rust (Solana / Anchor). Point it at source; specialised agents return ranked findings — each with a plain-English reason, a PoC stub and a patch sketch.

IBM Bob 2.0 Hackathon · Jason Parser Research · built and demonstrated inside IBM Bob IDE

This page is generated

git clone https://github.com/jamesparser/solguardian.git
cd solguardian
python3 -m solguardian analyze samples --out out/samples --html
open out/samples/report.html

Python 3.8+, standard library only. No RPC, no API keys, no network. The detectors are deterministic code, so this report reproduces byte-for-byte on your machine.

Results on the seeded sample set

17/17planted issues caught
(Solidity · HyperEVM · Anchor)
0.9s935 lines → full report
+ 49 PoC stubs
13deterministic detectors
7 EVM/HyperEVM · 6 Solana
N×concurrent file-sharded
agents + adjudicator
14skill packs: the checklists
every finding cites
0findings on the written-correct
negative control

Sample findings (critical)

whererulewhat SolGuardian says
Vault.sol:74 withdraw()CEI-001 Reentrancy — value is sent before balanceOf is decremented, so a callback re-enters while the old balance is still readable.
Vault.sol:83 adminDrain()AC-001 No access control — moves value to a caller-chosen address with no modifier, no sender check and no caller-scoped accounting.
Vault.sol:120 assetValue()OR-001 Spot-price oracle — in-pool reserves decide valuation; a flash loan can move that print inside the same transaction.
HyperVault.sol:54 migrate()DC-001 delegatecall to a caller-chosen target — the callee runs in this contract's storage and can rewrite the admin slot.
HyperVault.sol:87 claimTreasuryGrant()SR-002 Unlimited signature replay — no nonce, no spend-once map: one captured (v,r,s) pays out forever, on every fork.
lib.rs:174 withdraw()SIGNER-001 Missing signer — a raw AccountInfo authorises a lamport credit; on Solana the account list is the authorisation model.
lib.rs:31 deposit()MATH-001 Precision loss — amount / total_deposits * SCALE truncates a small deposit to exactly zero shares.
lib.rs:117 load_foreign_config()DESER-001 Unsafe deserialization — raw pointer cast over foreign account data with no owner, length or discriminator check.

Why it is explainable

Heuristic tool, honest limits. Expect false positives on unusual-but-correct code and false negatives on anything the patterns do not describe. No symbolic execution, no bytecode, no cross-contract data flow, no deployed state. The 17/17 figure is measured against a seed set we wrote — it is a floor, not a benchmark. A clean SolGuardian report is not an audit.

Built with IBM Bob 2.0

Bob IDE is the development environment: /init + AGENTS.md, Agent-mode multi-file work, parallel subagents for the EVM and Solana detectors, document understanding over the skills/ packs, and the review / commit flow. The same split ships in the product — solguardian/agents/ runs EvmHunter and SolanaHunter concurrently, then ReportWriter enforces the finding contract. Task evidence and the verbatim prompts are in bob_sessions/.