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 →
A partir de la actualización del programa 2026-07, la dependencia de OpenBook / Serum de AMM v4 ha sido eliminada. Las instrucciones heredadas v1
SwapBaseIn / SwapBaseOut, Deposit y Withdraw mantienen sus diseños de cuenta antiguos para compatibilidad hacia atrás: las cuentas de mercado aún se aceptan en sus posiciones antiguas, pero ya no se validan ni se usan (no se emite CPI). Las nuevas integraciones deben usar los puntos de entrada de intercambio V2, que omiten completamente las cuentas de mercado. Varias instrucciones han sido eliminadas y ahora revierten — consulta la entrada del registro de cambios. Las listas de cuentas a continuación usan los nombres de campo del SDK de Raydium; el IDL subyacente a veces usa prefijos serum_*.La actualización del programa 2026-09 añade una instrucción de administrador, WithdrawExcessLamports (etiqueta 18), y elimina la variable del sistema rent de CreateConfigAccount. Todo lo que un operador o LP llama permanece sin cambios. Consulta la entrada del registro de cambios 2026-09-09.Inventario de instrucciones
El SDK expone constructores solo para las instrucciones orientadas al usuario. Las instrucciones de mantenimiento generalmente son invocadas por el mantenedor de Raydium.
Eliminadas / ya no invocables (sus constructores de cliente fueron eliminados):
Initialize (etiqueta 0, usa Initialize2), MonitorStep (2), MigrateToOpenBook (5), WithdrawSrm (8), PreInitialize (10, usa Initialize2), SimulateInfo (12), AdminCancelOrders (13).
Una transacción que lleve una de estas etiquetas falla; el programa nunca ejecuta la instrucción. Trata los siete como eliminados en lugar de como rutas de error a manejar.
Initialize2
Arrancar un nuevo pool AMM v4 vinculado a un mercado OpenBook existente.
Argumentos
W, firmante S)
Dos diseños aceptados. La lista de 19 cuentas de arriba es la recomendada. Por
compatibilidad retroactiva el programa también lee un diseño heredado de 21 cuentas, que
inserta un
amm_open_orders ignorado en la posición 7 y un market_program ignorado en la
posición 16 — esto es lo que sigue emitiendo el constructor de instrucciones initialize2
del repositorio. Cualquier otra longitud se analiza posicionalmente contra el diseño heredado
y fallará.- El LP acuñado al creador =
sqrt(init_coin_amount × init_pc_amount) − 10^coin_mint.decimals. Los decimales del LP son iguales acoin_mint.decimals, así que la cantidad restada es exactamente un token LP entero; nunca se acuña y queda permanentemente fuera de circulación. Sisqrt(...)está por debajo de eso, la instrucción revierte conInitLpAmountTooLess. AmmInfo.lp_amountalmacena elsqrt(...)completo, no la cantidad acuñada — así quelp_mint.supplyqueda permanentemente un token LP entero por debajo deamm.lp_amount. Toda la matemática prorrateada usaamm.lp_amount.- No se publican órdenes de OpenBook (la cuadrícula del libro de órdenes ha sido eliminada).
AmmInfo.marketregistra la cuenta pasada en la posición 15, peroAmmInfo.open_ordersyAmmInfo.market_programse escriben ambos comoPubkey::default(), ycoin_lot_size/pc_lot_size/min_sizese inicializan a0. En el diseño heredado de 21 cuentas, las cuentas extraamm_open_ordersymarket_programse leen y se descartan.
InvalidCoinMint (los mints coin y pc son idénticos), InvalidConfigAccount (PDA amm_config incorrecto), InvalidFee (destino incorrecto de la comisión de creación de pool), InvalidProgramAddress (amm_authority o nonce incorrectos), RepeatCreateAmm (ya existe un pool para este mercado), InitLpAmountTooLess, InvalidSupply (alguna de las cantidades iniciales es 0, o el mint de LP ya tiene suministro), AlreadyInUse.
Deposit
Añadir liquidez.
Argumentos
Matemáticas — prorrateado estándar. Usando las reservas efectivas del pool (bóvedas + en libro), el SDK calcula el par coin/pc que produce la cantidad de LP dada y lo verifica contra
max_*. Revierte con ExceededSlippage si alguno de los lados excede el límite.
Withdraw
Quemar LP, recibir ambos lados.
Argumentos
Ya no hay ningún paso de liquidación desde OpenBook — la matemática prorrateada usa directamente los saldos de las bóvedas.
SwapBaseIn
Intercambio de entrada exacta. Siempre un intercambio de ruta AMM (no se enruta a través de la coincidencia de OpenBook).
Usa las variantes V2 para código nuevo. Dado que la dependencia de OpenBook de AMM v4 ha sido eliminada, los puntos de entrada V1 (
SwapBaseIn, SwapBaseOut) aún esperan la lista completa de 17 cuentas (o 18 con la cuenta de órdenes objetivo opcional), pero las cuentas de OpenBook/mercado ahora son aceptadas posicionalmente e ignoradas — no se validan y no se emite CPI. Pasar un número de cuenta incorrecto aún revierte con WrongAccountsNumber, pero el contenido de la cuenta de mercado ya no se verifica. Las nuevas integraciones deben usar SwapBaseInV2 / SwapBaseOutV2, que toman una lista de cuentas mucho más pequeña y representan la ruta de ejecución canónica hoy. Las formas V1 se documentan aquí para completitud y para leer transacciones existentes en cadena.
Matemáticas — consulta
products/amm-v4/math.
Precondiciones
AmmStatus::from_u64(amm.status).swap_permission()es verdadero — es decir,statuses1(Initialized),6(SwapOnly) o7(WaitingTrade).statuses un valor de enumeración, no una máscara de bits; verproducts/amm-v4/accounts.amm.state_data.pool_open_time <= now.amount_in > 0.user_source_token_accountcontiene al menosamount_in.
- El usuario pierde
amount_indel token de origen, ganaamount_out ≥ minimum_amount_outdel token de destino. - La comisión de swap se queda en las bóvedas, elevando el invariante
k. Los contadoresneed_take_pnl_*no son tocados por los swaps — el PnL del protocolo se recalcula a partir del delta deken el siguienteDeposit,WithdrawoWithdrawPnl(Processor::calc_take_pnl). - Nota: los contadores de análisis
state_data.swap_*_in_amount/swap_*_out_amountya no se actualizan — sus valores están congelados. Usa registros de transacciones para análisis de volumen.
ExceededSlippage, InvalidInput, InvalidStatus, NotAllowed (mint de coin/pc idéntico).
SwapBaseOut
Salida exacta, inversa de SwapBaseIn. Mismas cuentas.
Argumentos
SwapBaseInV2 / SwapBaseOutV2
Puntos de entrada de intercambio variantes (etiquetas 16 / 17) que omiten completamente las cuentas de OpenBook. Las matemáticas son idénticas a la ruta V1, pero la lista de cuentas se reduce a solo el lado AMM y el usuario — 8 cuentas, y amm_open_orders no se pasa:
Las reservas del pool ahora son los saldos de la bóveda (menos PnL pendiente), por lo que las matemáticas de cotización son directas e idénticas a la ruta v1. Usa V2 para ahorrar cómputo y evitar pasar las cuentas de mercado (ahora ignoradas). El enrutador de Raydium siempre usa la forma V2 al enrutar a través de AMM v4.
Los argumentos son los mismos que las formas V1 (
amount_in / minimum_amount_out para SwapBaseInV2; max_amount_in / amount_out para SwapBaseOutV2).
MonitorStep y otras instrucciones eliminadas
Históricamente, MonitorStep accionaba la interacción de OpenBook del pool: liquidaba órdenes completadas (moviendo ganancias de las bóvedas de mercado a las bóvedas del pool a través de CPI de OpenBook), cancelaba órdenes obsoletas y publicaba nuevas órdenes para cerrar la brecha entre target_orders y amm_open_orders. Con la dependencia de OpenBook eliminada, no hay nada que accionar y la instrucción se ha ido. Cualquier mantenedor o integración que aún la llame debe eliminar la llamada.
WithdrawPnl / TakePnl
Barrido de administrador de tarifas de protocolo acumuladas.
Argumentos
WithdrawPnlno toma argumentos; leeneed_take_pnl_*y mueve esas cantidades exactas.
Efecto
- Transfiere
need_take_pnl_coindepool_coin_token_accountapnl_coin_token_account. - Lo mismo para pc.
- Pone a cero
need_take_pnl_coinyneed_take_pnl_pc. - Cambio de lógica: si el saldo de la bóveda es insuficiente para cubrir el PnL acumulado, la instrucción devuelve
TakePnlErrordirectamente (ya no manipula el estado del libro de órdenes).
SetParams
Cambios de parámetros de administrador, llamados por la multifirma de Raydium. Los argumentos son una etiqueta param: u8 + carga útil.
CreateConfigAccount / UpdateConfigAccount
Gestión de administrador del PDA AmmConfig a nivel de programa (semilla ["amm_config_account_seed"]). La cuenta contiene exactamente tres campos significativos — pnl_owner, cancel_owner y create_pool_fee — más dos regiones de relleno reservadas; no hay bandera de creación de pool. UpdateConfigAccount establece pnl_owner con param = 0, cancel_owner con param = 1 y create_pool_fee con param = 2.
Cambiado en 2026-09, y compatible hacia atrás.
CreateConfigAccount ya no lee la variable del sistema rent. Su lista de cuentas ahora es 4 cuentas, reducida de 5:El programa lee parámetros de renta de
Rent::get() en lugar de deserializar una cuenta de variable del sistema pasada — lo que la actualización de dependencia de Solana 3.0 hizo natural.La cuenta eliminada fue última en la lista, y el manejador lee sus cuentas posicionalmente a través de next_account_info sin verificación de longitud. Una herramienta de administrador existente que aún pase la lista antigua de 5 cuentas por lo tanto sigue funcionando: la cuenta de renta final simplemente nunca se lee. Actualízala cuando sea conveniente, no urgentemente. UpdateConfigAccount no ha cambiado.Initialize2 mantiene la variable del sistema rent en la posición 3, y aún la usa: el programa dejó de llamar a Rent::from_account_info en ella, pero aún se reenvía a los CPI de spl_token::initialize_account e initialize_mint que crean las bóvedas del pool y el mint de LP. No la elimines de la lista de cuentas.
WithdrawExcessLamports
Barrido de administrador de lamports sentados por encima del mínimo exento de renta en cuentas que el programa controla. Añadido en la actualización 2026-09 para recuperar el exceso de financiamiento que la reducción de renta SIMD-0437 deja en cuentas creadas antes de cada paso.
Solo mueve el exceso. Los saldos de tokens, datos de cuenta, propietarios y estado del pool no se tocan, y la instrucción es una no-operación en una cuenta ya en su mínimo — por lo que es seguro dispararla repetidamente y nuevamente después de cada paso de lanzamiento.
Argumentos — ninguno. La carga útil es el byte de etiqueta único 18.
Cuentas
Cómo se maneja cada cuenta de origen
El programa se distribuye en el
owner de la cuenta de origen:
Errores comunes —
InvalidSignAccount (firmante incorrecto), InvalidSplTokenProgram (programa incorrecto en la ranura 3), InvalidProgramAddress (amm_authority incorrecto), LamportsCalculateError (código personalizado 60; el viaje de ida y vuelta de wSOL no llegó a cero), e InsufficientFunds de la ruta controlada por el programa cuando una cuenta contiene menos que su propio mínimo de renta.
Sin constructor del SDK. @raydium-io/raydium-sdk-v2 no envía un constructor para esta instrucción, ni tampoco el repositorio raydium-sdk-V2-demo — es una ruta de administrador. Codifícala a mano, de la manera que el barrido del lado de la billetera en solana-fundamentals/rent-and-reclaimable-rent lo hace para la instrucción del programa de tokens.
Matriz de cambio de estado
La columna de OpenBook se ha ido — ninguna instrucción toca un libro de órdenes más.Dónde ir a continuación
products/amm-v4/code-demos— Ejemplos de TypeScript para flujos de intercambio y LP.products/amm-v4/fees— Detalles deWithdrawPnly la división de tarifas.reference/error-codes— Tabla de referencia directa (los errores de AMM v4 se enumeran en esa página).
- Programa Raydium AMM —
raydium-io/raydium-amm - Módulo
Liquiditydel SDK de Raydium v2 - Programa OpenBook — validaciones de cuenta en el lado del mercado

