unspecifiedcoder/invariant_suites
GitHub: unspecifiedcoder/invariant_suites
该项目提供了一套可复用的 Foundry 有状态 invariant 测试套件,用于对 ERC-4626 策略金库和 Compound-fork 借贷市场进行深入的模糊测试与漏洞复现。
Stars: 0 | Forks: 0
# Invariant Suites
[](https://github.com/unspecifiedcoder/invariant_suites/actions/workflows/test.yml)
专为 ERC-4626 策略金库和 Compound-fork 借贷市场定制的**有状态 invariant 测试套件**。
大多数审计依赖于人工审查和 Slither。我提供可用于生产环境的 Foundry invariant 测试——包含 handler、针对性的 invariant 以及可复现的 PoC——并根据您协议特定的 harvest、rebalance 和记账逻辑进行量身定制。
该套件可直接放入您现有的 Foundry 设置中。您的审计员可以直接继承它。在发布后,您的 CI 会在每次 commit 时运行它。
## 包含内容
- **[`exploits/erc4626-inflation/`](exploits/erc4626-inflation/)** — 完整复现了经典的 ERC-4626 首批存款者膨胀攻击。包含确定性 PoC 以及自主 invariant fuzzer,可在 3 次调用的缩减序列上暴露该类 bug。
- **[`exploits/hundred-finance/`](exploits/hundred-finance/)** — 实时 fork 复现了 Hundred Finance Optimism 空市场捐赠攻击(2023 年 4 月,损失约 680 万美元)。单次捐赠造成了 6.5×10⁹ 的汇率膨胀,该结果基于真实的 2023 年 4 月 15 日 fork 状态进行断言。
- **[`templates/erc4626-base/`](templates/erc4626-base/)** — 适用于任何 ERC-4626 策略金库审计的可重用基础 handler 和 invariant。抽象基类;针对不同协议,只需继承并重写 `_fundActor` + `maxAmount()` 即可。
- **[`templates/lending-class/`](templates/lending-class/)** — 适用于任何 Compound-v2-fork 借贷市场审计的可重用基础 handler 和 invariant。结构相同;适用于借贷领域。
## 在本地运行
```
git clone https://github.com/unspecifiedcoder/invariant_suites.git
cd invariant_suites
forge install
forge test
```
在全新克隆(未配置 RPC)时的预期最终状态:
```
7 passed; 2 failed; 1 skipped
```
**这两个失败是故意的** —— 它们是 invariant 成功捕获了各自预先植入的 bug:
- `ToyVault` 上的 `invariant_vaultSolvent` — 在 2 次调用的缩减序列上捕获了植入的“忘记递减 `totalShares`”bug。
- `VulnerableVault` 上的 `invariant_noZeroShareDeposit` — 在 3 次调用的缩减序列上捕获了经典的 ERC-4626 膨胀攻击。
**被跳过** 的是 Hundred Finance 的 fork 测试 —— 当未设置 `OPTIMISM_RPC_URL` 时,它会自动跳过。要运行它,请将环境变量放入本地 `.env` 文件(已被 gitignore 忽略)中:
```
echo "OPTIMISM_RPC_URL=https://opt-mainnet.g.alchemy.com/v2/" > .env
forge test
```
设置好环境变量后,您将看到 `10 passed; 2 failed; 0 skipped`。
## 参与项目能产出什么
针对您协议的 invariant 套件服务将交付以下内容:
1. **一个 handler 合约**,能够执行您协议的实际状态机 —— 包括偏离标准基础合约的定制化 harvest、rebalance 和奖励分配路径。
2. **一套针对性的 invariant 集**,用于编码您协议的实际安全属性 —— 而不是通用的 ERC-4626 属性(这些已经包含在此处的模板中了)。
3. **针对每个发现的可复现 PoC** —— 编写为独立的 `forge test` 用例,您的审计员和 CI 日后可以永远运行它们。
服务结束时,该套件将保留在您的代码库中。您的审计员将继承它。您的 CI 将持续运行它。
## 仓库结构
```
src/ Solidity reference implementations
ToyVault.sol 1:1 ETH vault with one planted bug (pedagogical)
VulnerableVault.sol Naive ERC-4626 (no inflation mitigation)
test/ Foundry tests
ToyVault.t.sol Unit tests + PoC for the ToyVault bug
ToyVault.invariant.t.sol Invariant fuzzer for ToyVault
ToyVaultHandler.sol Handler for the ToyVault fuzzer
Inflation.t.sol Deterministic PoC of the ERC-4626 inflation attack
Inflation.invariant.t.sol Invariant fuzzer for the inflation attack
VulnerableVaultHandler.sol Handler for the inflation fuzzer
HundredFinance.fork.t.sol Live-fork reproduction (Optimism, block 90761917)
interfaces/ICToken.sol Minimal Compound-v2 cToken interface
mocks/MockERC20.sol Minimal mintable ERC-20 for testing
templates/ Reusable starting points
erc4626-base/ For ERC-4626 strategy-vault audits
lending-class/ For Compound-fork lending market audits
exploits/ Case-study writeups
erc4626-inflation/ ERC-4626 first-depositor inflation
hundred-finance/ Hundred Finance Optimism (April 2023)
```
## 联系方式
如有审计/预审计咨询:请提交一个 issue,或在 Twitter 上私信。
标签:DeFi, Foundry, LNA, Solidity, 区块链安全, 智能合约审计, 漏洞复现