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.64-alpha contra Solana mainnet-beta, verificado em 2026-09-09 — cada nome de builder, nome de parâmetro e tipo de parâmetro abaixo foi verificado contra o src/raydium/farm/ dessa versão e contra raydium-sdk-V2-demo/src/farm. O SDK despacha v3 / v5 / v6 internamente com base no proprietário do programa do farm; os exemplos abaixo assumem um farm v6. Veja reference/program-addresses para os três IDs de programa.Os nomes dos métodos do módulo farm não são o que você esperaria: não há getFarmById e não há setRewards. A busca passa por raydium.api.fetchFarmInfoById, e os builders de edição de recompensas são addNewRewardToken / addNewRewardsToken e restartReward / restartRewards.

Configuração

Os exemplos aqui espelham arquivos em raydium-sdk-V2-demo/src/farm. O bootstrap segue o config.ts.template do repositório de demonstração:

Buscar um farm por id

Não há raydium.farm.getFarmById. Todo exemplo de farm começa a partir do módulo API, que retorna a forma normalizada FormatFarmInfoOut que deposit / withdraw / harvestAllRewards usam:
fetchFarmInfoById recebe uma string separada por vírgulas de ids e retorna um array, então uma chamada pode hidratar um portfólio inteiro. Se você precisar das chaves de conta bruta em vez das informações de exibição, raydium.api.fetchFarmKeysById({ ids }) retorna os vaults e PDAs de autoridade; o SDK a chama internamente para você dentro de cada builder abaixo.

Fazer stake de tokens LP

Fonte: src/farm/stake.ts
O SDK lida com o pré-liquidação de qualquer recompensa pendente, então se essa carteira já tem stake neste farm, a instrução pagará as recompensas acumuladas para os ATAs do usuário na mesma transação.

Apenas coleta (harvest)

Fonte: src/farm/harvest.ts farmInfoList é um Record indexado por id do farm, não um array, e o builder retorna múltiplas transações — então execute deve receber sequentially: true:
O builder empacota o máximo de farms por transação que o limite de 1232 bytes permite e divide o resto em transações subsequentes, é por isso que retorna txIds em vez de um único txId. Para um único farm, faça harvest com o idioma amount: 0 — isso é o que src/farm/harvest.ts faz, em todas as versões incluindo v6:

Remover stake

Fonte: src/farm/unstake.ts

Criar um farm v6

Fonte: src/farm/createAmmFarm.ts e editAmmFarm.ts create recebe o objeto de informações do pool para o pool cujo mint LP está sendo feito stake (não um mint simples), e cada entrada de rewardInfos é um FarmRewardInfo: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Os tempos são segundos simples, e perSecond é uma string, não um BN. programId padrão é o programa v6, então você raramente o passa.
Pontos-chave:
  • perSecond é a taxa de emissão por segundo nas unidades brutas do mint de recompensa, passada como uma string decimal. O SDK a empacota na representação de ponto fixo on-chain antes de enviar.
  • O orçamento completo (perSecond × (endTime − openTime)) deve estar presente no seu ATA de recompensa — create o move para o vault de recompensa atomicamente.
  • Mints de recompensa Token-2022 não são suportados pelos builders de farm do SDK nesta versão do SDK; use um mint SPL simples para recompensas.
  • Você pode semear até 5 recompensas em uma chamada create. A lista de contas cresce por (reward_mint, reward_vault, sender_ata, token_program) por stream extra; fique atento ao limite de tamanho de transação de 1232 bytes. Para 4+ recompensas, crie com 1–2 e use addNewRewardsToken em transações subsequentes.

Adicionar um novo stream de recompensa

Não há raydium.farm.setRewards. Os dois builders que alteram as recompensas de um farm são addNewRewardToken / addNewRewardsToken (ocupam um slot livre com um mint novo) e restartReward / restartRewards (re-armam um slot cujo stream terminou). Ambos recebem objetos FarmRewardInfo exatamente na forma que create usa.
O orçamento delta (perSecond × duration) é puxado do ATA do pagador como parte da transação. A instrução subjacente não pode encurtar um stream, não pode reduzir per_second em um stream ativo e não pode alterar o mint de recompensa de um slot — para trocar mints, aguarde end_time e use addNewRewardsToken em um slot liberado, ou crie um novo farm.
restartRewards e addNewRewardsToken cada um retornam um builder, então uma única transação pode fazer ambos. src/farm/editAmmFarm.ts mostra o padrão: editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), depois um versionBuild({ txVersion }).

Reiniciar um stream finalizado

Fonte: src/farm/editAmmFarm.ts restartRewards recebe newRewardInfos (plural, um array); restartReward é a forma de item único e recebe newRewardInfo. O campo mint é mint, não rewardMint, e deve corresponder a um slot que já existe no farm — o builder procura o slot por mint e gera erro se estiver ausente.
restartRewards é apenas v6 — o builder lê o id do programa do farm e gera erro para farms v3 / v5. Válido apenas quando o reward_state == 2 do slot alvo (finalizado); o chamador deve ser o reward_sender do slot. Note que openTime >= endTime é rejeitado no lado do cliente antes de qualquer RPC ser feito.

Rust CPI

Não há crate Anchor raydium_farm_v6. Nenhum crate com esse nome existe em crates.io, o programa Farm v6 não publica nenhum IDL on-chain (nem uma conta anchor:idl legada nem uma entrada no programa Program Metadata), e nenhum repositório de fonte pública para ele existe. Uma revisão anterior desta página mostrou um exemplo raydium_farm_v6::cpi::deposit; ele não compilava contra nada e foi removido.
Farm v6 foi implantado pela última vez em 2024-05-13 e não é um programa Anchor do ponto de vista de um integrador. Se você precisar compor com ele a partir do seu próprio programa on-chain, construa a Instruction manualmente — derive a lista de contas e discriminadores de instrução independentemente (dos layouts TypeScript do SDK em raydium-sdk-V2/src/raydium/farm/, ou decodificando transações reais), e invoke_signed isso. Veja sdk-api/rust-cpi para esse procedimento. Qualquer que seja a rota que você tome, a cauda remaining_accounts deve corresponder aos slots de recompensa ativos do farm 1-para-1 (pares de reward_vault_i, user_reward_ata_i em ordem de índice). Omitir ou desordenar esses produz uma contabilidade silenciosa incorreta — o programa transferirá o valor errado.

Armadilhas

  • Esquecer de coletar antes de remover stake. Inofensivo — Withdraw liquida recompensas pendentes primeiro. Mas se sua UI mostrar “coletar” separadamente de “remover stake”, o usuário pode pensar que ainda há algo para coletar após um Withdraw. Não há; tudo acumulado até esse ponto foi pago.
  • total_staked = 0 durante emissões. Emissões acumuladas enquanto nada estava em stake são perdidas (a fórmula de atualização reward_per_share divide por 0 e o programa pula a atualização). Para programas com open_time agendado, execute um “seed stake” em open_time para evitar isso.
  • Taxas de transferência Token-2022. Em farms v6 com mints de recompensa Token-2022, a taxa de transferência se aplica na emissão (vault → usuário). Fatore isso em cotações de APR.
  • Pequeno per_second em v5. A taxa u64 do v5 significa que qualquer per_second < 1 unidade de token por segundo (em mints com ≥9 decimais isso é frequentemente a taxa desejada) não pode ser expressa — a taxa do stream arredonda para 0 e o farm não emite nada. Use v6.

Próximos passos

Fontes: