# Cobro de comisiones y recompensas

Recolecta las comisiones de trading acumuladas y las emisiones de recompensas de farming de tus posiciones CLMM.

***

### Cómo funcionan las comisiones en CLMM

A diferencia de los pools CPMM, donde las comisiones se acumulan en los vaults del pool y aumentan el valor del token LP, los pools CLMM registran las comisiones **por posición**. Cada posición acumula su parte de las comisiones de trading en función de:

* La participación de liquidez de la posición dentro del rango de ticks activo.
* El volumen de swaps que pasan por el rango de precios de la posición.

Las comisiones se cobran por separado de la liquidez — no necesitas retirar la liquidez para reclamar las comisiones.

***

### Recolección de comisiones y recompensas

Usa `raydium.clmm.harvestAllRewards()` para recolectar todas las comisiones de trading pendientes y las emisiones de recompensas de todas tus posiciones.

```typescript
import {
  ApiV3PoolInfoConcentratedItem,
  CLMM_PROGRAM_ID,
  DEVNET_PROGRAM_ID,
  ClmmPositionLayout,
} from '@raydium-io/raydium-sdk-v2'
import { initSdk, txVersion } from '../config'

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

  const allPosition = await raydium.clmm.getOwnerPositionInfo({
    programId: CLMM_PROGRAM_ID, // devnet: DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID
  })
  const nonZeroPosition = allPosition.filter((p) => !p.liquidity.isZero())
  if (!nonZeroPosition.length)
    throw new Error(
      `user no tiene ninguna posición distinta de cero, total de posiciones: ${allPosition.length}`
    )

  const positionPoolInfoList = (await raydium.api.fetchPoolById({
    ids: nonZeroPosition.map((p) => p.poolId.toBase58()).join(','),
  })) as ApiV3PoolInfoConcentratedItem[]

  const allPositions = nonZeroPosition.reduce(
    (acc, cur) => ({
      ...acc,
      [cur.poolId.toBase58()]: acc[cur.poolId.toBase58()]
        ? acc[cur.poolId.toBase58()].concat(cur)
        : [cur],
    }),
    {} as Record<string, ClmmPositionLayout[]>
  )

  const { execute } = await raydium.clmm.harvestAllRewards({
    allPoolInfo: positionPoolInfoList.reduce(
      (acc, cur) => ({
        ...acc,
        [cur.id]: cur,
      }),
      {}
    ),
    allPositions,
    ownerInfo: {
      useSOLBalance: true,
    },
    programId: CLMM_PROGRAM_ID, // devnet: DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID
    txVersion,
    // opcional: configura aquí la comisión de prioridad
    // computeBudgetConfig: {
    //   units: 600000,
    //   microLamports: 46591500,
    // },
  })

  const { txIds } = await execute({ sequentially: true })
  console.log('se han recolectado todas las recompensas de clmm:', { txIds })
}

harvestAllRewards()
```

#### Parámetros de recolección

| Parámetro      | Tipo      | Descripción                                                                         |
| -------------- | --------- | ----------------------------------------------------------------------------------- |
| `allPoolInfo`  | object    | Mapa del ID del pool a la información del pool para todos los pools con posiciones. |
| `allPositions` | object    | Mapa del ID del pool al array de posiciones en ese pool.                            |
| `ownerInfo`    | object    | `{ useSOLBalance: true }` para recibir SOL nativo en lugar de wSOL.                 |
| `programId`    | PublicKey | ID del programa CLMM.                                                               |
| `txVersion`    | TxVersion | Versión de la transacción.                                                          |

{% hint style="info" %}
Si tienes posiciones en muchos pools, `harvestAllRewards` puede generar múltiples transacciones. Usa `execute({ sequentially: true })` para enviarlas en orden.
{% endhint %}
