> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Casación

> El libro de órdenes, cómo se representa la prioridad precio-tiempo y cómo se resuelven contra ella la vigencia de la orden y la prevención de autoejecución.

La casación es una etapa dentro de la [ejecución del kernel](/es/protocol/architecture/kernel), no un servicio con el que la cadena habla. Toma las órdenes del bloque en su secuencia confirmada, las recorre contra el libro y produce ejecuciones. No mueve el saldo de nadie: de eso se encarga la [cámara de compensación](/es/protocol/architecture/clearinghouse), y ocurre después de que la casación termine.

Mantener las dos separadas es lo que permite probar el motor. La casación responde *qué se cruzó con qué*. La cámara de compensación responde *cuánto cuesta eso y quién le debe ahora a quién*.

<h2 id="the-book">
  El libro
</h2>

Cada instrumento tiene su propio libro, mantenido en memoria como tres estructuras que cooperan:

<div className="dg" data-dg="matching-book">
  <div className="dg-c" style={{aspectRatio:"720 / 302"}}>
    <svg className="dg-w" viewBox="0 0 720 302" aria-hidden="true">
      <path className="dg-wire dg-soft" d="M 348.60 82.00 L 352.60 82.00" />

      <path className="dg-wire dg-soft" d="M 438.20 82.00 L 442.20 82.00" />

      <path className="dg-wire dg-soft" d="M 527.80 82.00 L 531.80 82.00" />

      <path className="dg-wire dg-soft" d="M 617.40 82.00 L 621.40 82.00" />

      <path className="dg-wire dg--blue" d="M 205.00 68.00 L 238.60 68.00" />

      <path className="dg-head dg--blue" d="M 245.00 68.00 L 238.60 72.40 L 238.60 63.60 Z" />

      <path className="dg-wire dg--sky" d="M 205.00 162.00 L 238.60 162.00" />

      <path className="dg-head dg--sky" d="M 245.00 162.00 L 238.60 166.40 L 238.60 157.60 Z" />
    </svg>

    <div className="dg-band" style={{left:"34.7222%",top:"9.9338%",width:"65.2778%",height:"56.2914%"}}><span className="dg-cap">Slab arena — una región preasignada de slots de órdenes</span></div>
    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"9.9338%",width:"27.7778%",height:"25.1656%"}}><span className="dg-t">Niveles de precio</span><span className="dg-s">mapa ordenado, precio → nivel</span><span className="dg-n">el primer nivel se halla caminando al final, no escaneando</span></div>
    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"41.0596%",width:"27.7778%",height:"25.1656%"}}><span className="dg-t">Índice de órdenes</span><span className="dg-s">id de orden → slot</span><span className="dg-n">cancelar y modificar: tiempo constante</span></div>
    <div className="dg-b dg--yellow" style={{left:"36.9444%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">orden</span></div>
    <div className="dg-b dg--yellow" style={{left:"49.3889%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">orden</span></div>
    <div className="dg-b dg--yellow" style={{left:"61.8333%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">orden</span></div>
    <div className="dg-b dg--yellow" style={{left:"74.2778%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">orden</span></div>
    <div className="dg-b dg--yellow" style={{left:"86.7222%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">orden</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"36.9444%",top:"41.3907%",width:"60.8333%",height:"15.2318%"}}><span className="dg-s">Cadena doblemente enlazada en secuencia de llegada: la prioridad dentro de un nivel es posicional, no calculada.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"74.8344%",width:"100.0000%",height:"20.5298%"}}><span className="dg-t">Por qué el orden de reúso es fijo</span><span className="dg-s">Los slots liberados se reutilizan en un orden fijo y el índice tiene semilla fija. No es rendimiento: dos validadores que reutilicen slots en distinto orden bifurcarían.</span></div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"17.8808%",width:"15.2778%",whiteSpace:"normal"}}>cabeza de cada nivel</div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"62.9139%",width:"15.2778%",whiteSpace:"normal"}}>búsqueda directa</div>
  </div>
</div>

| Estructura            | Función                                                                                                                                                    |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Niveles de precio** | Un mapa ordenado de precio a nivel, de modo que la mejor compra y la mejor venta se encuentran caminando hasta el extremo en lugar de escaneando           |
| **Cadena de órdenes** | Una lista doblemente enlazada que enhebra las órdenes en su secuencia de llegada, de modo que la prioridad dentro de un nivel es posicional y no calculada |
| **Índice de órdenes** | Un mapa directo del ID de orden a su slot, de modo que cancelar y modificar son de tiempo constante en lugar de una búsqueda                               |

Las órdenes viven en un **slab arena**: una región preasignada con reserva y liberación en tiempo constante. Las operaciones del libro de órdenes no reservan memoria en la ruta caliente, y los slots liberados se reutilizan en un orden fijo y no allí donde el asignador decida ponerlos. Ese último detalle no es una decisión de rendimiento: si dos validadores reutilizaran los slots en órdenes distintos, cualquier cosa que observara la disposición de los slots divergiría.

La misma disciplina se aplica al índice de órdenes, cuya semilla es fija y no aleatoria. Un mapa hash con semilla por proceso es una defensa estándar contra los ataques de colisión; en una ruta de ejecución de consenso es una bifurcación.

Los precios son enteros en todo el recorrido: unidades de subtick, no decimales. Consulta [Precisión](/es/trading/precision) para ver cómo se corresponde eso con lo que envías.

<h2 id="priority">
  La prioridad
</h2>

La prioridad es primero el precio y después la posición en la cadena a ese precio. El “tiempo” es la posición canónica de la orden en la secuencia confirmada del bloque, no el momento en que llegó a un nodo.

Esto es lo que elimina la carrera de latencia dentro del bloque. Dos órdenes del mismo bloque tienen una precedencia definida que todos los validadores calculan igual, y ninguna cantidad de proximidad a un nodo concreto la cambia. Entre bloques, la llegada sigue importando, pero la unidad de competencia es el bloque, no el microsegundo.

El orden de etapas del kernel refuerza esto: las cancelaciones se ejecutan antes que las colocaciones agresivas dentro de un bloque, de modo que ninguna orden que llegue en el mismo bloque que su cancelación puede llevarse una cotización que está en el libro.

<h2 id="matching-an-order">
  Casar una orden
</h2>

<div className="dg" data-dg="matching-walk">
  <div className="dg-c" style={{aspectRatio:"720 / 334"}}>
    <svg className="dg-w" viewBox="0 0 720 334" aria-hidden="true">
      <path className="dg-wire dg--blue" d="M 134.00 144.00 L 155.60 144.00" />

      <path className="dg-head dg--blue" d="M 162.00 144.00 L 155.60 148.40 L 155.60 139.60 Z" />

      <path className="dg-wire dg--sky" d="M 320.00 144.00 L 345.60 144.00" />

      <path className="dg-head dg--sky" d="M 352.00 144.00 L 345.60 148.40 L 345.60 139.60 Z" />

      <path className="dg-wire dg--green" d="M 510.00 144.00 L 535.60 144.00" />

      <path className="dg-head dg--green" d="M 542.00 144.00 L 535.60 148.40 L 535.60 139.60 Z" />

      <path className="dg-wire dg--sky" d="M 633.00 114.00 L 633.00 80.00 L 241.00 80.00 L 241.00 103.60" />

      <path className="dg-head dg--sky" d="M 241.00 110.00 L 236.60 103.60 L 245.40 103.60 Z" />

      <path className="dg-wire dg--green" d="M 633.00 174.00 L 633.00 213.60" />

      <path className="dg-head dg--green" d="M 633.00 220.00 L 628.60 213.60 L 637.40 213.60 Z" />

      <path className="dg-wire dg--sky" d="M 241.00 178.00 L 241.00 213.60" />

      <path className="dg-head dg--sky" d="M 241.00 220.00 L 236.60 213.60 L 245.40 213.60 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"35.3293%",width:"18.0556%",height:"15.5689%"}}><span className="dg-t">Orden entrante</span></div>
    <div className="dg-b dg--yellow dg-round" style={{left:"23.0556%",top:"34.1317%",width:"20.8333%",height:"17.9641%"}}><span className="dg-t">¿Cruza el libro?</span></div>
    <div className="dg-b dg--sky" style={{left:"49.4444%",top:"35.3293%",width:"20.8333%",height:"15.5689%"}}><span className="dg-t">Consumir el mejor nivel opuesto</span></div>
    <div className="dg-b dg--green" style={{left:"75.8333%",top:"35.3293%",width:"24.1667%",height:"15.5689%"}}><span className="dg-t">Emitir ejecución</span></div>
    <div className="dg-b dg--green" style={{left:"75.8333%",top:"67.0659%",width:"24.1667%",height:"25.7485%"}}><span className="dg-t">Fin</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"10.5556%",top:"67.0659%",width:"45.8333%",height:"25.7485%"}}><span className="dg-t">Dejar en el libro o rechazar, según la vigencia</span><span className="dg-s">GTC deja el resto · IOC lo cancela · FOK no ejecuta nada si no se ejecuta entera · post-only se rechaza en vez de cruzar</span></div>
    <div className="dg-lbl" style={{left:"60.6944%",top:"23.9521%",width:"27.7778%",whiteSpace:"normal"}}>resto — tomar el siguiente nivel</div>
    <div className="dg-lbl" style={{left:"87.9167%",top:"58.9820%"}}>no queda nada</div>
  </div>
</div>

El motor de casación consume repetidamente la cabeza del lado opuesto y emite una ejecución por cada maker que toma, hasta que la orden entrante se agota o el libro deja de cruzar. Qué ocurre con el resto lo decide la vigencia de la orden:

* **GTC** — deja el resto en el libro.
* **IOC** — cancela el resto.
* **FOK** — si la orden no puede ejecutarse por completo, no se ejecuta nada.
* **ALO** — solo maker (post-only): si la orden fuese a tomar liquidez, se rechaza en lugar de cruzar.

Las ejecuciones llevan atribución desde que se producen. Cada ejecución registra dónde se sitúa en la secuencia de ejecuciones de su instrumento, y esas posiciones por instrumento se resuelven en un único orden a lo largo del bloque cuando se ensambla la salida. Esto es lo que permite que, más tarde, un evento se pueda rastrear hasta la transacción exacta y el punto exacto del bloque que lo causó.

<h2 id="self-trade-prevention">
  Prevención de autoejecución
</h2>

Si una orden entrante fuera a casar contra liquidez del mismo propietario que ya está en el libro, la casación se suprime en lugar de ejecutarse. Qué lado cede es configurable:

| Modo              | Comportamiento                                               |
| ----------------- | ------------------------------------------------------------ |
| **Expirar taker** | Se cancela la orden entrante                                 |
| **Expirar maker** | Se cancela la orden en el libro y la orden entrante continúa |
| **Expirar ambas** | Se cancelan las dos                                          |

Los makers cancelados de este modo se recogen durante la casación y se eliminan dentro del mismo bloque, de forma que el libro no se queda con una orden que ya está suprimida.

La propiedad para esta comprobación se resuelve en el nivel de cuenta que el libro sigue. Consulta [Prevención de autoejecución](/es/trading/self-trade-prevention) para la visión desde el lado del trading.

<h2 id="what-matching-does-not-do">
  Lo que la casación no hace
</h2>

No calcula comisiones, no realiza pérdidas y ganancias, no ajusta posiciones ni comprueba el margen. Eso ocurre después de la casación, en la [cámara de compensación](/es/protocol/architecture/clearinghouse), impulsado por las ejecuciones que la casación produjo.

Tampoco decide si una orden tenía permiso para existir. La suficiencia de margen, los límites de órdenes abiertas, las restricciones de solo reducción y la conversión de mercado a límite se resuelven antes de que una orden llegue al libro. Cuando el motor de casación ve una orden, la única pregunta es dónde encaja en el libro.

<h2 id="where-to-go-next">
  Qué leer a continuación
</h2>

<CardGroup cols={2}>
  <Card title="Cámara de compensación" href="/es/protocol/architecture/clearinghouse">
    Qué les ocurre a los saldos y a las posiciones una vez que existen ejecuciones.
  </Card>

  <Card title="Tipos de orden" href="/es/trading/order-types">
    La visión desde el lado del trading: qué puedes enviar y cómo se comporta cada tipo.
  </Card>

  <Card title="Libro de órdenes" href="/es/trading/order-book">
    Profundidad, niveles y cómo leer el libro como trader.
  </Card>

  <Card title="IntentionKernel" href="/es/protocol/architecture/kernel">
    Dónde encaja la casación en la ejecución del bloque.
  </Card>
</CardGroup>
