Entry Point Analyzer
Systematically identify all state-changing entry points in a smart contract codebase to guide security audits.
When to Use
Use this skill when:
- Starting a smart contract security audit to map the attack surface
- Asked to find entry points, external functions, or audit flows
- Analyzing access control patterns across a codebase
- Identifying privileged operations and role-restricted functions
- Building an understanding of which functions can modify contract state
When NOT to Use
Do NOT use this skill for:
- Vulnerability detection (use audit-context-building or domain-specific-audits)
- Writing exploit POCs (use solidity-poc-builder)
- Code quality or gas optimization analysis
- Non-smart-contract codebases
- Analyzing read-only functions (this skill excludes them)
Scope: State-Changing Functions Only
This skill focuses exclusively on functions that can modify state. Excluded:
| Language |
Excluded Patterns |
| Solidity |
view, pure functions |
| Vyper |
@view, @pure functions |
| Solana |
Functions without mut account references |
| Move |
Non-entry public fun (module-callable only) |
| TON |
get methods (FunC), read-only receivers (Tact) |
| CosmWasm |
query entry point and its handlers |
Why exclude read-only functions? They cannot directly cause loss of funds or state corruption. While they may leak information, the primary audit focus is on functions that can change state.
Workflow
- Detect Language - Identify contract language(s) from file extensions and syntax
- Use Tooling (if available) - For Solidity, check if Slither is available and use it
- Locate Contracts - Find all contract/module files (apply directory filter if specified)
- Extract Entry Points - Parse each file for externally callable, state-changing functions
- Classify Access - Categorize each function by access level
- Generate Report - Output structured markdown report
Slither Integration (Solidity)
For Solidity codebases, Slither can automatically extract entry points. Before manual analysis:
1. Check if Slither is Available
which slither
2. If Slither is Detected, Run Entry Points Printer
slither . --print entry-points
This outputs a table of all state-changing entry points with:
- Contract name
- Function name
- Visibility
- Modifiers applied
3. Use Slither Output as Foundation
- Parse the Slither output table to populate your analysis
- Cross-reference with manual inspection for access control classification
- Slither may miss some patterns (callbacks, dynamic access control)—supplement with manual review
- If Slither fails (compilation errors, unsupported features), fall back to manual analysis
4. When Slither is NOT Available
If which slither returns nothing, proceed with manual analysis using the language-specific reference files.
Language Detection
| Extension |
Language |
Reference |
.sol |
Solidity |
{baseDir}/references/solidity.md |
.vy |
Vyper |
{baseDir}/references/vyper.md |
.rs + Cargo.toml with solana-program |
Solana (Rust) |
{baseDir}/references/solana.md |
.move |
Move (Aptos/Sui) |
{baseDir}/references/move.md |
.fc, .func, .tact |
TON (FunC/Tact) |
{baseDir}/references/ton.md |
.rs + Cargo.toml with cosmwasm-std |
CosmWasm |
{baseDir}/references/cosmwasm.md |
Load the appropriate reference file(s) based on detected language before analysis.
Access Classification
Classify each state-changing entry point into one of these categories:
1. Public (Unrestricted)
Functions callable by anyone without restrictions.
2. Role-Restricted
Functions limited to specific roles. Common patterns to detect:
- Explicit role names:
admin, owner, governance, guardian, operator, manager, minter, pauser, keeper, relayer, lender, borrower
- Role-checking patterns:
onlyRole, hasRole, require(msg.sender == X), assert_owner, #[access_control]
- When role is ambiguous, flag as "Restricted (review required)" with the restriction pattern noted
3. Contract-Only (Internal Integration Points)
Functions callable only by other contracts, not by EOAs. Indicators:
- Callbacks:
onERC721Received, uniswapV3SwapCallback, flashLoanCallback
- Interface implementations with contract-caller checks
- Functions that revert if
tx.origin == msg.sender
- Cross-contract hooks
Output Format
Generate a markdown report with this structure:
# Entry Point Analysis: [Project Name]
**Analyzed**: [timestamp]
**Scope**: [directories analyzed or "full codebase"]
**Languages**: [detected languages]
**Focus**: State-changing functions only (view/pure excluded)
## Summary
| Category | Count |
|----------|-------|
| Public (Unrestricted) | X |
| Role-Restricted | X |
| Restricted (Review Required) | X |
| Contract-Only | X |
| **Total** | **X** |
---
## Public Entry Points (Unrestricted)
State-changing functions callable by anyone—prioritize for attack surface analysis.
| Function | File | Notes |
|----------|------|-------|
| `functionName(params)` | `path/to/file.sol:L42` | Brief note if relevant |
---
## Role-Restricted Entry Points
### Admin / Owner
| Function | File | Restriction |
|----------|------|-------------|
| `setFee(uint256)` | `Config.sol:L15` | `onlyOwner` |
### Governance
| Function | File | Restriction |
|----------|------|-------------|
### Guardian / Pauser
| Function | File | Restriction |
|----------|------|-------------|
### Other Roles
| Function | File | Restriction | Role |
|----------|------|-------------|------|
---
## Restricted (Review Required)
Functions with access control patterns that need manual verification.
| Function | File | Pattern | Why Review |
|----------|------|---------|------------|
| `execute(bytes)` | `Executor.sol:L88` | `require(trusted[msg.sender])` | Dynamic trust list |
---
## Contract-Only (Internal Integration Points)
Functions only callable by other contracts—useful for understanding trust boundaries.
| Function | File | Expected Caller |
|----------|------|-----------------|
| `onFlashLoan(...)` | `Vault.sol:L200` | Flash loan provider |
---
## Files Analyzed
- `path/to/file1.sol` (X state-changing entry points)
- `path/to/file2.sol` (X state-changing entry points)
Filtering
When user specifies a directory filter:
- Only analyze files within that path
- Note the filter in the report header
- Example: "Analyze only
src/core/" → scope = src/core/
Analysis Guidelines
- Be thorough: Don't skip files. Every state-changing externally callable function matters.
- Be conservative: When uncertain about access level, flag for review rather than miscategorize.
- Skip read-only: Exclude
view, pure, and equivalent read-only functions.
- Note inheritance: If a function's access control comes from a parent contract, note this.
- Track modifiers: List all access-related modifiers/decorators applied to each function.
- Identify patterns: Look for common patterns like:
- Initializer functions (often unrestricted on first call)
- Upgrade functions (high-privilege)
- Emergency/pause functions (guardian-level)
- Fee/parameter setters (admin-level)
- Token transfers and approvals (often public)
Common Role Patterns by Protocol Type
| Protocol Type |
Common Roles |
| DEX |
owner, feeManager, pairCreator |
| Lending |
admin, guardian, liquidator, oracle |
| Governance |
proposer, executor, canceller, timelock |
| NFT |
minter, admin, royaltyReceiver |
| Bridge |
relayer, guardian, validator, operator |
| Vault/Yield |
strategist, keeper, harvester, manager |
Rationalizations to Reject
When analyzing entry points, reject these shortcuts:
- "This function looks standard" → Still classify it; standard functions can have non-standard access control
- "The modifier name is clear" → Verify the modifier's actual implementation
- "This is obviously admin-only" → Trace the actual restriction; "obvious" assumptions miss subtle bypasses
- "I'll skip the callbacks" → Callbacks define trust boundaries; always include them
- "It doesn't modify much state" → Any state change can be exploited; include all non-view functions
Error Handling
If a file cannot be parsed:
- Note it in the report under "Analysis Warnings"
- Continue with remaining files
- Suggest manual review for unparsable files
1---2name: entry-point-analyzer3description: Analyzes smart contract codebases to identify state-changing entry points for security auditing. Detects externally callable functions that modify state, categorizes them by access level (public, admin, role-restricted, contract-only), and generates structured audit reports. Excludes view/pure/read-only functions. Use when auditing smart contracts (Solidity, Vyper, Solana/Rust, Move, TON, CosmWasm) or when asked to find entry points, audit flows, external functions, access control patterns, or privileged operations.4---5
6# Entry Point Analyzer
7
8Systematically identify all **state-changing** entry points in a smart contract codebase to guide security audits.
9
10## When to Use
11
12Use this skill when:
13- Starting a smart contract security audit to map the attack surface
14- Asked to find entry points, external functions, or audit flows
15- Analyzing access control patterns across a codebase
16- Identifying privileged operations and role-restricted functions
17- Building an understanding of which functions can modify contract state
18
19## When NOT to Use
20
21Do NOT use this skill for:
22- Vulnerability detection (use audit-context-building or domain-specific-audits)
23- Writing exploit POCs (use solidity-poc-builder)
24- Code quality or gas optimization analysis
25- Non-smart-contract codebases
26- Analyzing read-only functions (this skill excludes them)
27
28## Scope: State-Changing Functions Only
29
30This skill focuses exclusively on functions that can modify state. **Excluded:**
31
32| Language | Excluded Patterns |
33|----------|-------------------|
34| Solidity | `view`, `pure` functions |
35| Vyper | `@view`, `@pure` functions |
36| Solana | Functions without `mut` account references |
37| Move | Non-entry `public fun` (module-callable only) |
38| TON | `get` methods (FunC), read-only receivers (Tact) |
39| CosmWasm | `query` entry point and its handlers |
40
41**Why exclude read-only functions?** They cannot directly cause loss of funds or state corruption. While they may leak information, the primary audit focus is on functions that can change state.
42
43## Workflow
44
451. **Detect Language** - Identify contract language(s) from file extensions and syntax
462. **Use Tooling (if available)** - For Solidity, check if Slither is available and use it
473. **Locate Contracts** - Find all contract/module files (apply directory filter if specified)
484. **Extract Entry Points** - Parse each file for externally callable, state-changing functions
495. **Classify Access** - Categorize each function by access level
506. **Generate Report** - Output structured markdown report
51
52## Slither Integration (Solidity)
53
54For Solidity codebases, Slither can automatically extract entry points. Before manual analysis:
55
56### 1. Check if Slither is Available
57
58```bash
59which slither
60```
61
62### 2. If Slither is Detected, Run Entry Points Printer
63
64```bash
65slither . --print entry-points
66```
67
68This outputs a table of all state-changing entry points with:
69- Contract name
70- Function name
71- Visibility
72- Modifiers applied
73
74### 3. Use Slither Output as Foundation
75
76- Parse the Slither output table to populate your analysis
77- Cross-reference with manual inspection for access control classification
78- Slither may miss some patterns (callbacks, dynamic access control)—supplement with manual review
79- If Slither fails (compilation errors, unsupported features), fall back to manual analysis
80
81### 4. When Slither is NOT Available
82
83If `which slither` returns nothing, proceed with manual analysis using the language-specific reference files.
84
85## Language Detection
86
87| Extension | Language | Reference |
88|-----------|----------|-----------|
89| `.sol` | Solidity | [{baseDir}/references/solidity.md]({baseDir}/references/solidity.md) |
90| `.vy` | Vyper | [{baseDir}/references/vyper.md]({baseDir}/references/vyper.md) |
91| `.rs` + `Cargo.toml` with `solana-program` | Solana (Rust) | [{baseDir}/references/solana.md]({baseDir}/references/solana.md) |
92| `.move` | Move (Aptos/Sui) | [{baseDir}/references/move.md]({baseDir}/references/move.md) |
93| `.fc`, `.func`, `.tact` | TON (FunC/Tact) | [{baseDir}/references/ton.md]({baseDir}/references/ton.md) |
94| `.rs` + `Cargo.toml` with `cosmwasm-std` | CosmWasm | [{baseDir}/references/cosmwasm.md]({baseDir}/references/cosmwasm.md) |
95
96Load the appropriate reference file(s) based on detected language before analysis.
97
98## Access Classification
99
100Classify each state-changing entry point into one of these categories:
101
102### 1. Public (Unrestricted)
103Functions callable by anyone without restrictions.
104
105### 2. Role-Restricted
106Functions limited to specific roles. Common patterns to detect:
107- Explicit role names: `admin`, `owner`, `governance`, `guardian`, `operator`, `manager`, `minter`, `pauser`, `keeper`, `relayer`, `lender`, `borrower`
108- Role-checking patterns: `onlyRole`, `hasRole`, `require(msg.sender == X)`, `assert_owner`, `#[access_control]`
109- When role is ambiguous, flag as **"Restricted (review required)"** with the restriction pattern noted
110
111### 3. Contract-Only (Internal Integration Points)
112Functions callable only by other contracts, not by EOAs. Indicators:
113- Callbacks: `onERC721Received`, `uniswapV3SwapCallback`, `flashLoanCallback`
114- Interface implementations with contract-caller checks
115- Functions that revert if `tx.origin == msg.sender`
116- Cross-contract hooks
117
118## Output Format
119
120Generate a markdown report with this structure:
121
122```markdown
123# Entry Point Analysis: [Project Name]
124
125**Analyzed**: [timestamp]
126**Scope**: [directories analyzed or "full codebase"]
127**Languages**: [detected languages]
128**Focus**: State-changing functions only (view/pure excluded)
129
130## Summary
131
132| Category | Count |
133|----------|-------|
134| Public (Unrestricted) | X |
135| Role-Restricted | X |
136| Restricted (Review Required) | X |
137| Contract-Only | X |
138| **Total** | **X** |
139
140---
141
142## Public Entry Points (Unrestricted)
143
144State-changing functions callable by anyone—prioritize for attack surface analysis.
145
146| Function | File | Notes |
147|----------|------|-------|
148| `functionName(params)` | `path/to/file.sol:L42` | Brief note if relevant |
149
150---
151
152## Role-Restricted Entry Points
153
154### Admin / Owner
155| Function | File | Restriction |
156|----------|------|-------------|
157| `setFee(uint256)` | `Config.sol:L15` | `onlyOwner` |
158
159### Governance
160| Function | File | Restriction |
161|----------|------|-------------|
162
163### Guardian / Pauser
164| Function | File | Restriction |
165|----------|------|-------------|
166
167### Other Roles
168| Function | File | Restriction | Role |
169|----------|------|-------------|------|
170
171---
172
173## Restricted (Review Required)
174
175Functions with access control patterns that need manual verification.
176
177| Function | File | Pattern | Why Review |
178|----------|------|---------|------------|
179| `execute(bytes)` | `Executor.sol:L88` | `require(trusted[msg.sender])` | Dynamic trust list |
180
181---
182
183## Contract-Only (Internal Integration Points)
184
185Functions only callable by other contracts—useful for understanding trust boundaries.
186
187| Function | File | Expected Caller |
188|----------|------|-----------------|
189| `onFlashLoan(...)` | `Vault.sol:L200` | Flash loan provider |
190
191---
192
193## Files Analyzed
194
195- `path/to/file1.sol` (X state-changing entry points)
196- `path/to/file2.sol` (X state-changing entry points)
197```
198
199## Filtering
200
201When user specifies a directory filter:
202- Only analyze files within that path
203- Note the filter in the report header
204- Example: "Analyze only `src/core/`" → scope = `src/core/`
205
206## Analysis Guidelines
207
2081. **Be thorough**: Don't skip files. Every state-changing externally callable function matters.
2092. **Be conservative**: When uncertain about access level, flag for review rather than miscategorize.
2103. **Skip read-only**: Exclude `view`, `pure`, and equivalent read-only functions.
2114. **Note inheritance**: If a function's access control comes from a parent contract, note this.
2125. **Track modifiers**: List all access-related modifiers/decorators applied to each function.
2136. **Identify patterns**: Look for common patterns like:
214 - Initializer functions (often unrestricted on first call)
215 - Upgrade functions (high-privilege)
216 - Emergency/pause functions (guardian-level)
217 - Fee/parameter setters (admin-level)
218 - Token transfers and approvals (often public)
219
220## Common Role Patterns by Protocol Type
221
222| Protocol Type | Common Roles |
223|---------------|--------------|
224| DEX | `owner`, `feeManager`, `pairCreator` |
225| Lending | `admin`, `guardian`, `liquidator`, `oracle` |
226| Governance | `proposer`, `executor`, `canceller`, `timelock` |
227| NFT | `minter`, `admin`, `royaltyReceiver` |
228| Bridge | `relayer`, `guardian`, `validator`, `operator` |
229| Vault/Yield | `strategist`, `keeper`, `harvester`, `manager` |
230
231## Rationalizations to Reject
232
233When analyzing entry points, reject these shortcuts:
234- "This function looks standard" → Still classify it; standard functions can have non-standard access control
235- "The modifier name is clear" → Verify the modifier's actual implementation
236- "This is obviously admin-only" → Trace the actual restriction; "obvious" assumptions miss subtle bypasses
237- "I'll skip the callbacks" → Callbacks define trust boundaries; always include them
238- "It doesn't modify much state" → Any state change can be exploited; include all non-view functions
239
240## Error Handling
241
242If a file cannot be parsed:
2431. Note it in the report under "Analysis Warnings"
2442. Continue with remaining files
2453. Suggest manual review for unparsable files