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安全, 不变量测试, 借贷协议, 加密货币, 区块链安全, 安全测试模板, 属性测试, 智能合约安全, 流动性池, 金库