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
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
- Ordena
mint1/mint2por ordem de bytes antes da derivação. - Calcula
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - Cria as contas
observationetick_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
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
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).
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
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)
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
SwapV2:
Erros comuns
- Endpoints de tick fora do espaçamento →
InvalidTickIndex. Sempre ajuste viaTickUtils.getPriceAndTick. - Tick arrays insuficientes fornecidos em
SwapV2→TickArrayNotFound. UsecomputeAmountOutFormatpara 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_x64comprice→ 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
harvestAllRewardsem lote para múltiplas posições. - Queimar o NFT enquanto ainda há rent devido ao mint →
ClosePositiontambé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çado →
InvalidTickIndex. Sempre quantize viaTickUtils.getPriceAndTick. - Chamar
decreaseLimitOrderem uma ordem totalmente preenchida →InvalidOrderPhase. UsesettleLimitOrdere depoiscloseLimitOrder. - Esquecer
dynamicFeeConfigIdao passarenableDynamicFee: true→ a reversão deCreateCustomizablePooléInvalidDynamicFeeConfigParams. Desative a taxa dinâmica ou selecione uma configuração em/main/clmm-dynamic-config.
Próximos passos
sdk-api/typescript-sdk— superfície completa do SDK.sdk-api/rest-api— endpoints de cotação e metadados de pool.user-flows/create-clmm-pool— guia passo a passo sem código.integration-guides/aggregator— roteamento de CLMM como parte de um caminho.

