25 Solidity and Smart Contract Prompts for Foundry Audits, Gas Optimization, and DeFi Exploit Prevention

Разработка смарт-контрактов — это не просто код, а ответственность за миллионы долларов. По данным Rekt.news, только в 2024 году из-за уязвимостей в DeFi-протоколах потеряно более $1.8 млрд. Ошибка в 10 строк может стоить проекта. Но AI уже сегодня помогает писать безопаснее, быстрее и дешевле. В этой подборке — 12 промтов, которые я использую в ежедневной работе над Solidity-проектами: от генерации ERC-20 до поиска reentrancy и газ-оптимизации. Каждый промт — с примером и пояснением.

1. Генерация безопасного ERC-20 с защитой от overflow

Задача: быстро получить шаблон токена с проверенными библиотеками.

Промт:

Напиши смарт-контракт ERC-20 на Solidity 0.8.20 с использованием OpenZeppelin. Добавь: mint, burn, pause, cap. Объясни, почему SafeMath не нужен в 0.8+.

Пример использования:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyToken is ERC20, ERC20Burnable, Pausable, Ownable {
    uint256 public immutable cap;
    constructor(uint256 _cap) ERC20("MyToken", "MTK") {
        cap = _cap;
    }
    function mint(address to, uint256 amount) public onlyOwner {
        require(totalSupply() + amount <= cap, "Cap exceeded");
        _mint(to, amount);
    }
    function pause() public onlyOwner { _pause(); }
    function unpause() public onlyOwner { _unpause(); }
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override whenNotPaused {
        super._beforeTokenTransfer(from, to, amount);
    }
}

В Solidity 0.8+ арифметика проверяется автоматически, поэтому SafeMath избыточен. Промт сразу даёт рабочий контракт с pause и cap.

2. Поиск reentrancy-уязвимостей

Задача: проверить контракт на классическую атаку повторного входа.

Промт:

Проанализируй контракт ниже на reentrancy. Если найдёшь — покажи эксплойт и исправь с помощью ReentrancyGuard.

Пример:

function withdraw() public {
    uint256 balance = balances[msg.sender];
    (bool success, ) = msg.sender.call{value: balance}("");
    require(success, "Failed");
    balances[msg.sender] = 0; // уязвимость: состояние обновляется после вызова
}

AI укажет, что нужно сначала обнулить баланс, затем вызвать call. Или добавить nonReentrant из OpenZeppelin.

3. Аудит на overflow/underflow (для старых версий)

Промт:

Проверь контракт на Solidity 0.7 на integer overflow. Покажи, где SafeMath отсутствует, и добавь его.

Пример: uint256 total = a + b; без SafeMath в 0.7 — уязвимо. AI предложит a.add(b).

4. Проверка контроля доступа

Задача: найти функции без onlyOwner или require.

Промт:

Найди все публичные функции, которые меняют состояние, но не имеют модификатора onlyOwner или ролевой модели. Предложи исправления.

Пример: функция setFee(uint) без ограничений — любой может изменить комиссию. AI добавит onlyOwner.

5. Газ-оптимизация

Промт:

Оптимизируй этот контракт по газу. Используй calldata вместо memory, unchecked для счётчиков, immutable и constant. Покажи разницу в газе до/после.

Пример: замена for (uint i = 0; i < arr.length; i++) на unchecked { ++i; } экономит ~30 газ за итерацию.

6. Написание тестов на Foundry

Промт:

Сгенерируй Foundry-тесты для контракта ERC-20: testMint, testBurn, testPause, testCap. Используй forge-std.

Пример:

function testMint() public {
    token.mint(address(this), 100);
    assertEq(token.balanceOf(address(this)), 100);
}

7. Тесты на Hardhat с проверкой revert

Промт:

Напиши Hardhat-тест, который проверяет, что mint сверх cap ревертит с сообщением "Cap exceeded".

Пример:

await expect(token.mint(addr, cap.add(1))).to.be.revertedWith("Cap exceeded");

8. Генерация ERC-721 с метаданными

Промт:

Создай ERC-721 контракт с baseURI, onlyOwner mint и сжиганием. Используй OpenZeppelin 5.0.

Пример:

contract MyNFT is ERC721, Ownable {
    string private _baseURI;
    constructor() ERC721("MyNFT", "MNFT") {}
    function mint(address to, uint256 tokenId) public onlyOwner {
        _safeMint(to, tokenId);
    }
    function _baseURI() internal view override returns (string memory) {
        return _baseURI;
    }
}

9. Деплой через скрипт Hardhat

Промт:

Напиши скрипт деплоя для Hardhat с проверкой на Etherscan. Учти, что контракт принимает аргумент cap.

Пример:

const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy(1000000);
await token.deployed();
await hre.run("verify:verify", { address: token.address, constructorArguments: [1000000] });

10. Проверка на front-running

Промт:

Есть ли в контракте уязвимость к front-running? Если да, предложи commit-reveal схему.

Пример: аукцион без commit-reveal позволяет перебить ставку, увидев чужую транзакцию в мемпуле.

11. Аудит с помощью Slither и AI

Промт:

Объясни вывод Slither для этого контракта и предложи исправления для каждого предупреждения.

Пример: Slither выдаёт reentrancy-eth, AI объясняет и даёт патч.

12. Генерация документации NatSpec

Промт:

Добавь NatSpec-комментарии ко всем публичным функциям контракта.

Пример:

/// @notice Минтит токены указанному адресу
/// @param to Адрес получателя
/// @param amount Количество токенов
function mint(address to, uint256 amount) public onlyOwner { ... }

Сравнение инструментов аудита

Инструмент Тип Промт-поддержка
Slither Статический анализ Да, через объяснение вывода
MythX Динамический анализ Да, через API
Foundry Тестирование Да, генерация тестов
Hardhat Тестирование Да, генерация тестов

Выводы

AI не заменит полноценный аудит, но ускоряет разработку и снижает риск ошибок. Используйте промты для генерации, проверки и оптимизации. Всегда тестируйте на testnet и проводите независимый аудит перед mainnet. Безопасность — это процесс, а не чек-лист.

← All posts

Comments