Skip to main content
Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →

O que isto faz

Cria um novo pool CLMM no nível de taxa de sua escolha e abre uma posição concentrada inicial. Duas transações em quatro arquivos — config.ts, createPool.ts, createPosition.ts e utils.ts — executadas com npx tsx. O código é extraído dos demos oficiais em raydium-sdk-V2-demo/src/clmm e adaptado para funcionar de forma independente.

Configuração

Certifique-se de ter lido os pré-requisitos do Quick start e de ter RPC_URL, KEYPAIR e as dependências instaladas. Além das dependências no quickstart, você precisa:
  • decimal.js — matemática de preço e tick em createPool.ts e createPosition.ts.
  • bs58 — decodifica uma chave privada codificada em base58 em config.ts se você usar KEYPAIR_BS58 em vez de um arquivo de chave JSON.
  • tsx — executa os arquivos .ts abaixo diretamente via npx tsx; diferentemente dos scripts de swap e CPMM, este não é um arquivo .mjs simples executado com node.
A criação de um pool CLMM tem uma taxa única mais aluguel por array de tick para a posição inicial. Você também precisará de ambos os mints de seed em sua carteira — abrir uma posição quando o preço está dentro do intervalo escolhido requer liquidez em ambos os lados. Executando isto em devnet. Mudar cluster para "devnet" em config.ts não é suficiente por si só. createPool.ts passa um programId: CLMM_PROGRAM_ID explícito, uma constante mainnet fixa que não segue cluster — troque-o pela linha DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID comentada logo acima. createPosition.ts também codifica um poolId mainnet (o pool RAY-USDC); substitua-o pelo ID do pool devnet que você criou na Etapa 2.

Etapa 1 — config.ts

Salve como config.ts. Esta é a mesma forma que o src/config.ts.template do repositório de demo — disableFeatureCheck é forçado para true (recomendado para qualquer integração não trivial para que o SDK não bloqueie sua chamada de detecção de recursos na inicialização):
config.ts

Etapa 2 — createPool.ts

Salve ao lado de config.ts. Fonte: src/clmm/createPool.ts.
createPool.ts

Etapa 3 — createPosition.ts

Fonte: src/clmm/createPosition.ts.
createPosition.ts

Etapa 4 — utils.ts

Fonte: src/clmm/utils.ts.
utils.ts

Execute

O que acabou de acontecer

Transação 1 — raydium.clmm.createPool inicializou:
  • o estado do pool no PDA canônico para (mint1, mint2, ammConfig),
  • token_0_vault e token_1_vault (ordenados por ordem de byte do mint),
  • o buffer de anel observation,
  • o bitmap de array de tick inline,
e definiu o sqrt_price_x64 inicial a partir de seu initialPrice. Transação 2 — raydium.clmm.openPositionFromBase abriu uma posição concentrada:
  • cunhou um NFT de posição para sua carteira (o NFT é a posição; transferi-lo transfere a posição),
  • alocou arrays de tick nos limites inferior e superior (aluguel único se primeira posição nesses intervalos; arrays de tick nunca são fechados pelo programa, então posições subsequentes nos mesmos arrays não pagam aluguel extra),
  • depositou inputAmount de mint1 e o valor de par correspondente de mint2 (calculado por PoolUtils.getLiquidityAmountOutFromAmountIn),
  • creditou a posição com liquidez proporcional à largura do intervalo.
Quanto mais estreito o intervalo, maior a eficiência de capital por dólar de TVL — e mais dolorosa a perda impermanente quando o preço sai do intervalo. O intervalo usado acima ([0.000001, 100000]) é efetivamente full-range; aperte-o para concentrar taxas perto do spot atual.

Escolhendo um nível de taxa

clmmConfigs[0] é o nível de taxa mais baixo. O conjunto completo é publicado em GET https://api-v3.raydium.io/main/clmm-config: Veja user-flows/choosing-a-pool-type para uma matriz de decisão completa.

Erros comuns

  • Pool already exists for this config — Um pool CLMM já existe para este triplo (mint1, mint2, ammConfig). Procure o ID do pool existente e pule a Etapa 2.
  • Insufficient funds for amount B — Sua carteira tem o valor solicitado de mintA mas não o mintB correspondente. Abrir uma posição quando o preço está dentro do intervalo requer liquidez em ambos os lados.
  • Tick out of range — Seu lowerPrice ou upperPrice fica fora do intervalo de preço representável. Use um intervalo mais razoável em relação ao preço atual.
  • Preço obsoleto — Uma cotação da API pode estar 5–60 segundos desatualizada. Se executePosition falhar no slippage, descomente o bloco getRpcClmmPoolInfo em createPosition.ts para buscar novamente o preço ao vivo logo antes de assinar.

Ressalvas

  • NFT de posição é seu único identificador. Perca o NFT ou transfira-o, perca acesso à posição. Trate-o como uma chave.
  • Posições fora do intervalo não ganham taxas. Se o preço se mover para fora de [lowerPrice, upperPrice], sua posição fica estacionada inteiramente em um ativo e não ganha nada até você rebalancear.
  • Aluguel de array de tick é unidirecional. A primeira posição a tocar um array de tick nunca inicializado paga seu aluguel; o programa não expõe um caminho para fechar arrays de tick, então esse aluguel é permanente. Posições subsequentes no mesmo array são gratuitas.

Próximos passos

Fontes: