메인 콘텐츠로 건너뛰기
이 페이지는 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 좌표 (코인 측 금액, 스케일됨)
  y: u64,      // Y 좌표 (PC 측 금액, 스케일됨)
  price: u64,  // price = x/y, 승수로 스케일됨
}
현재 풀 리저브(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)
결과는 테이블 포인트를 부드럽게 연결하는 구간별 선형 곡선입니다.

스케일링: 승수

풀 리저브와 가격은 다른 스케일로 저장됩니다. ModelDataInfomultiplier 필드가 이를 처리합니다. 일반적인 패턴:
  • 코인은 6자리 소수, PC는 18자리 소수입니다.
  • 승수 = 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 미결제 주문을 보유하지 않았으므로 먼저 정산할 것이 없습니다. 볼트 잔액이 전부입니다. (2026-06-22 업그레이드에서 남은 마켓 코드를 제거했습니다.)

수수료 적용

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 토큰 보유자에게 이익을 줍니다.

풀 자산 회계

공식은 역사적으로 풀이 OpenBook OpenOrders 계정에 보유한 자금을 추가했습니다. 풀이 주문 게시를 중단한 이후 실제로는 0이었으며, 2026-06-22 업그레이드에서 공식에서 완전히 제거되어 볼트 전용 계산만 남겼습니다:
이전: total assets = vault balances + open-order funds (native_coin_total / native_pc_total) − pending PnL (need_take_pnl)
신규: total assets = vault balances − pending PnL (need_take_pnl)
이것은 곡선 수학이 유효 리저브로 취급하는 값입니다(누적되었지만 스윕되지 않은 need_take_pnl 부분은 물리적으로 볼트에 있지만 가격 책정에서 제외됩니다). 이전에 OpenOrders 잔액을 읽던 견적 코드와 인덱서는 해당 항목을 제거해야 합니다.

MonitorStep (제거됨)

MonitorStep은 미결제 OpenBook 채우기를 정산하고, AmmInfo.target_orders를 재계산하고, 조회 테이블에서 파생된 지정가 주문 그리드를 다시 게시하는 크랭크 명령어였습니다. 풀은 수년 전에 OpenBook에 주문 게시를 중단했으므로 크랭크는 할 일이 없었습니다. 2026-06-22 업그레이드에서 제거되었습니다. 통합자는 Stable 풀을 크랭크할 필요가 없습니다.

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

조회 테이블 + 보간 설계는 효율적이고 유연합니다:
  • 효율성: 이진 검색은 O(log 50,000) ≈ 16회 반복이며, 각각 약 300–500 CU입니다. 보간은 몇 번의 곱셈/나눗셈입니다. 총 견적 비용은 약 5k–15k CU로, 모든 스왑에서 공식을 재계산하는 것보다 훨씬 저렴합니다.
  • 유연성: 관리자는 모든 구간별 선형 곡선을 인코딩할 수 있습니다. 스테이블코인 쌍은 1:1 주변에서 높은 밀도를 얻습니다. 담보 쌍은 사용자 정의 곡선을 얻습니다.
  • 자체 포함 유동성: 모든 자금은 풀 볼트에 있으며 가격 책정은 직접 읽습니다. 크랭크 없음, 외부 오더북 없음, 거래당 더 적은 계정.
보간 로직에 대한 심화 학습은 raydium-stable/program/src/state.rs, 메서드 get_data_by_x, get_data_by_y, get_dy_by_dx_base_in 등을 참조하세요.

다음 단계

  • 계정ModelDataInfoDataElement 필드 참조.
  • 명령어 — 호출 가능한 집합(스왑, 입금, 출금, WithdrawPnl)과 제거된 명령어.
  • 수수료 — 수수료 적용과 WithdrawPnl.
  • products/amm-v4/math — OpenBook 수수료 포함 주문 가격 책정 로직.
출처:
  • raydium-stable/program/src/state.rs (보간 및 이진 검색 구현)
  • raydium-stable/program/src/math.rs (계산기 유틸리티)