solidity-security — скилл для Claude Code: аудит и установка
Скилл помогает писать и проверять Solidity-контракты с учётом типовых уязвимостей. Пригодится для аудита, DeFi и подготовки к профессиональной проверке.
/plugin marketplace add wshobson/agents
/plugin install blockchain-web3@claude-code-workflowsЧто делает solidity-security
solidity-security разбирает практики безопасной разработки Solidity-контрактов. Он помогает искать проблемы с повторным входом, переполнением и контролем доступа, а также проверять известные векторы атак и расход газа без потери защиты.
Подробные паттерны и рабочие примеры находятся в references/details.md. В исходных материалах есть тесты Hardhat на защиту от reentrancy, overflow и несанкционированного вывода, а также пример документированного контракта с паттерном Checks-Effects-Interactions.
Скилл доступен для Claude Code, Codex и Cursor. Ставьте его, если пишете или ревьюите Solidity; для задач вне смарт-контрактов он не нужен.
Какие задачи решает
- проверить контракт на reentrancy
- найти ошибки переполнения чисел
- проверить контроль доступа к функциям
- подготовить Solidity-код к аудиту
- разобрать типовые векторы атак
Примеры запросов агенту
- Проверь этот Solidity-контракт на reentrancy и проблемы с контролем доступа.
- Напиши Hardhat-тесты для защиты от overflow и несанкционированного вывода.
- Подготовь контракт к профессиональному аудиту и укажи, что исправить.
Как установить solidity-security
1Через маркетплейс плагинов
/plugin marketplace add wshobson/agents/plugin install blockchain-web3@claude-code-workflows2Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill solidity-security -a claude-code3Вручную: положить файлы
~/.claude/skills/solidity-security/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/solidity-security/
1Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill solidity-security -a codex2Вручную: положить файлы
.agents/skills/solidity-security/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add wshobson/agents --skill solidity-security -a cursor2Вручную: положить файлы
.cursor/skills/solidity-security/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install wshobson/agents solidity-security2Вручную: положить файлы
.github/skills/solidity-security/SKILL.mdКомандой платформы
gemini skills install https://github.com/wshobson/agents --path plugins/blockchain-web3/skills/solidity-securityВручную: положить файлы
.devin/skills/solidity-security/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Похожие
Вопросы о solidity-security
Как установить solidity-security в Claude Code?
Выполните npx skills add wshobson/agents --skill solidity-security -a claude-code. Файл скилла появится в ~/.claude/skills/solidity-security/SKILL.md.
Что делает solidity-security?
Скилл помогает писать и аудировать Solidity-контракты, искать reentrancy, переполнения и ошибки контроля доступа. Он также подсказывает безопасные паттерны и тесты Hardhat.
Какие тесты есть в solidity-security?
В материалах есть примеры Hardhat-тестов для защиты от reentrancy, integer overflow и несанкционированного вывода средств.
Исходный текст
SKILL.md · MIT
---
name: solidity-security
description: Master smart contract security best practices to prevent common vulnerabilities and implement secure Solidity patterns. Use when writing smart contracts, auditing existing contracts, or implementing security measures for blockchain applications.
---
# Solidity Security
Master smart contract security best practices, vulnerability prevention, and secure Solidity development patterns.
## When to Use This Skill
- Writing secure smart contracts
- Auditing existing contracts for vulnerabilities
- Implementing secure DeFi protocols
- Preventing reentrancy, overflow, and access control issues
- Optimizing gas usage while maintaining security
- Preparing contracts for professional audits
- Understanding common attack vectors
## Detailed patterns and worked examples
Detailed pattern documentation lives in `references/details.md`. Read that file when the navigation tier above is insufficient.
## Testing for Security
```javascript
// Hardhat test example
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Security Tests", function () {
it("Should prevent reentrancy attack", async function () {
const [attacker] = await ethers.getSigners();
const VictimBank = await ethers.getContractFactory("SecureBank");
const bank = await VictimBank.deploy();
const Attacker = await ethers.getContractFactory("ReentrancyAttacker");
const attackerContract = await Attacker.deploy(bank.address);
// Deposit funds
await bank.deposit({ value: ethers.utils.parseEther("10") });
// Attempt reentrancy attack
await expect(
attackerContract.attack({ value: ethers.utils.parseEther("1") }),
).to.be.revertedWith("ReentrancyGuard: reentrant call");
});
it("Should prevent integer overflow", async function () {
const Token = await ethers.getContractFactory("SecureToken");
const token = await Token.deploy();
// Attempt overflow
await expect(token.transfer(attacker.address, ethers.constants.MaxUint256))
.to.be.reverted;
});
it("Should enforce access control", async function () {
const [owner, attacker] = await ethers.getSigners();
const Contract = await ethers.getContractFactory("SecureContract");
const contract = await Contract.deploy();
// Attempt unauthorized withdrawal
await expect(contract.connect(attacker).withdraw(100)).to.be.revertedWith(
"Ownable: caller is not the owner",
);
});
});
```
## Audit Preparation
```solidity
contract WellDocumentedContract {
/**
* @title Well Documented Contract
* @dev Example of proper documentation for audits
* @notice This contract handles user deposits and withdrawals
*/
/// @notice Mapping of user balances
mapping(address => uint256) public balances;
/**
* @dev Deposits ETH into the contract
* @notice Anyone can deposit funds
*/
function deposit() public payable {
require(msg.value > 0, "Must send ETH");
balances[msg.sender] += msg.value;
}
/**
* @dev Withdraws user's balance
* @notice Follows CEI pattern to prevent reentrancy
* @param amount Amount to withdraw in wei
*/
function withdraw(uint256 amount) public {
// CHECKS
require(amount <= balances[msg.sender], "Insufficient balance");
// EFFECTS
balances[msg.sender] -= amount;
// INTERACTIONS
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Transfer failed");
}
}
```
© Seth Hobson · MIT · wshobson/agents