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 →
Banner de versión. Todos los ejemplos apuntan a @raydium-io/raydium-sdk-v2@0.2.64-alpha contra Solana mainnet-beta, verificado 2026-09-09 — cada nombre de constructor, nombre de parámetro y tipo de parámetro a continuación fue verificado contra el src/raydium/farm/ de esa versión y contra raydium-sdk-V2-demo/src/farm. El SDK distribuye v3 / v5 / v6 internamente según el propietario del programa de la granja; los ejemplos a continuación asumen una granja v6. Consulta reference/program-addresses para los tres IDs de programa.Los nombres de los métodos del módulo de granja no son lo que esperarías: no hay getFarmById ni no hay setRewards. La obtención se realiza a través de raydium.api.fetchFarmInfoById, y los constructores de edición de recompensas son addNewRewardToken / addNewRewardsToken y restartReward / restartRewards.

Configuración

Los ejemplos aquí reflejan archivos en raydium-sdk-V2-demo/src/farm. El arranque sigue el config.ts.template del repositorio de demostración:

Obtener una granja por id

No hay raydium.farm.getFarmById. Cada demostración de granja comienza desde el módulo API, que devuelve la forma normalizada FormatFarmInfoOut que deposit / withdraw / harvestAllRewards toman:
fetchFarmInfoById toma una cadena de ids separados por comas y devuelve un array, por lo que una llamada puede hidratar toda una cartera. Si necesitas las claves de cuenta sin procesar en lugar de la información de visualización, raydium.api.fetchFarmKeysById({ ids }) devuelve los vaults y PDAs de autoridad; el SDK lo llama internamente para ti dentro de cada constructor a continuación.

Hacer stake de tokens LP

Fuente: src/farm/stake.ts
El SDK maneja la pre-liquidación de cualquier recompensa pendiente, por lo que si esta billetera ya tiene stake en esta granja, la instrucción pagará las recompensas acumuladas a los ATAs del usuario en la misma transacción.

Solo reclamación (cosecha)

Fuente: src/farm/harvest.ts farmInfoList es un Record indexado por id de granja, no un array, y el constructor devuelve múltiples transacciones — por lo que execute debe recibir sequentially: true:
El constructor empaqueta tantas granjas por transacción como permite el límite de 1232 bytes y divide el resto en transacciones posteriores, por lo que devuelve txIds en lugar de un único txId. Para una sola granja, cosecha con el idioma amount: 0 — esto es lo que hace src/farm/harvest.ts, en cada versión incluyendo v6:

Retirar stake

Fuente: src/farm/unstake.ts

Crear una granja v6

Fuente: src/farm/createAmmFarm.ts y editAmmFarm.ts create toma el objeto de información del pool para el pool cuyo mint LP se está haciendo stake (no un mint desnudo), y cada entrada de rewardInfos es un FarmRewardInfo: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Los tiempos son segundos simples, y perSecond es una cadena, no un BN. programId por defecto es el programa v6, por lo que rara vez lo pasas.
Puntos clave:
  • perSecond es la tasa de emisión por segundo en las unidades sin procesar del mint de recompensa, pasada como una cadena decimal. El SDK la empaqueta en la representación de punto fijo en cadena antes de enviar.
  • El presupuesto completo (perSecond × (endTime − openTime)) debe estar presente en tu ATA de recompensa — create lo mueve al vault de recompensa atómicamente.
  • Los mints de recompensa Token-2022 no son compatibles con los constructores de granja del SDK en esta versión del SDK; usa un mint SPL simple para recompensas.
  • Puedes sembrar hasta 5 recompensas en una llamada create. La lista de cuentas crece por (reward_mint, reward_vault, sender_ata, token_program) por cada flujo adicional; mantente consciente del límite de tamaño de transacción de 1232 bytes. Para 4+ recompensas, crea con 1–2 y usa addNewRewardsToken en transacciones posteriores.

Agregar un nuevo flujo de recompensa

No hay raydium.farm.setRewards. Los dos constructores que cambian las recompensas de una granja son addNewRewardToken / addNewRewardsToken (ocupan un slot libre con un mint nuevo) y restartReward / restartRewards (re-arman un slot cuyo flujo ha terminado). Ambos toman objetos FarmRewardInfo exactamente en la forma que create usa.
El presupuesto delta (perSecond × duration) se extrae del ATA del pagador como parte de la transacción. La instrucción subyacente no puede acortar un flujo, no puede bajar per_second en un flujo activo, y no puede cambiar el mint de recompensa de un slot — para intercambiar mints, espera a end_time y usa addNewRewardsToken en un slot liberado, o crea una nueva granja.
restartRewards y addNewRewardsToken cada uno devuelven un constructor, por lo que una sola transacción puede hacer ambos. src/farm/editAmmFarm.ts muestra el patrón: editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), luego un versionBuild({ txVersion }).

Reiniciar un flujo terminado

Fuente: src/farm/editAmmFarm.ts restartRewards toma newRewardInfos (plural, un array); restartReward es la forma de un solo elemento y toma newRewardInfo. El campo mint es mint, no rewardMint, y debe coincidir con un slot que ya existe en la granja — el constructor busca el slot por mint y genera un error si está ausente.
restartRewards es solo v6 — el constructor lee el id del programa de la granja y genera un error para granjas v3 / v5. Válido solo cuando el reward_state == 2 del slot objetivo (terminado); la persona que llama debe ser el reward_sender del slot. Ten en cuenta que openTime >= endTime se rechaza del lado del cliente antes de que se realice cualquier RPC.

CPI de Rust

No hay un crate Anchor raydium_farm_v6. No existe ningún crate con ese nombre en crates.io, el programa Farm v6 no publica ningún IDL en cadena (ni una cuenta anchor:idl heredada ni una entrada en el programa Program Metadata), y no existe ningún repositorio de fuente pública para él. Una revisión anterior de esta página mostró un ejemplo raydium_farm_v6::cpi::deposit; no se compilaba contra nada y ha sido eliminado.
Farm v6 fue desplegado por última vez el 2024-05-13 y no es un programa Anchor desde el punto de vista de un integrador. Si necesitas componerlo desde tu propio programa en cadena, construye la Instruction a mano — deriva la lista de cuentas y los discriminadores de instrucción de forma independiente (desde los diseños de TypeScript del SDK bajo raydium-sdk-V2/src/raydium/farm/, o decodificando transacciones reales), e invoke_signed la. Consulta sdk-api/rust-cpi para ese procedimiento. Sea cual sea la ruta que tomes, la cola remaining_accounts debe coincidir con los slots de recompensa activos de la granja 1-a-1 (pares de reward_vault_i, user_reward_ata_i en orden de índice). Omitir o desordenar estos produce una contabilidad silenciosa incorrecta — el programa transferirá la cantidad incorrecta.

Trampas

  • Olvidar reclamar antes de retirar. Inofensivo — Withdraw liquida las recompensas pendientes primero. Pero si tu UI muestra “reclamar” separado de “retirar”, el usuario puede pensar que todavía hay algo que reclamar después de un Withdraw. No hay; todo lo acumulado hasta ese punto fue pagado.
  • total_staked = 0 durante emisiones. Las emisiones acumuladas mientras nada estaba en stake se pierden (la fórmula de actualización reward_per_share divide por 0 y el programa salta la actualización). Para programas con open_time programado, ejecuta un “seed stake” en open_time para evitar esto.
  • Tarifas de transferencia Token-2022. En granjas v6 con mints de recompensa Token-2022, la tarifa de transferencia se aplica en la emisión (vault → usuario). Factoriza esto en las cotizaciones de APR.
  • Pequeño per_second en v5. La tasa u64 de v5 significa que cualquier per_second < 1 unidad de token por segundo (en mints con ≥9 decimales esto es a menudo la tasa deseada) no puede ser expresado — la tasa de flujo se redondea a 0 y la granja no emite nada. Usa v6.

Dónde ir a continuación

Fuentes: