From df35da1f4ebb9985970568d6fffd812fe65a09bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ekiserrep=C3=A9?= <126416117+Ekiserrepe@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:31:25 +0200 Subject: [PATCH] spanish translation 2026.06.21 --- .../docs/es/docs/features/amendments.mdx | 24 ++++ .../get-aggregate-price.mdx | 103 +++++++++++++++ .../public-api-methods.mdx | 8 ++ .../network-features/balance-rewards.mdx | 22 +++ .../hooks/concepts/emitted-transactions.mdx | 6 +- .../es/docs/hooks/concepts/hookon-field.mdx | 26 +++- .../es/docs/hooks/concepts/named-hooks.mdx | 105 +++++++++++++++ .../hooks/concepts/serialized-objects.mdx | 29 ++++ .../functions/emitted-transaction/emit.mdx | 71 +++++++--- .../functions/emitted-transaction/prepare.mdx | 125 ++++++++++++++++++ .../ledger-objects-types/hook-definition.mdx | 13 +- .../ledger-objects-types/oracle.mdx | 90 +++++++++++++ .../ledger-objects-types/ripple-state.mdx | 25 ++++ .../transaction-types/claimreward.mdx | 72 +++++++--- .../transaction-types/oracledelete.mdx | 39 ++++++ .../transaction-types/oracleset.mdx | 107 +++++++++++++++ .../transaction-types/sethook.mdx | 31 +++-- src/i18n/featuresTranslations.ts | 8 ++ 18 files changed, 845 insertions(+), 59 deletions(-) create mode 100644 src/content/docs/es/docs/features/http-websocket-apis/get-aggregate-price.mdx create mode 100644 src/content/docs/es/docs/hooks/concepts/named-hooks.mdx create mode 100644 src/content/docs/es/docs/hooks/functions/emitted-transaction/prepare.mdx create mode 100644 src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/oracle.mdx create mode 100644 src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracledelete.mdx create mode 100644 src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracleset.mdx diff --git a/src/content/docs/es/docs/features/amendments.mdx b/src/content/docs/es/docs/features/amendments.mdx index 54c14ff..d1f2804 100644 --- a/src/content/docs/es/docs/features/amendments.mdx +++ b/src/content/docs/es/docs/features/amendments.mdx @@ -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` (4–16 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 (1–5 pares consumen 1 reserva de propietario; 6–10 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. diff --git a/src/content/docs/es/docs/features/http-websocket-apis/get-aggregate-price.mdx b/src/content/docs/es/docs/features/http-websocket-apis/get-aggregate-price.mdx new file mode 100644 index 0000000..e6bbdaa --- /dev/null +++ b/src/content/docs/es/docs/features/http-websocket-apis/get-aggregate-price.mdx @@ -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 (1–25) 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 1–25. | +| `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` | 1–50 (%) | diff --git a/src/content/docs/es/docs/features/http-websocket-apis/public-api-methods.mdx b/src/content/docs/es/docs/features/http-websocket-apis/public-api-methods.mdx index 9edea88..ab80f7f 100644 --- a/src/content/docs/es/docs/features/http-websocket-apis/public-api-methods.mdx +++ b/src/content/docs/es/docs/features/http-websocket-apis/public-api-methods.mdx @@ -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 | diff --git a/src/content/docs/es/docs/features/network-features/balance-rewards.mdx b/src/content/docs/es/docs/features/network-features/balance-rewards.mdx index c67634d..f14698a 100644 --- a/src/content/docs/es/docs/features/network-features/balance-rewards.mdx +++ b/src/content/docs/es/docs/features/network-features/balance-rewards.mdx @@ -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. + +### 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 | diff --git a/src/content/docs/es/docs/hooks/concepts/emitted-transactions.mdx b/src/content/docs/es/docs/hooks/concepts/emitted-transactions.mdx index 2b18611..3f78b86 100644 --- a/src/content/docs/es/docs/hooks/concepts/emitted-transactions.mdx +++ b/src/content/docs/es/docs/hooks/concepts/emitted-transactions.mdx @@ -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 | | - | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/src/content/docs/es/docs/hooks/concepts/hookon-field.mdx b/src/content/docs/es/docs/hooks/concepts/hookon-field.mdx index 156a44c..040851f 100644 --- a/src/content/docs/es/docs/hooks/concepts/hookon-field.mdx +++ b/src/content/docs/es/docs/hooks/concepts/hookon-field.mdx @@ -41,4 +41,28 @@ Ejemplos (asumiendo un entero sin signo de 256 bits): ### Calculadora HookOn - \ No newline at end of file + + +### 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. \ No newline at end of file diff --git a/src/content/docs/es/docs/hooks/concepts/named-hooks.mdx b/src/content/docs/es/docs/hooks/concepts/named-hooks.mdx new file mode 100644 index 0000000..12b2512 --- /dev/null +++ b/src/content/docs/es/docs/hooks/concepts/named-hooks.mdx @@ -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. diff --git a/src/content/docs/es/docs/hooks/concepts/serialized-objects.mdx b/src/content/docs/es/docs/hooks/concepts/serialized-objects.mdx index 78d80df..8922df2 100644 --- a/src/content/docs/es/docs/hooks/concepts/serialized-objects.mdx +++ b/src/content/docs/es/docs/hooks/concepts/serialized-objects.mdx @@ -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 + + + +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: diff --git a/src/content/docs/es/docs/hooks/functions/emitted-transaction/emit.mdx b/src/content/docs/es/docs/hooks/functions/emitted-transaction/emit.mdx index d237a4e..36e69e1 100644 --- a/src/content/docs/es/docs/hooks/functions/emitted-transaction/emit.mdx +++ b/src/content/docs/es/docs/hooks/functions/emitted-transaction/emit.mdx @@ -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 -Transacciones +Transacciones Emitidas +prepare() ### Comportamiento + +* 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. + + -* 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. ### Definición + +```c +int64_t emit ( + uint32_t write_ptr, + uint32_t write_len, + uint32_t read_ptr, + uint32_t read_len +); +``` + + ```javascript -function prepare( +function emit( txJson: Record | Transaction - ): ErrorCode | Record | Transaction -```` - + ): ErrorCode | ByteArray +``` ### Ejemplo + +```c +uint8_t emithash[32]; +if (emit(SBUF(emithash), SBUF(tx)) < 0) + rollback(SBUF("hook: emit failed"), __LINE__); +``` + + ```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) ``` @@ -47,15 +74,23 @@ const prepared_txn = prepare({ ### Parámetros + +
NombreTipoDescripción
write_ptruint32_tPuntero a un buffer donde escribir el hash de la transacción
write_lenuint32_tEl tamaño del buffer para escribir el hash de la transacción (debe ser 32)
read_ptruint32_tPuntero a la transacción a emitir
read_lenuint32_tLa longitud de la transacción
+
+ -
NombreTipoDescripción
txJsonRecord<string, any> | TransactionEl JSON de la transacción, debe estar completo excepto el campo Account (siempre la cuenta del Hook).
+
NombreTipoDescripción
txJsonRecord<string, any> | TransactionEl JSON de la transacción a emitir.
### Código de retorno - -
TipoDescripción
ErrorCode | Record<string, any> | TransactionDevuelve un ErrorCode si hay un error, o el JSON de la transacción preparada o el objeto Transaction.
+ +
TipoDescripción
int64_tEn caso de éxito, el número de bytes del hash de transacción escritos (32), o:

Si es negativo, un error:
OUT_OF_BOUNDS
- punteros/longitudes especificados fuera de la memoria del hook.

PREREQUISITE_NOT_MET
- se debe llamar primero a etxn_reserve

TOO_MANY_EMITTED_TXN
- el número de transacciones emitidas es ahora mayor que la promesa hecha cuando se llamó a etxn_reserve

EMISSION_FAILURE
- la transacción estaba malformada según las reglas de emisión.
-
\ No newline at end of file + + +
TipoDescripción
ErrorCode | ByteArrayDevuelve un ErrorCode si hay un error, o un array de hashes de la transacción emitida en caso de éxito.
+
+ diff --git a/src/content/docs/es/docs/hooks/functions/emitted-transaction/prepare.mdx b/src/content/docs/es/docs/hooks/functions/emitted-transaction/prepare.mdx new file mode 100644 index 0000000..39541a3 --- /dev/null +++ b/src/content/docs/es/docs/hooks/functions/emitted-transaction/prepare.mdx @@ -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 + +Transacciones Emitidas + +### Comportamiento + + + + +_(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()`. + + + +* 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. + + + +### Definición + + + +```c +int64_t prepare ( + uint32_t write_ptr, + uint32_t write_len, + uint32_t read_ptr, + uint32_t read_len +); +``` + + + +```javascript +function prepare( + txJson: Record | Transaction + ): ErrorCode | Record | Transaction +``` + + + +### Ejemplo + + + +```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); +``` + + + +```javascript +const prepared_txn = prepare({ + TransactionType: "Payment", + Destination: util_raddr(p1address_ns), + Amount: parseFloat(drops_sent)*2 + }) +``` + + + +### Parámetros + + + + +| 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. | + + + + + +
NombreTipoDescripción
txJsonRecord<string, any> | TransactionEl JSON de la transacción; debe ser una transacción completa excepto por Account (siempre la cuenta Hook).
+
+
+ +### Código de retorno + + + + +| 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()`.

Si es negativo, un error:
`OUT_OF_BOUNDS` — los punteros/longitudes quedan fuera de la memoria del hook.
`PREREQUISITE_NOT_MET` — se debe llamar a `etxn_reserve()` antes de `prepare()`.
`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).
`INTERNAL_ERROR` — fallo al generar `EmitDetails` o al re-serializar la transacción. | + +
+ + + +
TipoDescripción
ErrorCode | Record<string, any> | TransactionDevuelve un ErrorCode si hay un error, o el JSON de la transacción preparada o el objeto Transaction.
+
+
diff --git a/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/hook-definition.mdx b/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/hook-definition.mdx index d451c1f..d949b87 100644 --- a/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/hook-definition.mdx +++ b/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/hook-definition.mdx @@ -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 | Sí | 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 | Sí | 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. | diff --git a/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/oracle.mdx b/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/oracle.mdx new file mode 100644 index 0000000..b38bea6 --- /dev/null +++ b/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/oracle.mdx @@ -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` (1–10 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 (0–10) 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 | +| ----- | ----------------------------------- | +| 1–5 | 1 | +| 6–10 | 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 diff --git a/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state.mdx b/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state.mdx index f34f20c..a6ea744 100644 --- a/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state.mdx +++ b/src/content/docs/es/docs/protocol-reference/ledger-data/ledger-objects-types/ripple-state.mdx @@ -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 diff --git a/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/claimreward.mdx b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/claimreward.mdx index ee312b6..c87251c 100644 --- a/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/claimreward.mdx +++ b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/claimreward.mdx @@ -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. | diff --git a/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracledelete.mdx b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracledelete.mdx new file mode 100644 index 0000000..b3cd877 --- /dev/null +++ b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracledelete.mdx @@ -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. | diff --git a/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracleset.mdx b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracleset.mdx new file mode 100644 index 0000000..f00d0a8 --- /dev/null +++ b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/oracleset.mdx @@ -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: 0–10. 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 | +| ----- | ----------------------------------- | +| 1–5 | 1 | +| 6–10 | 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. | diff --git a/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/sethook.mdx b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/sethook.mdx index cfe6868..ec04328 100644 --- a/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/sethook.mdx +++ b/src/content/docs/es/docs/protocol-reference/transactions/transaction-types/sethook.mdx @@ -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 4–16 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 diff --git a/src/i18n/featuresTranslations.ts b/src/i18n/featuresTranslations.ts index 7660a9e..a447be0 100644 --- a/src/i18n/featuresTranslations.ts +++ b/src/i18n/featuresTranslations.ts @@ -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',