llm-trading-agent-security — Claude Code skill: security
This skill reviews autonomous trading agents with wallet or transaction authority. Use it to check spend limits, pre-send simulation, key handling, and execution safeguards.
npx skills add affaan-m/ECC --skill llm-trading-agent-security -a claude-codeWhat llm-trading-agent-security does
The skill splits agent protection into separate controls: filtering prompt injection in external data, single-transaction and daily spend limits, simulation before sending, and a required min_amount_out. Its Python examples use Decimal, the async self.w3.eth.call check, and slippage validation.
Other sections cover a circuit breaker for consecutive losses or drawdown, wallet isolation, the TRADING_WALLET_PRIVATE_KEY environment variable, private RPC routing, deadlines, and MEV protection. The wallet example needs Python and eth_account; transaction examples use a w3 object. Install it when an agent can sign trades, swaps, or treasury operations. An agent with no asset access does not need this scope.
What it helps with
- filter prompt injection in on-chain data and feeds
- cap single-transaction and daily spending
- simulate a transaction before sending it
- halt trading after losses or drawdown
- isolate the agent wallet and its key
Example prompts for the agent
- Review this agent before giving it permission to sign transactions.
- Add a per-transaction limit, a daily spend limit, and a `min_amount_out` check before sending.
- Audit `TRADING_WALLET_PRIVATE_KEY` handling and the circuit-breaker rules.
How to install llm-trading-agent-security
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill llm-trading-agent-security -a claude-code2Manually: put the files in place
~/.claude/skills/llm-trading-agent-security/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/llm-trading-agent-security/
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill llm-trading-agent-security -a codex2Manually: put the files in place
.agents/skills/llm-trading-agent-security/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill llm-trading-agent-security -a cursor2Manually: put the files in place
.cursor/skills/llm-trading-agent-security/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install affaan-m/ECC llm-trading-agent-security2Manually: put the files in place
.github/skills/llm-trading-agent-security/SKILL.md1Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill llm-trading-agent-security -a gemini-cli2Platform CLI
gemini skills install https://github.com/affaan-m/ECC --path skills/llm-trading-agent-securityManually: put the files in place
.devin/skills/llm-trading-agent-security/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill llm-trading-agent-security -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set146
The whole set →Similar
Questions about llm-trading-agent-security
How do I install llm-trading-agent-security in Claude Code?
Run npx skills add affaan-m/ECC --skill llm-trading-agent-security -a claude-code. The skill file is placed at ~/.claude/skills/llm-trading-agent-security/SKILL.md.
What does llm-trading-agent-security do?
It helps review prompt injection, spend limits, transaction simulation, circuit breakers, wallet isolation, and MEV protection. It targets agents that can sign or send transactions.
What is required for wallet key handling?
Load the key from TRADING_WALLET_PRIVATE_KEY or a secret manager. The key-loading example uses eth_account, and the skill recommends a dedicated hot wallet with only the required session funds.
Source text
SKILL.md · MIT
---
name: llm-trading-agent-security
description: Security patterns for autonomous trading agents with wallet or transaction authority. Covers prompt injection, spend limits, pre-send simulation, circuit breakers, MEV protection, and key handling. Use when an autonomous agent holds wallet or transaction authority and its limits, simulation, or key handling need review.
metadata:
version: "1.0.0"
origin: ECC direct-port adaptation
---
# LLM Trading Agent Security
Autonomous trading agents have a harsher threat model than normal LLM apps: an injection or bad tool path can turn directly into asset loss.
## When to Use
- Building an AI agent that signs and sends transactions
- Auditing a trading bot or on-chain execution assistant
- Designing wallet key management for an agent
- Giving an LLM access to order placement, swaps, or treasury operations
## How It Works
Layer the defenses. No single check is enough. Treat prompt hygiene, spend policy, simulation, execution limits, and wallet isolation as independent controls.
## Examples
### Treat prompt injection as a financial attack
```python
import re
INJECTION_PATTERNS = [
r'ignore (previous|all) instructions',
r'new (task|directive|instruction)',
r'system prompt',
r'send .{0,50} to 0x[0-9a-fA-F]{40}',
r'transfer .{0,50} to',
r'approve .{0,50} for',
]
def sanitize_onchain_data(text: str) -> str:
for pattern in INJECTION_PATTERNS:
if re.search(pattern, text, re.IGNORECASE):
raise ValueError(f"Potential prompt injection: {text[:100]}")
return text
```
Do not blindly inject token names, pair labels, webhooks, or social feeds into an execution-capable prompt.
### Hard spend limits
```python
from decimal import Decimal
MAX_SINGLE_TX_USD = Decimal("500")
MAX_DAILY_SPEND_USD = Decimal("2000")
class SpendLimitError(Exception):
pass
class SpendLimitGuard:
def check_and_record(self, usd_amount: Decimal) -> None:
if usd_amount > MAX_SINGLE_TX_USD:
raise SpendLimitError(f"Single tx ${usd_amount} exceeds max ${MAX_SINGLE_TX_USD}")
daily = self._get_24h_spend()
if daily + usd_amount > MAX_DAILY_SPEND_USD:
raise SpendLimitError(f"Daily limit: ${daily} + ${usd_amount} > ${MAX_DAILY_SPEND_USD}")
self._record_spend(usd_amount)
```
### Simulate before sending
```python
class SlippageError(Exception):
pass
async def safe_execute(self, tx: dict, expected_min_out: int | None = None) -> str:
sim_result = await self.w3.eth.call(tx)
if expected_min_out is None:
raise ValueError("min_amount_out is required before send")
actual_out = decode_uint256(sim_result)
if actual_out < expected_min_out:
raise SlippageError(f"Simulation: {actual_out} < {expected_min_out}")
signed = self.account.sign_transaction(tx)
return await self.w3.eth.send_raw_transaction(signed.raw_transaction)
```
### Circuit breaker
```python
class TradingCircuitBreaker:
MAX_CONSECUTIVE_LOSSES = 3
MAX_HOURLY_LOSS_PCT = 0.05
def check(self, portfolio_value: float) -> None:
if self.consecutive_losses >= self.MAX_CONSECUTIVE_LOSSES:
self.halt("Too many consecutive losses")
if self.hour_start_value <= 0:
self.halt("Invalid hour_start_value")
return
hourly_pnl = (portfolio_value - self.hour_start_value) / self.hour_start_value
if hourly_pnl < -self.MAX_HOURLY_LOSS_PCT:
self.halt(f"Hourly PnL {hourly_pnl:.1%} below threshold")
```
### Wallet isolation
```python
import os
from eth_account import Account
private_key = os.environ.get("TRADING_WALLET_PRIVATE_KEY")
if not private_key:
raise EnvironmentError("TRADING_WALLET_PRIVATE_KEY not set")
account = Account.from_key(private_key)
```
Use a dedicated hot wallet with only the required session funds. Never point the agent at a primary treasury wallet.
### MEV and deadline protection
```python
import time
PRIVATE_RPC = "https://rpc.flashbots.net"
MAX_SLIPPAGE_BPS = {"stable": 10, "volatile": 50}
deadline = int(time.time()) + 60
```
## Pre-Deploy Checklist
- External data is sanitized before entering the LLM context
- Spend limits are enforced independently from model output
- Transactions are simulated before send
- `min_amount_out` is mandatory
- Circuit breakers halt on drawdown or invalid state
- Keys come from env or a secret manager, never code or logs
- Private mempool or protected routing is used when appropriate
- Slippage and deadlines are set per strategy
- All agent decisions are audit-logged, not just successful sends
© affaan-m · MIT · affaan-m/ECC