As instruções AMM v4 esperam uniformemente tanto um pool side (contas do programa AMM v4) quanto um market side (contas OpenBook para o mercado vinculado). Omitir ou descompasar qualquer um dos conjuntos reverte a operação. As listas de contas abaixo usam nomes de campo do Raydium SDK para clareza; o IDL subjacente às vezes usa prefixos serum_*.
Inventário de instruções
| Grupo | Instrução | Notas |
|---|
| Ciclo de vida do pool | Initialize2 | Instrução de criação de pool atual (ainda funcional; a UI padrão para novos pools é CPMM). |
| Liquidez | Deposit | Adicionar liquidez, receber LP. |
| Liquidez | Withdraw | Queimar LP, receber ambos os lados pro-rata. |
| Swap | SwapBaseIn | Swap de entrada exata (caminho completo: vaults + OpenBook). |
| Swap | SwapBaseOut | Swap de saída exata (caminho completo). |
| Swap | SwapBaseInV2 | Swap de entrada exata que ignora OpenBook — apenas vaults, menos contas. |
| Swap | SwapBaseOutV2 | Swap de saída exata que ignora OpenBook. |
| Manutenção | SetParams | Admin: alterar parâmetros do pool. |
| Manutenção | WithdrawPnl | Varrer PnL do protocolo acumulado para as contas proprietário-PnL. |
| Manutenção | CreateConfigAccount | Admin: inicializar o AmmConfig PDA em nível de programa. |
| Manutenção | UpdateConfigAccount | Admin: alterar parâmetros de configuração em nível de programa. |
O SDK expõe builders apenas para instruções com interface de usuário. Instruções de manutenção são tipicamente invocadas pelo keeper do Raydium.
Initialize2
Bootstrap um novo pool AMM v4 vinculado a um mercado OpenBook existente.
Argumentos
nonce: u8
open_time: u64
init_pc_amount: u64
init_coin_amount: u64
Contas (escrita W, assinante S)
| # | Nome | W | S | Notas |
|---|
| 1 | token_program | | | SPL Token. |
| 2 | system_program | | | |
| 3 | rent | | | |
| 4 | amm | W | | Conta AmmInfo (chave com seed). |
| 5 | amm_authority | | | PDA do programa. |
| 6 | amm_open_orders | W | | OpenBook OpenOrders (com seed). |
| 7 | lp_mint | W | | |
| 8 | coin_mint | | | |
| 9 | pc_mint | | | |
| 10 | pool_coin_token_account | W | | |
| 11 | pool_pc_token_account | W | | |
| 12 | pool_withdraw_queue | W | | |
| 13 | pool_target_orders_account | W | | |
| 14 | pool_lp_token_account | W | | ATA LP do criador. |
| 15 | pool_temp_lp_token_account | W | | Conta de rascunho. |
| 16 | market_program | | | Programa OpenBook. |
| 17 | market | | | Mercado OpenBook. |
| 18 | user_wallet | W | S | Criador. Paga rent e financia depósito inicial. |
| 19 | user_token_coin | W | | |
| 20 | user_token_pc | W | | |
Pós-condições
lp_supply = sqrt(init_coin_amount × init_pc_amount) − INIT_BURN, onde INIT_BURN ≈ 100 unidades LP são mantidas fora de circulação.
- As ordens OpenBook ainda não foram postadas; o primeiro
MonitorStep posta a grid inicial.
Erros comuns — InvalidInput (decimais descompassadas, não ordenados), NotApproved, InvalidMarketState do lado OpenBook.
Deposit
Adicionar liquidez.
Argumentos
max_coin_amount: u64
max_pc_amount: u64
base_side: u64 // 0 = base em coin, 1 = base em pc
// (algumas variantes do SDK também aceitam other_amount_min)
Contas (abreviado)
| # | Nome | W | S |
|---|
| 1 | token_program | | |
| 2 | amm | W | |
| 3 | amm_authority | | |
| 4 | amm_open_orders | | |
| 5 | amm_target_orders | W | |
| 6 | lp_mint | W | |
| 7 | pool_coin_token_account | W | |
| 8 | pool_pc_token_account | W | |
| 9 | market | | |
| 10 | user_coin_token_account | W | |
| 11 | user_pc_token_account | W | |
| 12 | user_lp_token_account | W | |
| 13 | user_owner | | S |
Matemática — pro-rata padrão. Usando as reservas efetivas do pool (vaults + on-book), o SDK calcula o par coin/pc que rende a quantidade de LP fornecida e verifica contra max_*. Reverte com ExceededSlippage se qualquer lado exceder o limite.
Withdraw
Queimar LP, receber ambos os lados.
Argumentos
amount: u64 // LP a queimar
Contas — como Deposit com a direção invertida; lp_mint é escrita para burn, os ATAs do usuário são receptores. Uma etapa de settle-from-OpenBook semelhante a MonitorStep acontece internamente antes da matemática pro-rata para que o resgate use reservas frescas.
SwapBaseIn
Swap de entrada exata. Sempre um swap de caminho AMM (não roteia através de matching OpenBook).
Use as variantes V2 para novo código. Como o AMM v4 não compartilha mais liquidez com OpenBook, os entrypoints V1 (SwapBaseIn, SwapBaseOut) — que ainda requerem o conjunto completo de contas OpenBook para validação — são funcionalmente redundantes. Novas integrações devem usar SwapBaseInV2 / SwapBaseOutV2, que levam uma lista de contas muito menor e representam o caminho de execução canônico hoje. As formas V1 são documentadas aqui para completude e para ler transações on-chain existentes.
Argumentos
amount_in: u64
minimum_amount_out: u64
Contas (abreviado)
| # | Nome | W | S |
|---|
| 1 | token_program | | |
| 2 | amm | W | |
| 3 | amm_authority | | |
| 4 | amm_open_orders | W | |
| 5 | amm_target_orders | W | |
| 6 | pool_coin_token_account | W | |
| 7 | pool_pc_token_account | W | |
| 8 | market_program | | |
| 9 | market | W | |
| 10 | market_bids | W | |
| 11 | market_asks | W | |
| 12 | market_event_queue | W | |
| 13 | market_coin_vault | W | |
| 14 | market_pc_vault | W | |
| 15 | market_vault_signer | | |
| 16 | user_source_token_account | W | |
| 17 | user_dest_token_account | W | |
| 18 | user_owner | | S |
Matemática — veja products/amm-v4/math.
Pré-condições
amm.status permite swap (bit 0 da máscara de bitmask de status não está definido).
amm.state_data.pool_open_time <= now.
amount_in > 0.
user_source_token_account mantém pelo menos amount_in.
Pós-condições
- Usuário perde
amount_in do token de origem, ganha amount_out ≥ minimum_amount_out do token de destino.
state_data.swap_*_in_amount e swap_*_out_amount incrementados (para análise).
need_take_pnl_* incrementado pela parcela de taxa de protocolo.
Erros comuns — ExceededSlippage, InvalidInput, InvalidStatus, InvalidMarket.
SwapBaseOut
Saída exata, inverso de SwapBaseIn. Mesmas contas.
Argumentos
max_amount_in: u64
amount_out: u64
SwapBaseInV2 / SwapBaseOutV2
Variantes de entrypoint de swap que ignoram as contas OpenBook completamente. A matemática é idêntica ao caminho V1, mas a lista de contas encolhe apenas para o lado AMM:
| # | Nome | W | S |
|---|
| 1 | token_program | | |
| 2 | amm | W | |
| 3 | amm_authority | | |
| 4 | amm_open_orders | | |
| 5 | pool_coin_token_account | W | |
| 6 | pool_pc_token_account | W | |
| 7 | user_source_token_account | W | |
| 8 | user_dest_token_account | W | |
| 9 | user_owner | | S |
As reservas efetivas do pool ainda levam em conta tokens postados no OpenBook, então a matemática de quote não muda. Use V2 para economizar compute e evitar passar as contas de mercado quando você não precisa de um crank OpenBook na mesma transação. O roteador Raydium sempre usa a forma V2 ao rotear através de AMM v4.
Os argumentos são os mesmos das formas V1 (amount_in / minimum_amount_out para SwapBaseInV2; max_amount_in / amount_out para SwapBaseOutV2).
MonitorStep (legado / inerte)
Não é mais acionado. AMM v4 não compartilha mais liquidez com OpenBook, então MonitorStep não tem nada a fazer — o pool não tem ordens postadas para settle, cancel ou replace. A instrução permanece no programa on-chain para compatibilidade com versões anteriores, mas o keeper do Raydium não a chama mais. Chamá-la manualmente é efetivamente um no-op (exceto por atualizar o estado zerado) e não deve ser necessário para integradores.
Originalmente esta instrução acionava a interação do pool com OpenBook.
Argumentos
plan_order_limit: u16
place_order_limit: u16
cancel_order_limit: u16
Contas — tudo acima para um swap, mais contas administrativas OpenBook.
Efeito original (não é mais relevante na prática):
- Settled quaisquer ordens preenchidas (seus rendimentos movidos de
market_coin_vault/market_pc_vault para os vaults do pool via OpenBook CPI).
- Cancelou ordens obsoletas cujos preços ou tamanhos não correspondiam mais a
target_orders.
- Postou novas ordens para fechar a lacuna entre
target_orders e amm_open_orders.
Sem permissão. Qualquer conta pode chamá-la; historicamente o keeper do Raydium o fazia rotineiramente.
WithdrawPnl / TakePnl
Sweep administrativo de taxas de protocolo acumuladas.
Argumentos
WithdrawPnl não leva argumentos; lê need_take_pnl_* e move exatamente esses valores.
Contas (abreviado)
| # | Nome | W | S | |
|---|
| 1 | token_program | | | |
| 2 | amm | W | | |
| 3 | amm_authority | | | |
| 4 | amm_config | | | |
| 5 | amm_open_orders | W | | |
| 6 | pool_coin_token_account | W | | |
| 7 | pool_pc_token_account | W | | |
| 8 | pnl_coin_token_account | W | | Destinatário, armazenado em AmmConfig. |
| 9 | pnl_pc_token_account | W | | |
| 10 | pnl_owner | | S | Multisig admin. |
| 11 | market_program | | | |
| 12 | market | W | | |
| 13 | market_event_queue | W | | |
| 14 | market_coin_vault | W | | |
| 15 | market_pc_vault | W | | |
| 16 | market_vault_signer | | | |
Efeito
- Transfere
need_take_pnl_coin de pool_coin_token_account para pnl_coin_token_account.
- Mesmo para pc.
- Zera
need_take_pnl_coin e need_take_pnl_pc.
Nenhuma alteração nas reservas já que o PnL acumulado foi excluído do invariante.
SetParams
Alterações de parâmetros admin: máscara de status bitmask, profundidade da grid de ordenação, ondas de quantidade, taxas (raramente), etc. Chamado pelo multisig do Raydium. Os argumentos são uma tag param: u8 + payload, análogo ao UpdateAmmConfig do CPMM.
Matriz de mudança de estado
| Instrução | Oferta lp_mint | Vaults | Contadores PnL | OpenBook |
|---|
Initialize2 | oferta inicial cunhada para criador | + init_coin_amount, + init_pc_amount | 0 | OpenOrders criado |
Deposit | + | + ambos | — | settle fills |
Withdraw | − | − ambos | — | settle fills |
SwapBaseIn | — | + in, − out | + pnl share | talvez re-post grid |
SwapBaseOut | — | + in, − out | + pnl share | talvez re-post grid |
MonitorStep | — | settle fills | — | cancel / post |
WithdrawPnl | — | − (pnl swept) | 0 | — |
SetParams | — | — | — | — |
Próximos passos
Fontes: