Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
A curva da tabela de consulta
O Stable AMM substitui a fórmula x·y=k por uma tabela de consulta esparsa de tuplas (x, y, price). Ao precificar um swap, o programa:- Calcula a razão atual do pool a partir das reservas.
- Busca binariamente na tabela para encontrar as duas entradas que delimitam essa razão.
- Interpola linearmente entre elas para obter um preço intermediário.
- Aplica taxas e retorna a cotação.
Layout da tabela e busca binária
OModelDataInfo contém até 50.000 entradas DataElement, indexadas pelo administrador. Apenas as primeiras valid_data_count estão ativas. Cada entrada:
- Calcule a razão:
target_ratio = (x_real * multiplier) / y_real. - Busque binariamente por entradas onde
(element.x * multiplier) / element.ydelimitatarget_ratio. - Quando um intervalo
[min_idx, max_idx]é encontrado, interpole.
state.rs::ModelDataInfo::get_mininum_range_by_xy_real. O invariante chave: as entradas devem estar ordenadas (x ascendente, y descendente, price ascendente) para que a busca funcione.
Interpolação linear
Quando dois pontos da tabela delimitam a razão, a interpolação calcula um preço intermediário e um par de reservas:Escala: o multiplicador
As reservas do pool e os preços são armazenados em escalas diferentes. O campomultiplier em ModelDataInfo lida com isso. Um padrão comum:
- Moeda tem 6 decimais, PC tem 18 decimais.
- Multiplicador = 10^6 (ou similar).
- As entradas da tabela são armazenadas em uma escala reduzida para caber nos limites de u64.
Precificação de swap: SwapBaseIn e SwapBaseOut
SwapBaseIn (entrada exata)
Dado o valor de entradaamount_in:
- Obtenha a razão atual de
(coin_vault, pc_vault). - Encontre as entradas da tabela que delimitam e interpole para obter a razão no espaço da tabela.
- Converta a entrada para o espaço da tabela:
dx_table = amount_in * multiplier / ratio. - Consulte a tabela na nova coordenada X para encontrar o novo Y.
dy_table = y_old - y_new.- Converta de volta:
dy_real = dy_table * ratio / multiplier. - Aplique a taxa de negociação:
dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator). - Retorne
dy_output.
SwapBaseOut (saída exata)
Simétrico: dado oamount_out desejado, resolva para o amount_in necessário.
Ambos os caminhos leem as reservas efetivas diretamente dos vaults do pool. O pool não mantém ordens abertas do OpenBook há anos, portanto não há nada para liquidar primeiro — os saldos dos vaults são a história completa. (A atualização de 2026-06-22 removeu o código de mercado restante.)
Aplicação de taxas
Idêntica ao AMM v4: vejaproducts/amm-v4/math para a derivação completa.
pnl_portion vai para need_take_pnl_* e é retirada pelo administrador via WithdrawPnl. A lp_portion permanece no vault, inflacionando k e beneficiando os detentores de tokens LP.
Contabilidade de ativos do pool
A fórmula historicamente adicionava os fundos que o pool mantinha como ordens abertas em sua conta OpenOrders do OpenBook. Esse termo tem sido zero na prática desde que o pool parou de postar ordens, e a atualização de 2026-06-22 o removeu completamente da fórmula, deixando apenas o cálculo baseado em vaults:need_take_pnl acumulada mas não retirada fica fisicamente no vault mas é excluída da precificação). O código de cotação e indexadores que anteriormente liam saldos de OpenOrders devem descartar esse termo.
MonitorStep (removido)
MonitorStep era a instrução de crank que liquidava preenchimentos pendentes do OpenBook, recomputava AmmInfo.target_orders e repostava a grade de ordens limitadas derivada da tabela de consulta. O pool parou de postar ordens no OpenBook há anos, então o crank não tinha mais nada a fazer; foi removido na atualização de 2026-06-22. Integradores não precisam fazer crank em pools Stable.
Resumo: por que isso funciona
O design de tabela de consulta + interpolação é eficiente e flexível:- Eficiência: A busca binária é O(log 50.000) ≈ 16 iterações, cada uma ~ 300–500 CU. A interpolação é algumas multiplicações/divisões. O custo total de cotação é ~5k–15k CU, muito mais barato do que recomputar uma fórmula a cada swap.
- Flexibilidade: O administrador pode codificar qualquer curva linear por partes. Pares de stablecoin obtêm alta densidade em torno de 1:1; pares colateralizados obtêm curvas personalizadas.
- Liquidez autossuficiente: Todos os fundos vivem nos vaults do pool e a precificação os lê diretamente — sem crank, sem livro de ordens externo, menos contas por transação.
raydium-stable/program/src/state.rs, métodos get_data_by_x, get_data_by_y, get_dy_by_dx_base_in, etc.
Próximos passos
- Contas — referência de campos
ModelDataInfoeDataElement. - Instruções — o conjunto chamável (swap, deposit, withdraw,
WithdrawPnl) e as instruções removidas. - Taxas — aplicação de taxas e
WithdrawPnl. products/amm-v4/math— para a lógica de precificação de ordens inclusiva de taxas do OpenBook.
raydium-stable/program/src/state.rs(implementações de interpolação e busca binária)raydium-stable/program/src/math.rs(utilitários de calculadora)

