Skip to content

Token Liquidity Protection System

The token liquidity protection system is used to protect and manage trading pair liquidity, prevent large transactions from causing dramatic price impacts, and provide protection mechanisms for liquidity providers. This tutorial will explain how to implement a secure and reliable liquidity protection system.

Features

  • Liquidity monitoring
  • Trading restrictions
  • Price protection
  • Liquidity incentives
  • Emergency handling

Contract Implementation

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
    function token1() external view returns (address);
}

/**
 * @title LiquidityProtection
 * @dev Liquidity protection contract implementation
 */
contract LiquidityProtection is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // Pool information
    struct PoolInfo {
        IUniswapV2Pair pair;           // Trading pair contract
        uint256 minLiquidity;          // Minimum liquidity
        uint256 maxTradingAmount;      // Maximum trading amount
        uint256 priceImpactLimit;      // Price impact limit
        uint256 blockDelay;            // Block delay
        bool emergencyMode;            // Emergency mode
    }

    // User information
    struct UserInfo {
        uint256 lastTradeBlock;        // Last trade block
        uint256 tradingVolume;         // Trading volume
        bool isWhitelisted;            // Whether whitelisted
    }

    // State variables
    mapping(address => PoolInfo) public pools;           // Pool mapping
    mapping(address => mapping(address => UserInfo)) public userInfo;  // User information
    bool public globalEmergencyMode;                     // Global emergency mode
    uint256 public protectionDelay;                      // Protection delay

    // Events
    event PoolAdded(address indexed pair, uint256 minLiquidity, uint256 maxTradingAmount);
    event PoolUpdated(address indexed pair, uint256 minLiquidity, uint256 maxTradingAmount);
    event PoolRemoved(address indexed pair);
    event TradeProtected(address indexed pair, address indexed user, uint256 amount, uint256 impact);
    event EmergencyModeEnabled(address indexed pair);
    event EmergencyModeDisabled(address indexed pair);
    event WhitelistUpdated(address indexed user, bool status);

    /**
     * @dev Constructor
     */
    constructor(uint256 _protectionDelay) {
        protectionDelay = _protectionDelay;
    }

    /**
     * @dev Add liquidity pool
     */
    function addPool(
        address _pair,
        uint256 _minLiquidity,
        uint256 _maxTradingAmount,
        uint256 _priceImpactLimit,
        uint256 _blockDelay
    ) external onlyOwner {
        require(_pair != address(0), "Invalid pair address");
        require(address(pools[_pair].pair) == address(0), "Pool already exists");

        pools[_pair] = PoolInfo({
            pair: IUniswapV2Pair(_pair),
            minLiquidity: _minLiquidity,
            maxTradingAmount: _maxTradingAmount,
            priceImpactLimit: _priceImpactLimit,
            blockDelay: _blockDelay,
            emergencyMode: false
        });

        emit PoolAdded(_pair, _minLiquidity, _maxTradingAmount);
    }

    /**
     * @dev Update liquidity pool configuration
     */
    function updatePool(
        address _pair,
        uint256 _minLiquidity,
        uint256 _maxTradingAmount,
        uint256 _priceImpactLimit,
        uint256 _blockDelay
    ) external onlyOwner {
        require(address(pools[_pair].pair) != address(0), "Pool does not exist");

        PoolInfo storage pool = pools[_pair];
        pool.minLiquidity = _minLiquidity;
        pool.maxTradingAmount = _maxTradingAmount;
        pool.priceImpactLimit = _priceImpactLimit;
        pool.blockDelay = _blockDelay;

        emit PoolUpdated(_pair, _minLiquidity, _maxTradingAmount);
    }

    /**
     * @dev Remove liquidity pool
     */
    function removePool(address _pair) external onlyOwner {
        require(address(pools[_pair].pair) != address(0), "Pool does not exist");
        delete pools[_pair];
        emit PoolRemoved(_pair);
    }

    /**
     * @dev Check trade protection
     */
    function checkTradeProtection(
        address _pair,
        address _user,
        uint256 _amount
    ) external view returns (bool) {
        PoolInfo storage pool = pools[_pair];
        require(address(pool.pair) != address(0), "Pool does not exist");
        
        if (globalEmergencyMode || pool.emergencyMode) {
            return false;
        }

        UserInfo storage user = userInfo[_pair][_user];
        if (user.isWhitelisted) {
            return true;
        }

        // Check block delay
        if (block.number.sub(user.lastTradeBlock) < pool.blockDelay) {
            return false;
        }

        // Check trading volume limit
        if (_amount > pool.maxTradingAmount) {
            return false;
        }

        // Check liquidity
        (uint112 reserve0, uint112 reserve1,) = pool.pair.getReserves();
        if (uint256(reserve0) < pool.minLiquidity || uint256(reserve1) < pool.minLiquidity) {
            return false;
        }

        // Check price impact
        uint256 priceImpact = calculatePriceImpact(_pair, _amount);
        if (priceImpact > pool.priceImpactLimit) {
            return false;
        }

        return true;
    }

    /**
     * @dev Calculate price impact
     */
    function calculatePriceImpact(
        address _pair,
        uint256 _amount
    ) public view returns (uint256) {
        PoolInfo storage pool = pools[_pair];
        (uint112 reserve0, uint112 reserve1,) = pool.pair.getReserves();
        
        // Simplified price impact calculation
        uint256 currentPrice = uint256(reserve0).mul(1e18).div(reserve1);
        uint256 newReserve0 = uint256(reserve0).add(_amount);
        uint256 newPrice = newReserve0.mul(1e18).div(reserve1);
        
        return newPrice > currentPrice ? 
            newPrice.sub(currentPrice).mul(100).div(currentPrice) :
            currentPrice.sub(newPrice).mul(100).div(currentPrice);
    }

    /**
     * @dev Update user trade status
     */
    function updateTradeStatus(
        address _pair,
        address _user,
        uint256 _amount
    ) external {
        require(msg.sender == owner() || msg.sender == address(pools[_pair].pair), "Unauthorized");
        
        UserInfo storage user = userInfo[_pair][_user];
        user.lastTradeBlock = block.number;
        user.tradingVolume = user.tradingVolume.add(_amount);

        emit TradeProtected(_pair, _user, _amount, calculatePriceImpact(_pair, _amount));
    }

    /**
     * @dev Set emergency mode
     */
    function setEmergencyMode(address _pair, bool _enabled) external onlyOwner {
        require(address(pools[_pair].pair) != address(0), "Pool does not exist");
        pools[_pair].emergencyMode = _enabled;
        
        if (_enabled) {
            emit EmergencyModeEnabled(_pair);
        } else {
            emit EmergencyModeDisabled(_pair);
        }
    }

    /**
     * @dev Set global emergency mode
     */
    function setGlobalEmergencyMode(bool _enabled) external onlyOwner {
        globalEmergencyMode = _enabled;
    }

    /**
     * @dev Update whitelist status
     */
    function updateWhitelist(address _user, bool _status) external onlyOwner {
        userInfo[address(0)][_user].isWhitelisted = _status;
        emit WhitelistUpdated(_user, _status);
    }

    /**
     * @dev Update protection delay
     */
    function updateProtectionDelay(uint256 _delay) external onlyOwner {
        protectionDelay = _delay;
    }

    /**
     * @dev Get pool information
     */
    function getPoolInfo(address _pair)
        external
        view
        returns (
            uint256 minLiquidity,
            uint256 maxTradingAmount,
            uint256 priceImpactLimit,
            uint256 blockDelay,
            bool emergencyMode
        )
    {
        PoolInfo storage pool = pools[_pair];
        return (
            pool.minLiquidity,
            pool.maxTradingAmount,
            pool.priceImpactLimit,
            pool.blockDelay,
            pool.emergencyMode
        );
    }

    /**
     * @dev Get user information
     */
    function getUserInfo(address _pair, address _user)
        external
        view
        returns (
            uint256 lastTradeBlock,
            uint256 tradingVolume,
            bool isWhitelisted
        )
    {
        UserInfo storage user = userInfo[_pair][_user];
        return (
            user.lastTradeBlock,
            user.tradingVolume,
            user.isWhitelisted
        );
    }
}

Key Concepts

Protection Mechanism

Liquidity protection includes:

  • Minimum liquidity requirements
  • Maximum trading restrictions
  • Price impact control
  • Transaction delay protection

Monitoring System

Monitoring functions include:

  • Liquidity monitoring
  • Trading volume monitoring
  • Price monitoring
  • User behavior monitoring

Permission Management

Permission control:

  • Administrator permissions
  • Whitelist mechanism
  • Emergency control
  • Parameter adjustment

Security Considerations

  1. Liquidity security

    • Minimum value restrictions
    • Change monitoring
    • Emergency handling
    • Recovery mechanisms
  2. Transaction security

    • Amount restrictions
    • Frequency control
    • Price protection
    • Slippage control
  3. System security

    • Permission management
    • Parameter verification
    • Status checks
    • Emergency mode
  4. Data security

    • Status synchronization
    • Data verification
    • Error handling
    • Event recording

Best Practices

  1. Protection configuration

    • Reasonable restrictions
    • Appropriate delays
    • Dynamic adjustments
    • Hierarchical protection
  2. Monitoring management

    • Real-time monitoring
    • Threshold alarms
    • Exception handling
    • Data analysis
  3. Operation management

    • Parameter optimization
    • Whitelist management
    • Emergency response
    • Regular reviews
  4. User experience

    • Transparent rules
    • Clear prompts
    • Reasonable restrictions
    • Convenient operations

Extended Features

  1. Dynamic restrictions
  2. Multi-level protection
  3. Intelligent adjustment
  4. Risk warning
  5. Automatic recovery

Application Scenarios

  1. Liquidity management

    • Deep protection
    • Price stability
    • Transaction control
    • Risk management
  2. Transaction protection

    • Large transactions
    • Frequent transactions
    • Abnormal transactions
    • Arbitrage protection
  3. Market stability

    • Price stability
    • Deep maintenance
    • Volatility control
    • Risk prevention

Summary

Liquidity protection systems are essential for decentralized trading. Through this tutorial, you can:

  • Implement comprehensive protection mechanisms
  • Ensure transaction security
  • Maintain market stability
  • Optimize user experience

Frequently Asked Questions (FAQ)

Basic Concepts

Q: What is liquidity protection?

A: Liquidity protection is a mechanism used to prevent large transactions from causing dramatic price impacts, including:

  • Trading restrictions
  • Price protection
  • Liquidity monitoring
  • Emergency handling mechanisms
  • Whitelist management

Q: Why is liquidity protection needed?

A: Liquidity protection is crucial for maintaining market stability, primarily due to:

  • Preventing price manipulation
  • Protecting small transactions
  • Maintaining market stability
  • Reducing impermanent loss
  • Improving transaction security

Q: How to set protection parameters?

A: Protection parameter settings need to consider multiple aspects:

  • Minimum liquidity requirements
  • Maximum trading restrictions
  • Price impact thresholds
  • Transaction delay times
  • Emergency mode trigger conditions

Q: How to handle large transactions?

A: Large transactions need special handling to reduce market impact:

  • Batch execution
  • Slippage protection
  • Delayed transactions
  • Additional fees
  • Approval mechanisms

Q: What are the risks of liquidity protection?

A: The main risks include:

  • Poor parameter settings
  • Bypassing protection mechanisms
  • Contract vulnerabilities
  • Market manipulation
  • Emergency mode abuse

Q: How to handle emergencies?

A: Emergency handling processes include:

  • Activating emergency mode
  • Suspending transactions
  • Adjusting parameters
  • Notifying users
  • Recovery mechanisms

Q: How to optimize protection mechanisms?

A: Protection mechanisms can be optimized through:

  • Dynamic parameter adjustments
  • Intelligent monitoring systems
  • Multi-level protection
  • Warning mechanisms
  • Automated management

Q: How to improve protection efficiency?

A: Methods to improve protection efficiency include:

  • Algorithm optimization
  • Data analysis
  • Real-time monitoring
  • Quick response
  • Automated processing

Released under the MIT License by Vogeb.