audityzer-demo / app.py
AuditorSEC's picture
Create app.py
02f803a verified
Raw
History Blame Contribute Delete
2.41 kB
import gradio as gr
import subprocess
import tempfile
import os
def scan_contract(solidity_code: str) -> str:
if not solidity_code.strip():
return "Paste Solidity code above"
with tempfile.NamedTemporaryFile(suffix='.sol', delete=False, mode='w') as f:
f.write(solidity_code)
fname = f.name
try:
result = subprocess.run(
['slither', fname, '--print', 'human-summary'],
capture_output=True, text=True, timeout=60
)
output = result.stdout or result.stderr
except FileNotFoundError:
output = "Slither not installed. Running pattern-based scan...\n"
patterns = [
("reentrancy", "CRITICAL: Potential reentrancy vulnerability detected"),
("tx.origin", "HIGH: tx.origin used for authorization (phishing risk)"),
(".call{", "HIGH: Unchecked low-level call"),
("selfdestruct", "CRITICAL: selfdestruct detected"),
("block.timestamp", "MEDIUM: Block timestamp dependency"),
("delegatecall", "HIGH: delegatecall usage detected"),
]
findings = []
for pattern, message in patterns:
if pattern in solidity_code:
findings.append(message)
if findings:
output += "\n".join(findings)
else:
output += "No obvious vulnerabilities detected by pattern scan.\nNote: Install Slither for full analysis."
except Exception as e:
output = f"Error: {e}"
finally:
os.unlink(fname)
return output or "No issues found"
example_contract = """pragma solidity ^0.6.0;
contract Vulnerable {
mapping(address => uint) public balances;
function withdraw() public {
uint amount = balances[msg.sender];
(bool success,) = msg.sender.call{value: amount}("");
require(success);
balances[msg.sender] = 0; // state change AFTER external call = reentrancy!
}
}"""
demo = gr.Interface(
fn=scan_contract,
inputs=gr.Textbox(lines=20, label="Paste Solidity Code", value=example_contract),
outputs=gr.Textbox(label="Audit Results"),
title="AuditorSEC Audityzer Demo",
description="Automated smart contract vulnerability scanner. 14 vulnerability patterns. Powered by Slither + Audityzer. | GitHub: romanchaa997/Audityzer | Telegram: @audityzerbot",
examples=[[example_contract]]
)
demo.launch()