이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
2026-07 프로그램 업그레이드 이후, AMM v4의 OpenBook / Serum 의존성이 제거되었습니다. 레거시 v1
SwapBaseIn / SwapBaseOut, Deposit, Withdraw 명령어는 이전 계정 레이아웃을 유지하여 하위 호환성을 보장합니다. 마켓 계정은 여전히 이전 위치에서 수락되지만 더 이상 검증되거나 사용되지 않습니다 (CPI가 발행되지 않음). 새로운 통합은 마켓 계정을 완전히 생략하는 V2 스왑 진입점을 사용해야 합니다. 여러 명령어가 제거되었으며 이제 되돌아갑니다. 변경 로그 항목을 참조하세요. 아래 계정 목록은 Raydium SDK의 필드 이름을 사용합니다. 기본 IDL은 때때로 serum_* 접두사를 사용합니다.2026-09 프로그램 업그레이드는 하나의 관리자 명령어 WithdrawExcessLamports (태그 18)를 추가하고 CreateConfigAccount에서 rent sysvar를 제거합니다. 거래자나 LP가 호출하는 모든 것은 변경되지 않습니다. 2026-09-09 변경 로그 항목을 참조하세요.명령어 목록
SDK는 사용자 대면 명령어에 대한 빌더만 노출합니다. 유지보수 명령어는 일반적으로 Raydium 키퍼에 의해 호출됩니다.
제거됨 / 더 이상 호출 불가 (클라이언트 빌더 삭제됨):
Initialize (태그 0, Initialize2 사용), MonitorStep (2), MigrateToOpenBook (5), WithdrawSrm (8), PreInitialize (10, Initialize2 사용), SimulateInfo (12), AdminCancelOrders (13).
이러한 태그 중 하나를 포함하는 트랜잭션은 실패합니다. 프로그램은 명령어를 실행하지 않습니다. 이 일곱 개를 모두 처리할 오류 경로가 아닌 제거된 것으로 취급하세요.
Initialize2
기존 OpenBook 마켓에 바인딩된 새로운 AMM v4 풀을 부트스트랩합니다.
인자
W, 서명자 S)
수락되는 두 가지 레이아웃. 위의 19개 계정 목록이 권장 레이아웃입니다. 하위 호환성을 위해
프로그램은 21개 계정의 레거시 레이아웃도 읽으며, 이는 위치 7에 무시되는
amm_open_orders와
위치 16에 무시되는 market_program을 삽입합니다 — 저장소 내 initialize2 명령어 빌더가
여전히 내보내는 것이 바로 이것입니다. 그 외의 길이는 레거시 레이아웃에 대해 위치상으로
파싱되어 실패합니다.- 생성자에게 발행되는 LP =
sqrt(init_coin_amount × init_pc_amount) − 10^coin_mint.decimals. LP 소수 자릿수는coin_mint.decimals와 같으므로 차감되는 양은 정확히 온전한 LP 토큰 한 개입니다. 이는 절대 발행되지 않으며 영구적으로 유통에서 제외됩니다.sqrt(...)가 그보다 작으면 명령어는InitLpAmountTooLess로 복귀합니다. AmmInfo.lp_amount는 발행된 양이 아니라 전체sqrt(...)를 저장합니다 — 따라서lp_mint.supply는amm.lp_amount보다 영구적으로 온전한 LP 토큰 한 개만큼 작습니다. 모든 비례 계산은amm.lp_amount를 사용합니다.- OpenBook 주문이 게시되지 않습니다 (주문서 그리드가 제거됨).
AmmInfo.market은 슬롯 15에서 전달된 계정을 기록하지만,AmmInfo.open_orders와AmmInfo.market_program은 둘 다Pubkey::default()로 기록되며,coin_lot_size/pc_lot_size/min_size는0으로 초기화됩니다. 레거시 21개 계정 레이아웃에서는 추가된amm_open_orders와market_program계정이 읽힌 뒤 폐기됩니다.
InvalidCoinMint (coin과 pc 민트가 동일), InvalidConfigAccount (잘못된 amm_config PDA), InvalidFee (잘못된 풀 생성 수수료 목적지), InvalidProgramAddress (잘못된 amm_authority 또는 잘못된 nonce), RepeatCreateAmm (이 마켓에 이미 풀이 존재), InitLpAmountTooLess, InvalidSupply (초기 금액 중 하나가 0이거나 LP 민트에 이미 공급량이 있음), AlreadyInUse.
Deposit
유동성을 추가합니다.
인자
수학 — 표준 비례. 풀의 유효 준비금 (금고 + 장부)을 사용하여 SDK는 주어진 LP 양을 생성하는 coin/pc 쌍을 계산하고
max_*에 대해 확인합니다. 어느 쪽이든 한도를 초과하면 ExceededSlippage로 되돌아갑니다.
Withdraw
LP를 소각하고 양쪽을 수령합니다.
인자
더 이상 OpenBook에서 정산하는 단계가 없습니다 — 비례 수학은 금고 잔액을 직접 사용합니다.
SwapBaseIn
정확한 입력 스왑. 항상 AMM 경로 스왑입니다 (OpenBook 매칭을 통해 라우팅하지 않음).
새 코드에는 V2 변형을 사용하세요. AMM v4의 OpenBook 의존성이 제거되었으므로 V1 진입점 (
SwapBaseIn, SwapBaseOut)은 여전히 전체 17개 계정 목록 (또는 선택적 target-orders 계정 포함 18개)을 예상하지만 OpenBook/마켓 계정은 이제 위치적으로 수락되고 무시됩니다. 검증되지 않으며 CPI가 발행되지 않습니다. 잘못된 계정 개수를 전달하면 여전히 WrongAccountsNumber로 되돌아가지만 마켓 계정 내용은 더 이상 확인되지 않습니다. 새로운 통합은 SwapBaseInV2 / SwapBaseOutV2를 사용해야 하며, 이는 훨씬 더 작은 계정 목록을 사용하고 오늘날의 정규 실행 경로를 나타냅니다. V1 형식은 완전성을 위해 그리고 기존 온체인 트랜잭션을 읽기 위해 여기에 문서화되어 있습니다.
수학 —
products/amm-v4/math를 참조하세요.
사전 조건
AmmStatus::from_u64(amm.status).swap_permission()이 true입니다 — 즉,status가1(Initialized),6(SwapOnly) 또는7(WaitingTrade)입니다.status는 비트마스크가 아니라 열거형 값입니다.products/amm-v4/accounts를 참조하세요.amm.state_data.pool_open_time <= now.amount_in > 0.user_source_token_account는 최소amount_in을 보유합니다.
- 사용자는 소스 토큰
amount_in을 잃고 대상 토큰amount_out ≥ minimum_amount_out을 얻습니다. - 스왑 수수료는 금고에 남아 불변식
k를 높입니다.need_take_pnl_*카운터는 스왑에서 건드려지지 않습니다 — 프로토콜 PnL은 다음Deposit,Withdraw또는WithdrawPnl(Processor::calc_take_pnl)에서k델타로부터 다시 계산됩니다. - 참고:
state_data.swap_*_in_amount/swap_*_out_amount분석 카운터는 더 이상 업데이트되지 않습니다. 값이 고정됩니다. 거래량 분석을 위해 거래 로그를 사용하세요.
ExceededSlippage, InvalidInput, InvalidStatus, NotAllowed (coin/pc mint 동일).
SwapBaseOut
정확한 출력, SwapBaseIn의 역함수. 동일한 계정.
인자
SwapBaseInV2 / SwapBaseOutV2
OpenBook 계정을 완전히 건너뛰는 변형 스왑 진입점 (태그 16 / 17). 수학은 V1 경로와 동일하지만 계정 목록은 AMM 측과 사용자만으로 축소됩니다. 8개 계정, amm_open_orders는 전달되지 않습니다:
풀 준비금은 이제 금고 잔액 (미결제 PnL 제외)이므로 견적 수학은 간단하고 v1 경로와 동일합니다. V2를 사용하여 계산을 절약하고 (이제 무시되는) 마켓 계정을 전달하지 않도록 하세요. Raydium 라우터는 AMM v4를 통해 라우팅할 때 항상 V2 형식을 사용합니다.
인자는 V1 형식과 동일합니다 (
SwapBaseInV2의 경우 amount_in / minimum_amount_out; SwapBaseOutV2의 경우 max_amount_in / amount_out).
MonitorStep 및 기타 제거된 명령어
역사적으로 MonitorStep은 풀의 OpenBook 상호작용을 크랭크했습니다. 채워진 주문을 정산하고 (OpenBook CPI를 통해 마켓 금고에서 풀 금고로 수익 이동), 오래된 주문을 취소하고, target_orders와 amm_open_orders 사이의 간격을 좁히기 위해 새 주문을 게시했습니다. OpenBook 의존성이 제거되면서 크랭크할 것이 없어졌고 명령어가 제거되었습니다. 여전히 호출하는 키퍼나 통합은 호출을 제거해야 합니다.
WithdrawPnl / TakePnl
누적된 프로토콜 수수료의 관리자 수거.
인자
WithdrawPnl은 인자를 취하지 않습니다.need_take_pnl_*를 읽고 정확한 양을 이동합니다.
효과
pool_coin_token_account에서pnl_coin_token_account로need_take_pnl_coin을 전송합니다.- pc도 동일합니다.
need_take_pnl_coin과need_take_pnl_pc를 0으로 설정합니다.- 논리 변경: 금고 잔액이 누적된 PnL을 충당하기에 부족하면 명령어는
TakePnlError를 직접 반환합니다 (더 이상 주문서 상태를 조작하지 않음).
SetParams
Raydium 멀티시그에서 호출하는 관리자 매개변수 변경. 인자는 param: u8 태그 + 페이로드입니다.
CreateConfigAccount / UpdateConfigAccount
프로그램 수준 AmmConfig PDA (시드 ["amm_config_account_seed"])의 관리자 관리. 이 계정은 의미 있는 필드를 정확히 세 개 — pnl_owner, cancel_owner, create_pool_fee — 그리고 예약된 패딩 영역 두 개를 보유하며, 풀 생성 플래그는 없습니다. UpdateConfigAccount는 param = 0으로 pnl_owner, param = 1로 cancel_owner, param = 2로 create_pool_fee를 설정합니다.
2026-09에서 변경되었으며 하위 호환성 유지.
CreateConfigAccount는 더 이상 rent sysvar를 읽지 않습니다. 계정 목록은 이제 4개 계정으로 5개에서 축소되었습니다:프로그램은 전달된 sysvar 계정을 역직렬화하는 대신
Rent::get()에서 rent 매개변수를 읽습니다. Solana 3.0 의존성 범프가 자연스럽게 만든 것입니다.제거된 계정은 목록의 마지막이었으며 핸들러는 길이 확인 없이 next_account_info를 통해 위치적으로 계정을 읽습니다. 따라서 여전히 이전 5개 계정 목록을 전달하는 기존 관리자 도구는 계속 작동합니다. 후행 rent 계정은 단순히 읽혀지지 않습니다. 편할 때 업데이트하세요. 긴급하지 않습니다. UpdateConfigAccount는 변경되지 않습니다.Initialize2는 위치 3에서 rent sysvar를 유지하며 여전히 사용합니다. 프로그램은 더 이상 Rent::from_account_info를 호출하지 않지만 풀의 금고와 LP mint를 생성하는 spl_token::initialize_account 및 initialize_mint CPI로 전달됩니다. 계정 목록에서 제거하지 마세요.
WithdrawExcessLamports
프로그램이 제어하는 계정에서 rent 최소값 이상의 lamport를 수거하는 관리자 수거. 2026-09 업그레이드에서 추가되어 SIMD-0437 rent 감소가 각 단계 전에 생성된 계정에 남기는 과다 자금을 복구합니다.
초과분만 이동합니다. 토큰 잔액, 계정 데이터, 소유자, 풀 상태는 변경되지 않으며 명령어는 이미 최소값에 있는 계정에서는 작동하지 않습니다. 따라서 반복적으로 그리고 각 롤아웃 단계 후에 다시 실행하는 것이 안전합니다.
인자 — 없음. 페이로드는 단일 태그 바이트 18입니다.
계정
각 소스 계정 처리 방식
프로그램은 소스 계정의
owner에 따라 디스패치합니다:
일반적인 오류 —
InvalidSignAccount (잘못된 서명자), InvalidSplTokenProgram (슬롯 3의 잘못된 프로그램), InvalidProgramAddress (잘못된 amm_authority), LamportsCalculateError (사용자 정의 코드 60; wSOL 왕복이 0으로 정산되지 않음), 프로그램 소유 경로에서 계정이 자신의 rent 최소값보다 적게 보유할 때 InsufficientFunds.
SDK 빌더 없음. @raydium-io/raydium-sdk-v2는 이 명령어에 대한 빌더를 제공하지 않으며 raydium-sdk-V2-demo 저장소도 마찬가지입니다. 관리자 경로입니다. 수동으로 인코딩하세요. solana-fundamentals/rent-and-reclaimable-rent의 지갑 측 수거가 토큰 프로그램 명령어에 대해 하는 방식처럼.
상태 변경 매트릭스
OpenBook 열이 없습니다. 더 이상 어떤 명령어도 주문서를 건드리지 않습니다.다음 단계
products/amm-v4/code-demos— 스왑 및 LP 흐름에 대한 TypeScript 예제.products/amm-v4/fees—WithdrawPnl세부 사항 및 수수료 분할.reference/error-codes— 전방 참조 테이블 (AMM v4 오류는 해당 페이지에 나열됨).
- Raydium AMM 프로그램 —
raydium-io/raydium-amm - Raydium SDK v2
Liquidity모듈 - OpenBook 프로그램 — 마켓 측 계정 검증

