Agent skill
aztec-scanner
Use when the user wants to audit Aztec Network smart contracts written in Noir, scan for privacy-specific vulnerabilities including state leakage, note handling, or nullifier collisions, review private DeFi protocols for information disclosure, or analyze encrypted computation and zero-knowledge proof circuits.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/aztec-scanner
SKILL.md
Aztec Network Security Scanner
Security scanner for Aztec Network smart contracts written in Noir. Aztec is a privacy-focused L2 on Ethereum with a unique dual public/private state model.
Language & Runtime
| Attribute | Value |
|---|---|
| Chain | Aztec Network (Ethereum L2) |
| Language | Noir (Rust-inspired, ZK-circuit language) |
| Proof System | Ultra-PLONK (client-side proving) |
| State Model | Dual: Private (UTXO/notes) + Public (storage slots) |
| Privacy | Private functions hide inputs, outputs, and who called them |
| Execution | Private: client-side → Public: sequencer-side |
| Token Standard | Private tokens via note encryption |
Architecture: Public vs Private
┌─────────────────────────────────────────────────────────┐
│ Aztec Contract │
├──────────────────────────┬──────────────────────────────┤
│ Private Functions │ Public Functions │
│ (Client-side execution) │ (Sequencer-side execution) │
│ - Hidden inputs/outputs │ - Visible state changes │
│ - Note creation/nullifying │ - Storage slot reads/writes │
│ - ZK proof generation │ - Similar to Solidity │
├──────────────────────────┴──────────────────────────────┤
│ Private State: Notes (UTXO-like, encrypted) │
│ Public State: Storage slots (like Solidity) │
│ Shared: Nullifier tree, note hash tree, L1-L2 messages │
└─────────────────────────────────────────────────────────┘
Private State: Notes
Aztec uses a UTXO-like model for private state:
- Notes are encrypted data stored in the note hash tree
- To "read" a note, the owner decrypts it client-side
- To "spend" a note, a nullifier is emitted (marks the note as consumed)
- To "create" a note, a new note hash is added to the tree
- Notes are immutable — to update, nullify the old note and create a new one
Execution Order
Private functions execute FIRST (client-side), then public functions execute SECOND (sequencer-side). This ordering has security implications:
- Private can enqueue calls to public, but not vice versa
- Private computations can't read current public state (stale reads)
- Public functions see the effects of private functions
Detection Capabilities
| Category | Detection | Severity |
|---|---|---|
| Privacy | Private data exposed via public state or function args | Critical |
| Privacy | Note content leaked through observable behavior (timing, gas) | High |
| Privacy | Encryption key mismanagement (wrong recipient) | Critical |
| Nullifier | Nullifier collision (two notes produce same nullifier) | Critical |
| Nullifier | Nullifier not emitted when note consumed (double-spend) | Critical |
| Nullifier | Nullifier predictable (allows front-running) | High |
| State Sync | Public/private state inconsistency | High |
| State Sync | Private function reads stale public state | Medium |
| Circuit | Under-constrained circuit (invalid proofs accepted) | Critical |
| Circuit | Over-constrained circuit (valid transactions rejected) | Medium |
| Oracle | Untrusted oracle data used in circuit constraints | High |
| Access | Private function callable without proper auth | High |
| Notes | Note not encrypted for correct recipient | Critical |
| Notes | Note discovery failure (recipient can't find their notes) | High |
Privacy Threat Model
| Threat | Attack Vector | Mitigation |
|---|---|---|
| Transaction graph analysis | Linking sender/receiver via timing | Add delay, use shield/unshield |
| Amount leakage | Fixed denomination reveals nothing | Use uniform note sizes |
| Metadata leakage | Public function calls reveal intent | Minimize public function usage |
| Sequencer censorship | Sequencer refuses to include tx | Forced inclusion via L1 |
| Nullifier linking | Linking nullifiers to note creation | Nullifier derived from note secret + position |
Resources
- Aztec Patterns
Workflows
- Aztec Audit
Overview
Aztec is a privacy-focused L2 with:
- Private and public state separation
- UTXO-like note model for private data
- Noir language for circuit programming
- Encrypted function arguments
- Client-side proof generation
Error Code Reference
Common Aztec/Noir errors encountered during audits. Noir circuits fail at proof generation time, making errors harder to debug than runtime reverts.
Noir Language Errors
| Error Type | Error Pattern | Meaning |
|---|---|---|
| Assertion failure | assert(condition) failed |
Constraint not satisfied — proof cannot be generated |
| Array bounds | index out of bounds |
Array access exceeds declared length |
| Integer overflow | Overflow on arithmetic |
Operation exceeds field/integer bounds |
| Type mismatch | Expected type X, found Y |
Incorrect type in circuit computation |
| Unresolved variable | Variable not found |
Reference to undefined variable in circuit |
| Division by zero | Division by zero |
Denominator is zero in integer division |
Aztec Protocol Errors
| Error Pattern | Source | Meaning |
|---|---|---|
'NOTE_NOT_FOUND' |
Note management | Note does not exist or was nullified |
'NULLIFIER_ALREADY_EXISTS' |
Nullifier tree | Double-spend attempt — note already consumed |
'INVALID_CALLER' |
Access control | Unauthorized function caller |
'INVALID_CONTEXT' |
Context check | Wrong execution context (private vs public) |
'INVALID_NOTE_TYPE' |
Note deserialization | Note type does not match expected schema |
'PUBLIC_CALL_FAILED' |
Public function | Public portion of transaction reverted |
'PRIVATE_CALL_FAILED' |
Private function | Private proof verification failed |
'ENCRYPTION_FAILED' |
Note encryption | Failed to encrypt note for recipient |
'INVALID_SELECTOR' |
Function dispatch | Function selector not found on contract |
Privacy-Specific Audit Errors
| Issue | Error Pattern | Audit Significance |
|---|---|---|
| Note viewing key leak | No error — silent | If viewing keys are shared incorrectly, privacy is broken without any on-chain error |
| Nullifier predictability | No error — logical | Predictable nullifiers allow note existence tracking — check nullifier derivation |
| Public/private boundary leak | Transaction appears normal | Data flowing from private to public context may leak information — audit cross-context calls |
| Incomplete nullification | No error | Note consumed but nullifier not published — allows double-spend |
| Proof witness leakage | No on-chain error | Witness data in proof reveals private inputs — verify proof contains only public signals |
Troubleshooting
| Issue | Likely Cause | Solution |
|---|---|---|
| Privacy leakage not detected | Scanner audits logic without modeling information flow | Trace all data paths between private and public contexts; flag any private state exposed via public functions |
| Nullifier collision risks missed | Scanner doesn't model nullifier tree | Verify nullifier derivation includes unique components (note hash, secret, index) |
| Note encryption issues not caught | Scanner doesn't analyze encryption correctness | Verify notes are encrypted to correct recipient keys; check key rotation handling |
| Cross-context reentrancy missed | Scanner treats private/public as isolated | Trace private → public → private call chains for state manipulation opportunities |
| Proof circuit constraint gaps | Scanner checks Noir syntax, not constraint completeness | Verify every private input is constrained; unconstrained inputs allow proof forgery |
| Client-side proof manipulation ignored | Scanner only checks on-chain contracts | Audit client-side proof generation logic for witness injection or tampering vectors |
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?