Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
이 코드가 하는 일. 선택한 수수료 계층에서 새로운 CLMM 풀을 생성한 후 초기 집중 포지션을 개설합니다. config.ts, createPool.ts, createPosition.ts, utils.ts 4개 파일에서 2개 트랜잭션을 npx tsx로 실행합니다. 코드는 raydium-sdk-V2-demo/src/clmm의 공식 데모에서 가져와 독립 실행 가능하도록 수정했습니다.

설정

빠른 시작 필수 조건을 읽었는지 확인하고 RPC_URL, KEYPAIR, 필요한 의존성이 설치되어 있는지 확인하세요. 빠른 시작의 의존성 외에 다음을 설치해야 합니다:
  • decimal.jscreatePool.tscreatePosition.ts의 가격 및 틱 계산.
  • bs58config.ts에서 JSON 키파일 대신 KEYPAIR_BS58을 사용할 경우 base58 인코딩된 키페어를 디코딩합니다.
  • tsxnpx tsx를 통해 아래의 .ts 파일을 직접 실행합니다. 스왑 및 CPMM 스크립트와 달리 이것은 node로 실행하는 일반 .mjs 파일이 아닙니다.
CLMM 풀 생성에는 일회성 수수료와 초기 포지션을 위한 틱 배열 렌트가 필요합니다. 또한 지갑에 두 시드 민트가 모두 필요합니다. 선택한 범위 내에 가격이 있을 때 포지션을 개설하려면 양쪽에 유동성이 필요합니다. devnet에서 실행하기. config.ts에서 cluster"devnet"으로 변경하는 것만으로는 충분하지 않습니다. createPool.ts는 명시적 programId: CLMM_PROGRAM_ID를 전달하는데, 이는 cluster를 따르지 않는 고정된 메인넷 상수입니다. 바로 위의 주석 처리된 DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID 줄로 바꾸세요. createPosition.ts도 메인넷 poolId(RAY-USDC 풀)를 하드코딩합니다. 2단계에서 생성한 devnet 풀의 ID로 바꾸세요.

1단계 — config.ts

config.ts로 저장하세요. 이것은 데모 저장소의 src/config.ts.template과 같은 형태입니다. disableFeatureChecktrue로 강제됩니다(SDK가 시작 기능 감지 호출에서 차단되지 않도록 모든 비자명한 통합에 권장됨):
config.ts

2단계 — createPool.ts

config.ts와 함께 저장하세요. 출처: src/clmm/createPool.ts.
createPool.ts

3단계 — createPosition.ts

출처: src/clmm/createPosition.ts.
createPosition.ts

4단계 — utils.ts

출처: src/clmm/utils.ts.
utils.ts

실행하기

방금 일어난 일

트랜잭션 1 — raydium.clmm.createPool 초기화:
  • (mint1, mint2, ammConfig)의 정규 PDA에서 풀 상태,
  • token_0_vaulttoken_1_vault(민트 바이트 순서로 정렬),
  • observation 링 버퍼,
  • 인라인 틱 배열 비트맵,
그리고 initialPrice에서 초기 sqrt_price_x64를 설정했습니다. 트랜잭션 2 — raydium.clmm.openPositionFromBase 집중 포지션 개설:
  • 지갑에 포지션 NFT를 발행했습니다(NFT 포지션입니다. 이를 전송하면 포지션이 전송됩니다).
  • 하한과 상한에서 틱 배열을 할당했습니다(해당 범위의 첫 포지션인 경우 일회성 렌트, 틱 배열은 프로그램에서 닫지 않으므로 같은 배열의 후속 포지션은 추가 렌트를 지불하지 않음).
  • mint1inputAmount와 일치하는 mint2 쌍 금액을 예치했습니다(PoolUtils.getLiquidityAmountOutFromAmountIn으로 계산).
  • 범위 너비에 비례하는 유동성으로 포지션을 인정했습니다.
범위가 좁을수록 TVL당 자본 효율성이 높아집니다. 그리고 가격이 범위를 벗어날 때 비영구적 손실이 더 심합니다. 위에서 사용한 범위([0.000001, 100000])는 사실상 전체 범위입니다. 현재 현물 근처의 수수료에 집중하도록 범위를 좁혀보세요.

수수료 계층 선택하기

clmmConfigs[0]은 가장 낮은 수수료 계층입니다. 전체 집합은 GET https://api-v3.raydium.io/main/clmm-config에 게시됩니다: 전체 의사 결정 매트릭스는 user-flows/choosing-a-pool-type을 참조하세요.

일반적인 오류

  • Pool already exists for this config — 이 (mint1, mint2, ammConfig) 조합에 대해 CLMM 풀이 이미 존재합니다. 기존 풀 ID를 찾아 2단계를 건너뛰세요.
  • Insufficient funds for amount B — 지갑에 요청된 mintA 금액은 있지만 일치하는 mintB는 없습니다. 가격이 범위 내에 있을 때 포지션을 개설하려면 양쪽에 유동성이 필요합니다.
  • Tick out of rangelowerPrice 또는 upperPrice가 표현 가능한 가격 범위를 벗어났습니다. 현재 가격에 상대적으로 더 합리적인 범위를 사용하세요.
  • 오래된 가격 — API의 견적은 5~60초 오래될 수 있습니다. executePosition이 슬리피지에서 실패하면 createPosition.tsgetRpcClmmPoolInfo 블록의 주석을 제거하여 서명 직전에 라이브 가격을 다시 가져오세요.

주의사항

  • 포지션 NFT가 유일한 핸들입니다. NFT를 잃거나 전송하면 포지션에 대한 접근 권한을 잃습니다. 열쇠처럼 취급하세요.
  • 범위 밖 포지션은 수수료를 얻지 못합니다. 가격이 [lowerPrice, upperPrice] 범위를 벗어나면 포지션은 완전히 한 자산에 주차되어 재조정할 때까지 아무것도 얻지 못합니다.
  • 틱 배열 렌트는 일방향입니다. 초기화되지 않은 틱 배열에 처음 접근하는 포지션이 렌트를 지불합니다. 프로그램은 틱 배열을 닫을 경로를 노출하지 않으므로 해당 렌트는 영구적입니다. 같은 배열의 후속 포지션은 무료입니다.

다음

출처: