As instruções de farm são específicas de versão. Um Deposit na v6 não é executável em um farm v5 e vice-versa. O SDK faz o despacho lendo o proprietário do programa do farm; para CPI on-chain você deve escolher o ID do programa correto antecipadamente.
Inventário de instruções
| Propósito | v3 | v5 | v6 |
|---|
| Criar um farm | CreateFarm | CreateFarm | CreateFarm |
| Adicionar um ledger de usuário (pode ser implícito) | CreateUserLedger | CreateAssociatedLedger | Implícito em Deposit |
| Fazer stake | Deposit | Deposit | Deposit |
| Remover stake | Withdraw | Withdraw | Withdraw |
| Reclamar apenas recompensas | N/A (use Deposit 0) | N/A (use Deposit 0) | Harvest |
| Adicionar um fluxo de recompensas após criação | N/A | AddReward | AddReward |
| Editar um fluxo de recompensas existente | N/A | SetRewards | SetRewards |
| Reiniciar uma recompensa após end_time | N/A | RestartRewards | RestartRewards |
| Retirar orçamento de recompensas não reclamadas (admin) | N/A | WithdrawReward | WithdrawReward |
Na v3 e v5, a forma canônica de reclamar recompensas sem alterar o stake é chamar Deposit com amount = 0. O programa trata isso como um liquidamento puro. A v6 introduziu um Harvest explícito para clareza.
O SDK abstrai tudo isso por trás de raydium.farm.deposit({ ... }) etc. As seções abaixo documentam as listas de contas subjacentes para integradores que precisam construir instruções manualmente (agregadores, ferramentas de monitoramento, extensões do SDK).
CreateFarm (v6)
Ativar um novo farm v6.
Argumentos
reward_info_count: u8 // número de fluxos de recompensas na criação (1..=5)
reward_infos: [
{
open_time: u64,
end_time: u64,
emission_per_second_x64: u128, // Q64.64
mint: Pubkey, // reward mint
token_program: Pubkey, // SPL ou Token-2022
}
]
Contas (abreviado, para reward_info_count = 1)
| # | Nome | W | S | Notas |
|---|
| 1 | creator | W | S | Paga aluguel, possui o farm. |
| 2 | farm_state | W | | Nova conta FarmState. |
| 3 | farm_authority | | | PDA [farm_id]. |
| 4 | staking_mint | | | |
| 5 | staking_vault | W | | Criado como ATA da autoridade ou um vault PDA. |
| 6 | staking_token_program | | | |
| 7 | reward_mint | | | |
| 8 | reward_vault | W | | Receberá o orçamento inicial. |
| 9 | reward_token_program | | | |
| 10 | reward_sender_ata | W | | ATA do criador no mint de recompensas; drenado por esta instrução. |
| 11 | system_program | | | |
| 12 | token_program | | | |
| 13 | associated_token_program | | | |
| 14 | rent | | | |
Pré-condições
open_time > now, end_time > open_time.
- ATAs do
creator possuem pelo menos emission_per_second_x64 × (end_time − open_time) / 2^64 do mint de recompensas.
staking_mint não tem autoridade de congelamento, ou ela está desabilitada.
Pós-condições
FarmState inicializado, total_staked = 0.
- Vault(s) de recompensas financiados com o orçamento completo do fluxo.
- A ATA de recompensas do criador é drenada por essa quantidade.
Deposit (v6)
Fazer stake de amount do mint de staking.
Argumentos
Contas
| # | Nome | W | S |
|---|
| 1 | user | W | S |
| 2 | user_ledger | W | |
| 3 | farm_state | W | |
| 4 | farm_authority | | |
| 5 | staking_vault | W | |
| 6 | user_staking_ata | W | |
| 7..(7+n) | reward_vault_{i} | W | |
| … | user_reward_ata_{i} | W | |
| last−2 | system_program | | |
| last−1 | token_program | | |
| last | associated_token_program | | |
Se o user_ledger não existe, o SDK antecede uma ix no estilo CreateAccount; o programa v6 também pode criá-la lazily dado a conta do system program. Padrão de contas restantes: para cada recompensa ativa, anexar (reward_vault, user_reward_ata) para que o liquidamento possa fazer pagamentos.
Efeito
- Atualizar
reward_per_share_x64[i] para cada fluxo de recompensas ativo usando a fórmula de atualização lazy.
- Calcular
pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i].
- Transferir
pending_i de reward_vault_{i} para user_reward_ata_{i}.
- Transferir
amount do mint de staking de user_staking_ata para staking_vault.
- Atualizar
user_ledger.deposited += amount e re-fazer snapshot de reward_debts[i].
- Atualizar
farm_state.total_staked += amount.
Pré-condições
amount > 0 para um stake verdadeiro (v6 proíbe amount = 0 — use Harvest para claim-only).
user_staking_ata contém pelo menos amount.
- Cada vault de recompensa ativo contém pelo menos o pendente devido a este usuário.
Withdraw (v6)
Remover stake de amount.
Argumentos
Contas — idênticas a Deposit.
Efeito — mesmo liquidamento que Deposit, depois mover o mint de staking de volta para o usuário: staking_vault → user_staking_ata. Ambos total_staked e user_ledger.deposited diminuem.
Pré-condições
amount ≤ user_ledger.deposited.
- Farm não está pausado.
Harvest (v6)
Reclamar recompensas pendentes sem alterar o stake.
Argumentos — nenhum.
Contas — mesmo que Deposit, sem movimento no lado do staking.
Efeito — atualizar reward_per_share_x64[i], fazer payout de pending_i, re-fazer snapshot de reward_debts[i]. Sem mudança em total_staked ou deposited.
AddReward (v5/v6)
Adicionar um novo fluxo de recompensas a um farm existente que tem um slot não usado.
Argumentos
reward_info: {
open_time: u64,
end_time: u64,
emission_per_second_x64: u128,
mint: Pubkey,
token_program: Pubkey,
}
Pré-condições
- Existe um slot livre (
reward_info_count < 5 na v6, < 2 na v5).
open_time ≥ now (pode estar no futuro) ou open_time < now é permitido apenas se a versão do programa permitir — v6 permite, v5 não.
Pós-condições
- O novo fluxo é inicializado no índice
reward_info_count, reward_info_count++.
- O vault de recompensas é creditado com o orçamento completo do fluxo a partir da ATA do chamador.
Erro comum — RewardAlreadyExists se o mint colide com um slot existente.
SetRewards (v5/v6)
Estender ou complementar um fluxo de recompensas existente. Não pode mudar o mint; não pode encurtar end_time; não pode reduzir emission_per_second_x64 uma vez em execução.
Argumentos
reward_index: u8
new_open_time: u64,
new_end_time: u64,
new_emission_per_second_x64: u128,
Pré-condições
- O fluxo ainda está em execução (
reward_state == 1).
new_end_time ≥ current end_time.
- O orçamento adicional requerido
(new_emission × new_duration − already_emissioned) está presente na ATA do remetente e é transferido para o vault de recompensas pela instrução.
Na v5, a chamada equivalente é SetRewards com um conjunto de argumentos menor (sem mudanças por segundo em fluxos vivos).
RestartRewards (v5/v6)
Reiniciar um fluxo após seu end_time ter passado. Conceitualmente o mesmo que AddReward para um mint que já possui um slot.
Argumentos — forma idêntica a AddReward naquele índice.
Pré-condições
reward_state == 2 (encerrado).
- Chamador é
reward_sender do slot (v6) ou farm owner (v5).
WithdrawReward (v5/v6)
Limpeza administrativa do saldo do vault de recompensas não reclamadas após um fluxo ter terminado e todos os stakers terem tido a chance de fazer harvest.
Argumentos
Pré-condições
- Fluxo encerrado (
reward_state == 2).
reward_total_emissioned == reward_claimed + vault_balance (nada está atualmente devido).
Efeito — move o restante para reward_sender_ata. O programa não impede retirar enquanto stakers ainda têm claims pendentes; espera-se que o admin faça harvest em nome de stakers lentos primeiro (ou deixe-os fazer harvest). Se você retirar cedo, os usuários perdem acesso às suas recompensas não reclamadas. Não chame isso cedo.
Variações v5
Deposit / Withdraw têm a mesma forma que v6 mas usam até 2 slots de recompensas e reward_per_share é u128 (ponto fixo com um radicix diferente).
CreateAssociatedLedger é uma chamada separada obrigatória antes do primeiro Deposit; v6 a incorporou.
AddReward está disponível, Harvest não (use Deposit 0).
Variações v3
- Fluxo único de recompensas. Sem
AddReward, sem segundo slot.
Deposit 0 é a única forma de reclamar.
CreateUserLedger deve ser chamado antes do primeiro Deposit.
Matriz de mudança de estado
| Instrução | total_staked | user.deposited | reward_per_share | Vaults de recompensas |
|---|
CreateFarm | 0 | — | 0 | financiados pelo criador |
Deposit(n) | +n | +n | atualizado | −pending (pago) |
Withdraw(n) | −n | −n | atualizado | −pending |
Harvest | — | — | atualizado | −pending |
AddReward | — | — | — | +novo orçamento |
SetRewards | — | — | — | +delta orçamento |
RestartRewards | — | — | — | +orçamento |
WithdrawReward | — | — | — | −restante |
Próximos passos
Fontes: