# Lanzamiento de un token

Los creadores de tokens usan `createLaunchpad()` para desplegar un nuevo token respaldado por una bonding curve. Esta única transacción:

* acuña el token
* crea metadata on-chain
* inicializa la bonding curve
* abre el trading inmediatamente

No se requiere configuración adicional.

***

## Cómo funcionan los lanzamientos de tokens

Cuando se lanza un token, los siguientes pasos ocurren de forma atómica:

1. **Creación del token**\
   Se acuña un nuevo SPL token (o Token-2022 token) con el suministro especificado.
2. **Creación de metadata**\
   Se crea metadata on-chain vía Metaplex usando el nombre, símbolo y URI proporcionados.
3. **Inicialización de la bonding curve**\
   Se inicializa un pool de bonding curve usando los parámetros configurados.
4. **Comienza el trading**\
   Los usuarios pueden comprar y vender el token inmediatamente en la bonding curve.
5. **Migración**\
   Una vez alcanzada la meta de recaudación, la liquidez migra automáticamente a un pool de Raydium.

***

## Creando un lanzamiento de token

```ts
import {
  TxVersion,
  LAUNCHPAD_PROGRAM,
  getPdaLaunchpadConfigId,
  CpmmCreatorFeeOn,
} from '@raydium-io/raydium-sdk-v2'
import { initSdk } from './config'
import { Keypair, PublicKey } from '@solana/web3.js'
import { NATIVE_MINT } from '@solana/spl-token'
import BN from 'bn.js'

const createToken = async () => {
  const raydium = await initSdk()

  // Generar un nuevo keypair de mint
  const tokenKeypair = Keypair.generate()

  // Derivar la config global (cotizada en SOL, producto constante)
  const configId = getPdaLaunchpadConfigId(
    LAUNCHPAD_PROGRAM,
    NATIVE_MINT,
    0,
    0
  ).publicKey

  const { execute, extInfo } = await raydium.launchpad.createLaunchpad({
    programId: LAUNCHPAD_PROGRAM,

    // Configuración del token
    mintA: tokenKeypair.publicKey,
    decimals: 6,
    name: 'My token',
    symbol: 'MTK',
    uri: 'https://arweave.net/metadata.json',

    // Plataforma (opcional)
    platformId: new PublicKey('your-platform-id'),

    // Config global
    configId,

    // Destino de migración
    migrateType: 'cpmm',

    // Parámetros de la bonding curve
    supply: new BN('1000000000000000'),
    totalSellA: new BN('793100000000000'),
    totalFundRaisingB: new BN('85000000000'),

    // Vesting (opcional)
    totalLockedAmount: new BN('0'),
    cliffPeriod: new BN('0'),
    unlockPeriod: new BN('0'),

    // Compra inicial (opcional)
    createOnly: true,
    buyAmount: new BN('0'),
    slippage: new BN(100),

    // Comisión del creador post-migración
    creatorFeeOn: CpmmCreatorFeeOn.OnlyTokenB,

    // Ajustes de la transacción
    txVersion: TxVersion.V0,
    extraSigners: [tokenKeypair],
  })

  const { txIds } = await execute({ sendAndConfirm: true, sequentially: true })
  console.log('Pool id:', extInfo.address.poolId.toBase58())
  console.log('Token mint:', tokenKeypair.publicKey.toBase58())
}
```

***

### Referencia de parámetros

### Configuración del token

| Parámetro  | Tipo        | Requerido | Descripción                                                                                   |
| ---------- | ----------- | --------- | --------------------------------------------------------------------------------------------- |
| `mintA`    | `PublicKey` | Sí        | Clave pública del nuevo mint de token. Genere un nuevo keypair e inclúyalo en `extraSigners`. |
| `decimals` | `number`    | No        | Número de decimales. Por defecto: `6`.                                                        |
| `name`     | `string`    | Sí        | Nombre del token usado en la metadata on-chain.                                               |
| `symbol`   | `string`    | Sí        | Ticker del token. Máx. 10 caracteres.                                                         |
| `uri`      | `string`    | Sí        | URL del JSON de metadata (Arweave, IPFS, o cualquier URL pública).                            |

***

### Plataforma y config global

| Parámetro    | Tipo        | Requerido | Descripción                                                                                    |
| ------------ | ----------- | --------- | ---------------------------------------------------------------------------------------------- |
| `platformId` | `PublicKey` | No        | Configuración de la plataforma en la que lanzar. Por defecto la plataforma oficial de Raydium. |
| `configId`   | `PublicKey` | Sí        | Config global que define el token cotizado y el tipo de curva.                                 |
| `configInfo` | `object`    | No        | Datos de config preobtenidos. Se obtienen automáticamente si se omite.                         |

***

### Parámetros de la bonding curve

| Parámetro           | Tipo     | Requerido | Descripción                                                         |
| ------------------- | -------- | --------- | ------------------------------------------------------------------- |
| `supply`            | `BN`     | No        | Suministro total de tokens. Mínimo: `10,000,000` (pre-decimales).   |
| `totalSellA`        | `BN`     | No        | Tokens vendidos en la bonding curve. Debe ser ≥ 20% del suministro. |
| `totalFundRaisingB` | `BN`     | No        | Cantidad del token cotizado a recaudar antes de la migración.       |
| `migrateType`       | `string` | Sí        | Destino de migración: `cpmm` o `amm`.                               |

### Entendiendo la distribución del supply

```txt
supply = totalSellA + totalLockedAmount + migrateAmount
```

* `totalSellA`: tokens vendidos vía la bonding curve
* `totalLockedAmount`: tokens reservados para vesting
* `migrateAmount`: tokens migrados al pool AMM (deben ser ≥ 20% del suministro)

### Parámetros de vesting (opcional)

| Parámetro           | Tipo | Requerido | Descripción                                                        |
| ------------------- | ---- | --------- | ------------------------------------------------------------------ |
| `totalLockedAmount` | `BN` | No        | Tokens reservados para vesting. Máx. 30% del suministro.           |
| `cliffPeriod`       | `BN` | No        | Segundos después de la migración antes de que comience el vesting. |
| `unlockPeriod`      | `BN` | No        | Duración del vesting lineal en segundos.                           |

> Nota: el tiempo de inicio del vesting se establece automáticamente en la marca de tiempo del bloque de migración. Los destinatarios del vesting se configuran por separado usando `createVesting()`.

***

### Parámetros de la compra inicial (opcional)

| Parámetro        | Tipo      | Requerido | Descripción                                                                                      |
| ---------------- | --------- | --------- | ------------------------------------------------------------------------------------------------ |
| `createOnly`     | `boolean` | No        | `true` crea solo el token. `false` crea y ejecuta una compra inicial.                            |
| `buyAmount`      | `BN`      | No        | Cantidad del token cotizado a gastar en la compra inicial. Requerido si `createOnly` is `false`. |
| `slippage`       | `BN`      | No        | Deslizamiento máximo en puntos base (`100 = 1%`).                                                |
| `minMintAAmount` | `BN`      | No        | Tokens mínimos a recibir. Calculado automáticamente si se omite.                                 |

***

### Ajustes post-migración

| Parámetro      | Tipo               | Requerido | Descripción                                                                     |
| -------------- | ------------------ | --------- | ------------------------------------------------------------------------------- |
| `creatorFeeOn` | `CpmmCreatorFeeOn` | No        | En qué token(s) se recopilan las comisiones de creador después de la migración. |

### `CpmmCreatorFeeOn` options

| Valor        | Descripción                                                                                |
| ------------ | ------------------------------------------------------------------------------------------ |
| `OnlyTokenB` | Las comisiones de creador se recaudan solo en el token cotizado (recomendado).             |
| `BothToken`  | Las comisiones de creador se recaudan tanto en el token lanzado como en el token cotizado. |

***

### Parámetros de referidos (opcional)

| Parámetro          | Tipo        | Requerido | Descripción                                                                                                                      |
| ------------------ | ----------- | --------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `shareFeeRate`     | `BN`        | No        | Participación del referidor en las comisiones de trading (bps × 100). No puede exceder `maxShareFeeRate` desde la config global. |
| `shareFeeReceiver` | `PublicKey` | No        | Wallet que recibe las comisiones de referido. Se aplica solo a la compra inicial.                                                |

***

### Lanzamientos Token-2022

LaunchLab soporta Token-2022 tokens con extensiones de comisión por transferencia. Las comisiones por transferencia se recogen automáticamente en cada transferencia de token.

```ts
const { execute, extInfo } = await raydium.launchpad.createLaunchpad({
  // Parámetros estándar...

  // Habilitar Token-2022 con comisiones por transferencia
  transferFeeExtensionParams: {
    transferFeeBasePoints: 100,     // 1% de comisión por transferencia (100 bps)
    maxinumFee: new BN('1000000'),  // Comisión máxima por transferencia en unidades de token
  },

  // Los lanzamientos Token-2022 deben migrar a CPMM
  migrateType: 'cpmm',
})
```

### Notas importantes para lanzamientos Token-2022

* la migración es siempre `cpmm` (AMMv4 no soporta Token-2022)
* después de la migración, las autoridades de comisión por transferencia se transfieren al `transferFeeExtensionAuth` wallet
* la plataforma puede modificar las tasas de comisión o reclamar las comisiones retenidas acumuladas

***

### Obteniendo configs disponibles

Las configs globales determinan qué tokens cotizados y tipos de curva están disponibles. Obtenga configs desde la API o dérivelas directamente.

### Desde la API

```ts
const configs = await raydium.api.fetchLaunchConfigs()

// Encontrar una config específica
const solConfig = configs.find(c => c.key.mintB === NATIVE_MINT.toBase58())
```

### Derivación directa

```ts
import { getPdaLaunchpadConfigId, LAUNCHPAD_PROGRAM } from '@raydium-io/raydium-sdk-v2'
import { NATIVE_MINT } from '@solana/spl-token'

const configId = getPdaLaunchpadConfigId(
  LAUNCHPAD_PROGRAM,
  NATIVE_MINT, // Token cotizado
  0,           // Tipo de curva: 0 = constant product, 1 = fixed price, 2 = linear
  0            // Índice de config
).publicKey
```

### Configuraciones comunes

| Token cotizado      | Tipo de curva          | Descripción                            |
| ------------------- | ---------------------- | -------------------------------------- |
| SOL (`NATIVE_MINT`) | `0 (constant product)` | Lanzamiento estándar denominado en SOL |
| USD1 (mainnet)      | `0 (constant product)` | Lanzamiento denominado en stablecoin   |
| sUSDC (devnet)      | `0 (constant product)` | Lanzamiento denominado en stablecoin   |

***

### Ciclo de vida del pool

Después de la creación, el pool progresa a través de estos estados:

| Estado   | Valor | Descripción                                                                |
| -------- | ----- | -------------------------------------------------------------------------- |
| Trading  | `0`   | La bonding curve está activa. Los usuarios pueden comprar y vender tokens. |
| Migrate  | `1`   | Meta de recaudación alcanzada. Migración al AMM en progreso.               |
| Migrated | `2`   | Migración completa. El token ahora se negocia en el AMM de Raydium.        |

La transición de **trading** a **migrate** ocurre automáticamente cuando `totalFundRaisingB` se han recaudado worth de tokens cotizados.

***

### Derivando el pool id

Después de la creación, puede derivar el pool id para usar en funciones de trading:

```ts
import { getPdaLaunchpadPoolId, LAUNCHPAD_PROGRAM } from '@raydium-io/raydium-sdk-v2'
import { NATIVE_MINT } from '@solana/spl-token'

const { publicKey: poolId } = getPdaLaunchpadPoolId(
  LAUNCHPAD_PROGRAM,
  mintA,
  NATIVE_MINT
)

console.log('Pool id:', poolId.toBase58())
```

***

## Próximos pasos

Una vez que su token esté lanzado:

1. comparta el pool — los usuarios pueden tradear usando `buyToken()` y `sellToken()`
2. monitoree el progreso — rastree el progreso de recaudación hacia `totalFundRaisingB`
3. reclame comisiones — use `claimCreatorFee()` para recopilar las comisiones de trading de la bonding curve
4. post-migration — reclame comisiones de LP usando `harvestLockLiquidity()`
