Lightweight Static Security Analyzer for Vyper Smart Contracts
Scan .vy files for vulnerabilities and get instant feedback from your terminal.
Installation β’ Usage β’ Detectors β’ Examples
Vyper Guard is a fast, accurate static analyzer built specifically for Vyper smart contracts. It detects security vulnerabilities, logic risks, and best-practice violations before deployment.
Key Features:
- Lightning-fast analysis (scan in milliseconds)
- Vyper-native (understands decorators, built-in safety)
- 12+ specialized security detectors
- Auto-fix detected vulnerabilities
- Clear security scoring (0-100)
- Multiple output formats (CLI, JSON, Markdown)
pip install vyper-guardVerify installation:
vyper-guard --versionvyper-guard analyze vault.vyvyper-guard analyze vault.vy --format json --output report.jsonvyper-guard analyze vault.vy --fixββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VYPER GUARD SECURITY REPORT β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π File: vault.vy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SECURITY SCORE: 34 / 100 β
β Grade: F | Risk: π΄ CRITICAL β
β β οΈ DO NOT DEPLOY β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SEVERITY BREAKDOWN
π΄ CRITICAL ..... 2 issues
π HIGH ......... 3 issues
π‘ MEDIUM ....... 1 issue
π΅ LOW .......... 2 issues
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π΄ CRITICAL: Reentrancy Vulnerability (Line 42)
Issue: External call before state update
Vulnerable Code:
42 β raw_call(msg.sender, b"", value=balance)
43 β self.balances[msg.sender] = 0
β
Fix: Update state BEFORE external call
42 β self.balances[msg.sender] = 0
43 β raw_call(msg.sender, b"", value=balance)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Next Steps:
1. Fix all CRITICAL issues immediately
2. Address HIGH severity vulnerabilities
3. Re-run: vyper-guard analyze vault.vy
| # | Detector | Severity | What It Finds |
|---|---|---|---|
| 1 | missing_nonreentrant |
CRITICAL | External functions with value transfers but no @nonreentrant |
| 2 | unsafe_raw_call |
HIGH | raw_call() without return value checks |
| 3 | missing_event_emission |
LOW | State-changing functions that emit no event |
| 4 | timestamp_dependence |
LOW | block.timestamp used in short-window conditional logic |
| 5 | integer_overflow |
HIGH | unsafe_add, unsafe_sub, unsafe_mul, unsafe_div usage |
| 6 | unprotected_selfdestruct |
CRITICAL | selfdestruct() without access control |
| 7 | dangerous_delegatecall |
HIGH | raw_call() with is_delegate_call=True |
| 8 | unprotected_state_change |
HIGH | Writes to sensitive state without msg.sender check |
| 9 | send_in_loop |
HIGH | send() / raw_call() inside for loops |
| 10 | unchecked_subtraction |
HIGH | self.x -= amount without overflow guard |
| 11 | cei_violation |
HIGH | External call before state update |
| 12 | compiler_version_check |
HIGH / INFO | Known Vyper compiler CVEs (GHSA-5824, GHSA-vxmm) |
Each contract receives a 0-100 security score:
Base Score: 100
Deductions:
CRITICAL: -40 points (capped at -80)
HIGH: -20 points (capped at -60)
MEDIUM: -8 points (capped at -24)
LOW: -3 points (capped at -9)
| Score | Grade | Risk | Recommendation |
|---|---|---|---|
| 90-100 | A+ | β Minimal | Production ready |
| 75-89 | A | π’ Low | Minor fixes |
| 60-74 | B | π‘ Moderate | Review required |
| 45-59 | C | π High | Major fixes needed |
| 0-44 | F | π΄ Critical | DO NOT DEPLOY |
Recommended minimum for production: 80+
Note:
analyzecurrently accepts a single.vyfile path, not a directory path.
| Command | Description |
|---|---|
vyper-guard analyze <file> |
Scan a contract for vulnerabilities |
vyper-guard analyze <file> --fix |
Scan and auto-fix vulnerabilities |
vyper-guard stats <file> |
Show contract structure and complexity |
vyper-guard diff <file1> <file2> |
Compare security posture of two contracts |
vyper-guard benchmark [dir] |
Run lightweight detector quality benchmark on a corpus |
vyper-guard detectors |
List all available detectors |
vyper-guard init |
Create a .guardianrc config file |
vyper-guard monitor <address> |
Live-monitor a deployed contract |
vyper-guard baseline <address> |
Build normal-behaviour baseline |
vyper-guard version |
Show version and environment info |
- Explorer-first workflow (
explorer,analyze-address) for verified source analysis. - AI advisory triage with deterministic fallback (
--ai-triage). - LLM agent mode with memory/sandbox support (
agent,agent memory). - Improved
stats --graphHTML dashboard with clearer function-call/control-flow visuals.
- Full CLI usage and examples: docs/USAGE.md
- Detector catalog and rationale: docs/DETECTORS.md
- Installation and maintainer publishing flow: docs/INSTALLATION.md
- Release notes: docs/CHANGELOG.md
- AI triage:
analyze --ai-triage(+--ai-triage-mode llmwhen configured) - AI config helper:
ai config set/show - Graph exports:
stats <file> --graph(--graph-json,--graph-html) - Explorer + verified-source analysis:
explorer,analyze-address - Auto-remediation:
analyze --fix,--fix-dry-run,--fix-report
Use explicit artifacts (avoid dist/* when old versions exist):
rm -rf dist build
python -m build
python -m twine check dist/*
python -m twine upload dist/vyper_guard-<VERSION>-py3-none-any.whl dist/vyper_guard-<VERSION>.tar.gzRules:
- Bump version in both
pyproject.tomlandsrc/guardian/__init__.pyfirst. - Never re-upload an already published version.
- For token auth, set
TWINE_USERNAME=__token__and use fullpypi-...token as password.
- Fix CRITICAL issues first.
- Resolve HIGH severity before deployment.
- Improve MEDIUM/LOW findings for audit quality.
- Re-run scans until security posture is stable.
Recommended minimum score for production: 80+
Create .guardianrc in your project root:
# Analysis Settings
analysis:
enabled_detectors:
- cei_violation
- unsafe_raw_call
- missing_nonreentrant
severity_threshold: MEDIUM
exclude_patterns:
- "*/test/*"
- "*/mock/*"
# Reporting
reporting:
default_format: cli
output_directory: "./reports"
include_fix_suggestions: true
# Auto-Fix
remediation:
auto_apply: false
backup_original: trueβ Vulnerable:
@external
def withdraw():
balance: uint256 = self.balances[msg.sender]
raw_call(msg.sender, b"", value=balance) # External call first
self.balances[msg.sender] = 0 # State update afterβ Fixed:
@external
@nonreentrant("lock")
def withdraw():
balance: uint256 = self.balances[msg.sender]
self.balances[msg.sender] = 0 # State update first
raw_call(msg.sender, b"", value=balance) # External call afterβ Vulnerable:
@external
def transfer(recipient: address, amount: uint256):
raw_call(recipient, b"", value=amount) # No checkβ Fixed:
@external
def transfer(recipient: address, amount: uint256):
success: bool = raw_call(recipient, b"", value=amount)[0]
assert success, "Transfer failed"β Vulnerable:
@external
def updateOwner(new_owner: address):
self.owner = new_owner # No eventβ Fixed:
event OwnerUpdated:
old_owner: indexed(address)
new_owner: indexed(address)
@external
def updateOwner(new_owner: address):
old_owner: address = self.owner
self.owner = new_owner
log OwnerUpdated(old_owner, new_owner)1. Write Vyper contract
2. Run: vyper-guard analyze contract.vy
3. Fix CRITICAL and HIGH issues
4. Run: vyper-guard analyze contract.vy --fix
5. Re-scan until score β₯ 80
6. Test thoroughly
7. Deploy
Before deploying:
- Security score β₯ 80
- Zero CRITICAL vulnerabilities
- Zero HIGH vulnerabilities
- All external calls use reentrancy guards
- Access control on sensitive functions
- Events emitted for state changes
- Using latest stable Vyper version
- Test coverage β₯ 90%
Contributions welcome! Here's how:
- Report bugs via GitHub Issues
- Suggest features or new detectors
- Improve documentation
- Submit pull requests
git clone https://github.com/preethamak/vyper-guard.git
cd vyper-guard
pip install -e ".[dev]"
pytestImportant: Vyper Guard is a static analysis tool that helps identify common vulnerabilities. It does not guarantee complete security.
Recommendations:
- Combine automated scanning with manual audits
- Test thoroughly on testnets before mainnet
- Consider professional audits for high-value contracts
Vyper Guard is provided "as is" without warranty.
MIT License - see LICENSE file for details.
Built with β€οΈ by Preetham AK
Special thanks to the Vyper team.
- GitHub Issues: Report bugs
- GitHub: @preethamak
Made with π‘οΈ for secure smart contract development