Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →

불변식

풀은 coin_reserve × pc_reserve = k를 유지합니다. (2026-07 OpenBook 제거 이후):
주목할 두 가지 사항:
  1. 리저브는 이제 볼트 전용입니다. 과거의 오픈 오더 항목(풀이 OpenBook 지정가 주문으로 예치한 토큰)은 제거되었습니다. 실제로는 제거 훨씬 전부터 0이었습니다. 온체인 볼트 잔액에서 직접 k를 계산할 수 있습니다.
  2. PnL 누적(need_take_pnl_*)은 빼므로 관리자가 수수료를 회수할 때 곡선이 보존됩니다. CPMM의 protocol_fees_* 제외와 같은 원리입니다.
프로그램은 calc_total_without_take_pnl_no_orderbook을 통해 이를 계산합니다. (과거의 오더북 인식 변형은 제거됨) 모든 Swap* 작업은 LP의 수수료 몫을 리저브에 다시 더한 후 k' ≥ k를 강제합니다.

수수료 규칙

AMM v4는 CPMM/CLMM의 1/1_000_000 규칙 대신 비율 수수료(분자/분모 쌍)를 사용합니다. 온체인 Fees 구조체(프로그램 소스의 Fees::initialize 참조)의 기본값은:
해석 (공개된 메인넷 기본값):
  • 총 스왑 수수료: swap_fee = amount_in × 25 / 10_000 = 0.25% (총 입력의).
  • 프로토콜 몫: pnl_numerator / pnl_denominator = 12 / 100 = 12% 스왑 수수료의, 즉 0.25% × 12% = 0.03% (거래량의). 이 몫은 PnL 카운터에 누적되고 WithdrawPnl로 회수됩니다.
  • LP 몫: 스왑 수수료의 나머지 88%, 즉 0.25% × 88% = 0.22% (거래량의). 풀에 남아 k를 증가시킵니다.
  • 펀드 몫 없음. AMM v4는 CPMM/CLMM의 펀드 수수료 분할이 없습니다.
pnl_numerator / pnl_denominator는 거래량이 아닌 수수료의 분수입니다. 이는 이 필드 이름의 흔한 오독입니다. trade_fee_numerator / trade_fee_denominator (역시 25 / 10_000)는 과거에 OpenBook 통합이 AMM의 지정가 주문 그리드에 대한 수수료 포함 가격을 계산할 때 사용했습니다. OpenBook 코드가 제거되었으므로 이 필드는 유물입니다. 활성 스왑 수수료는 swap_fee_*입니다. 이러한 기본값에서의 편차는 드물지만 소수의 레거시 풀에 존재합니다. 항상 견적을 제시하기 전에 AmmInfo.fees에서 수수료를 읽으세요.

직접 스왑 수학 (AMM 경로)

가장 간단한 경우: 사용자가 OpenBook과 상호작용하지 않고 풀의 볼트에 대해 스왑합니다. 풀의 내부 리저브(온체인 할당 포함)가 분모입니다. SwapBaseIn (정확한 입력):
여기서 사용되는 리저브는 볼트 잔액(누적 PnL 제외)입니다. 과거에는 공식이 AMM이 OpenBook 주문에 잠근 토큰도 더했습니다. 그 항목은 제거되었습니다. 유효 리저브는 이제 원본 볼트 잔액에서 미결 PnL을 뺀 값과 같습니다. OpenBook 측을 새로고침하던 MonitorStep / 암시적 정산 경로는 제거되었습니다. SwapBaseOut (정확한 출력):

오더북 상호작용 (과거)

제거됨. 이 섹션에서 설명하는 그리드 구성은 AMM v4가 원래 곡선을 OpenBook 마켓에 어떻게 미러링했는지를 반영합니다. OpenBook 통합 — MonitorStep 크랭크 및 build_orders 그리드 로직 포함 — 은 프로그램에서 제거되었습니다 (2026-07 업그레이드). 아래 수학은 온체인 target_orders / amm_open_orders 계정이 과거에 어떤 크기로 할당되었는지에 대한 역사적 맥락으로만 보존됩니다.
사용자 스왑과 별도로 AMM v4는 과거에 OpenBook 마켓에 그리드 형태의 지정가 주문을 배치했습니다. 그리드는 AmmInfo 매개변수에서 계산되었습니다:
  • depth — 한쪽당 가격 수준의 개수.
  • amount_wave — 수준당 기본 크기 단위.
  • min_size, coin_lot_size, pc_lot_size — OpenBook 마켓 제약.
  • state_data.swap_acc_coin_fee, swap_acc_pc_fee — 마지막 TakePnl 이후의 누적 수수료 카운터.
프로그램은 현재 곡선 가격에서 일정한 비율 단계로 나가면서 수준별 가격을 도출합니다:
정확한 가격과 크기는 build_orders에서 계산된 target_orders에 의해 결정되고 각 MonitorStep에서 amm_open_orders와 비교됩니다. 모든 차이는 취소 + 새로운 게시로 이어집니다. OpenBook에서 새로 체결된 주문은 OpenBook 측을 새로고침하는 다음 작업에서 풀 볼트로 정산됩니다. 통합자는 그리드를 계산할 필요가 거의 없습니다 — Raydium 키퍼가 유지합니다 — 하지만 다음을 아는 것이 유용합니다:
  • 상당한 온체인 유동성이 있는 풀은 그 유동성이 k에 기여하며, 유휴 상태가 아닙니다.
  • 오래된 OpenBook 마켓(이벤트 큐 가득 참, 크랭크 차단)은 그리드 업데이트를 방지합니다. AMM은 다음 크랭크까지 보이는 오더북과 다른 가격을 인용할 수 있습니다.

정산 단계 (PnL)

0.03% 프로토콜 몫은 state_data.need_take_pnl_coinstate_data.need_take_pnl_pc에 누적됩니다. TakePnl은 이 금액을 볼트에서 관리자가 지정한 목적지로 이동한 후 카운터를 0으로 설정합니다. 중요한 속성: 불변식의 리저브는 항상 누적 PnL을 뺀 상태로 계산되므로 TakePnl은 곡선을 이동하지 않습니다. 이는 CPMM 규칙과 일치합니다.

작동 예제

풀 상태:
  • coin_reserve = 1_000_000_000_000 (1,000,000 코인 측; 6 소수점)
  • pc_reserve = 2_000_000_000_000 (2,000,000 pc 측; 6 소수점)
  • 수수료: 기본 swap = 25/10_000, pnl = 3/10_000.
사용자: SwapBaseIn 정확한 입력 1_000_000_000 코인 (1,000 코인).
LP 몫(2_200_000)은 어디에도 분리되지 않습니다. 단순히 k'를 증가시키는 나머지입니다.

정밀도 규칙

  • 리저브 곱셈은 u128을 사용합니다. 최종 나눗셈은 0으로 반올림합니다.
  • swap_fee는 올림합니다 (풀이 과소 청구하지 않도록).
  • SwapBaseOutamount_in은 올림합니다 (사용자가 과소 지불하지 않도록).
  • 극단적인 리저브 비율을 가진 풀은 매우 작은 입력에서 ZeroTradingTokens에 도달할 수 있습니다. CPMM과 같은 규칙입니다.

CPMM 대비 제한사항

  • AMM v4의 리저브는 이제 볼트 전용이므로 볼트 잔액(마이너스 need_take_pnl_*)에서 직접 견적을 제시할 수 있습니다. 과거의 open_orders.free / open_orders.locked 금액을 더해야 한다는 요구사항은 더 이상 적용되지 않습니다. SDK / API 견적이 여전히 가장 간단한 옵션입니다.
  • AMM v4는 구조화된 온체인 TWAP를 노출하지 않습니다. AMM v4 기반 가격을 원하는 외부 소비자는 거래 로그에서 직접 계산해야 합니다.
  • Token-2022는 지원되지 않습니다.

다음 단계

출처: