ability-analysis
Trigger Pattern Always (Aptos Move) - foundational security check - Inject Into Breadth…
Protocol Type Trigger vault (detected in recon TASK 0 Step 1) - Inject Into Core state agent OR economic design agent (merge via M4 hierarchy)
$ npx -y skills add PlamenTSV/plamen --skill vault-accounting --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/vault-accountingContext preview
The summary Claude sees to decide when to auto-load this skill.
Protocol Type Trigger vault (detected in recon TASK 0 Step 1) - Inject Into Core state agent OR economic design agent (merge via M4 hierarchy)
name: "vault-accounting" description: "Protocol Type Trigger vault (detected in recon TASK 0 Step 1) - Inject Into Core state agent OR economic design agent (merge via M4 hierarchy)"
> **Protocol Type Trigger**: `vault` (detected in recon TASK 0 Step 1) > **Inject Into**: Core state agent OR economic design agent (merge via M4 hierarchy) > **Language**: Both EVM and Solana (language-agnostic methodology, language-specific examples omitted) > **Finding prefix**: `[VA-N]`
When decomposing this skill into depth agent investigation questions, map sections to domains:
Recon classifies protocol as `vault` type based on indicators: deposit/withdraw/shares/strategy/vault. This skill adds vault-specific accounting checks that the general ECONOMIC_DESIGN_AUDIT does not cover.
For vault protocols with share-based accounting (LP tokens, vault shares):
Compute share price = total_assets / total_shares at these states: | State | total_assets | total_shares | Share Price | Expected | Issue? | |-------|-------------|-------------|-------------|----------|--------| | After deposit | {val} | {val} | {computed} | {expected} | | | After withdrawal | {val} | {val} | {computed} | {expected} | | | After profit report | {val} | {val} | {computed} | {expected} | | | After loss report | {val} | {val} | {computed} | {expected} | | | After fee harvest | {val} | {val} | {computed} | {expected} | | | After time-decay expiry | {val} | {val} | {computed} | {expected} | |
Tag: `[TRACE:state={event} -> share_price={value} -> {expected_or_unexpected}]`
For vaults with time-decay mechanisms (locked profit, vesting schedules, streaming distributions):
Tag: `[TRACE:{transition} -> {base_var} changed -> {decay_var} unchanged -> {decay_var} > {base_var} -> {consumer} computes {wrong_result}]`
For time-weighted calculations (fees, vesting, rewards) that use a `(value × timeDelta)` formula: 1. Identify the ANCHOR timestamp (e.g., `lastDistributionTime` (vesting vaults), `periodFinish`/`lastUpdateTime` (Synthetix-style staking), `lastFeeCollection` (management fee), `lastStreamUpdate` (streaming)) 2. Trace ALL functions that START a new time-weighted period (e.g., `distributeYield`/`updateSharePrice` (vesting vaults), `notifyRewardAmount` (Synthetix), `reportProfit`/`report` (Yearn-style), `startNewEpoch` (epoch-based)) 3. For each: does it update the anchor timestamp to `block.timestamp` (or `now`) UNCONDITIONALLY, or only inside a conditional block? 4. If the anchor is NOT updated when a new period starts: `timeDelta` in the next calculation will include time from BEFORE the new period, causing accelerated vesting/fee accrual 5. Test: what happens if the anchor timestamp is 7 days stale when a new period of 7 days starts? fraction = 7d/(7d+7d) = 50% vests immediately instead of 0%
Tag: `[TRACE:new_period_start → anchor_timestamp NOT updated → timeDelta includes {stale_duration} → {acceleration_factor}x acceleration]`
For any accounting getter intentionally OVERRIDDEN to diverge from the real held balance (excluding an unvested/streaming/pending component):
1. Determine whether its output can INCREASE purely from elapsed time (vesting) with no deposit/withdraw/donation event. 2. If yes, at every window where `totalSupply` is zero or dust while that divergence is closing, compute `shares = deposit * totalSupply / reportedAssets()` with real constants for a minimal deposit — does round-down zero/critically dilute the depositor because reported-assets rose ahead of supply? 3. Treat as a first-depositor/inflation-family finding whose value-injection trigger is the protocol's OWN accounting formula (time-based vesting), not an external donation — check the HARM in the depositor-LOSES direction, not only the attacker-profits direction of ZERO_STATE_RETURN §2a.
Tag: `[TRACE:reportedAssets() rises via vesting_elapsed → totalSupply=dust → shares=deposit*totalSupply/reportedAssets() rounds down → depositor loses principal]`
For vaults where one fee type changes a ratio that another fee type reads:
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…