mirror of
https://github.com/Xahau/xahau-web.git
synced 2026-07-31 02:50:10 +00:00
spanish translation 2026.06.21
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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 (%) |
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
| - | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
|
||||
@@ -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.
|
||||
105
src/content/docs/es/docs/hooks/concepts/named-hooks.mdx
Normal file
105
src/content/docs/es/docs/hooks/concepts/named-hooks.mdx
Normal 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.
|
||||
@@ -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:
|
||||
|
||||
@@ -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<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<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<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>
|
||||
|
||||
@@ -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<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<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>
|
||||
@@ -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. |
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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. |
|
||||
|
||||
@@ -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. |
|
||||
@@ -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. |
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
|
||||
Reference in New Issue
Block a user