메인 콘텐츠로 건너뛰기

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 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →

두 가지 서로 다른 개념

가격 임팩트슬리피지는 UI에서 자주 혼동되지만 서로 다른 의미입니다.
  • 가격 임팩트는 특정 풀 상태에서 거래를 체결할 때의 결정론적 특성입니다. (Δin, reserves)가 주어지면, 거래를 제출하기 전에 가격 임팩트를 완전히 계산할 수 있습니다.
  • 슬리피지는 견적 시점에서 예상했던 가격과 체결 시점에서 실제로 받은 가격 간의 실현된 차이입니다. 이는 지연 시간, 동시 거래, 블록 포함 순서의 함수이며, 풀 수학의 함수가 아닙니다.
다른 거래가 없는 풀에서 1% 견적은 다음 블록에 포함되면 0% 슬리피지를 가집니다. 그 1%는 가격 임팩트였던 것입니다. 다른 거래가 먼저 풀을 거래하면, 같은 견적은 0.2% 더 안 좋은 가격에 체결됩니다. 그 추가 0.2%가 슬리피지입니다.

정식 정의

가격 임팩트

p_before = pool.spot_price()
p_after  = pool.spot_price_if_trade(Δin) applied
impact   = (p_before − p_after) / p_before       // can be signed
CPMM의 경우: 소규모 거래에 대해 impact ≈ 2 · Δin / reserve_in입니다. CLMM의 경우: 거래가 넘는 틱의 개수에 따라 다릅니다. 종종 현재 틱 범위 내에서는 평탄하고, 각 틱 경계를 넘을 때 급변합니다.

실현된 슬리피지

quoted_out = amount_out computed at quote time
actual_out = amount_out observed on-chain
slippage   = (quoted_out − actual_out) / quoted_out
슬리피지는 항상 0 이상입니다 (견적이 정직했다고 가정). 음수 값은 견적보다 받았다는 의미이며, 이는 견적 시점과 체결 시점 사이에 풀 상태가 당신에게 유리하게 움직였을 경우 가능합니다.

minAmountOutmaxAmountIn 결정

모든 Raydium 스왑은 슬리피지 보호 경계를 사용합니다:
  • SwapBaseInput(amount_in, min_amount_out) — 정확한 입력, 출력의 하한.
  • SwapBaseOutput(max_amount_in, amount_out) — 정확한 출력, 입력의 상한.
SDK는 다음과 같이 계산합니다:
const computed = raydium.<pool_type>.computeAmountOut({
  poolInfo,
  amountIn,
  mintIn,
  mintOut,
  slippage: 0.005,     // 0.5% tolerance
});

// computed.amountOut         — the "expected" quote
// computed.minAmountOut      — amountOut × (1 − slippage), used as the on-chain bound
// computed.priceImpact       — deterministic, pool-state-only
// computed.fee               — total fee charged (all components summed)
슬리피지 허용도는 가격 임팩트 자체가 아니라, 가격 임팩트 주변의 버퍼입니다. 0.5% 허용도는 “내 견적보다 최대 0.5% 더 나쁜 가격을 받아들인다”는 의미이며, 이는 가격 임팩트가 0.01% (아주 작은 거래)였는지 2% (큰 거래)였는지 무관합니다. 2% 가격 임팩트 거래에 0.5% 허용도가 있다면, minAmountOut은 거래 전 스팟 가격보다 2.5% 낮습니다. 즉, 임팩트와 허용도의 합입니다.

권장 슬리피지 허용도

정답은 없으며, 올바른 경계는 다음에 따라 다릅니다:
  1. 거래 쌍의 안정성. 스테이블코인-스테이블코인 풀은 0.1%을 안전하게 사용할 수 있습니다. 변동성 높은 밈 토큰 쌍 풀은 안정적으로 체결되려면 보통 3–5%가 필요합니다.
  2. 거래 규모. 더 큰 거래는 더 큰 가격 임팩트를 가지므로, 거래 복귀를 피하기 위해 허용도를 그에 맞춰 확대해야 합니다. SDK의 자동 슬리피지 기본값이 max(0.5%, 2 × price_impact) 정도인 이유가 이것입니다.
  3. 블록 포함 지연. 멤풀에 여러 블록 동안 머물러 있는 거래는 더 많은 동시 거래에 노출됩니다. Jito 번들과 우선 수수료는 이를 감소시킵니다.
일반적인 규칙 (Raydium UI 기본값):
거래 쌍 유형기본 허용도
스테이블-스테이블 (USDC-USDT, USDC-USDS)0.1%
스테이블-주요 (USDC-SOL, USDC-BTC)0.5%
주요-주요 (SOL-BTC, SOL-ETH)1%
변동성 높음 (밈 토큰, 유동성 낮은 롱테일)3–5%

AMM 종류별 차이점

CPMM

가격 임팩트는 부드럽고 연속적입니다 (폐쇄형 2 · Δin / reserve_in). 슬리피지 허용도는 거래 규모에 따라 선형으로 확대됩니다.

AMM v4

CPMM과 같은 곡선 수학이지만, “유효 준비금”에는 풀의 OpenBook에 게시된 리미트 주문이 포함됩니다. 실제로는:
  • 원시 자산 잔액으로 견적하면 준비금을 저평가하고 따라서 임팩트를 과대평가합니다.
  • SDK는 AmmInfo를 가져와 vault + on_book.free + on_book.locked를 더해서 올바른 수를 얻습니다.
  • 오래된 OpenBook 상태 (크랭크 차단)는 견적 임팩트가 온체인 현실과 다르게 나타나게 할 수 있습니다. 애그리게이터는 보통 큰 AMM-v4 거래 전에 (권한 없는 MonitorStep으로) 미리 크랭크합니다.

CLMM

가격 임팩트는 구간별입니다. 현재 틱 범위 내에서는 임팩트가 Δin / L에 대해 대략 선형입니다. 틱 경계를 넘으면 L이 이산적으로 변하면서 한계 가격이 급격히 뛸 수 있습니다. 희소하게 분포된 여러 틱을 넘는 거래는 2 · Δin / reserve 경험칙이 제시하는 것보다 훨씬 큰 임팩트를 가질 수 있습니다. SDK의 CLMM 견적은 스왑 단계를 결정론적으로 반복하여 정확한 예상 amountOut을 반환하므로, minAmountOut = amountOut · (1 − slippage)는 정확합니다. 하지만 priceImpact 반환값은 “거래 전 스팟과 거래 후 스팟 간의 스프레드”로 해석해야 하며, CLMM에서는 amount_out만 신경 쓰는 사용자의 유효 슬리피지보다 훨씬 클 수 있습니다.

LaunchLab 곡선

CPMM과 유사하지만 비대칭 곡선 (이차 또는 가상 준비금) 사용. 곡선이 졸업을 향해 가팔라지면서 후기 구매자의 임팩트가 더 빠르게 증가합니다. 구매자 UI는 한 트랜잭션에서 곡선을 quote_reserve_target의 ~5% 이상 밀어낼 것으로 예상될 때 경고해야 합니다.

MEV 고려사항

솔라나에서 스왑에 대한 MEV 추출은 대부분 샌드위치 공격 형태입니다: 봇이 당신의 거래 다음에 거래하는 백런 트랜잭션과, 먼저 거래하는 프런트런 트랜잭션을 모두 같은 슬롯에 배치합니다. 당신의 거래는 샌드위치가 없었을 경우보다 더 나쁜 가격에 체결되고, 백런이 그 차이를 취합니다. 완화 방법:
  1. 타이트한 minAmountOut. 공격적인 슬리피지 경계는 피해 트랜잭션이 심하게 샌드위치당할 경우 복귀하도록 하여 자금을 보호합니다 (하지만 가스 낭비). 솔라나에서는 표준 관행입니다. 거부는 비쌉니다.
  2. Jito 번들. Jito를 통해 번들된 팁과 함께 제출하면 중개인이 트랜잭션 순서를 바꾸지 못하게 합니다. 번들은 원자적 블록으로 도착합니다.
  3. 우선 수수료. 높은 우선 수수료는 당신의 거래가 샌드위처가 반응하기 전에 현재 리더의 블록에 포함될 확률을 증가시킵니다. 번들보다는 덜 강력하지만 더 표준적입니다.
  4. 프라이빗 RPC. 프라이빗 RPC (또는 검증자의 직접 엔드포인트)를 통해 제출하면 멤풀 샌드위처가 당신의 거래를 관찰할 수 있는 시간을 줄입니다.
Raydium SDK는 번들링을 하지 않습니다. 통합자는 보통 그 위에 Jito를 계층화합니다. integration-guides/routing-and-mev에서 패턴을 확인하세요.

다중 홉 라우트의 슬리피지

스왑이 여러 풀을 통해 라우팅될 때 (예: USDC → SOL → RAY), 슬리피지 허용도는 끝에서만이 아니라 홉별로 적용해야 합니다:
// Bad: 0.5% applied at the end only, so any intermediate hop sliding fails the second hop.
const finalMin = finalAmount * (1 - 0.005);

// Better: each hop enforces its own bound.
const hop1Min  = hop1Amount * (1 - 0.005);
const hop2Min  = hop2Amount * (1 - 0.005);
// End-to-end this is tighter (compound), but atomic — if either hop degrades, the tx reverts early.
SDK의 라우터는 raydium.trade.swap을 호출할 때 홉별 경계를 자동으로 적용합니다. 커스텀 라우터의 경우 이 패턴을 복제하세요.

사용자에게 보고

좋은 스왑 UI를 위한 일반적인 규칙:
  • 예상 가격 임팩트와 슬리피지 허용도를 모두 따로 표시하세요.
  • 가격 임팩트가 ~2%를 초과하면 강조하세요. “높은 임팩트” 경고.
  • 가격 임팩트가 허용도를 초과하면 강조하세요. 거래는 거의 확실히 복귀할 것입니다.
  • 변동성 높은 쌍의 경우, “높은 슬리피지 모드”를 제공하여 경계를 완화하고 더 강한 경고를 표시하세요.

참고 자료

출처:
  • Raydium SDK v2 슬리피지 / 임팩트 구현.
  • Flashbots / Jito on Solana MEV.