
Shield
- 12 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
Shield is a Claude Code skill for the clodds bot that scans code, addresses, and transactions for scams and malicious patterns across chains.
About
Shield is a clodds security scanner for code, blockchain addresses, and transactions. Developers use it to scan code for malicious patterns, check whether an address is safe with auto chain detection, validate a transaction before execution, and look up known scam addresses. It matters for catching scams and unsafe transactions before funds move.
- Scans code for malicious patterns and checks address safety across chains
- Pre-flight transaction validation before sending funds
- Lists known scam addresses for Solana and EVM
Shield by the numbers
- 12 all-time installs (skills.sh)
- Ranked #1,643 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
shield capabilities & compatibility
- Capabilities
- security scan · scam detection · transaction validation
- Use cases
- security audit
What shield says it does
Multi-chain security scanner for code, addresses, transactions, and scam detection.
Pre-flight transaction validation
npx skills add https://github.com/alsk1992/cloddsbot --skill shieldAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 12 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Scan code, check an address, and validate a transaction before sending crypto to catch scams.
Who is it for?
Checking crypto addresses and transactions for scams before executing them in a trading bot.
Skip if: General application security audits unrelated to blockchain addresses or transactions.
When should I use this skill?
You are about to send a transaction or interact with an unknown address or code snippet.
What you get
Risky code, addresses, and transactions are flagged before execution.
- code scan result
- address safety report
- transaction validation
By the numbers
- 6 shield commands (scan, check, validate, scams, status, help)
Files
Security Shield
Multi-chain security scanner for code, addresses, transactions, and scam detection.
Commands
/shield scan <code> Scan code for malicious patterns
/shield check <address> Check address safety (auto-detect chain)
/shield validate <dest> <amt> [token] Pre-flight transaction validation
/shield scams [solana|evm] List known scam addresses
/shield status Show scanner statistics
/shield help Show help/**
* Security Shield Skill
*
* Commands:
* /shield scan <code> — Scan code for malicious patterns
* /shield check <address> — Check address safety (auto-detect chain)
* /shield validate <dest> <amt> [token] — Pre-flight transaction check
* /shield scams [chain] — List known scam addresses
* /shield status — Scanner statistics
* /shield help — Show help
*/
const HELP = `Security Shield — Multi-chain security scanner
Usage:
/shield scan <code> Scan code/plugin for malicious patterns
/shield check <address> Check address safety (auto-detect chain)
/shield validate <dest> <amt> [token] Pre-flight transaction validation
/shield scams [solana|evm] List known scam addresses
/shield status Show scanner statistics
/shield help Show this help
Examples:
/shield scan "eval(atob('...'))"
/shield check So11111111111111111111111111111111
/shield check 0xdAC17F958D2ee523a2206206994597C13D831ec7
/shield validate 0xABC...123 100 SOL
/shield scams solana
/shield status`;
function riskBar(score: number): string {
const filled = Math.round(score / 10);
const empty = 10 - filled;
return '[' + '#'.repeat(filled) + '-'.repeat(empty) + ']';
}
function levelEmoji(level: string): string {
switch (level) {
case 'clean': return 'SAFE';
case 'low': return 'LOW';
case 'medium': return 'MEDIUM';
case 'high': return 'HIGH';
case 'critical': return 'CRITICAL';
default: return level.toUpperCase();
}
}
export default {
name: 'shield',
description: 'Security shield — code scanning, address checking, transaction validation, scam detection',
commands: [
{ name: 'shield', description: 'Security shield scanner', usage: '/shield <subcommand> [args]' },
],
async handle(args: string): Promise<string> {
const trimmed = args.trim();
if (!trimmed || trimmed === 'help') return HELP;
const spaceIdx = trimmed.indexOf(' ');
const subcommand = spaceIdx === -1 ? trimmed : trimmed.substring(0, spaceIdx);
const rest = spaceIdx === -1 ? '' : trimmed.substring(spaceIdx + 1).trim();
try {
switch (subcommand.toLowerCase()) {
case 'scan': return await handleScan(rest);
case 'check': return await handleCheck(rest);
case 'validate': return await handleValidate(rest);
case 'scams': return await handleScams(rest);
case 'status': return await handleStatus();
default: return `Unknown subcommand: ${subcommand}\n\n${HELP}`;
}
} catch (err: any) {
return `Shield error: ${err.message || err}`;
}
},
};
async function handleScan(code: string): Promise<string> {
if (!code) return 'Please provide code to scan. Usage: /shield scan <code>';
const { getSecurityShield } = await import('../../../security/shield.js');
const shield = getSecurityShield();
const result = shield.scanCode(code);
const lines: string[] = [];
lines.push('Code Security Scan');
lines.push('='.repeat(40));
lines.push(`Risk Score: ${result.score}/100 ${riskBar(result.score)} ${levelEmoji(result.level)}`);
if (result.entropy !== undefined) {
lines.push(`Entropy: ${result.entropy.toFixed(2)} bits/char`);
}
lines.push('');
if (result.detections.length === 0) {
lines.push('No threats detected.');
} else {
lines.push(`Detections (${result.detections.length}):`);
for (const d of result.detections) {
lines.push(` [${d.category}] ${d.description} (weight: ${d.weight}${d.line ? `, line ${d.line}` : ''})`);
}
}
return lines.join('\n');
}
async function handleCheck(address: string): Promise<string> {
if (!address) return 'Please provide an address. Usage: /shield check <address>';
const { getSecurityShield } = await import('../../../security/shield.js');
const shield = getSecurityShield();
const result = await shield.checkAddress(address);
const lines: string[] = [];
lines.push('Address Security Check');
lines.push('='.repeat(40));
lines.push(`Address: ${result.address}`);
lines.push(`Chain: ${result.chain.toUpperCase()}`);
lines.push(`Risk Score: ${result.riskScore}/100 ${riskBar(result.riskScore)} ${levelEmoji(result.level)}`);
lines.push('');
if (result.scamMatch) {
lines.push(`SCAM MATCH: ${result.scamMatch.label}`);
lines.push(`Type: ${result.scamMatch.type}`);
lines.push('');
}
lines.push('Details:');
lines.push(` Exists: ${result.details.exists ? 'Yes' : 'No'}`);
if (result.details.isContract !== undefined) lines.push(` Contract: ${result.details.isContract ? 'Yes' : 'No'}`);
if (result.details.balance !== undefined) lines.push(` Balance: ${result.details.balance}`);
if (result.details.ageEstimate) lines.push(` Age: ${result.details.ageEstimate}`);
if (result.details.txVelocity !== undefined) lines.push(` Tx Velocity: ${result.details.txVelocity}/hr`);
lines.push('');
if (result.flags.length > 0) {
lines.push('Flags:');
for (const f of result.flags) {
lines.push(` - ${f}`);
}
}
return lines.join('\n');
}
async function handleValidate(input: string): Promise<string> {
if (!input) return 'Usage: /shield validate <destination> <amount> [token]';
const parts = input.split(/\s+/);
if (parts.length < 2) return 'Usage: /shield validate <destination> <amount> [token]';
const destination = parts[0];
const amount = parseFloat(parts[1]);
const token = parts[2] || undefined;
if (isNaN(amount)) return `Invalid amount: ${parts[1]}`;
const { getSecurityShield } = await import('../../../security/shield.js');
const shield = getSecurityShield();
const result = await shield.validateTx({ destination, amount, token });
const lines: string[] = [];
lines.push('Transaction Validation');
lines.push('='.repeat(40));
lines.push(`Destination: ${destination}`);
lines.push(`Amount: ${amount}${token ? ` ${token}` : ''}`);
lines.push(`Risk Score: ${result.riskScore}/100 ${riskBar(result.riskScore)} ${levelEmoji(result.addressCheck?.level || 'clean')}`);
lines.push(`Recommendation: ${result.recommendation.toUpperCase()}`);
lines.push(`Allowed: ${result.allowed ? 'Yes' : 'NO — BLOCKED'}`);
lines.push('');
if (result.flags.length > 0) {
lines.push('Flags:');
for (const f of result.flags) {
lines.push(` - ${f}`);
}
}
return lines.join('\n');
}
async function handleScams(filter: string): Promise<string> {
const { getScamEntries } = await import('../../../security/scam-db.js');
const chain = filter.toLowerCase() === 'solana' ? 'solana'
: filter.toLowerCase() === 'evm' ? 'evm'
: undefined;
const entries = getScamEntries(chain as any);
const lines: string[] = [];
lines.push(`Known Scam Addresses${chain ? ` (${chain.toUpperCase()})` : ''}`);
lines.push('='.repeat(40));
lines.push(`Total: ${entries.length}`);
lines.push('');
// Group by type
const byType = new Map<string, typeof entries>();
for (const e of entries) {
const arr = byType.get(e.type) || [];
arr.push(e);
byType.set(e.type, arr);
}
for (const [type, list] of byType) {
lines.push(`${type} (${list.length}):`);
for (const e of list.slice(0, 5)) {
const short = e.address.length > 20 ? e.address.substring(0, 10) + '...' + e.address.slice(-6) : e.address;
lines.push(` ${short} — ${e.label} [${e.chain}]`);
}
if (list.length > 5) lines.push(` ... and ${list.length - 5} more`);
lines.push('');
}
return lines.join('\n');
}
async function handleStatus(): Promise<string> {
const { getSecurityShield } = await import('../../../security/shield.js');
const shield = getSecurityShield();
const stats = shield.getStats();
const lines: string[] = [];
lines.push('Security Shield Status');
lines.push('='.repeat(40));
lines.push(`Code Scans: ${stats.codeScans}`);
lines.push(`Address Checks: ${stats.addressChecks}`);
lines.push(`Tx Validations: ${stats.txValidations}`);
lines.push(`Sanitizations: ${stats.sanitizations}`);
lines.push(`Threats Blocked: ${stats.threatsBlocked}`);
lines.push(`Scam DB Size: ${stats.scamDbSize} entries`);
return lines.join('\n');
}
Related skills
FAQ
What can Shield scan?
Code for malicious patterns, addresses for safety, and transactions for pre-flight validation.
Does it detect the chain automatically?
Yes, /shield check auto-detects the chain for a given address.