Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
버전 정보. 모든 예제는 Solana mainnet-beta에서 @raydium-io/raydium-sdk-v2@0.2.64-alpha를 대상으로 하며, 2026-09-09 검증됨 — 아래의 모든 빌더 이름, 파라미터 이름, 파라미터 타입은 해당 릴리스의 src/raydium/farm/과 raydium-sdk-V2-demo/src/farm에 대해 확인되었습니다. SDK는 팜의 프로그램 소유자에 따라 내부적으로 v3 / v5 / v6을 디스패치하며, 아래 예제는 v6 팜을 가정합니다. 세 개의 프로그램 ID는 reference/program-addresses를 참조하세요.팜 모듈의 메서드 이름은 예상과 다릅니다: getFarmById가 없고 setRewards도 없습니다. 페칭은 raydium.api.fetchFarmInfoById를 통해 이루어지며, 보상 편집 빌더는 addNewRewardToken / addNewRewardsToken과 restartReward / restartRewards입니다.

설정

여기의 예제는 raydium-sdk-V2-demo/src/farm의 파일을 반영합니다. 부트스트랩은 데모 저장소의 config.ts.template을 따릅니다:

ID로 팜 조회

raydium.farm.getFarmById는 없습니다. 모든 팜 예제는 API 모듈에서 시작하며, 이는 deposit / withdraw / harvestAllRewards가 모두 사용하는 정규화된 FormatFarmInfoOut 형태를 반환합니다:
fetchFarmInfoById는 쉼표로 구분된 ID 문자열을 받고 배열을 반환하므로, 한 번의 호출로 전체 포트폴리오를 채울 수 있습니다. 표시 정보가 아닌 원본 계정 키가 필요한 경우, raydium.api.fetchFarmKeysById({ ids })는 볼트와 권한 PDA를 반환합니다. SDK는 아래의 모든 빌더 내에서 내부적으로 이를 호출합니다.

LP 토큰 스테이킹

출처: src/farm/stake.ts
SDK는 보류 중인 보상의 사전 정산을 처리하므로, 이 지갑이 이미 이 팜에 스테이크를 가지고 있다면, 명령어는 누적된 보상을 같은 트랜잭션에서 사용자의 ATA로 지급합니다.

청구만 (수확)

출처: src/farm/harvest.ts farmInfoList는 배열이 아니라 **팜 ID로 키된 Record**이며, 빌더는 여러 트랜잭션을 반환합니다 — 따라서 execute에 sequentially: true를 전달해야 합니다:
빌더는 1232바이트 제한이 허용하는 만큼 많은 팜을 트랜잭션당 패킹하고 나머지를 후속 트랜잭션으로 분할하므로, 단일 txId가 아닌 txIds를 반환합니다. 단일 팜의 경우, amount: 0 관용구로 수확합니다 — 이는 v6을 포함한 모든 버전에서 src/farm/harvest.ts가 수행하는 작업입니다:

언스테이킹

출처: src/farm/unstake.ts

v6 팜 생성

출처: src/farm/createAmmFarm.ts 및 editAmmFarm.ts create는 스테이킹되는 LP 민트의 풀에 대한 풀 정보 객체를 받으며 (단순 민트가 아님), rewardInfos의 각 항목은 FarmRewardInfo입니다: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. 시간은 평문 초이며, perSecond는 BN이 아닌 문자열입니다. programId는 v6 프로그램으로 기본값이 설정되므로 거의 전달하지 않습니다.
핵심 사항:
  • perSecond는 보상 민트의 원시 단위로 초당 배출 속도이며, 십진 문자열로 전달됩니다. SDK는 전송 전에 온체인 고정소수점 표현으로 패킹합니다.
  • 전체 예산 (perSecond × (endTime − openTime))은 보상 ATA에 있어야 합니다 — create는 이를 보상 볼트로 원자적으로 이동합니다.
  • Token-2022 보상 민트는 이 SDK 버전의 SDK 팜 빌더에서 지원되지 않습니다. 보상에 일반 SPL 민트를 사용하세요.
  • 한 번의 create 호출에서 최대 5개의 보상을 시드할 수 있습니다. 계정 목록은 추가 스트림당 (reward_mint, reward_vault, sender_ata, token_program)만큼 증가합니다. 1232바이트 트랜잭션 크기 제한을 인식하세요. 4개 이상의 보상의 경우, 1-2개로 생성하고 후속 트랜잭션에서 addNewRewardsToken을 사용하세요.

새로운 보상 스트림 추가

raydium.farm.setRewards는 없습니다. 팜의 보상을 변경하는 두 빌더는 addNewRewardToken / addNewRewardsToken (새로운 민트로 자유 슬롯 점유) 및 restartReward / restartRewards (스트림이 끝난 슬롯 재시작)입니다. 둘 다 create가 사용하는 것과 정확히 같은 형태의 FarmRewardInfo 객체를 받습니다.
델타 예산 (perSecond × duration)은 트랜잭션의 일부로 지급자의 ATA에서 인출됩니다. 기본 명령어는 스트림을 단축할 수 없고, 라이브 스트림에서 per_second를 낮출 수 없으며, 슬롯의 보상 민트를 변경할 수 없습니다 — 민트를 교환하려면 end_time을 기다리고 해제된 슬롯에서 addNewRewardsToken을 사용하거나, 새 팜을 생성하세요.
restartRewards와 addNewRewardsToken은 각각 빌더를 반환하므로, 단일 트랜잭션이 둘 다 수행할 수 있습니다. src/farm/editAmmFarm.ts는 패턴을 보여줍니다: editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), 그 다음 하나의 versionBuild({ txVersion }).

완료된 스트림 재시작

출처: src/farm/editAmmFarm.ts restartRewards는 newRewardInfos (복수, 배열)를 받습니다. restartReward는 단일 항목 형태이며 newRewardInfo를 받습니다. 민트 필드는 rewardMint가 아닌 mint이며, 팜에 이미 존재하는 슬롯과 일치해야 합니다 — 빌더는 민트로 슬롯을 조회하고 없으면 오류를 발생시킵니다.
restartRewards는 v6 전용입니다 — 빌더는 팜의 프로그램 ID를 읽고 v3 / v5 팜에 대해 오류를 발생시킵니다. 대상 슬롯의 reward_state == 2 (완료)일 때만 유효합니다. 호출자는 슬롯의 reward_sender여야 합니다. openTime >= endTime은 RPC가 수행되기 전에 클라이언트 측에서 거부됩니다.

Rust CPI

raydium_farm_v6 Anchor 크레이트는 없습니다. crates.io에 그 이름의 크레이트는 없으며, Farm v6 프로그램은 온체인 IDL을 게시하지 않으며 (레거시 anchor:idl 계정도 아니고 Program Metadata 프로그램의 항목도 아님), 공개 소스 저장소가 없습니다. 이 페이지의 이전 개정판은 raydium_farm_v6::cpi::deposit 예제를 보여주었습니다. 이는 어떤 것에 대해서도 컴파일되지 않았으며 제거되었습니다.
Farm v6은 2024-05-13에 마지막으로 배포되었으며 통합자의 관점에서는 Anchor 프로그램이 아닙니다. 자신의 온체인 프로그램에서 이와 구성해야 하는 경우, Instruction을 직접 구성하세요 — 계정 목록과 명령어 판별자를 독립적으로 파생시키고 (SDK의 TypeScript 레이아웃 raydium-sdk-V2/src/raydium/farm/에서 또는 실제 트랜잭션을 디코딩하여), invoke_signed합니다. 해당 절차는 sdk-api/rust-cpi를 참조하세요. 어느 경로를 택하든, remaining_accounts 꼬리는 팜의 활성 보상 슬롯과 1-대-1로 일치해야 합니다 (인덱스 순서의 reward_vault_i, user_reward_ata_i 쌍). 이들을 생략하거나 잘못 정렬하면 자동 회계 오류가 발생합니다 — 프로그램은 잘못된 금액을 전송합니다.

주의사항

  • 언스테이킹 전에 청구 잊기. 무해합니다 — Withdraw는 먼저 보류 중인 보상을 정산합니다. 하지만 UI가 “청구”를 “언스테이킹”과 별도로 표시하면, 사용자는 Withdraw 후에도 여전히 청구할 것이 있다고 생각할 수 있습니다. 없습니다. 그 시점까지 누적된 모든 것이 지급되었습니다.
  • 배출 중 total_staked = 0. 아무것도 스테이킹되지 않은 동안 누적된 배출은 몰수됩니다 (reward_per_share 업데이트 공식이 0으로 나누고 프로그램이 업데이트를 건너뜁니다). 예정된 open_time이 있는 프로그램의 경우, open_time에 “시드 스테이크”를 실행하여 이를 피하세요.
  • Token-2022 전송 수수료. Token-2022 보상 민트가 있는 v6 팜에서, 전송 수수료는 배출 시 적용됩니다 (볼트 → 사용자). 이를 APR 견적에 포함시키세요.
  • v5의 작은 per_second. v5의 u64 속도는 모든 per_second < 1 토큰 단위/초 (≥9 소수 자릿수의 민트에서 이는 종종 원하는 속도)를 표현할 수 없음을 의미합니다 — 스트림 속도는 0으로 반올림되고 팜은 아무것도 배출하지 않습니다. v6을 사용하세요.

다음 단계

출처: