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 →
Esta entrada cubre una próxima actualización del programa AMM v4. Fue verificada contra la rama de lanzamiento local antes del despliegue. Confirma el programa desplegado antes de confiar en la nueva instrucción.
Dos cosas no relacionadas llegan juntas en una reconstrucción. La primera es mantenimiento: AMM v4 había estado fijado a solana-program =2.1.0 desde la actualización 2.1, y ese pin era un obstáculo. Los helpers del programa del sistema se movieron a su propio crate solana-system-interface en Solana 3.0, spl-token llegó a 9.0, y spl-associated-token-account llegó a 8.0. Este lanzamiento toma los tres. La segunda es dinero que el protocolo debe. SIMD-0437 está reduciendo el mínimo exento de rent en un 90% en cinco pasos, y el paso 1 llegó a mainnet el 3 de septiembre de 2026. Cada cuenta que AMM v4 creó antes — cientos de bóvedas de pool, mints de LP, cuentas AmmInfo y TargetOrders — ahora está sobre-financiada, y los lamports en una cuenta propiedad del programa solo pueden ser movidos por ese programa. De ahí una nueva instrucción.

TL;DR para integradores

  • Nada que un trader o LP llame ha cambiado. Initialize2, Deposit, Withdraw, SwapBaseIn, SwapBaseOut, SwapBaseInV2, SwapBaseOutV2, WithdrawPnl y SetParams mantienen sus listas de cuentas, layouts de argumentos y matemática. Ningún layout de cuenta cambió. Ningún código de error existente se movió.
  • Una instrucción se añade: WithdrawExcessLamports, tag 18. Solo para administrador, sin argumentos, lista de cuentas variádica. Devuelve lamports por encima del mínimo exento de rent desde cuentas controladas por AMM v4 y no toca nada más. Ver products/amm-v4/instructions.
  • Un código de error se añade: 60 LamportsCalculateError. AmmError no está numerado por Anchor — comienza en 0 — así que esto es custom program error: 0x3c. Los códigos 059 no cambian.
  • CreateConfigAccount (tag 14) dejó de leer la sysvar de rent y ahora está documentada como una instrucción de 4 cuentas. Nada en este lanzamiento es un cambio disruptivo, esto incluido: la cuenta estaba al final de la lista y el handler lee posicionalmente sin verificación de longitud, así que las herramientas de administrador que aún la pasan siguen funcionando.
  • Se requiere una actualización de IDL si generas clientes desde uno. Una nueva instrucción, una nueva variante de error, una lista de cuentas cambiada.

WithdrawExcessLamports

La instrucción toma la billetera de recolección de lamports como el único firmante y destino, el PDA de autoridad de AMM v4, el programa SPL Token, y luego cualquier número de cuentas de origen. Se distribuye según el propietario de cada cuenta de origen: La rama de wSOL es la interesante. El balance de lamports de una cuenta de SOL envuelto es su balance de token, así que el programa token rechaza WithdrawExcessLamports en ella completamente. El viaje de ida y vuelta a través de SyncNative y un UnwrapLamports de tamaño delta extrae solo el exceso donado y deja el balance envuelto exactamente donde comenzó — lo cual es asertado después, con LamportsCalculateError si la aritmética no está de acuerdo. Una bóveda de pool del lado de SOL por lo tanto mantiene su liquidez completa a través de un barrido, y ningún LP ve un cambio de precio a través de uno. El firmante es una clave dedicada por cluster, codificada bajo el mismo módulo config_feature que las direcciones existentes del propietario de AMM y la tarifa de creación de pool. A diferencia de CPMM y LaunchLab, AMM v4 acepta solo esa billetera — no hay fallback de administrador. Las direcciones están en reference/program-addresses.

CreateConfigAccount dejó de leer la sysvar de rent

Solana 3.0 es lo que hace que Rent::get() sea la forma natural de leer parámetros de rent, así que el lanzamiento reemplazó las cuatro llamadas Rent::from_account_info(...) en el programa. En tres de ellas — los helpers que crean las cuentas de token del pool, mint de LP y cuentas PDA durante Initialize2 — la cuenta sysvar aún se pasa y aún se reenvía a los CPIs del programa token, así que nada sobre esa lista de cuentas cambia. En CreateConfigAccount la sysvar no tenía otro propósito y era la última cuenta en la lista, así que salió de la lista documentada: Enviar la lista antigua de cinco cuentas aún funciona. La cuenta removida estaba al final, y process_create_config lee sus cuatro cuentas posicionalmente a través de next_account_info sin nada verificando el conteo total, así que una cuenta de rent final nunca es mirada. Las herramientas de administrador deben ser actualizadas por claridad, no por urgencia. Ningún constructor de cara al usuario construye esta instrucción en absoluto. Initialize2 es el caso a no sobre-leer: también dejó de llamar Rent::from_account_info, pero su cuenta de rent permanece en la posición 3 y aún es genuinamente usada — el programa la reenvía a los CPIs spl_token::initialize_account e initialize_mint que crean las bóvedas del pool y el mint de LP. Dejarla caer de esa lista de cuentas rompería la creación de pool.

Cambios de dependencias

Las piezas del programa del sistema que el programa usa — system_instruction::create_account, transfer, allocate, assign, y el ID del programa mismo — ahora vienen de solana-system-interface en lugar de solana_program::system_program y solana_program::system_instruction. El ID del programa es byte-idéntico, así que esto es un movimiento de tiempo de compilación sin consecuencia en cadena, incluyendo para las verificaciones InvalidSysProgramAddress que comparan contra él. Dos módulos muertos también fueron eliminados: srm_token y msrm_token, las declaraciones de mint de Serum/MSRM dejadas de la remoción de OpenBook. Nada las referenciaba.

Lo que no cambió

  • Cada layout de cuenta. AmmInfo, StateData, TargetOrders, AmmConfig — mismos tamaños, mismos offsets de campo. Ningún cambio de indexador o decodificador.
  • Códigos de error 059. LamportsCalculateError se añade en 60, así que nada se desplaza.
  • El PDA de autoridad de AMM. Aún un PDA para todo el programa, seed ["amm authority"], nonce 254.
  • Tarifas, contabilidad de PnL, y la curva. Sin tocar. WithdrawExcessLamports mueve lamports que nunca fueron parte de las reservas de ningún pool.
  • Token-2022. Aún no soportado. La nueva instrucción habla solo al programa SPL Token heredado.
  • ID del programa. Sin cambios — ver reference/program-addresses.

Páginas actualizadas

  • products/amm-v4/instructionsWithdrawExcessLamports añadida con su lista de cuentas y tabla de distribución por propietario; nueva sección CreateConfigAccount / UpdateConfigAccount cubriendo la remoción de sysvar de rent; filas de tabla de inventario y matriz de cambio de estado añadidas.
  • products/amm-v4/overview — banner de lanzamiento.
  • reference/error-codes — nueva sección “AMM v4: AmmError no está numerado por Anchor” documentando el código 60 y la numeración basada en 0.
  • reference/program-addresses — nueva sección “Billeteras de recolección de lamports excedentes”.
  • solana-fundamentals/rent-and-reclaimable-rent — nueva sección “Lo que los programas de Raydium barren en su propio lado”; la nota de SOL envuelto corregida para decir que ambos programas token exponen UnwrapLamports.
  • solana-fundamentals/toolchain — Agave 3.1.10, release.anza.xyz, Rust 1.91.0.