메인 콘텐츠로 건너뛰기

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

조회 테이블 곡선

Stable AMM은 x·y=k 공식을 희소 조회 테이블(x, y, price 튜플)로 대체합니다. 스왑 가격을 책정할 때 프로그램은:
  1. 예약금에서 풀의 현재 비율을 계산합니다.
  2. 이진 검색으로 그 비율을 포함하는 두 항목을 찾습니다.
  3. 그 사이를 선형 보간하여 중간 가격을 얻습니다.
  4. 수수료를 적용하고 견적을 반환합니다.
이 접근 방식은 공식의 결정성을 관리자의 유연성(가격 형성)과 바꾸며, Solana의 컴퓨팅 예산에 맞출 수 있을 정도로 효율적입니다.

테이블 레이아웃 및 이진 검색

ModelDataInfo는 관리자가 인덱싱한 최대 50,000개의 DataElement 항목을 보유합니다. 처음 valid_data_count개만 활성화됩니다. 각 항목:
DataElement {
  x: u64,      // X 좌표 (coin-side 금액, 스케일됨)
  y: u64,      // Y 좌표 (pc-side 금액, 스케일됨)
  price: u64,  // price = x/y, multiplier로 스케일됨
}
현재 풀 예약금(x_real, y_real)에서 가격을 찾으려면:
  1. 비율 계산: target_ratio = (x_real * multiplier) / y_real.
  2. (element.x * multiplier) / element.ytarget_ratio를 포함하는 항목들에 대해 이진 검색.
  3. 괄호 [min_idx, max_idx]를 찾으면 보간합니다.
프로그램의 이진 검색 코드는 state.rs::ModelDataInfo::get_mininum_range_by_xy_real에서 약 150줄에 걸쳐 있습니다. 핵심 불변식: 항목이 정렬되어야 합니다(x 오름차순, y 내림차순, price 오름차순) 검색이 작동하려면.

선형 보간

두 테이블 포인트가 비율을 포함하면, 보간은 중간 가격과 예약금 쌍을 계산합니다:
target = (x_real * multiplier) / y_real

[x1, y1, p1] = table[min_idx]
[x2, y2, p2] = table[max_idx]

// 가격 보간
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// 예약금 보간
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
결과는 테이블 포인트를 매끄럽게 연결하는 구간별 선형 곡선입니다.

스케일링: multiplier

풀 예약금과 가격은 다른 스케일로 저장됩니다. ModelDataInfomultiplier 필드가 이를 설명합니다. 일반적인 패턴:
  • Coin은 6 decimals, PC는 18 decimals를 가집니다.
  • Multiplier = 10^6 (또는 유사함).
  • 테이블 항목은 u64 범위에 맞도록 축소된 스케일로 저장됩니다.
프로그램은 읽기/쓰기 시 다음을 통해 재스케일합니다:
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio

스왑 가격 책정: SwapBaseInSwapBaseOut

SwapBaseIn (정확한 입력)

입력 금액 amount_in이 주어지면:
  1. (coin_vault, pc_vault)에서 현재 비율을 얻습니다.
  2. 괄호 테이블 항목을 찾고 보간하여 테이블 공간 비율을 얻습니다.
  3. 입력을 테이블 공간으로 변환: dx_table = amount_in * multiplier / ratio.
  4. 새로운 X 좌표에서 테이블을 쿼리하여 새로운 Y를 찾습니다.
  5. dy_table = y_old - y_new.
  6. 다시 변환: dy_real = dy_table * ratio / multiplier.
  7. 거래 수수료 적용: dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator).
  8. dy_output을 반환합니다.

SwapBaseOut (정확한 출력)

대칭: 원하는 amount_out이 주어지면 필요한 amount_in을 풉니다. 두 경로 모두 먼저 채워진 OpenBook 주문을 정산합니다(내부 MonitorStep과 유사한 로직을 통해), 따라서 유효한 예약금이 이전 블록에서의 채움을 반영합니다.

수수료 적용

AMM v4와 동일: 전체 도출은 products/amm-v4/math를 참조하세요.
gross_fee = amount_in * (swap_fee_numerator / swap_fee_denominator)    // 예: 0.25%
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // 예: 0.22%
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // 예: 0.03%
pnl_portionneed_take_pnl_*로 가고 관리자가 WithdrawPnl을 통해 쓸어갑니다. lp_portion은 볼트에 남아있고 k를 증가시켜 LP 토큰 보유자에게 이익을 줍니다.

MonitorStep 및 OpenBook

AMM v4와 마찬가지로 MonitorStep크랭크 명령어로:
  1. 보류 중인 OpenBook 주문 채움을 정산합니다(토큰을 볼트에서 풀로 이동).
  2. 새로운 한정 주문 슬롯 그리드로 AmmInfo.target_orders를 업데이트합니다.
  3. 새로운 그리드를 OpenBook에 게시합니다.
그리드는 테이블에서 계산됩니다: 프로그램은 조회 테이블을 사용하여 가격 포인트를 찾고 이를 OpenBook 주문으로 변환합니다. MonitorStep의 컴퓨팅 비용: 약 150k–180k CU (AMM v4와 유사).

요약: 이것이 작동하는 이유

조회 테이블 + 보간 설계는 효율적이고 유연합니다:
  • 효율성: 이진 검색은 O(log 50,000) ≈ 16회 반복이고, 각 반복은 약 300–500 CU입니다. 보간은 몇 번의 곱셈/나눗셈입니다. 총 견적 비용은 약 5k–15k CU로, 모든 스왑에서 공식을 재계산하는 것보다 훨씬 저렴합니다.
  • 유연성: 관리자는 모든 구간별 선형 곡선을 인코딩할 수 있습니다. 스테이블코인 쌍은 1:1 주변에 높은 밀도를 얻습니다; 담보화된 쌍은 맞춤형 곡선을 얻습니다.
  • OpenBook 합성: AMM v4의 동일한 MonitorStep / TargetOrders 로직이 적용됩니다. 테이블을 통한 가격 발견이 주문 그리드 생성으로 피드됩니다.
보간 로직에 대한 심화 학습은 raydium-stable/program/src/state.rs, 메소드 get_data_by_x, get_data_by_y, get_dy_by_dx_base_in 등을 참조하세요.

다음 단계

  • 계정ModelDataInfoDataElement 필드 참조.
  • 명령어 — 테이블을 채우기 위한 InitModelData, UpdateModelData.
  • 수수료 — 수수료 적용 및 WithdrawPnl.
  • products/amm-v4/math — OpenBook 수수료 포함 주문 가격 책정 로직.
소스:
  • raydium-stable/program/src/state.rs (보간 및 이진 검색 구현)
  • raydium-stable/program/src/math.rs (계산기 유틸리티)