ability-analysis
Trigger Pattern Always (Aptos Move) - foundational security check - Inject Into Breadth…
Trigger Pattern SEP-41 token patterns detected (approve/transfer/transfer_from/allowance/balance) - Inject Into Breadth agents, depth-token-flow, depth-edge-case
$ npx -y skills add PlamenTSV/plamen --skill sep41-token-safety --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/sep41-token-safetyContext preview
The summary Claude sees to decide when to auto-load this skill.
Trigger Pattern SEP-41 token patterns detected (approve/transfer/transfer_from/allowance/balance) - Inject Into Breadth agents, depth-token-flow, depth-edge-case
name: "sep41-token-safety" description: "Trigger Pattern SEP-41 token patterns detected (approve/transfer/transfer_from/allowance/balance) - Inject Into Breadth agents, depth-token-flow, depth-edge-case"
> **Trigger Pattern**: SEP-41 token patterns detected (`approve`/`transfer`/`transfer_from`/`allowance`/`balance`) > **Inject Into**: Breadth agents, depth-token-flow, depth-edge-case > **Finding prefix**: `[ST-N]` > **Rules referenced**: R4, R5, R10, R11, R13, R15
SEP-41 is Soroban's token interface standard, analogous to ERC-20. It introduces Soroban-specific behaviors that differ from ERC-20: allowances use Temporary storage with `expiration_ledger`, the `approve` function can be front-run similarly to ERC-20, and the Stellar Asset Contract (SAC) bridges Stellar classic assets into Soroban with additional accounting complexity.
The `approve(from, spender, amount, expiration_ledger)` function overwrites the current allowance without checking the existing value. This is the ERC-20 approve race condition, present identically in SEP-41:
| Token Contract | `approve` Guarded? | Guard Type | Effective? | |---------------|-------------------|-----------|-----------| | `{contract}` | YES/NO | `require!(current == 0)` / none | YES/NO |
**Attack sequence**: 1. Owner approves spender for 100 tokens 2. Owner submits new approval for 50 tokens 3. Spender front-runs the new approval and spends the 100-token allowance 4. New 50-token approval is set 5. Spender spends 50 more tokens — net: 150 tokens spent, 50 intended
**Soroban-specific note**: Soroban does not have a traditional mempool — transaction ordering is determined by validators, not fee-based priority. However, multi-operation transactions and DEX routing can create ordering dependencies. The race condition is lower likelihood than on EVM but the vulnerability exists.
**Check for**:
SEP-41 allowances include an `expiration_ledger` parameter stored alongside the allowance amount. When the ledger passes `expiration_ledger`, the allowance is treated as zero. Verify expiry is handled correctly:
| Contract | Allowance Expiry Checked Before Use? | Expired Allowance Returns 0 or Panics? | Protocol Communicates Expiry to Users? | |---------|--------------------------------------|---------------------------------------|---------------------------------------| | `{contract}` | YES/NO | `{behavior}` | YES/NO |
**Allowance storage**: SEP-41 standard stores allowances in Temporary storage with TTL linked to `expiration_ledger`. When `expiration_ledger` passes, the Temporary entry may be pruned, and the `allowance()` call returns zero automatically.
**Checks**:
**Edge case**: `expiration_ledger = 0` behavior — verify whether the token contract treats 0 as "no expiry" or "expired at ledger 0" (already expired). Inconsistency here could cause silent allowance failures.
SEP-41 `transfer(from, to, amount)` requires `from.require_auth()`. `transfer_from(spender, from, to, amount)` requires `spender.require_auth()` and checks the allowance. Trace auth through the contract's transfer chains:
| Calling Function | Transfer Type | Auth Address | `require_auth` Called? | Correct Subject? | |-----------------|--------------|-------------|----------------------|-----------------| | `{fn}` | `transfer` / `transfer_from` | `{from or spender}` | YES/NO | YES/NO |
**Patterns to check**:
The Stellar Asset Contract (SAC) wraps Stellar classic XLM and issued assets as SEP-41 tokens. Contracts that interact with SAC face unique considerations:
| Concern | Addressed? | Evidence | |---------|-----------|----------| | SAC balance includes trust line state (frozen/unauthorized) | YES/NO | `{fn:line or NONE}` | | Classic Stellar operations affecting SAC balance not reflected in Soroban state | YES/NO | `{fn:line or NONE}` | | Clawback feature of issued assets handled | YES/NO | `{fn:line or NONE}` | | Issuer authorization revocation handled | YES/NO | `{fn:line or NONE}` | | Token address permanence (classic re-issuance / migration) | YES/NO | `{fn:line or NONE}` |
**SAC-specific risks**:
Autonomous Web3 security auditor for Claude Code and OpenAI Codex CLI. Orchestrates 18-100 AI agents across 40+ phases to produce audit reports with verified PoC exploits — for smart contracts and L1 node-client infrastructure.
Repo: PlamenTSV/plamen
Trigger Pattern Always (Aptos Move) - foundational security check - Inject Into Breadth…
Trigger Pattern Always (Aptos Move) - Move VM aborts on shift = bit width - Inject Into…
Trigger Protocol has privileged roles (admin, operator, governance, resource account owner) -…
Trigger EXTERNAL_LIB flag detected (protocol uses third-party Move dependencies) - Used by…
Trigger Pattern MONETARY_PARAMETER flag (required) - Inject Into Breadth agents (merged via…