본문으로 건너뛰기

BDEX V3

BDEX V3는 집중 유동성(Concentrated Liquidity)을 도입하여 LP가 사용자 지정 가격 범위 내에 자본을 배분함으로써 자본 효율을 크게 향상시킬 수 있도록 합니다. Uniswap V3 아키텍처를 기반으로 하며 BOT Chain의 0.75초 블록 타임과 저가스 환경에 맞게 조정되었습니다.

집중 유동성 가이드

BDEX V3는 집중 유동성 모델을 사용합니다. V2와 달리 유동성이 항상 전체 가격 범위에 분산되지는 않습니다. 유동성 공급자는 자신의 자본이 활성화되는 사용자 지정 가격 범위를 선택합니다.

시장 가격이 선택한 범위 내에 있을 때 포지션은 스왑 수수료를 얻습니다. 시장 가격이 범위를 벗어나면 포지션은 비활성화되며 가격이 다시 범위로 들어올 때까지 더 이상 수수료를 얻지 않습니다.

핵심 컨트랙트:

컨트랙트용도
V3 FactoryV3 풀 생성 및 관리
NonfungiblePositionManagerLP 포지션을 NFT로 생성 및 관리
QuoterV2스왑 출력을 오프체인에서 시뮬레이션
Universal Router지원되는 프로토콜 전반에서 스왑 실행

지원되는 수수료 티어:

수수료 티어수수료 값Tick 간격일반적인 사용 사례
0.05%50010스테이블 또는 높은 상관관계의 페어
0.30%300060대부분의 표준 페어
1.00%10000200고변동성 또는 롱테일 자산

V3 풀 생성:

function createPool(
address tokenA,
address tokenB,
uint24 fee
) external returns (address pool);

풀이 생성된 후에는 유동성을 추가하기 전에 초기 가격으로 초기화해야 합니다.

function initialize(uint160 sqrtPriceX96) external;

집중 유동성 추가:

개발자는 포지션을 생성하기 위해 NonfungiblePositionManager.mint를 사용해야 합니다. 포지션은 ERC-721 NFT로 표현됩니다.

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

function mint(MintParams calldata params)
external
payable
returns (
uint256 tokenId,
uint128 liquidity,
uint256 amount0,
uint256 amount1
);

통합 참고 사항:

  • 포지션을 민팅하기 전에 사용자는 두 토큰의 사용에 대해 NonfungiblePositionManager를 승인해야 합니다.

  • tickLowertickUpper는 풀의 tick 간격과 일치해야 합니다.

  • 사용자를 슬리피지로부터 보호하기 위해 amount0Minamount1Min을 설정해야 합니다.

  • 가격 범위가 좁을수록 자본 효율은 높아지지만 포지션이 비활성화될 가능성도 높아집니다.

포지션 관리

BDEX V3 LP 포지션은 NonfungiblePositionManager에 의해 관리됩니다. 각 포지션은 고유한 토큰 페어, 수수료 티어, 가격 범위, 유동성 양, 누적 수수료를 가진 NFT입니다.

일반 포지션 작업:

function increaseLiquidity(IncreaseLiquidityParams calldata params)
external
payable
returns (uint128 liquidity, uint256 amount0, uint256 amount1);

function decreaseLiquidity(DecreaseLiquidityParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);

function collect(CollectParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);

function burn(uint256 tokenId) external payable;

포지션 생명 주기:

  1. Mint(민팅) — 새로운 집중 유동성 포지션 NFT를 생성합니다.

  2. Increase Liquidity(유동성 추가) — 기존 포지션에 유동성을 추가합니다.

  3. Decrease Liquidity(유동성 감소) — 포지션에서 유동성의 일부 또는 전부를 제거합니다.

  4. Collect Fees(수수료 수령) — 누적된 스왑 수수료를 청구합니다.

  5. Burn(소각) — 모든 유동성과 수수료를 제거한 후 NFT를 파기합니다.

수수료 수령 참고 사항:

  • V3 수수료는 LP의 지갑으로 자동 전송되지 않습니다.

  • LP는 누적된 수수료를 청구하기 위해 collect를 호출해야 합니다.

  • 수수료는 포지션이 활성 상태일 때, 즉 현재 풀 가격이 선택한 tick 범위 내에 있을 때만 누적됩니다.

  • 유동성을 제거해도 모든 수수료가 자동으로 수령되지는 않습니다. 애플리케이션은 필요할 때 collect를 호출해야 합니다.