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

Configuração

Cada demo nesta página corresponde a um arquivo em raydium-sdk-V2-demo/src/clmm; o link do GitHub aparece ao lado de cada seção. A inicialização segue o config.ts.template do repositório de demos (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 tick arrays o intervalo toca e agrupa instruções InitTickArray caso algum não esteja 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 as taxas, chame decreaseLiquidity com liquidity = new BN(0). O efeito colateral da instrução é liquidar tokens_fees_owed_{0,1} e transferi-los para fora. Para encerrar a posição completamente após zerar a liquidez e as taxas, passe closePosition: true na chamada final de decreaseLiquidity. O SDK acrescenta ClosePosition e queima o NFT.

Coletar recompensa(s)

Fonte: src/clmm/harvestAllRewards.ts
harvestAllRewards percorre todas as posições em todos os pools fornecidos, agrupa instruções CollectReward (e quaisquer UpdateRewardInfos) e as distribui entre transações conforme necessário.

Swap

Fonte: src/clmm/swap.ts
computeAmountOutFormat percorre o mapa de ticks fora da cadeia 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 o slippage,
  • a lista de contas de tick array que o swap efetivo irá acessar (remainingAccounts).
Sempre passe os remainingAccounts retornados pela simulação: se você passar de menos, o swap reverte no meio da execução com TickArrayNotFound; se passar dados desatualizados, o compute é desperdiçado.

Criar um pool CLMM personalizável

createCustomizablePool é o novo ponto de entrada que expõe os controles de taxa dinâmica e taxa unilateral no momento da criação do pool. Ele recebe os mesmos parâmetros que createPool, acrescidos de três campos adicionais:
createPool continua funcionando para o fluxo padrão sem taxa dinâmica, sem limit order e sem configurações avançadas. Use createCustomizablePool sempre que precisar de qualquer um dos três novos controles. Consulte products/clmm/instructions para a lista de contas on-chain.

Limit orders

Um limit order estaciona o input do usuário em um único tick e é preenchido em ordem FIFO quando um swap cruza esse tick. As saídas são enviadas para o ATA do proprietário no momento da liquidação; o proprietário não precisa estar online para ser atendido.

Abrir um limit order

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

Aumentar / diminuir uma ordem em aberto

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

Liquidar uma ordem preenchida

settleLimitOrder lê o unfilled_ratio_x64 da ordem em relação ao rastreador do grupo, calcula a saída preenchida e a transfere para o ATA do proprietário. O próprio proprietário pode chamar essa função; limit_order_admin (um keeper operacional off-chain) também pode chamá-la em nome do proprietário — a saída ainda vai para o proprietário. Para encerrar ordens completamente liquidadas e recuperar o rent, use closeLimitOrder (individual) ou closeAllLimitOrder (em lote). Para liquidar várias de uma vez, settleAllLimitOrder empacota o maior número possível de chamadas SettleLimitOrder em uma transação v0.

Listar as ordens em espera de uma carteira (off-chain)

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

Esqueleto de CPI em Rust

Ordem das contas restantes para SwapV2:
Se o swap não precisar da extensão, omita-a; caso contrário, ela é a primeira conta restante.

Erros comuns

  • Endpoints de tick fora do espaçamentoInvalidTickIndex. Sempre ajuste via TickUtils.getPriceAndTick.
  • Tick arrays insuficientes fornecidos em SwapV2TickArrayNotFound. Use computeAmountOutFormat para obter a lista completa.
  • Posição de alcance total sem a extensão do bitmap → o PDA da extensão deve ser gravável; o SDK lida com isso automaticamente.
  • Confundir sqrt_price_x64 com price → um erro de fator 2 aqui é especialmente problemático. Na dúvida, deixe o SDK calcular a partir de um preço legível por humanos.
  • Coletar recompensas com muita frequência → cada coleta custa uma transação. Use harvestAllRewards em lote para múltiplas posições.
  • Queimar o NFT enquanto ainda há rent devido ao mintClosePosition também fecha o mint e o ATA do NFT; não os feche separadamente ou o programa reverterá.
  • Abrir um limit order em um tick não espaçadoInvalidTickIndex. Sempre quantize via TickUtils.getPriceAndTick.
  • Chamar decreaseLimitOrder em uma ordem totalmente preenchidaInvalidOrderPhase. Use settleLimitOrder e depois closeLimitOrder.
  • Esquecer dynamicFeeConfigId ao passar enableDynamicFee: true → a reversão de CreateCustomizablePool é InvalidDynamicFeeConfigParams. Desative a taxa dinâmica ou selecione uma configuração em /main/clmm-dynamic-config.

Próximos passos

Fontes: