Defi Amm Security

affaan-m/ECC/skills/defi-amm-security

作者 affaan-mef648e01899ba3e8dc6371642deaaf64b4477775無授權條款275K 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫4 天前更新

Security checklist for Solidity AMM contracts, liquidity pools, and swap flows. Covers reentrancy, CEI ordering, donation or inflation attacks, oracle manipulation, slippage, admin controls, and integer math. Use when auditing or writing Solidity AMM, liquidity pool, or swap code.

僅含說明Security
AI 產生的概覽

針對 Solidity AMM、流動性池與兌換合約的安全檢查清單與強化模式,用於稽核或撰寫程式碼。

功能
此技能為 Solidity 自動做市商(AMM)合約、LP 金庫與兌換流程提供弱點檢查清單與模式庫。它對比重入與 CEI 順序、捐贈或通膨攻擊、預言機操縱、滑價保護、安全儲備數學以及管理員控制等面向的易受攻擊寫法與安全寫法。它也列出靜態分析、模糊測試與屬性測試的稽核工具指令。
適用情境
在撰寫或稽核 Solidity AMM 或流動性池合約、實作持有代幣餘額的兌換、存入、提取、鑄造或銷毀流程,或為 DeFi 協定加入費率設定、暫停器或預言機更新時使用。
執行需求
需要 Solidity 開發環境;稽核範例還需要 slither-analyzer、echidna-test 與 Foundry(forge)等工具。此技能不附帶指令碼,僅包含說明與程式碼範例。

DeFi AMM Security

Critical vulnerability patterns and hardened implementations for Solidity AMM contracts, LP vaults, and swap functions.

When to Use

  • Writing or auditing a Solidity AMM or liquidity-pool contract
  • Implementing swap, deposit, withdraw, mint, or burn flows that hold token balances
  • Reviewing any contract that uses token.balanceOf(address(this)) in share or reserve math
  • Adding fee setters, pausers, oracle updates, or other admin functions to a DeFi protocol

How It Works

Use this as a checklist-plus-pattern library. Review every user entrypoint against the categories below and prefer the hardened examples over hand-rolled variants.

Execution Safety

The shell commands in this skill are local audit examples. Run them only in a trusted checkout or disposable sandbox, and do not splice untrusted contract names, paths, RPC URLs, private keys, or user-supplied flags into shell commands. Ask before installing tools or running long fuzzing/static-analysis jobs that may consume significant local or paid resources.

Never include secrets, private keys, seed phrases, API tokens, or mainnet signing credentials in command examples, logs, or reports.

Examples

Reentrancy: enforce CEI order

Vulnerable:

solidity
function withdraw(uint256 amount) external {    require(balances[msg.sender] >= amount);    token.transfer(msg.sender, amount);    balances[msg.sender] -= amount;}

Safe:

solidity
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
using SafeERC20 for IERC20;
function withdraw(uint256 amount) external nonReentrant {    require(balances[msg.sender] >= amount, "Insufficient");    balances[msg.sender] -= amount;    token.safeTransfer(msg.sender, amount);}

Do not write your own guard when a hardened library exists.

Donation or inflation attacks

Using token.balanceOf(address(this)) directly for share math lets attackers manipulate the denominator by sending tokens to the contract outside the intended path.

solidity
// Vulnerablefunction deposit(uint256 assets) external returns (uint256 shares) {    shares = (assets * totalShares) / token.balanceOf(address(this));}
solidity
// Safeuint256 private _totalAssets;
function deposit(uint256 assets) external nonReentrant returns (uint256 shares) {    uint256 balBefore = token.balanceOf(address(this));    token.safeTransferFrom(msg.sender, address(this), assets);    uint256 received = token.balanceOf(address(this)) - balBefore;
    shares = totalShares == 0 ? received : (received * totalShares) / _totalAssets;    _totalAssets += received;    totalShares += shares;}

Track internal accounting and measure actual tokens received.

Oracle manipulation

Spot prices are flash-loan manipulable. Prefer TWAP.

solidity
uint32[] memory secondsAgos = new uint32[](2);secondsAgos[0] = 1800;secondsAgos[1] = 0;(int56[] memory tickCumulatives,) = IUniswapV3Pool(pool).observe(secondsAgos);int24 twapTick = int24(    (tickCumulatives[1] - tickCumulatives[0]) / int56(uint56(30 minutes)));uint160 sqrtPriceX96 = TickMath.getSqrtRatioAtTick(twapTick);

Slippage protection

Every swap path needs caller-provided slippage and a deadline.

solidity
function swap(    uint256 amountIn,    uint256 amountOutMin,    uint256 deadline) external returns (uint256 amountOut) {    require(block.timestamp <= deadline, "Expired");    amountOut = _calculateOut(amountIn);    require(amountOut >= amountOutMin, "Slippage exceeded");    _executeSwap(amountIn, amountOut);}

Safe reserve math

solidity
import {FullMath} from "@uniswap/v3-core/contracts/libraries/FullMath.sol";
uint256 result = FullMath.mulDiv(a, b, c);

For large reserve math, avoid naive a * b / c when overflow risk exists.

Admin controls

solidity
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
contract MyAMM is Ownable2Step {    function setFee(uint256 fee) external onlyOwner { ... }    function pause() external onlyOwner { ... }}

Prefer explicit acceptance for ownership transfer and gate every privileged path.

Security Checklist

  • Reentrancy-exposed entrypoints use nonReentrant
  • CEI ordering is respected
  • Share math does not depend on raw balanceOf(address(this))
  • ERC-20 transfers use SafeERC20
  • Deposits measure actual tokens received
  • Oracle reads use TWAP or another manipulation-resistant source
  • Swaps require amountOutMin and deadline
  • Overflow-sensitive reserve math uses safe primitives like mulDiv
  • Admin functions are access-controlled
  • Emergency pause exists and is tested
  • Static analysis and fuzzing are run before production

Audit Tools

bash
pip install slither-analyzerslither . --exclude-dependencies
echidna-test . --contract YourAMM --config echidna.yaml
forge test --fuzz-runs 10000

來源與署名

來源:affaan-m/ECC位於skills/defi-amm-security提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架