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 →
La curva de tabla de búsqueda
Stable AMM reemplaza la fórmula x·y=k con una tabla de búsqueda dispersa de tuplas (x, y, price). Cuando se cotiza un swap, el programa:- Calcula la relación actual del pool a partir de las reservas.
- Busca binariamente en la tabla para encontrar las dos entradas que delimitan esa relación.
- Interpola linealmente entre ellas para obtener un precio intermedio.
- Aplica comisiones y devuelve la cotización.
Diseño de tabla y búsqueda binaria
ModelDataInfo contiene hasta 50,000 entradas DataElement, indexadas por el administrador. Solo las primeras valid_data_count están activas. Cada entrada:
- Calcula la relación:
target_ratio = (x_real * multiplier) / y_real. - Busca binariamente entradas donde
(element.x * multiplier) / element.ydelimitetarget_ratio. - Cuando se encuentra un delimitador
[min_idx, max_idx], interpola.
state.rs::ModelDataInfo::get_mininum_range_by_xy_real. El invariante clave: las entradas deben estar ordenadas (x ascendente, y descendente, price ascendente) para que la búsqueda funcione.
Interpolación lineal
Una vez que dos puntos de tabla delimitan la relación, la interpolación calcula un precio intermedio y un par de reservas:Escalado: el multiplicador
Las reservas del pool y los precios se almacenan en escalas diferentes. El campomultiplier en ModelDataInfo explica esto. Un patrón común:
- La moneda tiene 6 decimales, PC tiene 18 decimales.
- Multiplicador = 10^6 (o similar).
- Las entradas de la tabla se almacenan en una escala reducida para caber dentro de los límites de u64.
Cotización de swap: SwapBaseIn y SwapBaseOut
SwapBaseIn (entrada exacta)
Dado el monto de entradaamount_in:
- Obtén la relación actual de
(coin_vault, pc_vault). - Encuentra las entradas de tabla delimitadoras e interpola para obtener la relación en el espacio de la tabla.
- Convierte la entrada al espacio de tabla:
dx_table = amount_in * multiplier / ratio. - Consulta la tabla en la nueva coordenada X para encontrar la nueva Y.
dy_table = y_old - y_new.- Convierte de vuelta:
dy_real = dy_table * ratio / multiplier. - Aplica comisión de operación:
dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator). - Devuelve
dy_output.
SwapBaseOut (salida exacta)
Simétrico: dado elamount_out deseado, resuelve el amount_in requerido.
Ambas rutas leen reservas efectivas directamente de los vaults del pool. El pool no ha mantenido órdenes abiertas de OpenBook durante años, por lo que no hay nada que liquidar primero — los saldos de los vaults son toda la historia. (La actualización del 2026-06-22 eliminó el código de mercado restante.)
Aplicación de comisiones
Idéntica a AMM v4: consultaproducts/amm-v4/math para la derivación completa.
pnl_portion va a need_take_pnl_* y es retirada por el administrador mediante WithdrawPnl. La lp_portion permanece en el vault, inflando k y beneficiando a los poseedores de tokens LP.
Contabilidad de activos del pool
La fórmula históricamente sumaba los fondos que el pool mantenía como órdenes abiertas en su cuenta OpenOrders de OpenBook. Ese término ha sido cero en la práctica desde que el pool dejó de publicar órdenes, y la actualización del 2026-06-22 lo eliminó completamente de la fórmula, dejando el cálculo solo de vaults:need_take_pnl acumulada pero no barrida se encuentra físicamente en el vault pero se excluye de la cotización). El código de cotización e indexadores que anteriormente leían saldos de OpenOrders deben eliminar ese término.
MonitorStep (eliminado)
MonitorStep era la instrucción de crank que liquidaba los rellenos pendientes de OpenBook, recalculaba AmmInfo.target_orders y volvía a publicar la cuadrícula de órdenes limitadas derivada de la tabla de búsqueda. El pool dejó de publicar órdenes en OpenBook hace años, por lo que el crank no tenía nada que hacer; fue eliminado en la actualización del 2026-06-22. Los integradores no necesitan hacer crank en pools Stable.
Resumen: por qué funciona
El diseño de tabla de búsqueda + interpolación es eficiente y flexible:- Eficiencia: La búsqueda binaria es O(log 50,000) ≈ 16 iteraciones, cada una ~ 300–500 CU. La interpolación es algunos multiplicaciones/divisiones. El costo total de cotización es ~5k–15k CU, mucho más barato que recomputar una fórmula en cada swap.
- Flexibilidad: El administrador puede codificar cualquier curva lineal por tramos. Los pares de stablecoins obtienen alta densidad alrededor de 1:1; los pares colateralizados obtienen curvas personalizadas.
- Liquidez autónoma: Todos los fondos viven en los vaults del pool y la cotización los lee directamente — sin crank, sin libro de órdenes externo, menos cuentas por transacción.
raydium-stable/program/src/state.rs, métodos get_data_by_x, get_data_by_y, get_dy_by_dx_base_in, etc.
Dónde ir a continuación
- Cuentas — referencia de campos
ModelDataInfoyDataElement. - Instrucciones — el conjunto invocable (swap, deposit, withdraw,
WithdrawPnl) y las instrucciones eliminadas. - Comisiones — aplicación de comisiones y
WithdrawPnl. products/amm-v4/math— para la lógica de cotización de órdenes inclusiva de comisiones de OpenBook.
raydium-stable/program/src/state.rs(implementaciones de interpolación y búsqueda binaria)raydium-stable/program/src/math.rs(utilidades de calculadora)

