# Trade API

La Trade API te permite obtener cotizaciones y ejecutar Swaps a través del motor de enrutamiento de Raydium. Para una implementación completa de extremo a extremo, consulta el [SDK demo](https://github.com/raydium-io/raydium-sdk-V2-demo).

## Descripción general del flujo

Usa la Trade API en dos pasos:

1. Obtén una cotización del motor de enrutamiento.
2. Construye una transacción a partir de esa cotización, luego fírmala y envíala.

## Obtener cotización

`GET https://transaction-v1.raydium.io/compute/swap-base-in`

Devuelve una cotización para intercambiar tokens con una cantidad de entrada exacta.

### Parámetros de consulta

| Nombre        | Tipo     | Requerido | Descripción                                                             |
| ------------- | -------- | --------- | ----------------------------------------------------------------------- |
| `inputMint`   | `string` | Sí        | Dirección mint del token desde el que se intercambia                    |
| `outputMint`  | `string` | Sí        | Dirección mint del token al que se intercambia                          |
| `amount`      | `string` | Sí        | Cantidad en unidades base, como decimales del token o lamports para SOL |
| `slippageBps` | `number` | Sí        | Tolerancia de deslizamiento en puntos básicos, por ejemplo `50 = 0.5%`  |
| `txVersion`   | `string` | Sí        | Versión de la transacción: `v0` o `legacy`                              |

### Respuesta de ejemplo

```json
{
  "id": "cbbcc7e2-a5fa-4040-a260-b229842c93c7",
  "success": true,
  "version": "V1",
  "data": {
    "swapType": "BaseIn",
    "inputMint": "So11111111111111111111111111111111111111112",
    "inputAmount": "100000000",
    "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "outputAmount": "13738391",
    "otherAmountThreshold": "13669699",
    "slippageBps": 50,
    "priceImpactPct": 0,
    "referrerAmount": "0",
    "routePlan": [
      {
        "poolId": "3nMFwZXwY1s1M5s8vYAHqd4wGs4iSxXE4LRoUMMYqEgF",
        "inputMint": "So11111111111111111111111111111111111111112",
        "outputMint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
        "feeMint": "So11111111111111111111111111111111111111112",
        "feeRate": 1,
        "feeAmount": "10000",
        "remainingAccounts": [
          "DDe2TojkajtXKYJEMKfjY3Xjdw1XhZqr8UEBNgrg512P",
          "AWeEpV2ASCkVmcpK7htwWCqztmKMNdsmquKMa7y96Wif",
          "22ps6VsrEnCwEfGX4nkFV2xz4ohpvF5aTVtSg5FcwGRn"
        ],
        "lastPoolPriceX64": "6841151606851928973"
      },
      {
        "poolId": "3NeUgARDmFgnKtkJLqUcEUNCfknFCcGsFfMJCtx6bAgx",
        "inputMint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
        "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "feeMint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
        "feeRate": 1,
        "feeAmount": "1376",
        "remainingAccounts": [
          "CxPCSxEmvkTyd6tqpVcZv2QscGrzkZKBmH7R9Bs9wocT",
          "9iD8oCrLQFNd1sbhYZg2awLrsZu4f1AAZG6bHuJkLXEx",
          "32D4WyeYS7irtnGpVS2VYja5H8uUpc8zF24kd15oFD2o"
        ],
        "lastPoolPriceX64": "18455174383562030500"
      }
    ]
  }
}
```

### Endpoints de cotización

| Ruta                     | Descripción                              |
| ------------------------ | ---------------------------------------- |
| `/compute/swap-base-in`  | Especifica la cantidad de entrada exacta |
| `/compute/swap-base-out` | Especifica la cantidad de salida exacta  |

## Construir la transacción

`POST https://transaction-v1.raydium.io/transaction/swap-base-in`

Construye una o más transacciones serializadas a partir de una respuesta de cotización.

### Cuerpo de la solicitud

| Nombre                          | Tipo      | Requerido | Descripción                                             |
| ------------------------------- | --------- | --------- | ------------------------------------------------------- |
| `swapResponse`                  | `object`  | Sí        | Respuesta devuelta por el endpoint de cotización        |
| `wallet`                        | `string`  | Sí        | Clave pública de la wallet del usuario                  |
| `txVersion`                     | `string`  | Sí        | Versión de la transacción: `V0` o `LEGACY`              |
| `wrapSol`                       | `boolean` | No        | Envuelve SOL a wSOL para la leg de entrada              |
| `unwrapSol`                     | `boolean` | No        | Desenvuelve wSOL a SOL para la leg de salida            |
| `inputAccount`                  | `string`  | No        | Cuenta de token de entrada, omitir si la entrada es SOL |
| `outputAccount`                 | `string`  | No        | Cuenta de token de salida, omitir si la salida es SOL   |
| `computeUnitPriceMicroLamports` | `string`  | No        | Tarifa de prioridad en micro-lamports                   |

### Respuesta de ejemplo

```json
{
  "id": "bca0c725-0037-48ce-8d0a-db39a0f6e020-tx",
  "version": "V1",
  "success": true,
  "data": [
    {
      "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQADEUxrOZd2...[truncated]"
    }
  ]
}
```

## Ayudante opcional de tarifa de prioridad

`GET https://api-v3.raydium.io/main/auto-fee`

Usa este ayudante si deseas un precio sugerido de compute unit en lugar de establecer la tarifa de prioridad manualmente.

## Ejemplo completo

### Instalar

```bash
yarn add @raydium-io/raydium-sdk-v2
```

### Configuración

```typescript
import { Transaction, VersionedTransaction } from '@solana/web3.js'
import { NATIVE_MINT } from '@solana/spl-token'
import axios from 'axios'
import { connection, owner, fetchTokenAccountData } from '../config'
import { API_URLS } from '@raydium-io/raydium-sdk-v2'

// config.ts
export const owner: Keypair = Keypair.fromSecretKey(bs58.decode('<YOUR_WALLET_SECRET_KEY>'))
export const connection = new Connection('<YOUR_RPC_URL>')
```

> No uses la clave privada de tu wallet principal para pruebas.

### Obtener cotización

```typescript
const { data: swapResponse } = await axios.get<SwapCompute>(
  `${API_URLS.SWAP_HOST}/compute/swap-base-in?inputMint=${inputMint}&outputMint=${outputMint}&amount=${amount}&slippageBps=${slippage * 100}&txVersion=${txVersion}`
)
```

### Serializar

```typescript
const { data: swapTransactions } = await axios.post(
  `${API_URLS.SWAP_HOST}/transaction/swap-base-in`,
  {
    computeUnitPriceMicroLamports: String(priorityFee),
    swapResponse,
    txVersion,
    wallet: owner.publicKey.toBase58(),
    wrapSol: isInputSol,
    unwrapSol: isOutputSol,
    inputAccount: isInputSol ? undefined : inputTokenAcc?.toBase58(),
    outputAccount: isOutputSol ? undefined : outputTokenAcc?.toBase58(),
  }
)
```

### Deserializar y enviar

```typescript
const allTxBuf = swapTransactions.data.map((tx) => Buffer.from(tx.transaction, 'base64'))
const allTransactions = allTxBuf.map((txBuf) =>
  isV0Tx ? VersionedTransaction.deserialize(txBuf) : Transaction.from(txBuf)
)

for (const tx of allTransactions) {
  const transaction = tx as VersionedTransaction
  transaction.sign([owner])
  const txId = await connection.sendTransaction(transaction, { skipPreflight: true })

  const { lastValidBlockHeight, blockhash } = await connection.getLatestBlockhash({
    commitment: 'finalized',
  })

  await connection.confirmTransaction(
    { blockhash, lastValidBlockHeight, signature: txId },
    'confirmed'
  )
}
```

## ¿Necesitas ayuda?

Pregunta en [#dev-chat](https://discord.com/channels/813741812598439958/1009085496279977994) en Discord.
