> ## 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.

# Implantar um pool CPMM

> Script Node pronto para usar que cria um novo pool CPMM. Configure mints e quantidades iniciais via variáveis de ambiente.

<Info>
  **Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.**

  [Ver versão em inglês →](/quick-start/deploy-cpmm-pool)
</Info>

<Info>
  **O que isto faz.** Cria um novo pool CPMM para dois mints que você especificar, seleciona a camada de taxa de 0,25%, fornece liquidez inicial ao preço implícito pelas quantidades iniciais e imprime o novo ID do pool e a assinatura da transação.
</Info>

## Configuração

Certifique-se de ter lido os [pré-requisitos do Quick start](/pt/quick-start) e de ter `RPC_URL`, `KEYPAIR` e as dependências instaladas.

Você também precisará **financiar a carteira com as quantidades iniciais de ambos os mints**, mais SOL suficiente para cobrir a taxa única de criação do pool e aluguel de conta (\~0,19 SOL no total em mainnet — veja [`reference/fee-comparison`](/pt/reference/fee-comparison#creation-costs) para o detalhamento de aluguel/taxa, ou [`ray/protocol-fees`](/pt/ray/protocol-fees#pool-creation-fees) apenas para a taxa).

**Executando isto em devnet.** Mudar `cluster` para `"devnet"` não é suficiente por si só. Este script fixa duas importações nomeadas que não seguem `cluster`: `programId: CREATE_CPMM_POOL_PROGRAM` e `poolFeeAccount: CREATE_CPMM_POOL_FEE_ACC`, ambas constantes de mainnet. Importe `DEVNET_PROGRAM_ID` do SDK e use `DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM` e `DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_FEE_ACC` em seu lugar — o mesmo padrão que o [script CLMM](/pt/quick-start/deploy-clmm-pool) usa.

## O script

Salve como `create-cpmm.mjs`:

```ts create-cpmm.mjs icon="js" theme={null}
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
  Raydium,
  TxVersion,
  CREATE_CPMM_POOL_PROGRAM,
  CREATE_CPMM_POOL_FEE_ACC,
} from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";
import fs from "node:fs";

// ── Config from env ──────────────────────────────────────────────
const RPC_URL  = process.env.RPC_URL  ?? "https://api.mainnet-beta.solana.com";
const KEYPAIR  = process.env.KEYPAIR  ?? `${process.env.HOME}/.config/solana/id.json`;
const MINT_A   = process.env.MINT_A;   // required, base58
const MINT_B   = process.env.MINT_B;   // required, base58
const AMOUNT_A = process.env.AMOUNT_A; // required, integer raw units
const AMOUNT_B = process.env.AMOUNT_B; // required, integer raw units

if (!MINT_A || !MINT_B || !AMOUNT_A || !AMOUNT_B) {
  console.error("Set MINT_A, MINT_B, AMOUNT_A, AMOUNT_B env vars.");
  process.exit(1);
}

// ── Setup ────────────────────────────────────────────────────────
const connection = new Connection(RPC_URL, "confirmed");
const owner = Keypair.fromSecretKey(
  new Uint8Array(JSON.parse(fs.readFileSync(KEYPAIR, "utf8"))),
);
const raydium = await Raydium.load({
  owner,
  connection,
  cluster: "mainnet",
  disableFeatureCheck: true,
  blockhashCommitment: "finalized",
});

// ── Pick the 0.25% fee tier ─────────────────────────────────────
const feeConfigs = await raydium.api.getCpmmConfigs();
const feeConfig  = feeConfigs.find((c) => c.index === 0);
if (!feeConfig) throw new Error("0.25% fee tier not found in CPMM configs.");

// ── Resolve mint metadata (Token-2022-aware) ────────────────────
const mintA = await raydium.token.getTokenInfo(new PublicKey(MINT_A));
const mintB = await raydium.token.getTokenInfo(new PublicKey(MINT_B));

// ── Build and execute ───────────────────────────────────────────
const { execute, extInfo } = await raydium.cpmm.createPool({
  programId:       CREATE_CPMM_POOL_PROGRAM,
  poolFeeAccount:  CREATE_CPMM_POOL_FEE_ACC,
  mintA,
  mintB,
  mintAAmount:     new BN(AMOUNT_A),
  mintBAmount:     new BN(AMOUNT_B),
  startTime:       new BN(0), // open immediately
  feeConfig,
  associatedOnly:  false,
  ownerInfo:       { useSOLBalance: true },
  txVersion:       TxVersion.V0,
  computeBudgetConfig: {
    units: 600_000,
    microLamports: 100_000,
  },
});

const { txId } = await execute({ sendAndConfirm: true });

console.log(`Pool ID:  ${extInfo.address.poolId.toBase58()}`);
console.log(`LP mint:  ${extInfo.address.lpMint.toBase58()}`);
console.log(`Vault A:  ${extInfo.address.vaultA.toBase58()}`);
console.log(`Vault B:  ${extInfo.address.vaultB.toBase58()}`);
console.log(`Tx:       https://solscan.io/tx/${txId}`);
```

## Execute

Exemplo: criar um pool SOL/USDC com 1 SOL e 160 USDC iniciais:

```bash icon="terminal" theme={null}
export MINT_A="So11111111111111111111111111111111111111112"   # wSOL
export MINT_B="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"   # USDC
export AMOUNT_A="1000000000"   # 1 SOL (9 decimals)
export AMOUNT_B="160000000"    # 160 USDC (6 decimals)

node create-cpmm.mjs
```

Saída esperada:

```text theme={null}
Pool ID:  HgC5...3kXb
LP mint:  4ZAS...9rkV
Vault A:  J9Mu...mP2k
Vault B:  AaJq...8wxx
Tx:       https://solscan.io/tx/5dQ...
```

## O que acabou de acontecer

1. **`getCpmmConfigs`** obteve a lista ativa de camadas de taxa de `api-v3.raydium.io` e selecionou o índice 0 (a camada de 0,25% — veja [`reference/fee-comparison`](/pt/reference/fee-comparison) para o conjunto completo).
2. **`getTokenInfo`** resolveu os metadados de cada mint, incluindo qual programa de token o possui. CPMM aceita mints SPL Token e Token-2022; o SDK roteia automaticamente.
3. **`createPool`** construiu uma transação que:
   * ordena os mints em ordem canônica,
   * deriva o PDA do pool, vaults, LP mint e autoridade,
   * paga a `create_pool_fee` única para `CREATE_CPMM_POOL_FEE_ACC`,
   * cria os ATAs do chamador se estiverem faltando,
   * fornece os vaults com `AMOUNT_A` e `AMOUNT_B`.
4. O **preço inicial** é definido pela razão de fornecimento: `price = AMOUNT_B / AMOUNT_A` após ajuste decimal. Escolha isto com cuidado — bots farão arbitragem de qualquer desvio de preço segundos após a abertura do pool.
5. **`startTime: new BN(0)`** abre a negociação imediatamente. Para preparar liquidez antes de abrir ao público, defina um timestamp Unix futuro.

## Erros comuns

* **`pool already exists`** — Um pool já existe para este par de mints nesta camada de taxa. Procure antes de criar.
* **`insufficient funds`** — Sua carteira não tem o suficiente de `MINT_A`, `MINT_B` ou SOL (para a taxa de criação do pool + aluguel).
* **`Token-2022 extension not supported`** — Um de seus mints usa uma extensão que CPMM não aceita. Veja [`reference/token-2022-support`](/pt/reference/token-2022-support).

## Após implantação

Você pode fazer swap imediatamente contra o novo pool — o script [Swap from CLI](/pt/quick-start/swap-from-cli) aceita seu novo `POOL_ID` diretamente. Agregadores (Jupiter, etc.) indexarão o novo pool em minutos.

## Próximos passos

* [`products/cpmm/overview`](/pt/products/cpmm/overview) — o que é CPMM e quando escolhê-lo.
* [`user-flows/create-cpmm-pool`](/pt/user-flows/create-cpmm-pool) — o mesmo fluxo com capturas de tela, via a interface do Raydium.
* [`user-flows/choosing-a-pool-type`](/pt/user-flows/choosing-a-pool-type) — você deveria ter usado CLMM em seu lugar?


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.