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
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
- 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 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
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.
Para um cliente Anchor direto, mantenha as contas declaradas inalteradas e anexe o pool:
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).
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
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)
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
SwapV2:
Armadilhas comuns
- Endpoints de tick fora do espaçamento →
InvalidTickIndex. Sempre ajuste viaTickUtils.getPriceAndTick. - Não há arrays de tick suficientes fornecidos em
SwapV2→TickArrayNotFound. UsecomputeAmountOutFormatpara 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_x64comprice→ 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
harvestAllRewardsem muitas posições. - Fechar contas NFT você mesmo →
ClosePositionqueima 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çado →
InvalidTickIndex. Sempre quantize viaTickUtils.getPriceAndTick. - Chamar
decreaseLimitOrderem uma ordem totalmente preenchida →InvalidOrderPhase. UsesettleLimitOrderdepoiscloseLimitOrder. - Esquecendo
dynamicFeeConfigIdenquanto passaenableDynamicFee: true→ a reversão deCreateCustomizablePooléInvalidDynamicFeeConfigParams. Desative a taxa dinâmica ou escolha uma configuração de/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— passo a passo sem código.integration-guides/aggregator— roteamento CLMM como parte de um caminho.

