Skip to content

EVM AMM Smart Contracts

This document outlines the external functions available for users to interact with this modified Uniswap V3 Core implementation for swapping and liquidity management.

Entry Points Overview

Users interact with two main contracts:

  • SwapRouter: For executing token swaps
  • NonfungiblePositionManager: For liquidity provision and management

SwapRouter Functions

Exact Input Swaps

exactInputSingle(ExactInputSingleParams params)

Execute a swap with exact input amount for a single pool.

exactInput(ExactInputParams params)

Execute a multi-hop swap with exact input amount.

Exact Output Swaps

exactOutputSingle(ExactOutputSingleParams params)

Execute a swap with exact output amount for a single pool.

exactOutput(ExactOutputParams params)

Execute a multi-hop swap with exact output amount.

NonfungiblePositionManager Functions

Liquidity Management

mint(MintParams params)

Create a new liquidity position and mint an NFT representing it.

increaseLiquidity(IncreaseLiquidityParams params)

Add liquidity to an existing position.

decreaseLiquidity(DecreaseLiquidityParams params)

Remove liquidity from an existing position.

collect(CollectParams params)

Collect accumulated fees from a position.

burn(uint256 tokenId)

Burn an NFT position (must have zero liquidity and fees).

Pool Creation (Restricted)

createAndInitializePoolIfNecessaryWithParams(CreatePoolParams params)

Create and initialize a new pool (only accessible by pool manager).

Key Differences from Standard Uniswap V3

1. Exclusive Trading Periods (ETP)

Purpose: Provides Caishen Wallet users with exclusive access to newly launched tokens before public trading begins.

Impact: During exclusive trading periods, only Caishen Wallet users and authorized market makers can swap.

SwapRouter Changes:

  • All swap functions check _checkExclusiveTrading() before execution
  • Enforces exclusive trading period restrictions based on pool configuration
  • Only vault address (representing Caishen Wallet users) and whitelisted market makers can trade during exclusive periods
  • Guarantees efficient trading experience for early adopters before public market access

2. Market Maker Whitelist System

SwapRouter Owner Functions:

  • addWhitelistedMarketMaker(address pool, address marketMaker)
  • removeWhitelistedMarketMaker(address pool, address marketMaker)
  • transferOwnership(address newOwner)

Access: Only SwapRouter owner can manage market maker whitelist per pool.

3. Project Manager Privileges and Liquidity Locking

Liquidity Protection: Project Manager liquidity is automatically locked during Exclusive Trading Period (ETP) and Early Launch Lock (ELL) periods to guarantee efficient trading.

NonfungiblePositionManager Changes:

  • decreaseLiquidity() has special logic for project managers with time-based restrictions
  • Project managers cannot withdraw liquidity during ETP and ELL periods, ensuring stable trading conditions
  • Project managers can call burnByProjectManager() instead of regular burn() on pools (after lock periods)
  • Locked liquidity guarantees sufficient depth for Caishen Wallet users during exclusive access windows
  • Provides additional control over liquidity management during launch phases while protecting trader experience

4. Pool Manager Controlled Pool Creation

Restriction: Pool creation via periphery is restricted to designated pool manager.

Standard Uniswap V3: Anyone can create pools via position manager This Implementation: Only poolManager address can call createAndInitializePoolIfNecessaryWithParams()

5. Launch Parameter Requirements

Pool Creation Changes:

  • Pools must be created with PoolLaunchParameters
  • Includes launch type configuration (Fair/Curated)
  • Defines exclusive trading periods and access controls
  • Requires oracle setup before operations

Standard Uniswap V3: Simple pool creation with just token pair and fee This Implementation: Complex launch configuration with access controls and timing restrictions

Access Control Summary

SwapRouter Owner

Powers:

  • Add/remove market makers from whitelist per pool
  • Transfer ownership
  • Manage exclusive trading access

Pool Manager

Powers:

  • Create new pools via NonfungiblePositionManager
  • Set launch parameters and configurations

Project Manager (per pool)

Powers:

  • Special liquidity burning privileges via burnByProjectManager()
  • Enhanced control during token launch phases

Whitelisted Market Makers (per pool)

Powers:

  • Trade during exclusive trading periods
  • Provide liquidity when regular users cannot

Vault Address (Caishen Wallet)

Powers:

  • Represents Caishen Wallet users for exclusive trading access
  • Trade during exclusive trading periods across all pools
  • Receives pool creation notifications
  • Enables seamless early access to new token launches

Error Codes

  • UA: Unauthorized access
  • ONS: Oracle Not Set - oracle must be configured before pool operations
  • NP: Not Periphery - restricted operation attempted
  • NPM: Not Pool Manager - pool creation attempted by non-manager
  • SWAP_ROUTER: NOT_AUTHORIZED_FOR_EXCLUSIVE_TRADING: Swap attempted during exclusive period by unauthorized user

Usage Notes

  1. Exclusive Trading Checks: All swaps are subject to exclusive trading period validation for Caishen Wallet user protection
  2. Oracle Requirements: Pools must have oracles configured before operations can begin
  3. NFT Positions: All liquidity positions are represented as ERC-721 NFTs
  4. Liquidity Locking: Project Manager liquidity is automatically locked during ETP and ELL periods to ensure trading stability
  5. Caishen Wallet Access: Vault address provides seamless exclusive access for Caishen Wallet users during launch windows
  6. Launch Phase Control: Pools can restrict trading to specific addresses during launch phases to optimize user experience

Struct and Parameter Definitions

SwapRouter Parameters

ExactInputSingleParams

solidity
struct ExactInputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint256 deadline;
    uint256 amountIn;
    uint256 amountOutMinimum;
    uint160 sqrtPriceLimitX96;
}

ExactInputParams

solidity
struct ExactInputParams {
    bytes path;
    address recipient;
    uint256 deadline;
    uint256 amountIn;
    uint256 amountOutMinimum;
}

ExactOutputSingleParams

solidity
struct ExactOutputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint256 deadline;
    uint256 amountOut;
    uint256 amountInMaximum;
    uint160 sqrtPriceLimitX96;
}

ExactOutputParams

solidity
struct ExactOutputParams {
    bytes path;
    address recipient;
    uint256 deadline;
    uint256 amountOut;
    uint256 amountInMaximum;
}

NonfungiblePositionManager Parameters

MintParams

solidity
struct MintParams {
    address token0;
    address token1;
    uint24 fee;
    int24 tickLower;
    int24 tickUpper;
    uint256 amount0Desired;
    uint256 amount1Desired;
    uint256 amount0Min;
    uint256 amount1Min;
    address recipient;
    uint256 deadline;
}

IncreaseLiquidityParams

solidity
struct IncreaseLiquidityParams {
    uint256 tokenId;
    uint256 amount0Desired;
    uint256 amount1Desired;
    uint256 amount0Min;
    uint256 amount1Min;
    uint256 deadline;
}

DecreaseLiquidityParams

solidity
struct DecreaseLiquidityParams {
    uint256 tokenId;
    uint128 liquidity;
    uint256 amount0Min;
    uint256 amount1Min;
    uint256 deadline;
}

CollectParams

solidity
struct CollectParams {
    uint256 tokenId;
    address recipient;
    uint128 amount0Max;
    uint128 amount1Max;
}

CreatePoolParams

solidity
struct CreatePoolParams {
    address token0;
    address token1;
    uint24 fee;
    uint160 sqrtPriceX96;
    PoolLaunchParameters launchParams;
}