Saltar para o conteúdo principal

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
Os programas de produtos Raydium são codebases independentes, mas foram projetados em torno de um conjunto compartilhado de convenções. Esta página é a referência canônica para essas convenções. Capítulos por produto descrevem como as convenções são instanciadas em suas contas; esta página descreve as convenções em si.

O que “compartilhado” significa aqui

Três sabores de compartilhamento percorrem a base de código:
  • Compartilhamento de convenção. Todo programa usa o mesmo padrão de derivação de PDA, a mesma forma de divisão de taxas e a mesma ideia de conta de observação — mas cada um os implementa em seu próprio programa com suas próprias sementes.
  • Compartilhamento de conta. Um punhado de contas são literalmente o mesmo registro em muitos pools (o PDA de autoridade global em CPMM, as contas AmmConfig).
  • Compartilhamento off-chain. Uma API REST e um SDK TypeScript front todos os quatro programas. Integradores interagem com um host HTTP e um pacote NPM, independentemente de qual programa eles acabam chamando.
As cinco primitivas abaixo cobrem tudo que cruza limites de programa.

1. PDAs de autoridade

Todo programa Raydium tem exatamente um PDA que possui seus cofres de token. Os usuários nunca mantêm autoridade de cofre diretamente — o PDA de autoridade é o único signatário que pode mover fundos para fora, e só assina quando uma instrução de programa válida o ordena. O padrão é idêntico entre produtos; as sementes diferem:
ProgramaSementes do PDA de autoridadeNotas
AMM v4[poolId]Autoridade por pool. Mesma forma que o design por pool do v4.
CPMM[b"vault_and_lp_mint_auth_seed"]PDA único compartilhado por todos os pools CPMM. Sem semente específica de pool.
CLMM[b"pool_vault_and_lp_mint_auth_seed"]PDA único compartilhado em todos os pools CLMM.
Farm v3 / v5 / v6[farmId]Por farm. O PDA possui cofres de staking + recompensas para esse farm.
LaunchLab[b"vault_auth", launchId]Por lançamento. Possui cofres de base + quote pré-graduação.
Algumas coisas decorrem disso:
  • Para CPMM e CLMM, o PDA de autoridade é uma conta global — cada pool desse tipo a usa. Se você está fazendo CPI em CPMM, você precisa dela uma vez, não por pool.
  • Para autoridades por pool / por farm, você deriva o PDA a partir do ID do pool/farm. O SDK faz isso em getPoolKeys / getFarmKeys; se você está integrando diretamente, você deriva com findProgramAddressSync.
  • A propriedade do cofre não pode ser alterada. Uma vez que uma conta de token é criada com o PDA de autoridade como proprietário, apenas esse PDA — invocado pelo programa — pode transferir para fora. Não há sobrescrita de administrador.
Para as sementes exatas e layouts de ATA por programa, veja products/cpmm/accounts, products/clmm/accounts, products/amm-v4/accounts, products/farm-staking/accounts, products/launchlab/accounts.

2. Contas de admin e config

CPMM e CLMM compartilham um padrão de conta de config chamado AmmConfig: uma pequena conta global, indexada por um u16, mantendo as taxas de taxas e destinos de admin que se aplicam a um nível de taxa inteiro. Pools se ligam a uma config na criação e nunca se religam.
// CPMM AmmConfig (abreviado — a versão CLMM é estruturalmente similar)
pub struct AmmConfig {
    pub bump: u8,
    pub disable_create_pool: bool,        // gate new pool creation in this tier
    pub index: u16,                       // tier index
    pub trade_fee_rate: u64,              // fraction of trade going to fees
    pub protocol_fee_rate: u64,           // fraction of trade fee to protocol
    pub fund_fee_rate: u64,               // fraction of trade fee to fund
    pub create_pool_fee: u64,             // one-time per-pool creation fee
    pub protocol_owner: Pubkey,           // signer for CollectProtocolFee
    pub fund_owner: Pubkey,               // signer for CollectFundFee
    pub padding: [u64; 16],
}
Regras da estrada:
  • Níveis de taxa são globais. Quando um pool diz “este é um pool de 0,25%”, significa que ele se liga ao AmmConfig cuja trade_fee_rate era 0,25% no momento da criação. Não há sobrescrita de taxa por pool.
  • Uma config pode ser alterada mas pools não a acompanham. Se a autoridade de config editar um AmmConfig, cada pool existente ligado a essa config pega a nova taxa imediatamente. Isso é um recurso, não um bug; é assim que as mudanças econômicas de nível de protocolo se propagam sem migrações por pool.
  • disable_create_pool é a alavanca de depreciação. Quando um nível de taxa é descontinuado, o multisig do protocolo define esse flag — pools existentes continuam funcionando mas nenhum novo pool pode escolher o nível.
  • protocol_owner / fund_owner são os signatários para chamadas de coleta de taxa. Defini-los como um multisig é o que controla o saque de taxa. Eles NÃO são os endereços de destino das taxas em si; isso é protocol_fee_destination / fund_fee_destination na mesma conta.
AMM v4 não tem AmmConfig — seus parâmetros de taxa são por pool, codificados na criação. Farm e LaunchLab têm seus próprios equivalentes (FarmConfig, LaunchConfig) cobertos em seus respectivos capítulos. Uma tabela completa de quem pode alterar o quê está em security/admin-and-multisig. As divisões de taxas atuais voltadas para o usuário estão em ray/protocol-fees.

3. A divisão de taxa de protocolo / fundo / criador

Cada taxa de swap CPMM e CLMM é dividida em até quatro destinos no caminho de saída:
                         total swap fee

              ┌───────────────┼───────────────┬──────────────┐
              ▼               ▼               ▼              ▼
        LP pool side     Protocol         Fund         Creator
        (raises k)       treasury         multisig     (LaunchLab pools)
Mecanicamente:
  1. A taxa de negociação se acumula no pool. A taxa é removida do lado de entrada do swap e o valor pós-taxa é o que a matemática de produto constante vê. Isso é o que “o LP ganha a taxa” significa — k sobe e assim também o valor implícito de token por LP.
  2. As porções de protocolo/fundo/criador são deduzidas desse acúmulo do lado LP em contas de contador por pool. Elas ficam no estado do pool (protocol_fees_token{0,1}, fund_fees_token{0,1}, etc.) até que alguém chame CollectProtocolFee / CollectFundFee / CollectCreatorFee. Elas não saem dos cofres do pool até então; da perspectiva de um swap elas ainda estão “no pool”.
  3. A coleta as move para fora. O signatário respectivo (as chaves protocol_owner / fund_owner no AmmConfig, ou o criador de lançamento para pools LaunchLab) chama a instrução de coleta e o programa transfere do cofre do pool para um ATA de destino.
Algumas observações críticas:
  • Os percentuais de divisão são da taxa de negociação, não do negócio. Uma taxa de negociação de 0,25% com uma participação de protocolo de 12% significa que o protocolo recebe 0,25% × 12% = 0,03% do negócio — não 12% do negócio.
  • Taxas de criador existem apenas em pools graduados do LaunchLab. Pools CPMM/CLMM padrão têm uma divisão de 3 vias (LP / protocolo / fundo). LaunchLab adiciona um quarto slot roteado para quem lançou o token, configurado no Initialize e imutável.
  • AMM v4 divide de apenas duas maneiras, codificadas por pool: LP e protocolo. Sem slot de fundo, sem slot de criador.
  • Fundo vs protocolo — ambos são destinos de tesouro do protocolo, mas têm signatários diferentes e usos pretendidos diferentes. protocol historicamente financia operações; fund é o tesouro de longo prazo. A divisão entre os dois é em si uma ajustável.
Taxas específicas estão em reference/fee-comparison e ray/protocol-fees.

4. Contas de observação (buffer de anel TWAP)

Tanto CPMM quanto CLMM mantêm uma conta de observação por pool — um buffer de tamanho fixo de amostras (timestamp, cumulative_price) que outros contratos podem usar para derivar um TWAP resistente a manipulação.
// CPMM ObservationState (abreviado)
pub struct ObservationState {
    pub initialized: bool,
    pub observation_index: u16,            // next slot to overwrite
    pub pool_id: Pubkey,
    pub observations: [Observation; OBSERVATION_NUM],
    pub padding: [u64; 4],
}

pub struct Observation {
    pub block_timestamp: u64,
    pub cumulative_token_0_price_x32: u128,  // sum of (price × dt) since init
    pub cumulative_token_1_price_x32: u128,
}
Como funciona:
  • Cada swap chama update_observation. O programa lê o preço atual, multiplica pelos segundos decorridos desde a observação anterior e o adiciona ao contador cumulativo. A nova entrada sobrescreve o slot mais antigo (estilo buffer de anel).
  • TWAP sobre uma janela = (cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start]). Consumidores escolhem duas observações delimitando a janela desejada e dividem.
  • O próprio Raydium não usa o TWAP para precificação. A matemática do AMM lê as reservas de spot diretamente. Observações são uma externalidade — Raydium paga o custo de escrevê-las para que outros contratos possam ler.
  • AMM v4 não tem conta de observação. É mais antigo que o design ObservationState; integradores querendo um TWAP v4 têm que computar um off-chain do histórico de logs.
Detalhes de layout e matemática de indexação estão em products/cpmm/accounts e products/clmm/accounts.

5. API REST + SDK + IDL

A superfície off-chain é um único trio usado por cada produto:
  • API RESThttps://api-v3.raydium.io. Uma visualização indexada principalmente de leitura de todo o estado on-chain mais um motor de cotação. Um host, um esquema.
  • SDK TypeScript@raydium-io/raydium-sdk-v2 no NPM. Constrói e assina transações para cada programa. Fala com a API para cotações/metadados, fala com um RPC Solana para atualizações de estado pré-assinatura.
  • Registro IDL — IDLs Anchor para cada programa publicado vivem no repositório raydium-idl (um JSON por programa: CPMM, CLMM, LaunchLab). O SDK TypeScript consome esses IDLs internamente; clientes downstream Rust / Python regeneram dos mesmos arquivos.
O limite entre eles é claro:
PeçaLê deEscreve emTolerância de obsolescência
API RESTIndexador (analisa logs da chain)— (somente leitura para integradores)Alguns segundos
SDKAPI + RPCConstrói transações; não transmiteNenhuma — deve buscar novamente o estado pré-assinatura
IDLFonte do programaVersionado por atualização do programa
Um erro comum é alimentar a saída da API REST diretamente em uma transação. Não faça isso — busque novamente o estado relevante de pool/posição de um RPC Solana no slot em que você está assinando. O SDK faz isso automaticamente para fluxos de primeira parte; se você contornar o SDK, você tem que fazer isso você mesmo. A referência completa está em sdk-api/, com a superfície IDL especificamente em sdk-api/anchor-idl.

6. Indexadores e feeds de preço

A API REST é alimentada pelo próprio indexador Raydium, que se inscreve em logs de programa de uma frota de RPCs Solana e escreve registros desnormalizados em um armazenamento SQL. Duas consequências para integradores:
  • O indexador é a única coisa que “sabe sobre” estado entre programas. Mapear um pool CPMM para seu equivalente CLMM, computar um número de volume de 24h entre versões de programa, pegar um farm associado a um mint de LP — tudo isso é trabalho de indexador. Os próprios programas não fazem isso.
  • Tempo de inatividade do indexador é tempo de inatividade da API. Se a API retorna dados obsoletos ou vazios, o indexador é o suspeito. O estado on-chain é afetado; integradores com seu próprio RPC e SDK podem continuar transacionando.
Feeds de preço são uma preocupação separada. A API publica um campo priceUsd na maioria das respostas de pool; isso é computado off-chain a partir de um snapshot da visualização do indexador das reservas do pool e um preço de referência cotado (pools USDC como o pivô comum). É bom o suficiente para UI; não é seguro usar como um oráculo on-chain. Use o TWAP de observação para isso.

O que não é compartilhado

Vale a pena listar explicitamente, porque novos leitores frequentemente assumem mais compartilhamento do que existe:
  • Programas não chamam uns aos outros. Um swap CPMM nunca faz CPI em CLMM ou AMM v4. O único programa que compõe múltiplos AMMs é o programa AMM Routing — e esse é em si fino, apenas emitindo CPIs em cada AMM em sequência.
  • Nenhuma autoridade de atualização compartilhada entre programas. Cada programa on-chain tem sua própria chave de atualização de programa (um multisig 3 de 4 mais um timelock de 24h). Elas não estão vinculadas.
  • Nenhum estado compartilhado entre farms e AMMs. Um farm não sabe qual LP que ele staked vem de um pool CPMM, um mint de NFT de posição CLMM ou um token SPL não relacionado. O programa farm trata o mint de staking como opaco.
  • Nenhuma dependência de oráculo. Precificação é reservas on-chain. Não há fallback de Pyth/Switchboard; o AMM não verifica um oráculo antes de liquidar.

Apontadores

Fontes:
  • Raydium SDK v2 — a fonte da verdade para sementes de PDA, layouts de conta e definições de IDL.
  • Registro IDL Raydium — IDLs Anchor.
  • Páginas de contas por produto citadas acima.