agents/skills/evm/staking-receipt-tokens/SKILL.md
Type Thought-template (instantiate before use) - Research basis Donation attacks via unsolicited token transfers
npx skillsauth add plamentsv/plamen staking-receipt-tokensInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Type: Thought-template (instantiate before use) Research basis: Donation attacks via unsolicited token transfers
delegation|staking.*receipt|liquid.*staking|getLiquidRewards|unbond|
stake.*share|validator|deposit.*voucher|withdraw.*voucher|claimReward
transfer()/transferFrom()?For each EXTERNAL staking/delegation token the protocol interacts with (not just the protocol's own receipt token):
getTotalStake(protocol) or equivalent change? (accounting impact on withdrawal calculations)
c. Does transfer() trigger side effects? (reward auto-claim, delegation state changes)
d. Does non-zero balance block any admin/privileged operations? (e.g., entity removal requires balance == 0)| External Token | ERC20? | Unsolicited Transfer? | Iteration DoS? | Balance Impact? | Side Effects? | Blocks Operations? | |----------------|--------|----------------------|-----------------|-----------------|---------------|-------------------| | {token_name} | YES/NO | YES/NO | YES/NO | YES/NO | YES/NO | YES/NO |
RULE: If ANY external token is ERC20-transferable AND affects protocol state → finding with severity >= MEDIUM.
balanceOf(address(this)) for {RECEIPT_TOKEN}1. Attacker acquires {RECEIPT_TOKEN} externally via {EXTERNAL_ACQUISITION}
2. Attacker transfers {DONATION_AMOUNT} to {PROTOCOL_CONTRACT}
3. Protocol's balanceOf(this) increases by {DONATION_AMOUNT}
4. Next operation at {AFFECTED_FUNCTION} uses inflated balance
5. Impact: {IMPACT_DESCRIPTION}
balanceOf(this) for {RECEIPT_TOKEN} in any calculation?balanceOf and compares to tracked state, donation is detectedbalanceOf(this) for this token, donation has no effectFor protocols with N entities:
Single entity dust: X tokens (below threshold, ignored)
N entities with dust: N × X tokens
Compounding factor: If dust compounds over time → N × X × T
Check: Can attacker spread small amounts across many entities to:
1. Accumulate significant total value?
2. Avoid per-entity dust thresholds?
3. Exploit aggregation rounding?
When receipt tokens are transferred:
transfer() trigger reward claims?transfer() update internal delegation state?transfer() call any hooks or callbacks?Specific checks: | Token | transfer() Side Effect | Exploitable? | |-------|----------------------|--------------| | Staking receipts | May claim rewards | Check if rewards go to sender/receiver/neither | | stETH | Rebases on transfer | Check exchange rate impact | | LP tokens | May trigger sync | Check for manipulation window | | cTokens/aTokens | May accrue interest | Check balance vs shares discrepancy |
For protocols managing multiple validators:
Pattern A: Dust Spreading
- Attacker creates dust positions across N validators
- Each position below withdrawal threshold
- Total value: significant
- Impact: locked value, accounting discrepancies
Pattern B: Selective Validator Manipulation
- Attacker identifies validator with exploitable state
- Moves delegation to that specific validator
- Exploits validator-specific vulnerability
- Impact: depends on vulnerability
Pattern C: Aggregation Rounding
- Protocol rounds down per-validator withdrawals
- Attacker exploits: N validators × rounding_error = significant loss/gain
When the protocol has multi-step operations (request → wait → claim), check what happens if the external entity (validator, pool, vault, market) experiences an adverse event between steps.
| Multi-Step Operation | External Entity | Adverse Event | Impact on Pending Operation | Recovery Path? | |---------------------|-----------------|---------------|----------------------------|----------------| | {request→claim} | {entity} | Entity paused/frozen | {what happens to pending claim} | YES/NO | | {request→claim} | {entity} | Entity slashed/penalized | {what happens to pending claim} | YES/NO | | {request→claim} | {entity} | Entity deprecated/removed | {what happens to pending claim} | YES/NO | | {request→claim} | {entity} | Entity liquidated/drained | {what happens to pending claim} | YES/NO |
Adverse events to check: pause, slash, penalize, deprecate, remove, liquidate, drain, migrate, upgrade
RULE: If a pending multi-step operation has no recovery path when the external entity experiences an adverse event → apply Rule 9 (stranded asset severity floor).
{CONTRACTS} - Contracts to analyze
{RECEIPT_TOKEN} - Specific token (stETH, rETH, cToken, aToken, LP token, etc.)
{EXTERNAL_STAKING} - Where token can be acquired externally
{PROTOCOL_CONTRACT} - Contract that holds receipt tokens
{BALANCE_CHECK_LOCATIONS}- Lines where balanceOf(this) is called
{EXTERNAL_ACQUISITION} - How attacker gets tokens (stake directly, buy on DEX)
{DONATION_AMOUNT} - Amount transferred in attack
{AFFECTED_FUNCTION} - Function affected by inflated balance
{IMPACT_DESCRIPTION} - What goes wrong
| Field | Required | Description | |-------|----------|-------------| | receipt_tokens | yes | List of identified receipt tokens | | transferable | yes | YES/NO for each token | | balance_dependencies | yes | Functions using balanceOf(this) | | donation_impact | yes | What happens if balance is inflated | | tracked_vs_actual | yes | Gap analysis | | finding | yes | CONFIRMED / REFUTED / CONTESTED / NEEDS_DEPTH | | evidence | yes | Code locations with line numbers | | step_execution | yes | ✓/✗/? for each step |
CRITICAL: You MUST report completion status for ALL steps. Findings with incomplete steps (✗ or ? without valid reason) will be flagged for depth review.
Before finalizing ANY finding, complete this checklist:
| Step | Required | Completed? | Notes | |------|----------|------------|-------| | 1. Identify Receipt Tokens | YES | ✓/✗/? | | | 2. Check Transferability | YES | ✓/✗/? | | | 2b. External Token Transferability | YES | ✓/✗/? | MANDATORY - never skip | | 3. Trace Balance Dependencies | YES | ✓/✗/? | | | 4. Model Donation Attack | YES | ✓/✗/? | | | 5. Assess Severity | YES | ✓/✗/? | | | 6. Identify Multi-Entity Patterns | IF N>1 | ✓/✗(N/A)/? | Skip only if protocol has single entity | | 7. Model Compounding Dust | IF N>1 | ✓/✗(N/A)/? | Skip only if protocol has single entity | | 8. On-Transfer Side Effects | YES | ✓/✗/? | MANDATORY - never skip | | 9. Cross-Validator Attack Patterns | IF validators | ✓/✗(N/A)/? | Skip only if no validators |
After Step 5 (Assess Severity):
After Step 8 (On-Transfer Side Effects):
**Step Execution**: ✓1,2,3,4,5,8 | ✗6,7(N/A-single validator) | ✗9(N/A-no multi-validator)
OR if incomplete:
**Step Execution**: ✓1,2,3,4,5 | ?6,7(need multi-entity analysis) | ?8(transfer effects unknown)
**FLAG**: Incomplete analysis - requires depth review
development
Prepare Solidity projects for a security audit — test coverage, test quality, NatSpec docs, code hygiene, dependency health, best-practice enforcement, deployment readiness, and project documentation checks. Generates a scored Audit Readiness Report and optionally runs static analysis. Trigger on: "prepare for audit", "audit readiness", "pre-audit check", "audit prep", "NatSpec check", or any request to review a Solidity codebase before a security review.
development
Launch the Plamen deterministic Web3 security audit pipeline
development
Run the Plamen smart-contract audit wizard in Codex
testing
Launch the Plamen deterministic L1 infrastructure audit pipeline