Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
버전 정보package.json에서 SDK 버전을 고정하세요. 본딩 곡선 인터페이스는 마이너 릴리스 간에 변경되었습니다.

설정

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

런칭 생성

소스: src/launchpad/createMint.ts (Bonk 변형의 경우 createBonkMintApi.ts) 런칭의 대부분의 경제학은 인수가 아닙니다configId를 통해 바인딩하는 GlobalConfig에서 나오며, SDK는 나머지를 API의 기본 매개변수에서 채웁니다. 민트의 신원, 바인딩할 설정, 그리고 (선택적으로) 첫 번째 매매를 전달합니다:
참고:
  • curveType, graduationFractionBps, initialK, quoteMint, openTime, fees 또는 postGraduationLpPolicy 인수는 없습니다. 곡선 형태와 quote 민트는 바인딩하는 GlobalConfig의 속성입니다; 수수료율은 GlobalConfigPlatformConfig에 있습니다; 졸업 시 LP 처리는 PlatformConfig 설정입니다. products/launchlab/instructions에서 InitializeV2가 정확히 무엇을 수용하는지 확인하세요.
  • 10자를 초과하는 symbol과 빈 uri는 모두 RPC 전에 클라이언트 측에서 거부됩니다.
  • transferFeeExtensionParams를 전달하면 빌더가 InitializeWithToken2022로 전환되고 migrateType"cpmm"으로 강제합니다.
  • 빌더는 transactions 배열을 반환합니다; createOnly: false는 첫 번째 매매 트랜잭션을 추가합니다. 항상 execute({ sequentially: true })를 사용하세요 — 민트가 존재해야 매매가 진행됩니다.

런칭 상태 조회

소스: src/launchpad/poolInfo.ts getLaunchById는 없습니다. 풀 ID는 (programId, mintA, mintB)의 PDA이며, getRpcPoolInfo는 바인딩된 configInfo가 첨부된 디코딩된 PoolState를 반환합니다:
getRpcPoolsInfo({ poolIdList })는 배치 형식이며 풀 ID로 키가 지정된 poolInfoMap을 반환합니다 — 루프 대신 포트폴리오 보기에 사용하세요. 원시 계정을 직접 디코딩하려면 LaunchpadPool.decodeLaunchpadConfig.decode가 내보내집니다.

매매 — 정확한 quote 입력

소스: src/launchpad/buy.ts 오프체인 견적 도우미는 **Curve.buyExactIn**입니다. 내보낸 Curve 클래스의 정적 메서드입니다 — raydium.launchpad의 메서드가 아닙니다. 트랜잭션 빌더는 **buyToken**입니다. 둘 다 플랫폼의 수수료율이 필요하며, 이는 별도의 PlatformConfig 계정에 있습니다:
slippage 대신 minMintAAmount를 명시적으로 전달할 수 있습니다; 둘 다 생략하면 SDK는 라이브 RPC 데이터에서 바운드를 계산합니다. shareFeeRatepoolInfo.configInfo.maxShareFeeRate를 초과할 수 없으며, shareFeeReceiver도 전달할 때만 적용됩니다.

매매 — 정확한 기본 출력

빌더는 **buyTokenExactOut**이며, 금액 인수는 outAmount (원하는 기본)과 maxBuyAmount (최대 지출할 quote)입니다. Curve.buyExactOut({ poolInfo, amountA, ... })는 일치하는 오프체인 미리보기입니다.
“정확히 X 토큰 매매” UI에 유용합니다. 빌더는 0의 outAmount를 클라이언트 측에서 거부하며, 곡선이 충분히 이동하여 quote 요구사항이 maxBuyAmount를 초과하면 프로그램이 되돌립니다.

판매

소스: src/launchpad/sell.ts 빌더는 **sellToken**입니다 (정확한 quote 출력 변형의 경우 sellTokenExactOut), sellAmount와 선택적 minAmountB가 있습니다. Curve.sellExactIn({ poolInfo, amountA, ... })는 이를 미리봅니다.
곡선의 판매 경로는 매매 경로와 대칭입니다: real_asellAmount로 줄이면 quote_outreal_a − sellAmountreal_a 사이의 곡선 아래 적분 영역에서 판매 수수료를 뺀 값과 같습니다. sellAmount는 0보다 커야 합니다 — 빌더는 RPC 전에 0을 거부합니다.

졸업

졸업은 통합자가 트리거할 수 있는 것이 아닙니다. raydium.launchpad.graduate가 없고, 매매 빌더에 autoGraduate 플래그가 없으며, 반환 값에 willGraduate 필드가 없습니다. 온체인에서 졸업은 MigrateToCpswap (또는 레거시 MigrateToAmm)이며, 둘 다 서명자를 바인딩 GlobalConfig에 기록된 지갑으로 제한합니다 — migrate_to_cpswap_walletmigrate_to_amm_wallet 각각. 다른 서명자의 호출은 InvalidOwner로 실패합니다. 허가 없는 것이 아니며, MEV 봇이 이를 경쟁할 수 없습니다.
이러한 지갑은 Raydium의 졸업 크랭크에 의해 운영되므로, 실제로는 누가 최종 매매를 했든 임계값을 넘은 후 몇 초 내에 마이그레이션이 진행됩니다. 통합자 측에서 할 수 있는 유일한 것은 상태 전환을 빠른 이벤트로 취급하는 것입니다: getRpcPoolInfo를 폴링하고 (또는 아래 gRPC를 통해 구독), status가 변경될 때 UI를 곡선에서 결과 CPMM 풀로 전환합니다. 계정 목록, 마이그레이션 수수료, 졸업 시 LP 분할 방법은 products/launchlab/instructions을 참조하세요.

크리에이터 수수료 수집

소스: src/launchpad/claimCreatorFee.ts (단일 민트) 및 collectAllCreatorFees.ts (배치) 메서드는 **claimCreatorFee**입니다 (배치 형식의 경우 claimMultipleCreatorFee). quote 민트로 키가 지정되며, 런칭이 아닙니다 — 한 번의 호출로 서명자의 해당 민트에서 런칭 전체에 걸쳐 누적된 크리에이터 수수료를 쓸어냅니다:
누적된 크리에이터 수수료 카운터를 크리에이터의 quote 민트의 ATA로 전송합니다. 졸업 전후로 호출 가능합니다; 거대한 잔액이 축적될 때까지 기다리지 말고 주기적으로 사용하세요. 플랫폼 운영자는 병렬 claimPlatformFee / claimAllPlatformFee / claimVaultPlatformFee 빌더를 가지고 있습니다.

런칭을 생명주기를 통해 추적

모두 합치면, 모니터링 스크립트는 다음과 같을 수 있습니다:
10초 타이머로 getRpcPoolInfo를 폴링하는 것은 단일 런칭에 적합합니다. 인덱서의 경우 대신 아래 gRPC 구독을 사용하세요 — getRpcPoolsInfo({ poolIdList })는 배치하지만, 수백 개의 풀을 폴링하는 것은 여전히 이점 없이 RPC 크레딧을 소모합니다.

gRPC를 통해 설정 및 풀 감시

소스: src/grpc/launchpadPoolInfo.ts Yellowstone gRPC를 통해 LaunchLab 프로그램을 구독하고 각 민트의 토큰 프로그램과 함께 모든 GlobalConfigPoolState 업데이트를 기록합니다. 한 accounts 구독에 두 개의 datasize 필터가 두 계정 유형을 분리하므로, 단일 스트림이 둘 다를 포함합니다. 데모는 런칭의 민트를 분류하기 위한 가장 짧은 올바른 참조이며, Token-2022 quote-mint 릴리스는 이를 필요하게 합니다:
  • PoolState.token_program_flag에서 직접 분류되며, 민트 조회 없이 기본 민트에 대해 bit0을, quote 민트에 대해 bit1을 디코딩합니다. 전체 바이트를 0에 대해 테스트하는 것 — quote 민트가 레거시 전용이었을 때 충분했던 — quote 민트가 Token-2022일 때마다 레거시 기본 민트를 Token-2022로 잘못 읽습니다.
  • 설정은 그런 식으로 분류될 수 없습니다: GlobalConfig는 quote 민트의 주소를 저장하고 프로그램 플래그는 없으므로, 데모는 민트 계정의 소유자를 한 번 읽고 민트당 캐시합니다.
또한 둘을 서로 교차 검사하며, 이는 자신의 인덱서에 유지할 유용한 어설션입니다. createupdate는 데모의 자체 캐시에서 추론되며, 시작 시 getProgramAccounts에서 시드됩니다; 시드가 비활성화되면 “create”를 “이 스트림에서 처음 본” 것으로 읽으세요. gRPC 액세스는 공개 RPC 표면의 일부가 아닙니다 — 데모 저장소의 src/grpc/README.md를 참조하세요.

Rust CPI

자신의 Anchor 프로그램에서 LaunchLab을 호출하는 것은 드뭅니다 (대부분의 런칭 통합은 TS 측만입니다). 그렇다면:
  • 크레이트는 **raydium-launchpad**입니다 (lib 이름 raydium_launchpad), 버전 0.2.0, cpi 기능을 노출합니다. raydium_launchlab은 없습니다.
  • crates.io에 게시되지 않습니다 — 다른 Raydium 프로그램 크레이트와 동일한 방식으로 git 리비전으로 의존합니다.
  • CPI 진입점은 SDK의 TypeScript 메서드가 아닌 온체인 명령어 이름을 따릅니다: buy_exact_in, buy_exact_out, sell_exact_in, sell_exact_out, claim_creator_fee, create_vesting_account, claim_vested_token. migrate_to_amm / migrate_to_cpswapGlobalConfig 마이그레이션 지갑에 서명자 게이트되며 통합자 프로그램에서 호출할 수 없습니다.
크레이트 고정 규칙은 sdk-api/rust-cpi를 참조하세요 — 특히 Anchor 버전 분할은 한 크레이트가 LaunchLab과 CLMM 모두에 CPI할 수 있는지 결정합니다.

함정

  • 온체인 명령어 이름과 SDK 메서드 이름을 혼동합니다. 프로그램은 buy_exact_in / sell_exact_in을 가지고 있습니다; SDK는 buyToken / sellToken을 가지고 있습니다. buyExactInsellExactInCurve의 정적 메서드로만 존재하며, 견적을 계산합니다 — 트랜잭션을 빌드하지 않습니다.
  • extraSigners 잊기. createLaunchpad는 생성하는 키페어에서 기본 민트를 생성하므로, 해당 키페어가 서명해야 합니다. extraSigners: [pair]를 생략하면 트랜잭션이 서명 검증에 실패합니다.
  • quote 민트를 선택하지 않습니다. 하나를 전달하지 않습니다. quote 민트는 configId를 통해 바인딩하는 GlobalConfig의 속성입니다 — getPdaLaunchpadConfigId(programId, quoteMint, curveType, index). 다른 quote 민트에 대해 런칭하려면 다른 설정을 바인딩하세요; raydium.api.fetchLaunchConfigs()는 기본 매개변수와 함께 사용 가능한 것들을 나열합니다.
  • 메타데이터 크기.uri 문자열은 Metaplex CPI를 예산 초과로 밀어냅니다. uri를 ~200자 이하로 유지하세요 — 대부분의 CDN 호스팅 JSON 메타데이터는 쉽게 맞습니다. symbol은 10자로 하드 캡됩니다.
  • 졸업을 경쟁할 수 있는 경쟁으로 취급합니다. 그렇지 않습니다 — 위의 경고를 참조하세요. UI는 여전히 status 전환을 빠른 이벤트로 취급해야 합니다. Raydium의 크랭크는 임계값을 넘은 후 몇 초 내에 마이그레이션을 진행하기 때문입니다.

다음 단계

소스: