# Creación de una plataforma

Crea y configura tu plataforma LaunchLab para habilitar lanzamientos de tokens.

Antes de que los usuarios puedan lanzar tokens en tu plataforma, necesitas crear una configuración de plataforma. Cada wallet solo puede crear una plataforma.

***

## Creando una plataforma

Usa `createPlatformConfig()` para inicializar tu plataforma con estructuras de comisiones, ajustes de distribución de LP y metadatos.

```typescript
import {
  TxVersion,
  LAUNCHPAD_PROGRAM,
  DEVNET_PROGRAM_ID,
} from '@raydium-io/raydium-sdk-v2'
import { initSdk } from './config'
import { PublicKey } from '@solana/web3.js'
import BN from 'bn.js'

const createPlatform = async () => {
  const raydium = await initSdk()
  const owner = raydium.ownerPubKey

  const { execute, extInfo } = await raydium.launchpad.createPlatformConfig({
    programId: LAUNCHPAD_PROGRAM, // Usa DEVNET_PROGRAM_ID.LAUNCHPAD_PROGRAM para devnet

    // Configuración de wallet
    platformAdmin: owner,
    platformClaimFeeWallet: owner,
    platformLockNftWallet: owner,
    platformVestingWallet: owner,

    // nivel de comisiones del pool CPMM para pools migrados
    cpConfigId: new PublicKey('DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8'),

    // autoridad de comisión de transferencia de Token-2022 (recibe las autoridades de comisiones tras la migración)
    transferFeeExtensionAuth: owner,

    // Configuración de comisiones
    feeRate: new BN(10000),        // 1% de comisión de plataforma en operaciones de bonding curve
    creatorFeeRate: new BN(5000),  // 0.5% de comisión del creador en operaciones de bonding curve

    // Distribución de LP en la migración (debe sumar 1,000,000)
    migrateCpLockNftScale: {
      platformScale: new BN(100000),  // 10% para la plataforma (bloqueado)
      creatorScale: new BN(100000),   // 10% para el creador (bloqueado)
      burnScale: new BN(800000),      // 80% quemado
    },

    // Metadatos de la plataforma
    name: 'My LaunchLab',
    web: 'https://mylaunchlab.io',
    img: 'https://mylaunchlab.io/logo.png',

    txVersion: TxVersion.V0,
  })

  const { txId } = await execute({ sendAndConfirm: true })
  console.log('Platform created:', extInfo.platformId.toBase58())
}
```

***

## Parámetros de configuración

### Configuración de wallet

| Parámetro                | Tipo      | Descripción                                                                                           |
| ------------------------ | --------- | ----------------------------------------------------------------------------------------------------- |
| `platformAdmin`          | PublicKey | Wallet de administrador que controla la plataforma. Puede actualizar la configuración.                |
| `platformClaimFeeWallet` | PublicKey | Wallet que recibe las comisiones de trading de la plataforma desde las bonding curves.                |
| `platformLockNftWallet`  | PublicKey | Wallet que recibe el Fee Key NFT de la plataforma después de la migración.                            |
| `platformVestingWallet`  | PublicKey | Wallet para las asignaciones de vesting de la plataforma. Usa `PublicKey.default` si no es necesaria. |

### Configuración de comisiones

| Parámetro        | Tipo | Descripción                                                                                                            |
| ---------------- | ---- | ---------------------------------------------------------------------------------------------------------------------- |
| `feeRate`        | BN   | Parte de la plataforma de las comisiones de trading de la bonding curve. En bps × 100 (`10000 = 1%`).                  |
| `creatorFeeRate` | BN   | Parte del creador de las comisiones de trading de la bonding curve. En bps × 100 (`5000 = 0.5%`). Máx. `50000` (`5%`). |

Las comisiones se denominan en el token de cotización (por ejemplo, SOL). Para cada trade, la comisión total = `protocolFeeRate` + `platformFeeRate` + `creatorFeeRate` + `shareFeeRate`. Cada parte recibe su proporción correspondiente.

### Distribución de LP en la migración

| Parámetro       | Tipo | Descripción                                                                                                    |
| --------------- | ---- | -------------------------------------------------------------------------------------------------------------- |
| `platformScale` | BN   | Parte de los tokens LP de la plataforma, bloqueados mediante Burn & Earn. La plataforma recibe el Fee Key NFT. |
| `creatorScale`  | BN   | Parte de los tokens LP del creador, bloqueados mediante Burn & Earn. El creador recibe el Fee Key NFT.         |
| `burnScale`     | BN   | Tokens LP quemados permanentemente. No generan comisiones.                                                     |

Estos tres valores deben sumar `1,000,000` (100%).

### Ejemplos de distribución

```typescript
// 80% quemado, 10% creador, 10% plataforma
{ burnScale: 800000, creatorScale: 100000, platformScale: 100000 }

// 90% quemado, 10% creador (sin participación de la plataforma)
{ burnScale: 900000, creatorScale: 100000, platformScale: 0 }

// 100% quemado (sin comisiones continuas)
{ burnScale: 1000000, creatorScale: 0, platformScale: 0 }
```

### Configuración del pool

| Parámetro                  | Tipo      | Descripción                                                                                                        |
| -------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------ |
| `cpConfigId`               | PublicKey | Nivel de comisiones para el pool CPMM después de la migración. Obtén las configuraciones disponibles desde la API. |
| `transferFeeExtensionAuth` | PublicKey | Recibe las autoridades de comisiones de transferencia para lanzamientos de Token-2022 después de la migración.     |

### Configuraciones CPMM disponibles

* Mainnet: [api-v3.raydium.io/main/cpmm-config](https://api-v3.raydium.io/main/cpmm-config)
* Devnet: [api-v3-devnet.raydium.io/main/cpmm-config](https://api-v3-devnet.raydium.io/main/cpmm-config)

### Metadatos

| Parámetro | Tipo   | Descripción                                    |
| --------- | ------ | ---------------------------------------------- |
| `name`    | string | Nombre de la plataforma (almacenado on-chain). |
| `web`     | string | URL del sitio web de la plataforma.            |
| `img`     | string | URL del logotipo de la plataforma.             |

***

## Actualización de la configuración de la plataforma

La configuración de la plataforma se puede actualizar una vez por epoch. Usa `updatePlatformConfig()` para modificar la configuración.

```typescript
const updatePlatform = async () => {
  const raydium = await initSdk()

  const { execute } = await raydium.launchpad.updatePlatformConfig({
    platformAdmin: raydium.ownerPubKey,

    // Actualiza una sola configuración
    updateInfo: { type: 'updateFeeRate', value: new BN(15000) }, // Cambiar a 1.5%

    txVersion: TxVersion.V0,
  })

  await execute({ sendAndConfirm: true })
}
```

### Tipos de actualización disponibles

| Tipo                         | Valor     | Descripción                                                           |
| ---------------------------- | --------- | --------------------------------------------------------------------- |
| `updateFeeRate`              | BN        | Actualizar la tasa de comisión de trading de la plataforma            |
| `updateClaimFeeWallet`       | PublicKey | Cambiar la wallet de cobro de comisiones                              |
| `updateLockNftWallet`        | PublicKey | Cambiar el destinatario del Fee Key NFT                               |
| `updateVestingWallet`        | PublicKey | Cambiar la wallet de vesting                                          |
| `updateCpConfigId`           | PublicKey | Cambiar el nivel de comisión de CPMM para migraciones                 |
| `updateName`                 | string    | Actualizar el nombre de la plataforma                                 |
| `updateWeb`                  | string    | Actualizar la URL del sitio web                                       |
| `updateImg`                  | string    | Actualizar la URL del logotipo                                        |
| `migrateCpLockNftScale`      | object    | Actualizar los ratios de distribución de LP                           |
| `updatePlatformVestingScale` | BN        | Actualizar la asignación de vesting de la plataforma                  |
| `updatePlatformCpCreator`    | PublicKey | pasar un publicKey como receptor de comisiones después del graduation |
| `updateAll`                  | object    | Actualizar toda la configuración a la vez                             |

***

### Aplicación de parámetros de lanzamiento (opcional)

Las plataformas pueden restringir qué configuraciones de token están permitidas. Si los parámetros de un creador no coinciden con una configuración permitida, la transacción falla.

```typescript
import { updatePlatformCurveParamInstruction } from '@raydium-io/raydium-sdk-v2'

// Agrega una configuración permitida en el índice 1
const instruction = updatePlatformCurveParamInstruction(
  LAUNCHPAD_PROGRAM,
  platformAdmin,
  platformId,
  1, // índice (0-254)
  {
    migrateType: 1,                              // 0 = AMM, 1 = CPMM
    migrateCpmmFeeOn: 0,                         // Token de comisión del creador
    supply: new BN('1000000000000000'),          // 1B tokens (con decimales)
    totalSellA: new BN('793100000000000'),       // ~79.3% vendido en la curva
    totalFundRaisingB: new BN('85000000000'),    // 85 SOL para recaudar
    totalLockedAmount: new BN('0'),              // Sin vesting
    cliffPeriod: new BN('0'),
    unlockPeriod: new BN('0'),
  }
)
```

### Cómo funciona la aplicación de parámetros

* Almacena hasta 25 configuraciones (índice 0-254)
* Establece un parámetro en `null` para omitir la validación de ese campo
* Los creadores deben coincidir exactamente con al menos una configuración
* Las configuraciones se pueden actualizar una vez por epoch

**Ejemplo:** Permitir montos de recaudación flexibles pero suministro fijo:

```typescript
{
  supply: new BN('1000000000000000'),     // Debe ser exactamente 1B
  totalFundRaisingB: null,                // Se permite cualquier cantidad
  // ... otros parámetros
}
```

***

### Obtención del ID de tu plataforma

Después de la creación, el ID de tu plataforma se deriva de tu wallet de administrador:

```typescript
import { getPdaPlatformId, LAUNCHPAD_PROGRAM } from '@raydium-io/raydium-sdk-v2'

const { publicKey: platformId } = getPdaPlatformId(
  LAUNCHPAD_PROGRAM,
  adminWallet
)
```

Comparte este `platformId` con los creadores de tokens que quieran lanzar en tu plataforma.
