crypto-scam-detector
Real-time cryptocurrency scam detection with database-first architecture. Protects users from phishing, honeypots, rug pulls, and ponzi schemes. No external API calls during checks!
+ 1 more
Potentially suspicious implementation signals detected: sudo , password.
βοΈ Quick review
9/12 functionality-v2 checks passed before the stumble. The requirements txt shape is the part that made this interesting.
crypto-scam-detector bills itself as βReal-time cryptocurrency scam detection with database-first architecture. Protects users from phishing, honeypots, rug pulls, and ponzi schemes. No external APIβ, and it came into testing with shell access, network references, env requirements, 4 blast-radius signals, 2 suspicious signals. That makes the runtime evidence a lot more interesting than a generic pass/fail blob. RatioDaemon version: functionality-v2 after baseline-v3 is the lane that faceplanted. The requirements txt shape missed the proof signal the test was looking for. This is not cinematic evil β just a credibility bruise the runtime engine was kind enough to document.
baseline safety checks passed8/8 passedclean historyshow baseline lane summary
follow-on functionality checks failed9/12 passedfirst failed run seen for this laneshow follow-on lane summary
Before you install
- You are specifically looking for coding-agents-and-ides / awesome-index workflows.
- Expect setup work: this skill references 12 env vars.
- Assume outside service calls are part of the story: 12 external domain references showed up.
- Expect local command execution or subprocess behavior, not just polite in-memory logic.
- functionality-v2 found trouble, so treat this like a review-first install instead of a casual click.
- Suspicious signals are present; this is not just a broader capability surface doing ordinary work.
- The capability surface is non-trivial: this skill touches higher-privilege or higher-impact areas.
Why this label
This landed in High Risk because suspicious patterns or dangerous signal combinations outweighed ordinary provenance and utility clues.
Uncertainty: Source-level evidence helps, but this is still largely static-analysis-first unless a manual review is present.
Capability surface and suspicious signals
Capability surface
These increase access or impact, but they are not the same thing as deceptive or malicious behavior.
Capability summary
+ 3 more
Suspicious behaviors
These are the signals that count much more heavily against the score.
Evidence
+ 9 more
+ 9 more
+ 1 more
+ 2 more
Read this section in two layers: capability surface shows what the skill can touch, while suspicious signals show what looks deceptive or riskier than ordinary integrations.
π§ͺ Technical runtime details
This is the raw runtime layer: baseline-v3 first, then the follow-on lane when available. The postcard above is the fast read; the receipts below are the technical view.
This is the follow-on adaptive lane: source-aware smoke checks for the file types actually present in this skill after it already cleared baseline-v3. Depending on the repo shape, that can include manifest identity, package entrypoints, docs-link integrity, shipped fixture validation, and real help-smoke runs.
eecf19a944c3487e6e93dc87fa6a08fe1c5e6b6861746517454d0e4f95764c14π§ skill structurestatus: passedpassedexit 0250 mstap for adaptive receipts
sh -lc test -s /source/SKILL.md && grep -Eq "^#{1,6} " /source/SKILL.md && echo skill-structure-okskill-structure-okβπͺͺ _meta.json shapestatus: passedpassedexit 0239 mstap for adaptive receipts
node -e const fs=require("fs"); const files=process.argv.slice(1); for (const file of files) { const meta=JSON.parse(fs.readFileSync(file, "utf8")); if (!meta || Array.isArray(meta) || typeof meta !== "object") throw new Error(`${file}: _meta.json must be an object`); if (typeof meta.owner !== "string" || !meta.owner) throw new Error(`${file}: owner missing`); if (typeof meta.slug !== "string" || !meta.slug) throw new Error(`${file}: slug missing`); if (!meta.latest || typeof meta.latest !== "object") throw new Error(`${file}: latest missing`); if (typeof meta.latest.version !== "string" || !meta.latest.version) throw new Error(`${file}: latest.version missing`); if (typeof meta.latest.publishedAt !== "number") throw new Error(`${file}: latest.publishedAt missing`); } console.log(`meta-json-shape-ok:${files.length}`); /source/_meta.jsonmeta-json-shape-ok:1β𧬠_meta.json identitystatus: passedpassedexit 0229 mstap for adaptive receipts
node -e const fs=require("fs"); const expectedOwner=process.argv[1]; const expectedSlug=process.argv[2]; const files=process.argv.slice(3); for (const file of files) { const meta=JSON.parse(fs.readFileSync(file, "utf8")); if (meta.owner !== expectedOwner) throw new Error(`${file}: owner mismatch ${meta.owner} !== ${expectedOwner}`); if (meta.slug !== expectedSlug) throw new Error(`${file}: slug mismatch ${meta.slug} !== ${expectedSlug}`); if (meta.history && !Array.isArray(meta.history)) throw new Error(`${file}: history must be an array`); for (const entry of meta.history || []) { if (typeof entry.version !== "string" || !entry.version) throw new Error(`${file}: history.version missing`); if (typeof entry.publishedAt !== "number") throw new Error(`${file}: history.publishedAt missing`); } } console.log(`meta-json-identity-ok:${files.length}`); princedoss77 crypto-scam-detector /source/_meta.jsonmeta-json-identity-ok:1βπ§Ύ json parsestatus: passedpassedexit 0232 mstap for adaptive receipts
node -e const fs=require("fs"); const files=process.argv.slice(1); for (const file of files) JSON.parse(fs.readFileSync(file, "utf8")); console.log(`json-parse-ok:${files.length}`); /source/_meta.json /source/clawhub-manifest.json /source/package.jsonjson-parse-ok:3βπ shell syntaxstatus: passedpassedexit 0224 mstap for adaptive receipts
bash -lc for file do bash -n "$file"; done && echo shell-syntax-ok:$# functionality-shell /source/check_address.sh /source/install.sh /source/setup.sh /source/verify_package.shshell-syntax-ok:4βπ python syntaxstatus: passedpassedexit 0344 mstap for adaptive receipts
python3 -c import ast, pathlib, sys; files=sys.argv[1:]; [ast.parse(pathlib.Path(file).read_text(encoding="utf-8"), filename=file) for file in files]; print(f"python-syntax-ok:{len(files)}") /source/blockchain_detector.py /source/crypto_check_db.py /source/database.py /source/scam_database.py /source/secure_key_manager.py /source/sync_worker.pypython-syntax-ok:6βπ¦ package.json shapestatus: passedpassedexit 0227 mstap for adaptive receipts
node -e const fs=require("fs"); const files=process.argv.slice(1); for (const file of files) { const pkg=JSON.parse(fs.readFileSync(file, "utf8")); if (!pkg || Array.isArray(pkg) || typeof pkg !== "object") throw new Error(`${file}: package.json must be an object`); if (pkg.scripts && (Array.isArray(pkg.scripts) || typeof pkg.scripts !== "object")) throw new Error(`${file}: scripts must be an object when present`); if (pkg.dependencies && (Array.isArray(pkg.dependencies) || typeof pkg.dependencies !== "object")) throw new Error(`${file}: dependencies must be an object when present`); } console.log(`package-json-shape-ok:${files.length}`); /source/package.jsonpackage-json-shape-ok:1βπͺ package entrypointsstatus: passedpassedexit 0238 mstap for adaptive receipts
node -e const fs=require("fs"); const path=require("path"); const exts=["",".js",".mjs",".cjs",".json","/index.js","/index.mjs","/index.cjs"]; const existsTarget=(base,target)=>{ if (typeof target !== "string" || !target || /^(node:|https?:|@)/.test(target)) return true; const resolved=path.resolve(base,target); return exts.some((suffix)=>fs.existsSync(resolved + suffix)); }; const files=process.argv.slice(1); for (const file of files) { const pkg=JSON.parse(fs.readFileSync(file, "utf8")); const base=path.dirname(file); if (typeof pkg.main === "string" && !existsTarget(base,pkg.main)) throw new Error(`${file}: missing main target ${pkg.main}`); if (typeof pkg.bin === "string" && !existsTarget(base,pkg.bin)) throw new Error(`${file}: missing bin target ${pkg.bin}`); if (pkg.bin && typeof pkg.bin === "object" && !Array.isArray(pkg.bin)) { for (const [name,target] of Object.entries(pkg.bin)) { if (!existsTarget(base,target)) throw new Error(`${file}: missing bin target for ${name}: ${target}`); } } } console.log(`package-json-entrypoints-ok:${files.length}`); /source/package.jsonpackage-json-entrypoints-ok:1βπ requirements.txt shapestatus: failedexpectation_failedexit 0315 mstap for adaptive receipts
python3 -c import pathlib, re, sys
allowed_prefixes=("-r ","--requirement ","-c ","--constraint ","-e ","--editable ","--index-url ","--extra-index-url ","--find-links ","--trusted-host ","--no-binary ","--only-binary ")
pattern=re.compile(r"^[A-Za-z0-9_.-]+(?:[[A-Za-z0-9_.,-]+])?(?:s*(?:==|>=|<=|~=|>|<|!=)s*[^s#;]+)?(?:s*;.*)?$")
files=sys.argv[1:]
for file in files:
for idx,line in enumerate(pathlib.Path(file).read_text(encoding="utf-8").splitlines(), start=1):
stripped=line.strip()
if not stripped or stripped.startswith("#"):
continue
if stripped.startswith(allowed_prefixes) or "://" in stripped or " @ " in stripped:
continue
if not pattern.match(stripped):
raise SystemExit(f"{file}:{idx}: malformed requirement line: {stripped}")
print(f"requirements-txt-shape-ok:{len(files)}") /source/requirements.txtββπ python help smokestatus: failedruntime_failedexit 1850 mstap for adaptive receipts
sh -lc for file do python3 "$file" --help >/dev/null 2>&1 || python3 "$file" -h >/dev/null 2>&1 || exit 1; done && echo python-help-ok:$# functionality-python-help /source/sync_worker.pyββpython help bogus envstatus: failedcrashed_with_fake_credentialsexit 1821 mstap for adaptive receipts
sh -lc for file do python3 "$file" --help >/dev/null 2>&1 || python3 "$file" -h >/dev/null 2>&1 || exit 1; done && echo python-help-bogus-env-ok:$# functionality-python-help-bogus-env /source/sync_worker.pyββπ docs link integritystatus: passedpassedexit 0305 mstap for adaptive receipts
python3 -c import pathlib, re, sys
root=pathlib.Path("/source").resolve()
pattern=re.compile(r"[[^]]+](([^)]+))")
missing=[]
checked=0
for file in [pathlib.Path(p) for p in sys.argv[1:]]:
try:
text=file.read_text(encoding="utf-8")
except Exception:
continue
for target in pattern.findall(text):
target=target.strip().strip("<>")
if not target or target.startswith(("http://","https://","mailto:","#")):
continue
target=target.split("#",1)[0].strip()
if not target:
continue
checked += 1
resolved=(file.parent / target).resolve()
try:
resolved.relative_to(root)
except ValueError:
missing.append(f"{file}: outside-source link -> {target}")
continue
if not resolved.exists():
missing.append(f"{file}: missing -> {target}")
if missing:
raise SystemExit("\n".join(missing[:20]))
print(f"docs-local-links-ok:{checked}") /source/CHANGELOG.md /source/DATABASE_ARCHITECTURE.md /source/EXPORT_PACKAGE.md /source/MULTICHAIN_SUPPORT.md /source/README.md /source/READY_TO_PUBLISH.md /source/REALTIME_SYNC_UPDATE.md /source/SECURITY.md /source/SKILL.md /source/SUBMISSION.md /source/V2.2.0_RELEASE_NOTES.mdββeecf19a944c3487e6e93dc87fa6a08fe1c5e6b6861746517454d0e4f95764c14π¦ Source mountstatus: passedpassedexit 0269 mstap for the raw receipts
sh -lc find /source -maxdepth 2 -type f | sort | sed -n "1,12p" > /workspace/source-files.txt && wc -l /workspace/source-files.txt && cat /workspace/source-files.txtbusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b81bccab9217bdb89cca3ade3294d057214263a3d79ad56deb3413b177621106f7e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
12 /workspace/source-files.txt /source/CHANGELOG.md /source/DATABASE_ARCHITECTURE.md /source/EXPORT_PACKAGE.md /source/MULTICHAIN_SUPPORT.md /source/README.md /source/READY_TO_PUBLISH.md /source/REALTIME_SYNC_UPDATE.md /source/SECURITY.md /source/SKILL.md /source/SUBMISSION.md /source/V2.2.0_RELEASE_NOTES.md /source/_meta.json
Observed stderr:
(empty)
Workspace artifacts:
- source-files.txt (298 B)
π Source write guardstatus: passedpassedexit 0251 mstap for the raw receipts
sh -lc touch /source/driftbot-write-test >/tmp/source-write.out 2>&1 || true; if grep -Eiq "Read-only file system|Permission denied" /tmp/source-write.out || [ ! -e /source/driftbot-write-test ]; then echo source-readonly; fibusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b8a65af92097dc754e9cac4a455c5378d78b05e7927705ae45e1d20a24c4c1fd3ce3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
source-readonly
Observed stderr:
(empty)
Workspace artifacts:
No workspace artifacts produced.
π Workspace writestatus: passedpassedexit 0242 mstap for the raw receipts
sh -lc echo workspace-ok > /workspace/write-check.txt && grep -q "workspace-ok" /workspace/write-check.txt && echo workspace-write-okbusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b881487f7df7b83c1d3fae9c36fb1009328fa34feca0f5c1581674de4cba29e6f5e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
workspace-write-ok
Observed stderr:
(empty)
Workspace artifacts:
- write-check.txt (13 B)
π Hostname network denialstatus: passedpassedexit 0237 mstap for the raw receipts
sh -lc wget -T 3 -qO- http://example.com >/tmp/http-host.out 2>&1 || true; grep -Eiq "bad address|network is unreachable|timed out|failed|refused" /tmp/http-host.out && echo network-host-blockedbusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b8aa4c95f392f2c19669ae67769237c23b54efb5f5e26a8ac8f11162ef28e7f141e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
network-host-blocked
Observed stderr:
(empty)
Workspace artifacts:
No workspace artifacts produced.
π§± Raw-IP network denialstatus: passedpassedexit 0221 mstap for the raw receipts
sh -lc wget -T 3 -qO- http://1.1.1.1 >/tmp/http-ip.out 2>&1 || true; grep -Eiq "bad address|network is unreachable|timed out|failed|refused" /tmp/http-ip.out && echo network-ip-blockedbusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b8ee48345f6e97282a8b1f42753df3c9b37886403c60b09a044657b95126bae8b1e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
network-ip-blocked
Observed stderr:
(empty)
Workspace artifacts:
No workspace artifacts produced.
π§ͺ Fake-env handlingstatus: failedhandled_fake_credentials_cleanlyexit 0237 mstap for the raw receipts
sh -lc env | grep -E "OPENAI_API_KEY|SLACK_BOT_TOKEN|GITHUB_TOKEN" | sed "s/=.*$/=REDACTED/"busybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b8d714e2d3c2043f53d26d2deebac9b26a17f96f8d20158469b586bb598bc80c57e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
GITHUB_TOKEN=REDACTED SLACK_BOT_TOKEN=REDACTED OPENAI_API_KEY=REDACTED
Observed stderr:
(empty)
Workspace artifacts:
No workspace artifacts produced.
ποΈ Secret-path isolationstatus: passedpassedexit 0216 mstap for the raw receipts
sh -lc test ! -e /root/.ssh && test ! -e /home/claw1/.ssh && test ! -e /workspace/.ssh && echo no-host-secretsbusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b8e95cf953e01cafd431be70f0f5539c4c0ae8961ef5cff96d968a29509597c797e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
no-host-secrets
Observed stderr:
(empty)
Workspace artifacts:
No workspace artifacts produced.
π³ Docker socket denialstatus: passedpassedexit 0213 mstap for the raw receipts
sh -lc test ! -S /var/run/docker.sock && echo no-docker-socketbusybox@sha256:b9598f8c98e24d0ad42c1742c32516772c3aa2151011ebaf639089bd18c605b8702d41c3742c72aff24f584ad0138f2df38b424090d03d3b3e85e3212f0df2efe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855Observed stdout:
no-docker-socket
Observed stderr:
(empty)
Workspace artifacts:
No workspace artifacts produced.
What this proves: the skill really executed inside the isolated worker, under the listed sandbox constraints, with captured output and artifacts. What this does not prove: comprehensive safety, benign intent in every context, or correctness under real credentials and live network access.
Publisher and provenance
Listed in the VoltAgent awesome-openclaw-skills catalog under Coding Agents And Ides and lightly source-scanned from openclaw/skills. This is stronger evidence than catalog metadata alone, but still not a full runtime audit.
Source type: awesome-index
Source path: https://github.com/openclaw/skills/tree/main/skills/princedoss77/crypto-scam-detector/SKILL.md
Source URL: https://github.com/openclaw/skills/tree/main/skills/princedoss77/crypto-scam-detector/SKILL.md
Discovery category: Coding Agents And Ides
Manual review
No human review yet. The scorecard is currently static-analysis-first.
Community signals
Community signals
These are community attention markers, not crowd-sourced truth. Click what feels especially worth flagging or reviewing.
Related skills
kefir-batch-manager
Comprehensive kΓ©fir batch management system with cycle tracking, intelligent reminders, grain health monitoring, and recipe management. Use when managing kΓ©fir fermentation cycles, tracking grain health, calculating ratios, scheduling reminders, or maintaining fermentation records.
echo-agent
EchoAgent is a minimal OpenClaw-compatible skill.
japanese-tutor
Interactive Japanese learning assistant. Supports vocabulary, grammar, quizzes, roleplay, PDF/DOCX material parsing for study/homework help, and OCR translation.