Skip to main content
Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
Las instrucciones de farm son específicas de cada versión. Un Deposit en v6 no se puede ejecutar en un farm v5 y viceversa. El SDK se distribuye leyendo el propietario del programa del farm; para CPI on-chain debes elegir el ID del programa correcto desde el principio.

Inventario de instrucciones

En v3 y v5, la forma canónica de reclamar recompensas sin cambiar el stake es llamar a Deposit con amount = 0. El programa lo trata como un puro settlement. v6 introdujo un Harvest explícito para mayor claridad. El SDK abstrae todos estos detrás de raydium.farm.deposit({ ... }) etc. Las secciones siguientes documentan las listas de cuentas subyacentes para integradores que necesitan construir instrucciones manualmente (agregadores, herramientas de monitoreo, extensiones de SDK).

CreateFarm (v6)

Crear un nuevo farm v6. Argumentos
Cuentas (resumidas, para reward_info_count = 1) Precondiciones
  • open_time > now, end_time > open_time.
  • Las ATA del creator contienen al menos emission_per_second_x64 × (end_time − open_time) / 2^64 del mint de recompensa.
  • staking_mint no tiene autoridad de congelación, o la autoridad de congelación está deshabilitada.
Postcondiciones
  • FarmState inicializado, total_staked = 0.
  • Vault(s) de recompensa financiado(s) con el presupuesto completo del stream.
  • El ATA de recompensa del creador se drena por esa cantidad.

Deposit (v6)

Stake de amount del mint de staking. Argumentos
Cuentas Si user_ledger no existe, el SDK prepende un ix estilo CreateAccount; el programa v6 también puede crearlo de forma lazy dado que el account del system program está presente. Patrón de cuentas restantes: por cada recompensa activa, añade (reward_vault, user_reward_ata) para que el settlement pueda hacer pagos. Efecto
  1. Actualizar reward_per_share_x64[i] para cada stream de recompensa activa usando la fórmula de actualización lazy.
  2. Calcular pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i].
  3. Transferir pending_i desde reward_vault_{i} a user_reward_ata_{i}.
  4. Transferir amount del mint de staking desde user_staking_ata a staking_vault.
  5. Actualizar user_ledger.deposited += amount y reenganchar reward_debts[i].
  6. Actualizar farm_state.total_staked += amount.
Precondiciones
  • amount > 0 para un stake real (v6 prohíbe amount = 0 — usar Harvest para claim-only).
  • user_staking_ata contiene al menos amount.
  • Cada vault de recompensa activa contiene al menos lo pendiente adeudado a este usuario.

Withdraw (v6)

Unstake de amount. Argumentos
Cuentas — idénticas a Deposit. Efecto — mismo settlement que Deposit, luego mover el mint de staking de vuelta al usuario: staking_vault → user_staking_ata. Tanto total_staked como user_ledger.deposited disminuyen. Precondiciones
  • amount ≤ user_ledger.deposited.
  • El farm no está pausado.

Harvest (v6)

Reclamar recompensas pendientes sin cambiar el stake. Argumentos — ninguno. Cuentas — igual a Deposit, sin movimiento en el lado del staking. Efecto — actualizar reward_per_share_x64[i], pagar pending_i, reenganchar reward_debts[i]. Sin cambios en total_staked o deposited.

AddReward (v5/v6)

Añadir un nuevo stream de recompensa a un farm existente que tiene un slot no utilizado. Argumentos
Precondiciones
  • Existe un slot libre (reward_info_count < 5 en v6, < 2 en v5).
  • open_time ≥ now (puede ser en el futuro) u open_time < now está permitido solo si la versión del programa lo permite — v6 lo hace, v5 no.
Postcondiciones
  • El nuevo stream se inicializa en el índice reward_info_count, reward_info_count++.
  • El vault de recompensa se acredita con el presupuesto completo del stream desde el ATA del llamador.
Error comúnRewardAlreadyExists si el mint colisiona con un slot existente.

SetRewards (v5/v6)

Extender o top up un stream de recompensa existente. No puede cambiar el mint; no puede acortar end_time; no puede reducir emission_per_second_x64 una vez en ejecución. Argumentos
Precondiciones
  • El stream sigue en ejecución (reward_state == 1).
  • new_end_time ≥ current end_time.
  • El presupuesto adicional requerido (new_emission × new_duration − already_emissioned) está presente en el ATA del remitente y se transfiere al vault de recompensa por la instrucción.
En v5, la llamada equivalente es SetRewards con un conjunto de argumentos más pequeño (sin cambios por segundo en streams en ejecución).

RestartRewards (v5/v6)

Reiniciar un stream después de que su end_time ha pasado. Conceptualmente lo mismo que AddReward para un mint que ya tiene un slot. Argumentos — forma idéntica a AddReward en ese índice. Precondiciones
  • reward_state == 2 (ended).
  • El llamador es reward_sender del slot (v6) o el farm owner (v5).

WithdrawReward (v5/v6)

Barrida administrativa del saldo de vault de recompensa no reclamada después de que un stream ha terminado y todos los stakers han tenido la oportunidad de hacer harvest. Argumentos
Precondiciones
  • El stream ha terminado (reward_state == 2).
  • reward_total_emissioned == reward_claimed + vault_balance (nada se adeuda actualmente).
Efecto — mueve el resto a reward_sender_ata. El programa no impide retirar mientras los stakers aún tienen reclamaciones pendientes; se espera que el admin haga harvest en nombre de stakers rezagados primero (o dejarles hacer harvest). Si retiras temprano, los usuarios pierden acceso a sus recompensas no reclamadas. No llames a esto temprano.

Variaciones de v5

  • Deposit / Withdraw tienen la misma forma que v6 pero usan hasta 2 slots de recompensa y reward_per_share es u128 (punto fijo con un radix diferente).
  • CreateAssociatedLedger es una llamada separada requerida antes del primer Deposit; v6 lo fusionó.
  • AddReward está disponible, Harvest no (usar Deposit 0).

Variaciones de v3

  • Stream de recompensa único. Sin AddReward, sin segundo slot.
  • Deposit 0 es la única forma de reclamar.
  • CreateUserLedger debe ser llamado antes del primer Deposit.

Matriz de cambio de estado

Hacia dónde ir a continuación

Fuentes: