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 enraydium-sdk-V2-demo/src/farm. El arranque sigue el config.ts.template del repositorio de demostración:
Obtener una granja por id
No hayraydium.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
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:
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.
perSecondes 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 —createlo 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 usaaddNewRewardsTokenen transacciones posteriores.
Agregar un nuevo flujo de recompensa
No hayraydium.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.
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.
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
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 laInstruction 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 —
Withdrawliquida 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 unWithdraw. No hay; todo lo acumulado hasta ese punto fue pagado. total_staked = 0durante emisiones. Las emisiones acumuladas mientras nada estaba en stake se pierden (la fórmula de actualizaciónreward_per_sharedivide por 0 y el programa salta la actualización). Para programas conopen_timeprogramado, 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_seconden v5. La tasau64de v5 significa que cualquierper_second < 1unidad 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
products/farm-staking/instructions— referencia de instrucción subyacente.products/clmm/fees— compara con los flujos de recompensa nativos de CLMM.user-flows/migrate-amm-v4-to-cpmm— a menudo emparejado con la creación de una nueva granja CPMM.
- Raydium SDK v2
- IDL de Farm v6 incluido en
raydium-io/raydium-sdk-V2bajosrc/raydium/farm/.

