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 →
Banner de versão. Todos os exemplos visam @raydium-io/raydium-sdk-v2@0.2.42-alpha contra Solana mainnet-beta, verificado em 2026-04. Os IDs de programa vêm de reference/program-addresses via o SDK.

Configuração

Cada exemplo nesta página espelha um arquivo em raydium-sdk-V2-demo/src/clmm; o link do GitHub fica ao lado de cada seção. O bootstrap segue o config.ts.template do repositório de exemplos (fonte) — disableFeatureCheck: true é a configuração recomendada para qualquer integração não trivial:

Criar um pool CLMM

Fonte: src/clmm/createPool.ts
O SDK:
  • Ordena mint1/mint2 por ordem de bytes antes da derivação.
  • Calcula sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64).
  • Cria as contas observation e tick_array_bitmap_extension.
  • Paga a taxa de criação do pool definida por ammConfig.

Abrir uma posição em um intervalo escolhido

Fonte: src/clmm/createPosition.ts
O SDK calcula automaticamente quais arrays de tick o intervalo toca e agrupa instruções InitTickArray se algum não estiver inicializado.

Aumentar liquidez em uma posição existente

Fonte: src/clmm/increaseLiquidity.ts

Diminuir liquidez (e coletar taxas ao mesmo tempo)

Fonte: src/clmm/decreaseLiquidity.ts e src/clmm/closePosition.ts
Para coletar apenas taxas, chame decreaseLiquidity com liquidity = new BN(0). O efeito colateral da instrução é liquidar tokens_fees_owed_{0,1} e transferi-los. Para fechar a posição inteiramente após zerar liquidez e taxas, passe closePosition: true na chamada final de decreaseLiquidity. O SDK anexa ClosePosition e queima o NFT.
Posições de emissor restrito requerem um construtor de fechamento compatível. Essas posições têm uma conta de token NFT congelada. ClosePosition deve anexar o ID do pool da posição como a primeira conta restante para que o CLMM possa descongelar a conta antes de queimar. O branch de fonte do programa não inclui uma mudança no SDK. Confirme que sua versão do SDK suporta explicitamente o caminho de fechamento congelado antes de ativar a criação de posição de emissor restrito.
Para um cliente Anchor direto, mantenha as contas declaradas inalteradas e anexe o pool:
Você pode passar poolId em cada fechamento. O CLMM o lê apenas quando positionNftAccount está congelado, o que mantém um caminho de cliente compatível com posições antigas e novas.

Coletar recompensa(s)

Fonte: src/clmm/harvestAllRewards.ts
harvestAllRewards percorre cada posição em cada pool passado, agrupa instruções CollectReward (e qualquer UpdateRewardInfos), e as divide entre transações se necessário.

Swap

Fonte: src/clmm/swap.ts
computeAmountOutFormat percorre o mapa de ticks off-chain usando a mesma lógica do programa on-chain e retorna:
  • o valor esperado de saída,
  • o valor mínimo de saída após slippage,
  • a lista de contas de array de tick que o swap real tocará (remainingAccounts).
Sempre passe remainingAccounts retornado pela simulação: se você passar muito poucos, o swap reverte no meio da caminhada com TickArrayNotFound; se você passar desatualizados, computação desperdiçada.

Criar um pool CLMM personalizável

createCustomizablePool é o novo ponto de entrada que expõe os toggles de taxa dinâmica e taxa unilateral no momento da criação do pool. Tem a mesma forma que createPool mais três adições:
createPool continua funcionando para o caminho padrão de taxa, sem limite de ordem, sem taxa dinâmica. Use createCustomizablePool sempre que precisar de qualquer um dos três novos controles. Veja products/clmm/instructions para a lista de contas on-chain.

Ordens limitadas

Uma ordem limitada estaciona a entrada do usuário em um único tick e é preenchida FIFO quando um swap cruza esse tick. Os resultados são enviados para o ATA do proprietário no momento da liquidação; o proprietário não precisa estar online para ser preenchido.

Abrir uma ordem limitada

O SDK deriva o PDA LimitOrderState de (pool, owner, tick, nonce), incrementa o LimitOrderNonce por-(pool, owner), e insere a ordem na coorte FIFO naquele tick.

Aumentar / diminuir uma ordem aberta

decreaseLimitOrder só pode remover da porção não preenchida da ordem; a porção preenchida fica bloqueada até a liquidação. Ambas as instruções revertam com InvalidOrderPhase se a ordem já foi totalmente preenchida.

Liquidar uma ordem preenchida

settleLimitOrder lê o unfilled_ratio_x64 da ordem contra o rastreador de coorte, calcula a saída preenchida e a transfere para o ATA do proprietário. O proprietário pode chamar isso por si mesmo; limit_order_admin (um mantenedor operacional off-chain) também pode chamar em nome do proprietário — a saída ainda vai para o proprietário. Para fechar ordens totalmente liquidadas para recuperar aluguel, use closeLimitOrder (única) ou closeAllLimitOrder (lote). Para liquidar muitas de uma vez, settleAllLimitOrder empacota quantas chamadas SettleLimitOrder couberem em uma tx v0.

Listar ordens estacionadas de uma carteira (off-chain)

O endpoint de ordens ativas retorna ordens não preenchidas e parcialmente preenchidas em um único payload (totalAmount / filledAmount / pendingSettle distinguem as fases). Para histórico de ordens fechadas use /limit-order/history/order/list-by-user?wallet=… (por carteira, paginado por nextPageId); para o log de eventos completo de uma ordem específica use /limit-order/history/event/list-by-pda?pda=….

Esqueleto Rust CPI

Ordem de conta restante para SwapV2:
Se o swap nunca precisar da extensão, omita-a; caso contrário, é a primeira conta restante.

Armadilhas comuns

  • Endpoints de tick fora do espaçamentoInvalidTickIndex. Sempre ajuste via TickUtils.getPriceAndTick.
  • Não há arrays de tick suficientes fornecidos em SwapV2TickArrayNotFound. Use computeAmountOutFormat para obter a lista completa.
  • Posição de intervalo completo sem a extensão de bitmap → o PDA de extensão deve ser gravável; o SDK lida com isso automaticamente.
  • Confundir sqrt_price_x64 com price → uma confusão de fator-2 aqui é particularmente dolorosa. Em caso de dúvida, deixe o SDK calculá-lo a partir de um preço legível por humanos.
  • Coletar recompensas muito cedo → cada coleta custa uma transação. Agrupe via harvestAllRewards em muitas posições.
  • Fechar contas NFT você mesmoClosePosition queima o NFT e fecha seu ATA. Também fecha um mint NFT Token-2022; um mint SPL Token clássico permanece com suprimento zero porque esse programa não pode fechar mints. Não feche contas suportadas separadamente ou a instrução reverterá.
  • Abrir uma ordem limitada em um tick não espaçadoInvalidTickIndex. Sempre quantize via TickUtils.getPriceAndTick.
  • Chamar decreaseLimitOrder em uma ordem totalmente preenchidaInvalidOrderPhase. Use settleLimitOrder depois closeLimitOrder.
  • Esquecendo dynamicFeeConfigId enquanto passa enableDynamicFee: true → a reversão de CreateCustomizablePool é InvalidDynamicFeeConfigParams. Desative a taxa dinâmica ou escolha uma configuração de /main/clmm-dynamic-config.

Próximos passos

Fontes: