spanish translation 2026.06.21

This commit is contained in:
Ekiserrepé
2026-06-24 16:31:25 +02:00
parent a7ef49d121
commit df35da1f4e
18 changed files with 845 additions and 59 deletions

View File

@@ -81,6 +81,30 @@ Enmienda principal que habilita la funcionalidad de contratos inteligentes Hook
Actualizaciones y mejoras al sistema de Hooks.
##### HookAPISerializedType240
Corrige el análisis incorrecto de los campos `STPathSet` (usados por `sfPaths` en transacciones Payment) dentro de todas las funciones de la API Hook `sto_` ([sto_subfield](/es/docs/hooks/functions/serialization/sto_subfield), [sto_subarray](/es/docs/hooks/functions/serialization/sto_subarray), [sto_emplace](/es/docs/hooks/functions/serialization/sto_emplace), [sto_erase](/es/docs/hooks/functions/serialization/sto_erase), [sto_validate](/es/docs/hooks/functions/serialization/sto_validate)). Antes de esta enmienda, los campos PathSet eran tratados incorrectamente como datos codificados en VL, lo que causaba que el analizador interno (`get_stobject_length`) leyera mal el límite del campo y corrompiera el análisis de todos los campos subsiguientes en el objeto. Los campos PathSet se auto-delimitan (usando bytes separadores de ruta `0xFF` y un byte de fin de conjunto `0x00`) y ahora se analizan correctamente. También eleva el tipo serializado máximo soportado de `STI_VECTOR256` (19) a `STI_CURRENCY` (26), añadiendo soporte correcto para `STI_ISSUE` (24), `STI_XCHAIN_BRIDGE` (25) y `STI_CURRENCY` (26) dentro de todas las funciones `sto_`. _(Introducida en 2026.6.21-release+3350)_
##### NamedHooks
Añade un campo opcional `HookName` (416 bytes, UTF-8) al slot Hook en una [transacción SetHook](/es/docs/protocol-reference/transactions/transaction-types/sethook). Cuando una instalación de hook incluye un `HookName`, ese hook **solo se ejecutará** si la transacción entrante también incluye un campo `HookName` de nivel superior coincidente. Las transacciones sin `HookName`, o con un valor diferente, omiten silenciosamente el hook nombrado. `HookName` también se añade como campo común opcional en todos los tipos de transacción para que los remitentes puedan apuntar a hooks nombrados específicos. Esto permite que múltiples hooks coexistan en una cuenta con diferentes puntos de entrada activados por diferentes llamantes. _(Introducida en 2026.6.21-release+3350)_
##### HooksUpdate2
Añade la función de la API Hook `prepare()`. `prepare(write_ptr, write_len, read_ptr, read_len)` acepta una transacción serializada parcial que contiene solo los campos específicos del tipo de transacción e inyecta automáticamente todos los campos requeridos para la emisión: `Account`, `Sequence`, `SigningPubKey`, `Fee`, `FirstLedgerSequence`, `LastLedgerSequence` y `EmitDetails`. La salida puede pasarse directamente a `emit()`, eliminando la necesidad de construir manualmente estos campos repetitivos en el código del hook. _(Introducida en 2026.6.21-release+3350)_
##### HookOnV2
Los Hooks pueden continuar especificando `HookOn` con el comportamiento existente, u opcionalmente reemplazarlo con dos campos separados: `HookOnIncoming` y `HookOnOutgoing`. Ambos usan la misma sintaxis de máscara de bits que `HookOn`, pero diferencian entre transacciones originadas desde la cuenta del Hook (`HookOnOutgoing`) y transacciones originadas desde otra cuenta (`HookOnIncoming`). _(Introducida en 2026.6.21-release+3350)_
##### PriceOracle
Un puerto del estándar XRPL PriceOracle (XLS-47d). Habilita feeds de precios on-chain permitiendo a las cuentas publicar datos de precios de activos como [objetos Oracle del ledger](/es/docs/protocol-reference/ledger-data/ledger-objects-types/oracle). Introduce dos nuevas transacciones: [OracleSet](/es/docs/protocol-reference/transactions/transaction-types/oracleset) (crear o actualizar un Oracle) y [OracleDelete](/es/docs/protocol-reference/transactions/transaction-types/oracledelete) (eliminar un Oracle). También añade el método RPC `get_aggregate_price` para consultar precios agregados de múltiples oracles. Cada objeto Oracle almacena entre 1 y 10 pares de precios activo/cotización (15 pares consumen 1 reserva de propietario; 610 consumen 2). El entero `AssetPrice`, junto con `Scale`, codifica el precio como `AssetPrice` × 10^(-`Scale`). _(Introducida en 2026.6.21-release+3350)_
##### IOURewardClaim
Amplía el tipo de transacción [ClaimReward](/es/docs/protocol-reference/transactions/transaction-types/claimreward) más allá de los ajustes de saldo génesis a otras monedas IOU. Los contadores de recompensa se mantienen dentro de la línea de confianza (objetos `LowReward`/`HighReward` en el objeto [RippleState](/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state)) y no afectan a los ajustes de saldo génesis. La transacción activa cualquier Hook instalado en la cuenta especificada por el campo `Issuer`, permitiendo que ese Hook procese y opcionalmente pague la recompensa. La cuenta que paga la recompensa no necesita ser el emisor de la moneda IOU. _(Introducida en 2026.6.21-release+3350)_
##### Remit
Implementa [XLS-55](https://github.com/XRPLF/XRPL-Standards/discussions/156). Un nuevo tipo de transacción de pago push simple pero potente de lo-que-ves-es-lo-que-obtienes. Habilita [transacciones Remit](/es/docs/protocol-reference/transactions/transaction-types/remit) que permiten pagar múltiples monedas y URITokens en la misma transacción al mismo destino. La transacción paga automáticamente para crear líneas de confianza faltantes, paga automáticamente las reservas en tokens transferidos y paga automáticamente para crear la cuenta de destino si no existe. Puede acuñar un recibo o URIToken de bonificación inline dentro de la transacción. Opcionalmente, informar a un Hook de terceros sobre la transacción. Sin pagos parciales ni rutas.

View File

@@ -0,0 +1,103 @@
---
title: get_aggregate_price
description: >-
Obtiene estadísticas de precios agregados de múltiples objetos Price Oracle
para un par de activos determinado.
---
_(Añadido por la [enmienda PriceOracle](/es/docs/features/amendments/#priceoracle).)_
El método `get_aggregate_price` consulta los datos de precio almacenados en uno o más [objetos Oracle del ledger](/es/docs/protocol-reference/ledger-data/ledger-objects-types/oracle) para un par de activos especificado y devuelve estadísticas agregadas (media, mediana, desviación estándar). Opcionalmente, se pueden eliminar valores atípicos y aplicar un filtro de ventana temporal.
### Formato de solicitud
```json
{
"command": "get_aggregate_price",
"ledger_index": "current",
"base_asset": "XAH",
"quote_asset": "USD",
"trim": 20,
"time_threshold": 300,
"oracles": [
{
"account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"oracle_document_id": 1
},
{
"account": "rN7n3473SaZBCG4dFL83w7PB8LTfHBEDP",
"oracle_document_id": 2
}
]
}
```
### Parámetros de solicitud
| Campo | Tipo JSON | ¿Requerido? | Descripción |
| ---------------- | ---------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `base_asset` | String | Sí | El código de moneda del activo que se está cotizando (p. ej. `"XAH"`, `"BTC"`). |
| `quote_asset` | String | Sí | El código de moneda de la denominación (p. ej. `"USD"`, `"EUR"`). |
| `oracles` | Array | Sí | Array de hasta **200** referencias de oracle. Cada entrada debe contener `account` (String, AccountID) y `oracle_document_id` (Number, UInt32). |
| `trim` | Number | No | Porcentaje (125) de valores atípicos a eliminar de ambos extremos de la distribución de precios antes de calcular las estadísticas de `trimmed_set`. |
| `time_threshold` | Number | No | Antigüedad máxima en segundos para que un precio sea incluido. Los precios con `LastUpdateTime < (latestTime - time_threshold)` se excluyen. Si se omite, se incluyen todos los precios. |
| `ledger_index` | String o Number | No | El ledger a consultar. Por defecto `"current"`. |
### Formato de respuesta
```json
{
"result": {
"entire_set": {
"mean": "7.456",
"size": 5,
"standard_deviation": "0.12"
},
"trimmed_set": {
"mean": "7.45",
"size": 3,
"standard_deviation": "0.08"
},
"median": "7.46",
"time": 816348900,
"status": "success"
}
}
```
### Campos de respuesta
| Campo | Tipo JSON | Descripción |
| ------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------ |
| `entire_set.mean` | String | Precio medio de todos los puntos de datos recogidos (como cadena decimal). |
| `entire_set.size` | Number | Número de puntos de datos de precio utilizados para calcular las estadísticas. |
| `entire_set.standard_deviation` | String | Desviación estándar de los precios en el conjunto completo. |
| `trimmed_set.mean` | String | Precio medio tras eliminar el `trim%` superior e inferior de valores atípicos. Solo presente si se especificó `trim`. |
| `trimmed_set.size` | Number | Número de puntos de datos restantes tras el recorte. Solo presente si se especificó `trim`. |
| `trimmed_set.standard_deviation`| String | Desviación estándar tras el recorte. Solo presente si se especificó `trim`. |
| `median` | String | Precio mediano del conjunto completo. |
| `time` | Number | El `LastUpdateTime` (epoch de Ripple) más reciente encontrado entre todos los objetos Oracle consultados. |
### Algoritmo
1. Itera a través de hasta **200** cuentas de oracle y recupera sus entradas del ledger `Oracle`.
2. Para cada Oracle, busca en hasta **3** entradas de metadatos de transacciones históricas para encontrar un precio para el par `base_asset`/`quote_asset` solicitado.
3. Aplica el filtro `time_threshold`: conserva solo los precios donde `LastUpdateTime ≥ (latestTime - time_threshold)`.
4. Calcula la media, la desviación estándar y la mediana sobre el conjunto filtrado.
5. Si `trim` > 0: elimina el `trim%` superior e inferior por valor de precio y recalcula las estadísticas para `trimmed_set`.
### Casos de error
| Código de error | Descripción |
| --------------------- | ---------------------------------------------------------------------------------------------- |
| `rpcORACLE_MALFORMED` | Una entrada en `oracles` tiene un `account` o `oracle_document_id` faltante o inválido. |
| `rpcINVALID_PARAMS` | Tipo de parámetro inválido, cadena de activo vacía, o `trim` fuera del rango 125. |
| `rpcOBJECT_NOT_FOUND` | No se encontraron datos de precio coincidentes para el par de activos solicitado en ninguno de los objetos Oracle consultados. |
| `rpcINTERNAL` | Todos los puntos de datos fueron excluidos por el filtro `time_threshold`, dejando un conjunto de resultados vacío. |
### Límites
| Parámetro | Límite |
| -------------- | ------------------------------------------------------------- |
| `oracles` | Máximo 200 entradas por solicitud |
| Profundidad histórica | Máximo 3 entradas de metadatos históricas buscadas por oracle |
| `trim` | 150 (%) |

View File

@@ -68,6 +68,14 @@ Interactúe directamente con un servidor xahaud usando los métodos de API públ
| server_state | Obtiene el estado del servidor en formato legible por máquina. |
| manifest | Recupera detalles de clave pública para un validador. |
### Métodos de Oracle
_(Requiere la [enmienda PriceOracle](/es/docs/features/amendments/#priceoracle).)_
| Método | Descripción |
| ----------------------- | ------------------------------------------------------------------------------------ |
| [get_aggregate_price](/es/docs/features/http-websocket-apis/get-aggregate-price) | Obtiene estadísticas de precios agregados de múltiples objetos Oracle para un par de activos. |
### Métodos de Utilidad
| Método | Descripción |

View File

@@ -18,3 +18,25 @@ Una transacción `ClaimReward` permite a una cuenta reclamar las recompensas que
El tipo de transacción `GenesisMint` también está asociado con la característica de Recompensas de Balance. Esta es una transacción Emitida que se ejecuta a través del Hook de Recompensa cada vez que un usuario reclama sus recompensas de balance.
<LinkCard title="GenesisMint - (Txn Emitida)" href="/es/docs/protocol-reference/transactions/transaction-types/genesismint-emitted-txn" />
### IOU Reward Claim
_(Requiere la [enmienda IOURewardClaim](/es/docs/features/amendments/#iourewardclaim).)_
La enmienda `IOURewardClaim` extiende el mecanismo de recompensas a las monedas IOU emitidas por cualquier cuenta. El mismo cálculo de área bajo la curva (tiempo de tenencia × cantidad tenida) que rige las recompensas génesis de XAH se aplica a los tenedores de tokens IOU, con el Hook del emisor controlando la lógica de pago.
#### Cómo funciona
1. **Opt-in**: El tenedor de tokens envía una transacción `ClaimReward` con el campo `ClaimCurrency` especificando el IOU. Esto inicializa contadores de seguimiento de recompensas (`LowReward` o `HighReward`) directamente en la línea de confianza (objeto de ledger [RippleState](/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state)).
2. **Acumulación**: Después de cada transacción que modifica el saldo de la línea de confianza, el ledger actualiza automáticamente el campo `TrustLineRewardAccumulator`. Esto rastrea el producto acumulado de saldo × ledgers transcurridos desde el último reinicio.
3. **Reclamación**: Cuando el tenedor envía otra `ClaimReward` con `ClaimCurrency`, el ledger reinicia los contadores y activa el Hook del emisor (que debe estar instalado y debe ejecutarse en la transacción `ClaimReward`). El Hook lee el valor acumulado y emite un pago de recompensa en la forma que elija el emisor.
#### Diferencias clave respecto a las recompensas génesis de XAH
| | Recompensas Génesis XAH | Recompensas IOU |
|---|---|---|
| Enmienda | `BalanceRewards` | `IOURewardClaim` |
| Contadores almacenados en | AccountRoot | RippleState (línea de confianza) |
| Tipo de acumulador | UInt64 (drops / 1.000.000) | Amount (en las unidades del token) |
| Pago gestionado por | Hook de la cuenta génesis | Hook de la cuenta del emisor |
| Restricción de emisor | Debe ser la cuenta génesis | Cualquier cuenta con un Hook en la transacción `ClaimReward`, excepto cuentas AMM |

View File

@@ -18,13 +18,13 @@ La solución: **Transacciones emitidas**. Permitimos que la Transacción Origina
Las Transacciones emitidas son transacciones _nuevas_ creadas por la ejecución de un Hook y que entran en consenso para ser procesadas en el siguiente ledger. La transacción puede ser de cualquier tipo, pero debe seguir reglas estrictas de emisión.
Para emitir una transacción, el Hook primero prepara la transacción serializada y luego llama a [emit](/es/docs/hooks/functions/emitted-transaction/emit-1).
Para emitir una transacción, el Hook primero prepara la transacción serializada y luego llama a [emit](/es/docs/hooks/functions/emitted-transaction/emit). Con la [enmienda HooksUpdate2](/es/docs/features/amendments/#hooksupdate2), la API [prepare()](/es/docs/hooks/functions/emitted-transaction/prepare) puede construir automáticamente la transacción completa lista para emisión a partir de una entrada parcial, eliminando la necesidad de establecer manualmente `Account`, `Sequence`, `SigningPubKey`, `Fee`, `FirstLedgerSequence`, `LastLedgerSequence` y `EmitDetails`.
Dado que las transacciones emitidas pueden activar Hooks en el siguiente ledger, que a su vez pueden emitir más transacciones, todas las transacciones emitidas incluyen un campo `burden` y un campo `generation` dentro de su bloque `EmitDetails`. El bloque `EmitDetails` reemplaza el campo de firma en una transacción tradicional.
Los campos `burden` y `generation` previenen conjuntamente ataques de tipo [Fork bomb](https://en.wikipedia.org/wiki/Fork_bomb) en el ledger al aumentar exponencialmente el coste de las transacciones emitidas que crecen de forma exponencial.
Es importante destacar que la API de Hooks sigue la regla estricta de _no reescritura_. Debes presentar una transacción emitida completa, válida y canónicamente formada a xahaud para su emisión, o será rechazada. No es responsabilidad de xahaud construir tu transacción por ti. El Hook debe hacerlo por sí mismo.
Es importante destacar que la API de Hooks sigue la regla estricta de _no reescritura_. Debes presentar una transacción emitida completa, válida y canónicamente formada a xahaud para su emisión, o será rechazada. Con la [enmienda HooksUpdate2](/es/docs/features/amendments/#hooksupdate2), la API [prepare()](/es/docs/hooks/functions/emitted-transaction/prepare) automatiza esto: el Hook proporciona solo los campos específicos del tipo de transacción y el runtime inyecta todo el código repetitivo de emisión requerido. Sin HooksUpdate2, el Hook debe construir la transacción completa por sí mismo.
### Callbacks
@@ -34,7 +34,7 @@ Si una transacción emitida expira antes de poder ser aceptada en un ledger (por
### Reglas de emisión
La API [emit](/es/docs/hooks/functions/emitted-transaction/emit-1) aplicará las siguientes reglas sobre una transacción propuesta (a emitir):
La API [emit](/es/docs/hooks/functions/emitted-transaction/emit) aplicará las siguientes reglas sobre una transacción propuesta (a emitir):
| # | Regla de emisión | Explicación |
| - | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

View File

@@ -41,4 +41,28 @@ Ejemplos (asumiendo un entero sin signo de 256 bits):
### Calculadora HookOn
<LinkCard title="Calculadora HookOn" href="https://richardah.github.io/xrpl-hookon-calculator/" />
<LinkCard title="Calculadora HookOn" href="https://richardah.github.io/xrpl-hookon-calculator/" />
### Campo HookCanEmit
_(Añadido por la [enmienda HookCanEmit](/es/docs/features/amendments/#hookcanemit).)_
`HookCanEmit` usa la misma sintaxis de máscara de bits de 256 bits que `HookOn`, pero controla qué tipos de transacción puede **emitir** un Hook, en lugar de qué tipos lo activan.
- Usa la misma semántica activo-bajo que `HookOn`, con el bit 22 (`ttHOOK_SET`) siendo activo-alto.
- Si `HookCanEmit` está ausente, el Hook puede emitir cualquier tipo de transacción, incluyendo `SetHook`.
### Campos HookOnIncoming y HookOnOutgoing
_(Añadido por la [enmienda HookOnV2](/es/docs/features/amendments/#hookonv2).)_
En lugar de especificar un único campo `HookOn`, los Hooks pueden opcionalmente reemplazarlo con dos campos separados que diferencian la dirección de la transacción que los activa:
- **`HookOnIncoming`** — activa el Hook en transacciones **originadas desde otra cuenta** (la cuenta del Hook no es el iniciador).
- **`HookOnOutgoing`** — activa el Hook en transacciones **originadas desde la propia cuenta del Hook**.
Ambos campos usan la misma sintaxis de campo de bits que `HookOn`. `HookOnIncoming` y `HookOnOutgoing` son mutuamente excluyentes con `HookOn` — debes usar `HookOn` solo o el par `HookOnIncoming`/`HookOnOutgoing`, no ambos. Si solo se especifica uno del par, el Hook no se activará en la dirección no especificada.
_Nota: Los campos `HookOnIncoming` y `HookOnOutgoing` no pueden configurarse con exactamente los mismos ajustes. Si necesitas que un Hook responda en ambas direcciones usando criterios idénticos, usa el campo `HookOn` en su lugar, ya que ofrece una forma más simple y apropiada de definir el comportamiento de activación compartida._
Usar `HookOn` solo continúa funcionando exactamente como antes.

View File

@@ -0,0 +1,105 @@
---
title: Named Hooks
description: Activa hooks específicos en una cuenta usando una puerta de ejecución basada en nombre.
---
_(Añadido por la [enmienda NamedHooks](/es/docs/features/amendments/#namedhooks).)_
### Descripción general
Por defecto, cada hook instalado en una cuenta se ejecuta en cada tipo de transacción para el que ha sido configurado mediante `HookOn`. Los Named Hooks permiten que un hook instalado declare una **puerta de ejecución**: el hook solo se ejecuta si la transacción que lo activa lleva un valor `HookName` coincidente.
Esto permite que varios hooks coexistan en la misma cuenta, cada uno con un caso de uso diferente, donde los llamantes seleccionan qué hook activar incluyendo el `HookName` apropiado en su transacción.
### Cómo funciona
**1. Nombrar el hook en el momento de la instalación**
Establece el campo `HookName` dentro del slot `Hook` de una [transacción SetHook](/es/docs/protocol-reference/transactions/transaction-types/sethook):
```json
{
"TransactionType": "SetHook",
"Account": "rHookOwner...",
"Hooks": [
{
"Hook": {
"HookHash": "A5663784D04ED1B4408C6B97193464D27C9C3334AAF8BBB4FA5EB8E557FC4A2C",
"HookOn": "0000000000000000",
"HookNamespace": "...",
"HookName": "6D795F68616E646C6572"
}
}
]
}
```
`HookName` es una cadena UTF-8 codificada en hexadecimal (p. ej. `6D795F68616E646C6572` = `"my_handler"`). Se almacena por instalación en el [objeto Hook del ledger](/es/docs/protocol-reference/ledger-data/ledger-objects-types/hook) de la cuenta y no se comparte con la [HookDefinition](/es/docs/protocol-reference/ledger-data/ledger-objects-types/hook-definition).
**2. Activar el hook por nombre en una transacción**
Cualquier tipo de transacción puede incluir el campo `HookName` de nivel superior para apuntar al hook nombrado:
```json
{
"TransactionType": "Payment",
"Account": "rSender...",
"Destination": "rHookOwner...",
"Amount": "1000000",
"HookName": "6D795F68616E646C6572"
}
```
Cuando el ledger procesa esta transacción y llega a la cadena de hooks en `rHookOwner`:
- Los hooks **sin** un `HookName` establecido → se ejecutan normalmente (comportamiento sin cambios).
- Los hooks **con** un `HookName` que coincide con el `HookName` de la transacción → se ejecutan.
- Los hooks **con** un `HookName` que **no coincide** → se omiten silenciosamente (sin error).
Las transacciones que **no** llevan el campo `HookName` omitirán todos los hooks nombrados de la cuenta.
### Restricciones de HookName
| Restricción | Valor |
| ----------------- | ------------------------------ |
| Longitud mínima | 4 bytes (8 caracteres hex en JSON) |
| Longitud máxima | 16 bytes (32 caracteres hex en JSON) |
| Codificación | UTF-8 válido |
| Eliminar nombre | Establecer en blob vacío (`""`) en una operación de actualización |
### Eliminar un nombre
Para eliminar un nombre previamente asignado a un slot de hook, envía una operación de actualización con `HookName` establecido en un blob vacío:
```json
{
"TransactionType": "SetHook",
"Account": "rHookOwner...",
"Hooks": [
{
"Hook": {
"HookName": ""
}
}
]
}
```
Tras la eliminación, el hook vuelve a la ejecución incondicional (gobernada únicamente por sus configuraciones de `HookOn` / `HookOnIncoming` / `HookOnOutgoing`).
### Cálculo de comisiones
El cálculo de comisiones de hook respeta la misma lógica de puerta: los hooks nombrados que serían omitidos por una transacción (nombre no coincidente o ausente) **no** se contabilizan al calcular la comisión de ejecución de hook para esa transacción.
### Casos de error
| Código de error | Condición |
| --------------- | --------- |
| `temDISABLED` | `HookName` está presente en un slot Hook pero la enmienda `NamedHooks` no está habilitada. |
| `temMALFORMED` | `HookName` presente como campo de transacción de nivel superior pero `Hooks` o `NamedHooks` no está activo; o el valor no supera la validación de UTF-8 o longitud. |
### Casos de uso
- **Cuentas multipropósito**: instala varios hooks especializados (p. ej. procesador de pagos, manejador de gobernanza, gestor de escrow), cada uno controlado por un nombre diferente.
- **Invocación selectiva**: contratos externos o usuarios pueden activar selectivamente solo el hook relevante para su interacción sin afectar a los demás.
- **Migración gradual**: despliega una nueva versión de hook bajo un nombre diferente y migra los llamantes de forma incremental sin eliminar el hook anterior.

View File

@@ -2,6 +2,7 @@
title: Objetos serializados
description: ¡Manipula objetos serializados de xahaud directamente!
---
import { Aside } from '@astrojs/starlight/components';
### ¿Qué son los objetos serializados?
@@ -45,6 +46,34 @@ for (int i = 0; GUARD(3), i < 3; ++i)
}
````
### Soporte de PathSet y Tipos Serializados Soportados
<Aside type="caution" title="Error de análisis de PathSet (pre-HookAPISerializedType240)">
Sin la [enmienda HookAPISerializedType240](/es/docs/features/amendments/#hookapiserializedtype240), todas las funciones `sto_` analizan incorrectamente los campos `sfPaths` (campos STPathSet, usados en transacciones Payment con enrutamiento entre monedas). El analizador interno lee mal el límite del PathSet, corrompiendo los resultados de cualquier campo que aparezca después de `sfPaths` en el objeto serializado. Los desarrolladores de Hooks que procesen transacciones Payment con rutas entre monedas deben asegurarse de que esta enmienda esté habilitada.
</Aside>
Con la [enmienda HookAPISerializedType240](/es/docs/features/amendments/#hookapiserializedtype240), los siguientes tipos serializados son manejados correctamente por todas las funciones `sto_`:
| Tipo STI | Código | Ejemplos |
|---|---|---|
| `STI_UINT16` | 1 | `sfTransactionType` |
| `STI_UINT32` | 2 | `sfFlags`, `sfSequence`, `sfOfferSequence` |
| `STI_UINT64` | 3 | `sfHookOn` |
| `STI_HASH128` | 4 | `sfEmailHash` |
| `STI_HASH256` | 5 | `sfLedgerHash`, `sfTransactionHash` |
| `STI_AMOUNT` | 6 | `sfAmount`, `sfFee` |
| `STI_VL` | 7 | `sfPublicKey`, blobs |
| `STI_ACCOUNT` | 8 | `sfAccount`, `sfDestination` |
| `STI_OBJECT` | 14 | `sfTransaction`, objetos internos |
| `STI_ARRAY` | 15 | `sfHooks`, `sfMemos`, `sfSigners` |
| `STI_UINT8` | 16 | `sfCloseResolution` |
| `STI_UINT160` | 17 | `sfTakerPaysCurrency` |
| `STI_PATHSET` | 18 | `sfPaths` _(corregido por HookAPISerializedType240)_ |
| `STI_VECTOR256` | 19 | `sfHookNamespaces` |
| `STI_ISSUE` | 24 | _(añadido por HookAPISerializedType240)_ |
| `STI_XCHAIN_BRIDGE` | 25 | _(añadido por HookAPISerializedType240)_ |
| `STI_CURRENCY` | 26 | _(añadido por HookAPISerializedType240)_ |
### Solapamiento con slots
Puede que observes cierta superposición entre las APIs de slots y las APIs STO. La diferencia clave es quién *posee* los datos subyacentes:

View File

@@ -1,45 +1,72 @@
---
title: prepare
description: Prepara una transacción JSON para su emisión.
title: emit
description: Emite una nueva transacción desde el hook
---
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
### Conceptos
<LinkButton href="/es/docs/protocol-reference/transactions">Transacciones</LinkButton>
<LinkButton href="/es/docs/hooks/concepts/emitted-transactions">Transacciones Emitidas</LinkButton>
<LinkButton href="/es/docs/hooks/functions/emitted-transaction/prepare">prepare()</LinkButton>
### Comportamiento
<Tabs>
<TabItem label="C">
* Lee una transacción de `read_ptr`
* Valida la transacción contra las reglas de emisión
* Emite la transacción al consenso cuando es válida
* Escribe el hash canónico de la transacción en `write_ptr`
Con la [enmienda HooksUpdate2](/es/docs/features/amendments/#hooksupdate2), usa [`prepare()`](/es/docs/hooks/functions/emitted-transaction/prepare) antes de `emit()` para inyectar automáticamente todos los campos de emisión requeridos (`Account`, `Sequence`, `SigningPubKey`, `Fee`, `EmitDetails`, etc.) a partir de una transacción parcial.
</TabItem>
<TabItem label="JavaScript">
* Esta función toma un objeto JSON de transacción y lo prepara para su emisión.
* La transacción debe estar completa excepto el campo Account, que siempre debe ser la cuenta del Hook.
* Esta función emite el JSON de transacción proporcionado.
* En caso de éxito, devuelve los hashes de la transacción emitida.
* Si hay un error, devuelve un código de error.
</TabItem>
</Tabs>
### Definición
<Tabs>
<TabItem label="C">
```c
int64_t emit (
uint32_t write_ptr,
uint32_t write_len,
uint32_t read_ptr,
uint32_t read_len
);
```
</TabItem>
<TabItem label="JavaScript">
```javascript
function prepare(
function emit(
txJson: Record<string, any> | Transaction
): ErrorCode | Record<string, any> | Transaction
````
): ErrorCode | ByteArray
```
</TabItem>
</Tabs>
### Ejemplo
<Tabs>
<TabItem label="C">
```c
uint8_t emithash[32];
if (emit(SBUF(emithash), SBUF(tx)) < 0)
rollback(SBUF("hook: emit failed"), __LINE__);
```
</TabItem>
<TabItem label="JavaScript">
```javascript
const prepared_txn = prepare({
TransactionType: "Payment",
Destination: util_raddr(p1address_ns),
Amount: parseFloat(drops_sent)*2
})
const emitResult = emit(txJson)
if(typeof emitResult === 'number')
rollback("Failed to emit!", 1)
```
</TabItem>
</Tabs>
@@ -47,15 +74,23 @@ const prepared_txn = prepare({
### Parámetros
<Tabs>
<TabItem label="C">
<table><thead><tr><th>Nombre</th><th width="124">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>write_ptr</td><td>uint32_t</td><td>Puntero a un buffer donde escribir el hash de la transacción</td></tr><tr><td>write_len</td><td>uint32_t</td><td>El tamaño del buffer para escribir el hash de la transacción (debe ser 32)</td></tr><tr><td>read_ptr</td><td>uint32_t</td><td>Puntero a la transacción a emitir</td></tr><tr><td>read_len</td><td>uint32_t</td><td>La longitud de la transacción</td></tr></tbody></table>
</TabItem>
<TabItem label="JavaScript">
<table><thead><tr><th>Nombre</th><th width="124">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>txJson</td><td>Record&#x3C;string, any> | Transaction</td><td>El JSON de la transacción, debe estar completo excepto el campo Account (siempre la cuenta del Hook).</td></tr></tbody></table>
<table><thead><tr><th>Nombre</th><th width="124">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>txJson</td><td>Record&#x3C;string, any> | Transaction</td><td>El JSON de la transacción a emitir.</td></tr></tbody></table>
</TabItem>
</Tabs>
### Código de retorno
<Tabs>
<TabItem label="JavaScript">
<table><thead><tr><th width="231">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>ErrorCode | Record&#x3C;string, any> | Transaction</td><td>Devuelve un ErrorCode si hay un error, o el JSON de la transacción preparada o el objeto Transaction.</td></tr></tbody></table>
<TabItem label="C">
<table><thead><tr><th width="127">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>int64_t</td><td>En caso de éxito, el número de bytes del hash de transacción escritos (32), o:<br /><br />Si es negativo, un error:<br /><code>OUT_OF_BOUNDS</code><br />- punteros/longitudes especificados fuera de la memoria del hook.<br /><br /><code>PREREQUISITE_NOT_MET</code><br />- se debe llamar primero a <code>etxn_reserve</code><br /><br /><code>TOO_MANY_EMITTED_TXN</code><br />- el número de transacciones emitidas es ahora mayor que la promesa hecha cuando se llamó a <code>etxn_reserve</code><br /><br /><code>EMISSION_FAILURE</code><br />- la transacción estaba malformada según las reglas de emisión.</td></tr></tbody></table>
</TabItem>
</Tabs>
<TabItem label="JavaScript">
<table><thead><tr><th width="231">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>ErrorCode | ByteArray</td><td>Devuelve un ErrorCode si hay un error, o un array de hashes de la transacción emitida en caso de éxito.</td></tr></tbody></table>
</TabItem>
</Tabs>

View File

@@ -0,0 +1,125 @@
---
title: prepare
description: Prepara una transacción para su emisión inyectando automáticamente todos los campos de emisión requeridos.
---
import { Tabs, TabItem, LinkButton } from '@astrojs/starlight/components';
### Conceptos
<LinkButton href="/es/docs/hooks/concepts/emitted-transactions">Transacciones Emitidas</LinkButton>
### Comportamiento
<Tabs>
<TabItem label="C">
_(Requiere la [enmienda HooksUpdate2](/es/docs/features/amendments/#hooksupdate2).)_
* Lee una transacción serializada parcial de `read_ptr`/`read_len`. La entrada debe contener como mínimo el `TransactionType` y todos los campos requeridos por ese tipo de transacción, pero los campos específicos de emisión incluidos serán **sobreescritos**.
* Inyecta automáticamente todos los campos requeridos para la emisión: `Account` (la cuenta Hook), `Sequence` (0), `SigningPubKey` (todo ceros), `Fee` (calculada), `FirstLedgerSequence` (ledger actual + 1), `LastLedgerSequence` (ledger actual + 5) y `EmitDetails`.
* Escribe el blob de transacción completo y listo para emisión en `write_ptr`.
* La salida puede pasarse directamente a [`emit()`](/es/docs/hooks/functions/emitted-transaction/emit).
* Se debe llamar a `etxn_reserve()` antes de `prepare()`.
</TabItem>
<TabItem label="JavaScript">
* Esta función toma un objeto JSON de transacción y lo prepara para su emisión.
* La transacción debe estar completa excepto por los campos Account, Sequence, SigningPubKey, Fee, FirstLedgerSequence, LastLedgerSequence y EmitDetails.
</TabItem>
</Tabs>
### Definición
<Tabs>
<TabItem label="C">
```c
int64_t prepare (
uint32_t write_ptr,
uint32_t write_len,
uint32_t read_ptr,
uint32_t read_len
);
```
</TabItem>
<TabItem label="JavaScript">
```javascript
function prepare(
txJson: Record<string, any> | Transaction
): ErrorCode | Record<string, any> | Transaction
```
</TabItem>
</Tabs>
### Ejemplo
<Tabs>
<TabItem label="C">
```c
etxn_reserve(1);
// Construir una transacción de pago mínima (TransactionType + campos requeridos únicamente)
uint8_t tx[256];
// ... rellenar tx con TransactionType, Destination, Amount ...
int64_t tx_len = /* tamaño de tx */;
// prepare() rellena Account, Sequence, Fee, EmitDetails, etc.
uint8_t prepared[512];
int64_t prepared_len = prepare(prepared, sizeof(prepared), tx, tx_len);
if (prepared_len < 0)
rollback("Prepare failed", 14, prepared_len);
// emit() envía la transacción completamente formada
uint8_t txid[32];
if (emit(txid, 32, prepared, prepared_len) != 32)
rollback("Emit failed", 11, EMISSION_FAILURE);
```
</TabItem>
<TabItem label="JavaScript">
```javascript
const prepared_txn = prepare({
TransactionType: "Payment",
Destination: util_raddr(p1address_ns),
Amount: parseFloat(drops_sent)*2
})
```
</TabItem>
</Tabs>
### Parámetros
<Tabs>
<TabItem label="C">
| Nombre | Tipo | Descripción |
| ----------- | --------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `write_ptr` | uint32_t | Puntero a un buffer para recibir el blob de transacción preparado completo. |
| `write_len` | uint32_t | Longitud del buffer de escritura. Debe ser suficientemente grande para contener la transacción preparada (tamaño de entrada + campos inyectados). |
| `read_ptr` | uint32_t | Puntero a una transacción serializada parcial. Debe incluir `TransactionType` y todos los campos requeridos específicos del tipo. |
| `read_len` | uint32_t | Longitud de la transacción de entrada. |
</TabItem>
<TabItem label="JavaScript">
<table><thead><tr><th>Nombre</th><th width="124">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>txJson</td><td>Record&#x3C;string, any> | Transaction</td><td>El JSON de la transacción; debe ser una transacción completa excepto por Account (siempre la cuenta Hook).</td></tr></tbody></table>
</TabItem>
</Tabs>
### Código de retorno
<Tabs>
<TabItem label="C">
| Tipo | Descripción |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| int64_t | En caso de éxito, el número de bytes escritos en `write_ptr` (el tamaño del blob de transacción preparado). El valor devuelto es la longitud de la transacción preparada. Pasa el buffer original como `read_ptr` y la longitud devuelta como `read_len` al llamar a `emit()`.<br /><br />Si es negativo, un error:<br />`OUT_OF_BOUNDS` — los punteros/longitudes quedan fuera de la memoria del hook.<br />`PREREQUISITE_NOT_MET` — se debe llamar a `etxn_reserve()` antes de `prepare()`.<br />`INVALID_ARGUMENT` — el blob de entrada no es una transacción serializada válida, o la transacción no puede prepararse (p. ej. falló el cálculo de la comisión).<br />`INTERNAL_ERROR` — fallo al generar `EmitDetails` o al re-serializar la transacción. |
</TabItem>
<TabItem label="JavaScript">
<table><thead><tr><th width="231">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>ErrorCode | Record&#x3C;string, any> | Transaction</td><td>Devuelve un ErrorCode si hay un error, o el JSON de la transacción preparada o el objeto Transaction.</td></tr></tbody></table>
</TabItem>
</Tabs>

View File

@@ -13,11 +13,12 @@ Un objeto `HookDefinition` describe un hook, que es un fragmento de código que
{
"HookHash": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0",
"HookOn": "0000000000000000000000000000000000000000000000000000000000000000",
"HookCanEmit": "0000000000000000000000000000000000000000000000000000000000000000",
"HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000",
"HookParameters": {
"HookParameter": {
"HookParameterName": "DEADBEEF",
"HookParameterValue": "DEADBEEF",
"HookParameterValue": "DEADBEEF"
}
},
"HookApiVersion": 1,
@@ -37,10 +38,12 @@ Un objeto `HookDefinition` tiene los siguientes campos:
| Campo | Tipo JSON | \[Tipo Interno]\[] | ¿Requerido? | Descripción |
| ----------------- | --------- | ------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- |
| `HookHash` | String | Hash256 | Sí | El identificador único del hook. |
| `HookOn` | String | Hash256 | | La/s transacción/es en las que se activa el hook. |
| `HookCanEmit` | String | Hash256 | No | La/s transacción/es que el hook puede emitir. |
| `HookNamespace` | String | Hash256 | | El espacio de nombres del hook. |
| `HookHash` | String | Hash256 | Sí | El identificador único del hook. |
| `HookOn` | String | Hash256 | No | La/s transacción/es en las que se activa el hook. Mutuamente exclusivo con `HookOnIncoming`/`HookOnOutgoing`. |
| `HookOnIncoming` | String | Hash256 | No | _(HookOnV2)_ Misma sintaxis que `HookOn`. Activa el hook en transacciones originadas desde otra cuenta. Mutuamente exclusivo con `HookOn`. |
| `HookOnOutgoing` | String | Hash256 | No | _(HookOnV2)_ Misma sintaxis que `HookOn`. Activa el hook en transacciones originadas desde la propia cuenta del Hook. Mutuamente exclusivo con `HookOn`. |
| `HookCanEmit` | String | Hash256 | No | Misma sintaxis que `HookOn`. Controla qué tipos de transacción puede emitir el hook. Si está ausente, el hook puede emitir cualquier tipo de transacción. |
| `HookNamespace` | String | Hash256 | Sí | El espacio de nombres del hook. |
| `HookParameters` | String | Vector | Sí | Los parámetros que acepta el hook. |
| `HookApiVersion` | Number | UInt16 | Sí | La versión de la API del hook que usa el hook. |
| `CreateCode` | String | VL | Sí | El código que se ejecuta cuando se crea el hook. |

View File

@@ -0,0 +1,90 @@
---
title: Oracle
---
\[[Source](https://github.com/Xahau/xahaud/blob/dev/src/xrpld/app/tx/detail/SetOracle.cpp)]
_(Añadido por la [enmienda PriceOracle](/es/docs/features/amendments/#priceoracle).)_
Un objeto `Oracle` del ledger representa un Price Oracle creado por una cuenta en el ledger de Xahau. Almacena uno o más puntos de datos de precio de activos y se identifica mediante la cuenta propietaria junto con un ID de documento. Los objetos Oracle se crean y actualizan mediante [transacciones OracleSet](/es/docs/protocol-reference/transactions/transaction-types/oracleset) y se eliminan mediante [transacciones OracleDelete](/es/docs/protocol-reference/transactions/transaction-types/oracledelete).
### Ejemplo JSON
```json
{
"LedgerEntryType": "Oracle",
"Owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"OracleDocumentID": 1,
"Provider": "70726F7669646572",
"AssetClass": "63757272656E6379",
"LastUpdateTime": 816348759,
"PriceDataSeries": [
{
"PriceData": {
"BaseAsset": "XAH",
"QuoteAsset": "USD",
"AssetPrice": 74560,
"Scale": 4
}
},
{
"PriceData": {
"BaseAsset": "BTC",
"QuoteAsset": "USD",
"AssetPrice": 6800000,
"Scale": 2
}
}
],
"URI": "697066733A2F2F",
"OwnerNode": "0000000000000000",
"PreviousTxnID": "5463C6E08862A1FAE5EDAC12D70ADB16546A1F674930521295BC082494B62924",
"PreviousTxnLgrSeq": 6,
"index": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0"
}
```
### Campos
Un objeto `Oracle` tiene los siguientes campos:
| Campo | Tipo JSON | \[Internal Type]\[] | ¿Requerido? | Descripción |
| ------------------- | --------- | ------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Owner` | String | AccountID | Sí | La cuenta que creó y posee este Oracle. Solo esta cuenta puede actualizarlo o eliminarlo. |
| `OracleDocumentID` | Number | UInt32 | Sí | El identificador único de este Oracle dentro de la cuenta propietaria. |
| `Provider` | String | Blob | Sí | Identificador del proveedor de datos codificado en hexadecimal (p. ej. el nombre del servicio oracle). Máximo 256 bytes. |
| `AssetClass` | String | Blob | Sí | Cadena codificada en hexadecimal que describe la categoría de activos (p. ej. `63757272656E6379` = "currency"). Máximo 16 bytes. |
| `LastUpdateTime` | Number | UInt32 | Sí | Marca de tiempo epoch de Ripple (segundos desde el 1 de enero de 2000) de la última actualización de precio. |
| `PriceDataSeries` | Array | Array | Sí | Array de objetos `PriceData` (110 entradas). Las entradas se almacenan en orden canónico por par `BaseAsset`/`QuoteAsset`. |
| `URI` | String | Blob | No | URI codificado en hexadecimal que apunta a datos complementarios fuera de la cadena (p. ej. un CID de IPFS). Máximo 256 bytes. |
| `OwnerNode` | String | UInt64 | Sí | Indicación de qué página del directorio del propietario enlaza con este objeto. |
| `PreviousTxnID` | String | Hash256 | Sí | El hash identificador de la transacción que modificó este objeto más recientemente. |
| `PreviousTxnLgrSeq` | Number | UInt32 | Sí | El índice del ledger que contiene la transacción que modificó este objeto más recientemente. |
| `LedgerEntryType` | String | UInt16 | Sí | El valor `0x0080`, mapeado a la cadena `Oracle`, indica que este es un objeto Oracle. |
### Objeto PriceData
Cada entrada en `PriceDataSeries` contiene un objeto `PriceData`:
| Campo | Tipo JSON | \[Internal Type]\[] | ¿Requerido? | Descripción |
| ------------ | --------- | ------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `BaseAsset` | String | Currency | Sí | El activo cuyo precio se publica (p. ej. `"XAH"`, `"BTC"`). |
| `QuoteAsset` | String | Currency | Sí | La moneda de denominación (p. ej. `"USD"`, `"EUR"`). |
| `AssetPrice` | Number | UInt64 | No | El precio como número entero escalado. El precio efectivo es `AssetPrice × 10^(-Scale)`. |
| `Scale` | Number | UInt8 | No | Exponente decimal (010) usado para derivar el precio efectivo. Ejemplo: `AssetPrice = 74560`, `Scale = 4` → precio efectivo = 7,456. |
### Reserva
Un objeto Oracle consume reservas del propietario según el número de pares `PriceData` almacenados:
| Pares | Reservas del propietario consumidas |
| ----- | ----------------------------------- |
| 15 | 1 |
| 610 | 2 |
### Formato del ID de Oracle
El ID de un objeto `Oracle` es el \[SHA-512Half]\[] de los siguientes valores, concatenados en orden:
* La clave de espacio Oracle (`0x0152`)
* El AccountID del `Owner`
* El `OracleDocumentID` como entero sin signo de 32 bits

View File

@@ -44,6 +44,16 @@ El "emisor" del saldo en una línea de confianza depende de si el saldo es posit
"issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"value": "10"
},
"LowReward": {
"RewardLgrFirst": 1000000,
"RewardLgrLast": 1001234,
"RewardTime": 744000000,
"TrustLineRewardAccumulator": {
"currency": "USD",
"issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"value": "500"
}
},
"index": "9CA88CDEDFF9252B3DE183CE35B038F57282BC9503CDFA1923EF9A95DF0D6F7B"
}
```
@@ -69,6 +79,21 @@ Un objeto `RippleState` tiene los siguientes campos:
| `PreviousTxnLgrSeq` | Number | UInt32 | Sí | El \[índice del ledger]\[Ledger Index] que contiene la transacción que modificó más recientemente este objeto. |
| `LockCount` | Number | UInt32 | No | El número total de saldos bloqueados en un objeto de ledger RippleState. |
| `LockedBalance` | Object | Amount | No | El monto actual de tokens bloqueados para una línea de confianza específica. |
| `LowReward` | Object | STObject | No | _(IOURewardClaim)_ Contadores de seguimiento de recompensas IOU para la cuenta baja. Presente solo después de que la cuenta baja opte mediante `ClaimReward` con `ClaimCurrency`. Contiene `RewardLgrFirst`, `RewardLgrLast`, `RewardTime` y `TrustLineRewardAccumulator`. |
| `HighReward` | Object | STObject | No | _(IOURewardClaim)_ Contadores de seguimiento de recompensas IOU para la cuenta alta. Presente solo después de que la cuenta alta opte mediante `ClaimReward` con `ClaimCurrency`. Contiene `RewardLgrFirst`, `RewardLgrLast`, `RewardTime` y `TrustLineRewardAccumulator`. |
### Campos LowReward / HighReward
_(Añadido por la [enmienda IOURewardClaim](/es/docs/features/amendments/#iourewardclaim).)_
Tanto `LowReward` como `HighReward` son objetos internos con la misma estructura. `LowReward` está presente si la cuenta baja ha optado por las recompensas IOU para esta línea de confianza, y `HighReward` está presente si la cuenta alta ha optado. Ambos pueden estar presentes si ambas cuentas han optado. El ordenamiento canónico alto/bajo solo determina a qué lado se mapea una cuenta.
| Campo | Tipo JSON | Tipo Interno | Descripción |
| ---------------------------- | --------- | ------------- | ---------------------------------------------------------------------------------------------------- |
| `RewardLgrFirst` | Number | UInt32 | El número de secuencia del ledger cuando la cuenta optó por primera vez por las recompensas IOU para esta línea de confianza. Se actualiza cada vez que se ejecuta `ClaimReward`. El campo se eliminará si la cuenta opta por salir. |
| `RewardLgrLast` | Number | UInt32 | El número de secuencia del ledger de la última vez que se actualizó el acumulador de recompensas. |
| `RewardTime` | Number | UInt32 | El tiempo de cierre del ledger (segundos en epoch de Ripple) cuando los contadores fueron reiniciados por última vez por una transacción `ClaimReward`. |
| `TrustLineRewardAccumulator` | Object | Amount | El total acumulado de `saldo × ledgers transcurridos` desde el último `ClaimReward`. Expresado en la moneda de la línea de confianza. Este es el valor que el Hook del emisor lee para calcular el pago de recompensa. |
### Indicadores RippleState

View File

@@ -4,13 +4,15 @@ description: >-
Una transacción ClaimReward permite a una cuenta reclamar las recompensas
acumuladas. Las recompensas pueden ser reclamadas por el propietario de la
cuenta o por un emisor especificado. La cuenta también puede optar por
no recibir recompensas.
no recibir recompensas. Con la enmienda IOURewardClaim, esta transacción
también soporta reclamar recompensas para monedas IOU con un Hook de
recompensa instalado.
---
\[[Source](https://github.com/Xahau/xahaud/blob/dev/src/ripple/app/tx/impl/ClaimReward.cpp)]
_(Añadido por la enmienda \[BalanceRewards]\[].)_
### Opt-in + Reclamación
### Opt-in + Reclamación (recompensas génesis XAH)
```json
{
@@ -20,7 +22,7 @@ _(Añadido por la enmienda \[BalanceRewards]\[].)_
}
```
### Opt-out
### Opt-out (recompensas génesis XAH)
```json
{
@@ -30,34 +32,68 @@ _(Añadido por la enmienda \[BalanceRewards]\[].)_
}
```
### Reclamación de Recompensa IOU
_(Requiere la enmienda \[IOURewardClaim]\[].)_
```json
{
"TransactionType": "ClaimReward",
"Account": "rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm",
"Issuer": "rIssuerAccountXXXXXXXXXXXXXXXXXXX",
"ClaimCurrency": {
"currency": "USD",
"issuer": "rIssuerAccountXXXXXXXXXXXXXXXXXXX"
}
}
```
### Campos
| Campo | Tipo JSON | \[Tipo Interno]\[] | Descripción |
| --------- | --------- | ------------------- | -------------------------------------------------------------------- |
| `Account` | String | AccountID | La dirección de la cuenta que está reclamando la recompensa. |
| `Flags` | Number | UInt32 | _(Opcional)_ Puede tener el indicador 1 activado para optar por no recibir recompensas. |
| `Issuer` | String | AccountID | _(Opcional)_ La cuenta génesis. |
| Campo | Tipo JSON | \[Tipo Interno]\[] | Descripción |
| --------------- | --------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Account` | String | AccountID | La dirección de la cuenta que está reclamando la recompensa. |
| `Flags` | Number | UInt32 | _(Opcional)_ Puede tener el indicador 1 activado para optar por no recibir recompensas. |
| `Issuer` | String | AccountID | _(Opcional)_ La cuenta génesis (recompensas XAH) o una cuenta IOU (recompensas IOU). |
| `ClaimCurrency` | Object | Issue | _(Opcional, IOURewardClaim)_ La moneda IOU para reclamar recompensas, como `{"currency": "...", "issuer": "..."}`. No puede ser XAH. El emisor no debe ser la cuenta génesis y no debe ser igual a `Account`. Requiere que exista una línea de confianza entre `Account` y el emisor. |
### Indicadores ClaimReward
Las transacciones del tipo ClaimReward admiten valores adicionales en el campo `Flags`, de la siguiente manera:
| Nombre del Indicador | Valor Hex | Valor Decimal | Descripción |
| -------------------- | ------------ | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tfOptOut` | `0x00000001` | 1 | El indicador `isOptOut` en el código ClaimReward se usa para optar una cuenta por no recibir recompensas eliminando los campos relacionados con recompensas del objeto de cuenta en el ledger si el campo `sfFlags` de la transacción se establece en 1. |
| Nombre del Indicador | Valor Hex | Valor Decimal | Descripción |
| -------------------- | ------------ | ------------- | ------------------------------------------------------------------------------------------------- |
| `tfOptOut` | `0x00000001` | 1 | Excluye a la cuenta de las recompensas eliminando los campos relacionados con recompensas del objeto de cuenta del ledger. |
### Costo de Transacción Especial
La transacción ClaimReward tiene un costo de transacción estándar, que es el costo mínimo de transacción requerido para todas las transacciones.
### Comportamiento de Recompensa IOU
_(Requiere la enmienda \[IOURewardClaim]\[].)_
Cuando se especifica `ClaimCurrency`, la transacción sigue el camino de recompensa IOU:
1. La cuenta `Issuer` debe tener un Hook instalado que se active en una transacción `ClaimReward`. El Hook es responsable de calcular y distribuir el pago de recompensa.
2. En la primera reclamación, se inicializa un objeto de seguimiento de recompensas `LowReward` o `HighReward` en la línea de confianza (objeto de ledger [RippleState](/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state)) entre `Account` y el emisor. El lado utilizado depende del ordenamiento canónico alto/bajo de las dos cuentas.
3. Después de cada transacción subsiguiente que cambia el saldo de la línea de confianza, el ledger actualiza automáticamente `TrustLineRewardAccumulator` dentro del objeto de seguimiento usando la misma fórmula de área bajo la curva que las recompensas génesis de XAH.
4. Cuando se envía una `ClaimReward` con `ClaimCurrency`, el ledger reinicia los contadores de recompensa en la línea de confianza y activa el Hook del emisor, que lee el valor acumulado y emite un pago de recompensa.
Los contadores de recompensa IOU son completamente independientes de los campos de recompensa génesis de XAH en el objeto AccountRoot.
### Casos de Error
Además de los errores que pueden ocurrir para todas las transacciones, las transacciones ClaimReward pueden resultar en los siguientes códigos de resultado:
| Código de Error | Descripción |
| ----------------- | ------------------------------------------------------------------------------------------------------- |
| `temDISABLED` | Ocurre si la función no está habilitada. |
| `temINVALID_FLAG` | Ocurre si el indicador se establece en un valor distinto de 1. |
| `temMALFORMED` | Ocurre si el emisor es el mismo que la cuenta fuente o si el indicador y el emisor no están correctamente establecidos. |
| `tecNO_ISSUER` | Ocurre si el emisor no existe. |
| `terNO_ACCOUNT` | Ocurre si la cuenta emisora no existe. |
| Código de Error | Descripción |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `temDISABLED` | Ocurre si la enmienda requerida (`BalanceRewards` o `IOURewardClaim`) no está habilitada. |
| `temINVALID_FLAG` | Ocurre si el indicador se establece en un valor distinto de 1. _(Requiere la enmienda \[fixRewardClaimFlags]\[].)_ |
| `temMALFORMED` | Ocurre si `ClaimCurrency` es un tipo no monetario o XAH, si el emisor es igual a `Account`, o si los campos de la transacción están incorrectamente establecidos. |
| `temBAD_ISSUER` | Ocurre si se establece `ClaimCurrency` pero el emisor es la cuenta génesis, o si `Issuer` es la cuenta génesis pero también se establece `ClaimCurrency`. |
| `terNO_ACCOUNT` | Ocurre si la cuenta emisora no existe. |
| `tecNO_ISSUER` | Ocurre si la cuenta `Issuer` no existe. |
| `tecNO_PERMISSION` | Ocurre si la cuenta del emisor es una cuenta AMM. Las cuentas AMM no pueden tener Hooks de recompensa. |
| `tecNO_TARGET` | Ocurre si la cuenta del emisor no tiene Hooks, o ninguno de sus Hooks se activa en una transacción `ClaimReward`. |
| `tecNO_LINE` | Ocurre si no existe ninguna línea de confianza entre `Account` y el emisor para el `ClaimCurrency` especificado. |

View File

@@ -0,0 +1,39 @@
---
title: OracleDelete
description: >-
Una transacción OracleDelete elimina un objeto Price Oracle existente del
ledger, liberando las reservas del propietario que mantenía.
---
\[[Source](https://github.com/Xahau/xahaud/blob/dev/src/xrpld/app/tx/detail/DeleteOracle.cpp)]
_(Añadido por la [enmienda PriceOracle](/es/docs/features/amendments/#priceoracle).)_
### Ejemplo
```json
{
"TransactionType": "OracleDelete",
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"OracleDocumentID": 1
}
```
### Campos
| Campo | Tipo JSON | \[Internal Type]\[] | Descripción |
| ------------------ | --------- | ------------------- | -------------------------------------------------------------------------------------------- |
| `Account` | String | AccountID | La dirección de la cuenta propietaria del Oracle. Solo el propietario puede eliminar el objeto. |
| `OracleDocumentID` | Number | UInt32 | El ID de documento del objeto Oracle a eliminar. |
### Coste especial de transacción
Las transacciones OracleDelete tienen el coste de transacción estándar.
### Casos de error
| Código de error | Descripción |
| ----------------- | -------------------------------------------------------------------- |
| `temDISABLED` | La enmienda PriceOracle no está habilitada. |
| `temINVALID_FLAG` | Se especificaron flags inválidos. |
| `terNO_ACCOUNT` | La cuenta emisora no existe. |
| `tecNO_ENTRY` | No existe ningún objeto Oracle para la cuenta y `OracleDocumentID` indicados. |

View File

@@ -0,0 +1,107 @@
---
title: OracleSet
description: >-
Una transacción OracleSet crea o actualiza un objeto Price Oracle en el
ledger, publicando uno o más puntos de datos de precio de activos para una cuenta dada.
---
\[[Source](https://github.com/Xahau/xahaud/blob/dev/src/xrpld/app/tx/detail/SetOracle.cpp)]
_(Añadido por la [enmienda PriceOracle](/es/docs/features/amendments/#priceoracle).)_
### Crear
```json
{
"TransactionType": "OracleSet",
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"OracleDocumentID": 1,
"Provider": "70726F7669646572",
"AssetClass": "63757272656E6379",
"LastUpdateTime": 1763033559,
"PriceDataSeries": [
{
"PriceData": {
"BaseAsset": "XAH",
"QuoteAsset": "USD",
"AssetPrice": 74560,
"Scale": 4
}
}
]
}
```
### Actualizar
```json
{
"TransactionType": "OracleSet",
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"OracleDocumentID": 1,
"LastUpdateTime": 1763033700,
"PriceDataSeries": [
{
"PriceData": {
"BaseAsset": "XAH",
"QuoteAsset": "USD",
"AssetPrice": 74800,
"Scale": 4
}
}
]
}
```
### Campos
| Campo | Tipo JSON | \[Internal Type]\[] | Descripción |
| ------------------ | --------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `Account` | String | AccountID | La dirección de la cuenta que crea o actualiza el Oracle. Solo esta cuenta puede actualizarlo o eliminarlo posteriormente. |
| `OracleDocumentID` | Number | UInt32 | Un identificador único para este Oracle dentro de la cuenta propietaria. Pueden existir múltiples Oracles por cuenta usando diferentes IDs. |
| `Provider` | String | Blob | _(Opcional en actualización; requerido en creación)_ Identificador codificado en hexadecimal del proveedor de Oracle (p. ej. Chainlink, Band). Máximo 256 bytes. |
| `URI` | String | Blob | _(Opcional)_ URI codificado en hexadecimal que hace referencia a datos complementarios fuera de la cadena para este Oracle (p. ej. CID de IPFS). Máximo 256 bytes. |
| `AssetClass` | String | Blob | _(Opcional en actualización; requerido en creación)_ Categoría codificada en hexadecimal que describe el tipo de activos (p. ej. `63757272656E6379` = "currency"). Máximo 16 bytes. |
| `LastUpdateTime` | Number | UInt32 | Marca de tiempo Unix (segundos desde el 1 de enero de 1970) de la última actualización de precio. Debe estar dentro de ±300 segundos del tiempo de cierre del ledger y debe ser estrictamente mayor que el valor almacenado actualmente en actualizaciones. |
| `PriceDataSeries` | Array | Array | Array de objetos `PriceData`. Debe contener entre 1 y 10 entradas. En una actualización, los pares sin `AssetPrice` se eliminan del objeto. |
### Objeto PriceData
Cada entrada en `PriceDataSeries` es un objeto `PriceData`:
| Campo | Tipo JSON | \[Internal Type]\[] | Descripción |
| ------------ | --------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BaseAsset` | String | Currency | El activo cuyo precio se publica (p. ej. `"XAH"`, `"BTC"`). |
| `QuoteAsset` | String | Currency | La moneda de denominación (p. ej. `"USD"`, `"EUR"`). Debe diferir de `BaseAsset`. |
| `AssetPrice` | Number | UInt64 | _(Opcional)_ El precio como número entero escalado. El precio efectivo es `AssetPrice × 10^(-Scale)`. Omitir este campo **elimina** un par existente durante una actualización. |
| `Scale` | Number | UInt8 | _(Opcional)_ Exponente decimal usado para derivar el precio efectivo. Valores válidos: 010. Por defecto: 0. Ejemplo: `AssetPrice = 74560`, `Scale = 4` → precio efectivo = 7,456. |
### Reserva
Las transacciones OracleSet consumen reservas del propietario según el número de pares `PriceData` almacenados:
| Pares | Reservas del propietario consumidas |
| ----- | ----------------------------------- |
| 15 | 1 |
| 610 | 2 |
Si una actualización cambia el número de pares por encima o por debajo del umbral de 5 pares, el recuento del propietario se ajusta automáticamente (±1).
### Coste especial de transacción
Las transacciones OracleSet tienen el coste de transacción estándar.
### Casos de error
| Código de error | Descripción |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `temDISABLED` | La enmienda PriceOracle no está habilitada. |
| `temINVALID_FLAG` | Se especificaron flags inválidos. |
| `temMALFORMED` | `Provider`, `URI` o `AssetClass` está vacío o supera la longitud máxima; pares base/quote duplicados en la misma transacción; `BaseAsset` igual a `QuoteAsset`; `Scale` > 10; `Provider` o `AssetClass` no coinciden con los valores almacenados en una actualización; `Provider` o `AssetClass` ausentes en una creación. |
| `temARRAY_EMPTY` | `PriceDataSeries` está vacío. |
| `temARRAY_TOO_LARGE` | `PriceDataSeries` contiene más de 10 entradas en la transacción. |
| `terNO_ACCOUNT` | La cuenta emisora no existe. |
| `tecINVALID_UPDATE_TIME` | `LastUpdateTime` está fuera de la ventana de ±300 segundos desde el tiempo de cierre del ledger, es anterior a la marca de tiempo UNIX (segundos desde el 1 de enero de 1970), o no es estrictamente mayor que el valor almacenado en una actualización. |
| `tecTOKEN_PAIR_NOT_FOUND` | Un par especificado para eliminación (sin `AssetPrice`) no existe en el objeto Oracle actual. |
| `tecARRAY_EMPTY` | El resultado tras aplicar todas las actualizaciones y eliminaciones dejaría `PriceDataSeries` vacío. |
| `tecARRAY_TOO_LARGE` | El resultado tras aplicar todas las actualizaciones y adiciones superaría las 10 entradas. |
| `tecINSUFFICIENT_RESERVE` | La cuenta no tiene suficiente XAH para cumplir el requisito de reserva para crear el objeto Oracle. |

View File

@@ -92,11 +92,11 @@ Cada operación se especifica por la inclusión u omisión de ciertos campos del
* El Hook Correspondiente no existe _o_ se especifica `FLAG_OVERRIDE`.
* El campo `CreateCode` está especificado y no está en blanco y contiene el bytecode WebAssembly válido para un Hook válido.
* No existe ninguna instancia del mismo bytecode WebAssembly en el XRPL. (Si existe y todos los demás requisitos se cumplen, se interpreta como una Operación Instalar.)
* No existe ninguna instancia del mismo bytecode WebAssembly en Xahau. (Si existe y todos los demás requisitos se cumplen, se interpreta como una Operación Instalar.)
**Comportamiento**:
* Se crea un objeto `HookDefinition` con conteo de referencias en el XRPL.
* Se crea un objeto `HookDefinition` con conteo de referencias en Xahau.
* Se crea un array `Hooks` en la cuenta ejecutante, si no existe ya.
* Se crea un objeto `Hook` en la posición del Hook Correspondiente si no existe ya.
* El objeto `Hook` apunta a la `HookDefinition`.
@@ -156,7 +156,7 @@ Cada operación se especifica por la inclusión u omisión de ciertos campos del
* El Hook Correspondiente existe.
* `HookHash` está ausente.
* `CreateCode` está ausente.
* Uno o más de `HookNamespace`, `HookParameters` o `HookGrants` está presente.
* Uno o más de `HookNamespace`, `HookParameters`, `HookGrants`, `HookOn`, `HookOnIncoming`, `HookOnOutgoing`, `HookCanEmit` o `HookName` está presente.
**Ejemplo**:
@@ -235,17 +235,20 @@ Cada operación se especifica por la inclusión u omisión de ciertos campos del
### Campos del Hook
| Campo | Tipo JSON | Tipo Interno | Descripción |
| ---------------- | --------- | ------------ | ------------------------------------------------- |
| `HookHash` | String | Hash256 | El hash del hook. |
| `CreateCode` | String | Blob | El código WebAssembly del hook. |
| `HookGrants` | Array | Array | Las concesiones asociadas con el hook. |
| `HookNamespace` | String | Hash256 | El espacio de nombres del hook. |
| `HookParameters` | Array | Array | Los parámetros del hook. |
| `HookOn` | String | Hash256 | Las transacciones en las que se activa el hook. |
| `HookCanEmit` | String | Hash256 | Las transacciones que el hook puede emitir. |
| `HookApiVersion` | Number | UInt16 | La versión de API del hook. |
| `Flags` | Number | UInt32 | Indicadores adicionales para el hook. |
| Campo | Tipo JSON | Tipo Interno | Descripción |
| ------------------ | --------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `HookHash` | String | Hash256 | El hash del hook. |
| `CreateCode` | String | Blob | El código WebAssembly del hook. |
| `HookGrants` | Array | Array | Las concesiones asociadas con el hook. |
| `HookNamespace` | String | Hash256 | El espacio de nombres del hook. |
| `HookParameters` | Array | Array | Los parámetros del hook. |
| `HookOn` | String | Hash256 | Las transacciones en las que se activa el hook. Mutuamente exclusivo con `HookOnIncoming`/`HookOnOutgoing`. |
| `HookOnIncoming` | String | Hash256 | _(HookOnV2)_ Misma sintaxis que `HookOn`. Activa el hook en transacciones originadas desde otra cuenta. Mutuamente exclusivo con `HookOn`. |
| `HookOnOutgoing` | String | Hash256 | _(HookOnV2)_ Misma sintaxis que `HookOn`. Activa el hook en transacciones originadas desde la propia cuenta del Hook. Mutuamente exclusivo con `HookOn`. |
| `HookCanEmit` | String | Hash256 | Misma sintaxis que `HookOn`. Controla qué tipos de transacción puede emitir el hook. Si está ausente, el hook puede emitir cualquier tipo. |
| `HookName` | String | Blob | _(NamedHooks)_ Un nombre UTF-8 de 416 bytes para el hook. Cuando se establece, el hook solo se ejecutará si la transacción entrante incluye un campo `HookName` coincidente. |
| `HookApiVersion` | Number | UInt16 | La versión de API del hook. |
| `Flags` | Number | UInt32 | Indicadores adicionales para el hook. |
### Indicadores

View File

@@ -229,6 +229,14 @@ export const featuresTranslations = {
checks_para2:
'Pocas plataformas tienen un instrumento de pago diferido nativo. Sin contratos inteligentes personalizados. Solo una primitiva limpia y simple.',
// Price Oracles solo
oracle_label: 'Feeds de Datos',
oracle_h4: 'Price Oracles: Feeds de Precio Nativos en el Ledger',
oracle_para1:
'Xahau dispone de un sistema de Price Oracle integrado que lleva los precios de activos del mundo real directamente al ledger. Los proveedores de datos autorizados pueden publicar y actualizar precios para cualquier par de activos, y múltiples entradas de oracle pueden agregarse on-chain para derivar un precio de referencia único y fiable — sin depender de contratos inteligentes externos ni middleware fuera de la cadena.',
oracle_para2:
'Aplicaciones como protocolos DeFi, creadores de mercado automatizados o herramientas de cumplimiento pueden consultar el precio agregado on-ledger a través de una interfaz estandarizada. Dado que los datos del oracle se validan y almacenan como objetos de primera clase del ledger, heredan las mismas garantías de finalidad, auditabilidad y seguridad que cualquier otra transacción en Xahau.',
// Act III — Governance & Identity
act3_label: 'Gobernanza e Identidad',