junggyusong/solidity-fuzzing-templates
GitHub: junggyusong/solidity-fuzzing-templates
为 DeFi 协议常见原语提供生产级模糊测试 harness 模板,帮助安全研究人员和开发者快速验证 AMM、借贷和 Vault 的核心不变量。
Stars: 0 | Forks: 0
# Solidity 模糊测试模板
用于 DeFi 协议安全测试的生产级模糊测试 harness 模板。涵盖了 AMM、借贷和 ERC4626 vault 不变量,支持 **Foundry 不变量测试**和 **Echidna** 属性测试。
## 支持的框架
| 框架 | 配置 | 前缀约定 |
|-----------|--------|-------------------|
| [Foundry](https://book.getfoundry.sh/forge/invariant-testing) | `foundry.toml` | `invariant_` |
| [Echidna](https://github.com/crytic/echidna) | `echidna.yaml` | `echidna_` |
## 项目结构
```
src/
invariants/ # Foundry invariant tests
AMMInvariant.t.sol # Constant-product AMM (k = x * y)
LendingInvariant.t.sol # Lending pool solvency & liquidation
VaultInvariant.t.sol # ERC4626 vault share accounting
echidna/ # Echidna property tests
EchidnaAMM.sol # AMM properties for Echidna
foundry.toml # Foundry invariant test configuration
echidna.yaml # Echidna configuration
```
## 安装说明
```
# Clone
git clone https://github.com/junggyusong/solidity-fuzzing-templates.git
cd solidity-fuzzing-templates
# 安装 Foundry (如果尚未安装)
curl -L https://foundry.paradigm.xyz | bash
foundryup
# 安装依赖项
forge install
```
## 用法
### Foundry 不变量测试
```
# 运行所有 invariant 测试
forge test --match-contract Invariant
# 运行带有 verbosity 的特定测试套件
forge test --match-contract AMMInvariant -vvv
# 使用自定义 depth/runs 运行 (覆盖 foundry.toml)
forge test --match-contract AMMInvariant -vvv \
--fuzz-runs 512 --invariant-depth 64
```
### Echidna
```
# 安装 Echidna
pip3 install slither-analyzer
# 从 https://github.com/crytic/echidna/releases 下载 Echidna
# 运行 Echidna 属性测试
echidna src/echidna/EchidnaAMM.sol --contract EchidnaAMM --config echidna.yaml
```
## 不变量目录
### AMM (恒定乘积)
- **k 不变量**: 兑换后 `x * y` 绝不能减少
- **无代币耗尽**: 储备必须保持为正数
- **LP 份额比例**: 铸造的份额反映存入的价值
### 借贷池
- **偿付能力**: 任何时候总存款 >= 总借款
- **清算阈值**: 低于抵押率头寸可被清算
- **利息单调性**: 应计利息永远不会减少
### ERC4626 Vault
- **totalAssets 一致性**: 报告的资产与实际代币余额匹配
- **份额价格单调性**: 份额价格(资产/份额)永远不会下降
- **往返安全性**: 存款然后提现返回的数量 <= 原始数量
## 编写自定义不变量
1. 在 `src/invariants/` 中创建一个带有 `.t.sol` 扩展名的新文件
2. 继承 `forge-std/Test.sol`
3. 实现一个 `setUp()` 函数来部署合约并配置 handler
4. 使用 `invariant_` 前缀定义不变量函数
5. 使用 `targetContract()` 将 fuzzer 定向到你的 handler
## 许可证
MIT
标签:AMM, DeFi安全, Echidna, ERC4626, Foundry, Fuzzing, Solidity, Web3安全, 不变量测试, 借贷协议, 加密货币, 区块链安全, 安全测试模板, 属性测试, 智能合约安全, 流动性池, 金库