
solidity-dev
Complete Solidity smart contract development - building, testing, gas optimization, and security scanning. Use this skill for .sol files, Foundry commands, deployment scripts, gas analysis, or security review.
Complete Solidity smart contract development - building, testing, gas optimization, and security scanning. Use this skill for .sol files, Foundry commands, deployment scripts, gas analysis, or security review.
Solidity Development
Comprehensive skill for EVM/Solidity smart contract development, combining build/test workflows, gas optimization, and security analysis.
When This Skill Activates
- Working on
.solfiles - Running Foundry commands (forge, cast, anvil)
- Contract deployment or testing
- ABI or interface changes
- Gas optimization tasks
- Security review or pre-audit preparation
Scope
- Solidity contracts (core protocol)
- Foundry tests and scripts
- Deployment scripts
- Contract interfaces and ABIs
- Gas analysis and optimization
- Security scanning (Slither)
Part 1: Development Workflows
Build & Test
forge build
forge test
forge test -vvv # verbose
forge test --match-test "testSpecificFunction"
forge test --match-path test/SomeContract.t.sol
Deploy
forge script script/Deploy.s.sol --broadcast --rpc-url $RPC_URL
After Contract Changes
- Update interface if signature changed
- Rebuild ABIs:
forge build - Run tests:
forge test - Sync to frontend if needed
Code Standards
- Use OpenZeppelin for standard patterns
- Custom errors over require strings
- Events for all state changes
- NatSpec comments on public functions
- WAD math (1e18) for precision, convert at boundaries
Part 2: Gas Optimization
Gas Analysis Commands
# Create baseline snapshot
forge snapshot --snap .gas-baseline
# Run gas report
forge test --gas-report
# Compare against baseline
forge snapshot --diff .gas-baseline
# Check specific function
forge test --match-test test_PlaceOrder --gas-report -vvv
# Storage layout analysis
forge inspect ContractName storage-layout --pretty
Optimization Patterns
| Pattern | Savings | Example |
|---|---|---|
| Storage Packing | ~20,000 gas/slot | Combine uint128 + uint128 into single slot |
| Calldata vs Memory | ~60 gas/word | Use calldata for read-only arrays |
| Unchecked Math | ~40 gas/op | Use unchecked {} when overflow impossible |
| Cache Storage | ~100 gas/read | uint256 cached = storageVar; |
| Short-circuit | Variable | Put cheaper checks first in require |
| Avoid Zero Init | ~3 gas/var | Don't initialize to default values |
Gas Optimization Checklist
- [ ] Storage variables packed efficiently
- [ ] Hot path functions use
calldatafor arrays - [ ] Loops have
uncheckedincrements - [ ] Storage reads cached in local variables
- [ ] No redundant zero-initializations
- [ ] Short-circuit conditions ordered by cost
Anti-Patterns
- Don't optimize cold paths at expense of readability
- Don't use
assemblyunless savings > 1000 gas - Don't sacrifice security for gas savings
Part 3: Security Analysis
Slither Commands
# Full analysis
slither . --config-file slither.config.json
# Target specific contract
slither src/ContractName.sol
# Generate JSON report
slither . --json slither-report.json
# Run specific detector
slither . --detect reentrancy-eth
# Function summary
slither . --print function-summary
High-Severity Detectors
| Detector | Severity | Description |
|---|---|---|
reentrancy-eth |
HIGH | Reentrancy with ETH transfer |
reentrancy-no-eth |
HIGH | Reentrancy without ETH |
arbitrary-send-eth |
HIGH | Arbitrary ETH destination |
controlled-delegatecall |
HIGH | Delegatecall to user input |
suicidal |
HIGH | Selfdestruct with user control |
uninitialized-state |
HIGH | Uninitialized state variables |
Security Checklist
Access Control
- [ ] All external functions have proper modifiers
- [ ] Owner/admin functions protected
- [ ] Role-based access properly enforced
Reentrancy
- [ ] CEI pattern followed (Checks-Effects-Interactions)
- [ ] External calls after state updates
- [ ] ReentrancyGuard on vulnerable functions
Math & Validation
- [ ] Arithmetic checked or intentionally unchecked
- [ ] Division by zero protected
- [ ] Zero address checks
- [ ] Array bounds checked
Common Vulnerability Patterns
Reentrancy
// VULNERABLE
function withdraw() external {
uint256 amount = balances[msg.sender];
(bool success,) = msg.sender.call{value: amount}("");
balances[msg.sender] = 0; // State update AFTER external call
}
// FIXED
function withdraw() external nonReentrant {
uint256 amount = balances[msg.sender];
balances[msg.sender] = 0; // State update BEFORE external call
(bool success,) = msg.sender.call{value: amount}("");
}
Access Control
// VULNERABLE
function setPrice(uint256 price) external {
currentPrice = price; // No access control
}
// FIXED
function setPrice(uint256 price) external onlyOwner {
currentPrice = price;
}
DeFi-Specific Checks
- [ ] No same-block price dependencies (flash loan risk)
- [ ] Slippage protection on swaps
- [ ] Commit-reveal for sensitive ops
- [ ] Deadline parameters respected
- [ ] Oracle manipulation protected (use TWAP/Chainlink)
Audit Preparation Checklist
- [ ]
forge buildcompiles without warnings - [ ]
forge testpasses with >80% coverage - [ ] Slither runs clean (or issues documented)
- [ ] All external functions documented (NatSpec)
- [ ] Access control matrix documented
- [ ] Invariant tests pass
- [ ] Dependencies audited/pinned
You Might Also Like
Related Skills

coding-agent
Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.
openclaw
add-uint-support
Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
pytorch
at-dispatch-v2
Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
pytorch
skill-writer
Guide users through creating Agent Skills for Claude Code. Use when the user wants to create, write, author, or design a new Skill, or needs help with SKILL.md files, frontmatter, or skill structure.
pytorch
implementing-jsc-classes-cpp
Implements JavaScript classes in C++ using JavaScriptCore. Use when creating new JS classes with C++ bindings, prototypes, or constructors.
oven-sh
implementing-jsc-classes-zig
Creates JavaScript classes using Bun's Zig bindings generator (.classes.ts). Use when implementing new JS APIs in Zig with JSC integration.
oven-sh