diff --git a/.gitignore b/.gitignore index 2e76687a3a..c285d68523 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,7 @@ yarn-error.log *.iml .venv/ +_code-samples/*/js/package-lock.json + # PHP composer.lock diff --git a/@i18n/es-ES/CODE_OF_CONDUCT.md b/@i18n/es-ES/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..c8da32b3cf --- /dev/null +++ b/@i18n/es-ES/CODE_OF_CONDUCT.md @@ -0,0 +1,48 @@ +# Código de conducta del pacto de contribuidores + +## Nuestro compromiso + +Con el fin de fomentar un ambiente abierto y acogedor, nosotros, como contribuidores y mantenedores, nos comprometemos a hacer de la participación en nuestro proyecto y nuestra comunidad una experiencia libre de acoso para todos, independientemente de, entre otras, características como la edad, tamaño corporal, discapacidad, origen étnico, características sexuales, identidad y expresión de género, nivel de experiencia, educación, estatus socioeconómico, nacionalidad, apariencia personal, raza, religión o identidad y orientación sexual. + +## Nuestros estándares + +Ejemplos de comportamiento que contribuyen a crear un ambiente positivo incluyen: + +* Utilizar lenguaje acogedor e inclusivo +* Ser respetuoso con los diferentes puntos de vista y experiencias +* Saber aceptar las críticas constructivas +* Centrarse en lo que es lo mejor para la comunidad +* Mostrar empatía hacia otros miembros de la comunidad + +Ejemplos de comportamiento que no contribuyen a crear un ambiente positivo incluyen: + +* Utilizar un lenguaje o imágenes sexualizadas y atención o insinuaciones sexuales no deseadas +* Trolear, comentario insultantes/peyorativos y ataques personales o políticos +* Acoso público o en privado +* Publicar información privada de otras personas, así cómo direcciones físicas o electrónicas, sin permiso explícito +* Cualquier otra conducta que pueda ser razonablemente considerada inapropiada en un sentido profesional + +## Nuestras responsabilidades + +Los mantenedores del proyecto son responsables de aclarar los estándares de comportamiento aceptable y se espera que tomen acciones correctivas justas y apropiadas en respuesta a cualquier caso de comportamiento inaceptable. + +Los mantenedores del proyecto tienen el derecho y la responsaiblidad de eliminar, editar o rechazar comentarios, commits, código, ediciones de wiki, problemas y otras contribuciones que no estén alineadas con este Código de Conducta, o de expulsar temporal o definitivamente a cualquier colaborador por otros comportamientos que consideren inapropiados, amenazantes, ofensivos, dañinos o que viole de cualquier modo este Código de Conducta. + +## Alcance + +Este Código de Conducta aplica en todos los espacios del proyecto y también aplica cuando un individuo está representando el proyecto o su comunidad en espacios públicos. Ejemplos de representación de un proyecto o la comunidad incluye usar un correo electrónico oficial del proyecto, publicaciones a través de una cuenta oficial de redes sociales o actuar como representante asignado en un evento en línea o en la vida real. La representación de un proyecto debe ser definida y aclarada con más detalle por los mantenedores del proyecto. + +## Aplicación + +Los casos de comportamiento abusivo, acoso, o de cualquier otro modo inaceptable se pueden informar contactando con el equipo del proyecto al correo . Todas las quejas serán revisadas e investigadas y resultarán en una resupuesta que se considere adecuada y necesaria a las circunstancias. El equipo del proyecto está obligado a mantener la confidencialidad con respecto al informador del incidente. Podría darse el caso de publicar más detalles sobre políticas de comportamiento específicas. + +Los mantenedores de proyecto que no sigan o hagan cumplir el Código de conducta de buena fe podrían enfrentarse a repercusiones temporales o definitivas según lo determinen otros miembros que lideren el proyecto. + +## Atribución + +Este Código de Conducta está adaptado de el [Pacto del Contribuidores][inicio], versión 1.4, disponible en https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[inicio]: https://www.contributor-covenant.org + +Para respuestas a preguntas comunes sobre este código de conducta, visita +https://www.contributor-covenant.org/faq diff --git a/@i18n/es-ES/CONTRIBUTING.md b/@i18n/es-ES/CONTRIBUTING.md new file mode 100644 index 0000000000..4774d8e46e --- /dev/null +++ b/@i18n/es-ES/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contribuir + +Para obtener información sobre cómo contribuir a este repositorio, consulta [Contribute Documentation (XRPL.org)](https://xrpl.org/es_ES/contribute-documentation.html). \ No newline at end of file diff --git a/@i18n/es-ES/about/faq.md b/@i18n/es-ES/about/faq.md new file mode 100644 index 0000000000..e428959875 --- /dev/null +++ b/@i18n/es-ES/about/faq.md @@ -0,0 +1,151 @@ +--- +seo: + description: Respuestas a preguntas frecuentes sobre el XRP Ledger, el ecosistema XRPL y la comunidad. +subtitle: Respuestas a tus preguntas XRPL +labels: + - Blockchain +--- +###### FAQ +# Respuestas a Tus Preguntas XRPL + + + +#### ¿Es XRPL una blockchain privada, propiedad de Ripple? + +No, el XRP Ledger es una blockchain pública y descentralizada. Cualquier cambio que impactase al proceso de las transacciones o al consenso necesita ser aprobado por al menos el 80%% de la red. Ripple es un contribuidor de la red, pero sus derechos son los mismos que los de otros contruibuidores. En términos de validación, hay más de 150 validadores en la red con más de 35 en la Lista de Nodos Únicos (ver [“¿Qué son las Listas de Nodos Únicos (UNLs en inglés)?” abajo](#what-are-unique-node-lists-unls)) — Ripple mantiene [solo 1](https://foundation.xrpl.org/2023/03/23/unl-update-march-2023/) de esos nodos. + +#### ¿No es la Prueba de Trabajo (Proof of Work) el mejor mecanísmo de validación? + +La Prueba de Trabajo (PoW en inglés) fue el primer mecanismo para resolver el problema del doble gasto sin requerir a un tercero de confianza. [El mecanismo de consenso del XRP Ledger](../docs/concepts/consensus-protocol/index.md) resuelve el mismo problema de una manera mucho más rápida, barata y energéticamente más eficiente. + +#### ¿Cómo puede ser una blockchain sostenible? + +Se sabe abiertamente que el consumo de energia de Bitcoin, a partir de 2021, es equivalente al utilizado por Argentina, mucha de la electricidad que usan los mineros de Bitcoin procede de fuentes contaminantes. El XRP Ledger confirma transacciones a través del mecanismo de “[consenso](../docs/concepts/consensus-protocol/index.md)” - el cual no desperdicia energía como lo hace la prueba de trabajo - y aprovecha las compensaciones de carbono para ser [una de la primeras blokchains verdaderamente neutral en carbono](https://ripple.com/ripple-press/ripple-leads-sustainability-agenda-to-achieve-carbon-neutrality-by-2030/). + +#### ¿Pueden otras divisas que no sean XRP ser intercambiadas a través del XRPL? + +Sí, el XRP Ledger fue creado específicamente para poder tokenizar activos arbitrarios, como el USD, EUR, petróleo, oro, puntos de fidelización, y más. Cualquier divisa puede ser emitida en el XRP Ledger. Esto se ilustra en la creciente comunidad que respalda una variedad de tokens cripto y fiat. + +#### ¿No es XRPL solo para pagos? + +Aunque XRPL inicialmente se desarrolló para casos de uso de pagos, tanto el libro mayor como el activo nativo digital XRP se han ido popularizando para un rango de casos de uso innovadores como los NFTs. Nuevas propuestas de estándares para un creador de mercados automatizado (en inglés, AMM), la enmienda de los "hooks" para la funcionalidad de contratos inteligentes, y puentes entre cadenas están siendo desarrollados. + +## Validadores y Listas de Nodos Únicos + +#### ¿Qué servicio brindan los validadores de transacciones? + +Todos los nodos garantizan que las transacciones cumplen los requisitos del protocolo y, por lo tanto, son "válidas". El servicio que proveen los validadores de manera única es agrupar administrativamente las transacciones en unidades ordenadas, acordando uno de esos órdenes específicamente para prevenir el doble gasto. + +Ver [Consenso](../docs/concepts/consensus-protocol/index.md) para más información sobre el proceso de consenso. + + +#### ¿Cuánto cuesta mantener un validador? + +Mantener un validador no requiere de comisiones o XRP. Es comparable al gasto de ejecutar un servidor de correo electrónico en términos de uso de electricidad. + + +#### ¿Qué son Las Listas de Nodos Únicos (UNLs)? + +Las UNLs son las listas de validadores que un participante determinado cree que no conspirarán para defraudarle. Cada operador de servidor puede elegir su propia UNL, generalmente basándose en un cojunto determinado proporcionado por un publicador de confianza. (La lista predeterminada de un publicador a veces es llamada UNL predeterminada, o _dUNL_.) + + +#### ¿Qué UNL debería escoger? + +Dado que cualquiera puede montar un validador, la carga de elegir un conjunto confiable de validadores recae sobre los participantes. Actualmente, la XRP Ledger Foundation y Ripple publican listas predeterminadas recomendadas de valiadores de alta calidad, basadas en desesmpeño pasado, identidades comprobadas, y políticas de IT responsables. Sin embargo, cada participante de la red puede elegir qué validadores considera confiables y no necesita seguir a uno de los publicadores mencionados anteriormente. + + +#### Si Ripple recomienda la adopción de su UNL, ¿Esto no crea un sistema centralizado? + +No. Cada participante elige directa o indirectamente su UNL. Si Ripple dejase de operar o actuase de manera maliciosa, los participantes pueden cambiar sus UNLs para usar una lista de un publicador diferente. + + +#### ¿Cuál es la estructura de incentivos para los validadores? + +El principal incentivo para ejecutar un validador es preservar y proteger el funcionamiento estable y la evolución sensata de la red. Son los validadores quienes deciden la evolución del XRP Ledger, por lo que cualquier negocio que utilice o dependa del XRP Ledger tiene un incentivo inherente para garantizar la confiabilidad y estabilidad de la red. Los validadores también se ganan el respeto y la buena voluntad de la comunidad al contribuir de esta manera. + +Si ejecutas un servidor XRP Ledger para participar en la red, el costo y el esfuerzo adicionales para ejecutar un validador son mínimos. Esto significa que no son necesarios incentivos adicionales, como las recompensas mineras en Bitcoin. Ripple evita pagar XRP como recompensa por operar un validador para que dichos incentivos no deformen el comportamiento de los validadores. + +Para ver ejemplos de cómo los incentivos pueden distorsionar el comportamiento de validación, lee sobre [valor extraíble del minero (MEV en inglés)](https://arxiv.org/abs/1904.05234). + + +#### ¿Pueden las instituciones financieras establecer validadores de transacciones para ayudarlas a cumplir estándares y requisitos institucionales específicos? + +No, las instituciones no pueden configurar políticas de validación personalizadas para elegir permitir algunas transacciones y rechazar otras. Los validadores siguen el protocolo o no. Si el software no sigue las reglas del protocolo, no funciona. Por lo tanto, no se recomienda que las instituciones busquen implementaciones personalizadas sin experiencia interna. + + +#### ¿Qué pasa si más del 20% de los nodos de la red no están de acuerdo con la mayoría? ¿Cómo se elige la versión final del ledger? + +Normalmente, si hay una disputa sobre la validez de una transacción, esa transacción se pospone hasta que la mayoría pueda llegar a un acuerdo. Pero si más del 20% de la red no siguiera las mismas reglas de protocolo que la mayoría, la red se detendría temporalmente. Podría reanudarse cuando los participantes reconfiguren sus UNL en función de aquellos que quieran llegar a un consenso entre ellos. Se desea este retraso temporal en el procesamiento en lugar de duplicar el gasto. + +En el proceso de determinar la versión autoritativa de un ledger, puede haber varias versiones internas temporales. Estas versiones internas ocurren naturalmente en sistemas distribuidos porque no todos los nodos reciben transacciones en el mismo orden. El comportamiento análogo en Bitcoin es cuando dos servidores ven cada uno una cadena más larga diferente porque dos bloques fueron extraídos aproximadamente al mismo tiempo. + +Sin embargo, sólo puede haber una última versión del ledger _validated_ en un momento dado; otras versiones son irrelevantes e inofensivas. + +Para obtener más información sobre cómo se comporta el mecanismo de consenso del XRP Ledger en situaciones adversas, consulta [Protecciones de consenso contra ataques y modos de fallo](../docs/concepts/consensus-protocol/consensus-protections.md). + + +#### ¿El XRP Ledger tiene un proceso formal para añadir validadores? + +No, un proceso formal para agregar validadores no es compatible con XRP Ledger, porque es un sistema sin autoridad central. + +Los publicadores de UNL predeterminados individuales establecen sus propias políticas sobre cuándo agregar o eliminar validadores de sus listas de recomendaciones. + +Para recomendaciones y mejores prácticas, consulta [Ejecutar `rippled` como validador](../docs/infrastructure/configuration/server-modes/run-rippled-as-a-validator.md). + + +#### Si la dUNL tiene lmayor influencia en la red, ¿quiere decir que XRPL es centralizado? +Los validadores pueden optar por no utilizar la dUNL o cualquier UNL ampliamente utilizada. Cualquiera puede crear una nueva UNL en cualquier momento. + +Puede haber varias UNL en uso en la misma red. Cada operador puede personalizar la UNL de su propio servidor o elegir seguir una lista recomendada diferente. Todos estos servidores todavía pueden ejecutar la misma cadena y llegar a un consenso entre sí. + +Sin embargo, si tu UNL no coincide lo suficiente con las UNL utilizadas por otros, existe el riesgo de que su servidor se separe (fork) del resto de la red. Siempre que tu UNL tenga > 90 % de superposición con la utilizada por las personas con las que transaccionas, estás completamente a salvo de bifurcarte. Si tiene menos superposición, es posible que aún puedas seguir la misma cadena, pero las posibilidades de bifurcarte aumentan con una menor superposición, peor conectividad de red y la presencia de validadores maliciosos o poco confiables en tu UNL. + + +## Papel de XRP + + +#### ¿Cuál es el proposito de XRP? + +XRP se creó como el activo nativo de XRP Ledger para potenciar una nueva generación de pagos digitales: más rápidos, más ecológicos y más baratos que cualquier activo digital anterior. También sirve para proteger el ledger del spam y para [conectar divisas](../docs/concepts/tokens/decentralized-exchange/autobridging.md) en el exchange descentralizado del XRP Ledger, cuando hacerlo es beneficioso para los usuarios. Con el tiempo, la comunidad XRP Ledger ha sido pionera en nuevos [casos de uso](/about/uses) para XRP, al igual que el propio XRP Ledger. + + +#### ¿Cómo responde el XRP Ledger al flood de transaciones? + +El XRP Ledger está diseñado para establecer el [coste de transacción](../docs/concepts/transactions/transaction-cost.md) dinámicamente en función de la demanda como una medida antispam. El impacto de cualquier posible manipulación de XRP es minimizado a medida que la red crece, crece la capitalización y crece el volumen de transacciones. + + +#### ¿Qué ocurre con el lavado de dinero y la actividad económica sospechosa? + + + +La red XRP Ledger es una red abierta y todas las transacciones son públicamente visibles. + +Ripple se compromete a monitorear e informar cualquier indicador AML en la red XRP Ledger, así como a informar actividades sospechosas a FinCEN, según corresponda. + +[XRP Forensics / xrplorer](https://xrplorer.com/) mantiene una lista de asesoramiento para rastrear y minimizar el lavado de dinero, las estafas, el fraude y el uso ilícito del XRP Ledger. Los exchanges y otros proveedores de servicios pueden utilizar este servicio para prevenir y reaccionar ante delitos financieros. + + +## Consideraciones de seguridad + + +#### ¿Cuál es el proceso para revisar las contribuciones de código de terceros? + +El proceso de contribución de código comienza cuando un desarrollador abre una [pull request](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) a un repositorio de código fuente como el [repositorio `rippled`](https://github.com/xrplf/rippled/), que contiene la implementación de referencia de Ripple del núcleo del servidor y del protocolo de XRP Ledger. + +Este pull request activa pruebas unitarias y de integración automatizadas, así como revisiones de código por parte de varios desarrolladores que, por lo general, tienen experiencia significativa en el área de código a la que afecta al pull request. + +Una vez que el pull request pasa las pruebas automatizadas y recibe la aprobación de los revisores, un [mantenedor del repositorio](https://opensource.guide/best-practices/) confiable puede prepararlo para su inclusión en la próxima versión beta. + + +#### ¿Ripple posee o controla el XRP Ledger o la red XRP Ledger? + +No, Ripple no posee ni controla el XRP Ledger o la red XRP Ledger. + +Ripple contribuye a una implementación de referencia del nucleo del servidor de XRP Ledger ([`rippled`](https://github.com/xrplf/rippled)) y emplea un equipo de ingenieros que contribuyen al código base de código abierto. Ripple publica periodicamente paquetes binarios precompilados. Cualquiera puede [descargar y compilar el software desde la fuente](../docs/infrastructure/installation/index.md). + +Varias entidades publican listas de validadores recomndadados (UNLs). Desde julio de 2023, Ripple mantiene solo uno de los 35 validadores que están en la UNL por defecto. + + +#### ¿El XRP Ledger distingue entre el código base para la validación y el del software del usuario? + +Sí. Hay varias [librerías de cliente para XRP Ledger](../docs/references/client-libraries.md) que están destinadas a desarrolladores de software de usuario. Estas librerias tienen distintos códigos base y repositorios del [núcleo del servidor XRP Ledger](../docs/concepts/networks-and-servers/index.md) que alimenta la red y valida las transacciones. diff --git a/@i18n/es-ES/about/privacy-policy.md b/@i18n/es-ES/about/privacy-policy.md new file mode 100644 index 0000000000..7033063c32 --- /dev/null +++ b/@i18n/es-ES/about/privacy-policy.md @@ -0,0 +1,126 @@ +--- +seo: + title: Política de privacidad + description: Esta política describe cómo MTU XRP Ledger Trust respeta tu privacidad y detalla la recopilación, uso, y divulgación de los datos involucrados en el uso de este servicio. +--- +# Política de privacidad de XRPL.org + +Última actualización: 20 de enero, 2023 + +MTU XRP Ledger Trust (“MTU XRP Ledger Trust”, "Nosotros"", "Nuestro") respeta la necesidad de privacidad de los usuarios, y esta Política de Privacidad describe la recopilación, uso y divulgación de tu información cuando usas este servicio. + +## Definiciones + +Para los fines de esta Política de Privacidad: + +* _Compañía_ - (referida como "MTU XRP Ledger Trust", "Nosotros", "Nuestro" en esta política) se refiere a XRPL.org +* _Cookies_ - son pequeños ficheros que se colocan en tu ordenador, dispositivo móvil o cualquier otro dispositivo por un sitio web, conteniendo detalles de tu historial de navegación en ese sitio web entre sus muchos usos. +* _Dispositivo_ - significa cualquier dispositivo que puede acceder al servicio, como un ordenador, un teléfono móvil o una tablet digital. +* _Datos personales_ - es cualquier información que se relacione con un usuario identificado o identificable. +* _Servicio_ - se refiere a este sitio web XRPL.org. +* _Proveedor de servicios_ - significa cualquier persona normal o jurídica que procesa los datos en nombre de MTU XRP Ledger Trust. Se refiere a tercaras compañías o individuos contratados por MTU XRP Ledger Trust para facilitar el Servicio, para proveer el Servicio en nombre de MTU XRP Ledger Trust, para realizar servicios relacionados con el Servicio o para asistir a MTU XRP Ledger Trust analizando como el Servicio es utilizado. +* _Datos de Uso_ - se refiere a datos recopilados automáticamente, generados por el uso del Servicio o la infraestructura del Servicio en sí (por ejemplo, la duración de una página visitada). +* _Tú_ - significa el individuo que accede o usa el Servicio, o MTU XRP Ledger Trust, u otra entidad legal en nombre de la cual dicho individuo accede al Servicio, según corresponda. + +## Recopilación y uso de tus datos + +### Tipos de datos recopilados + +**Datos de Uso** se recopilan automáticamente al utilizar este Servicio. Los Datos de Uso pueden incluir información como la dirección de Protocolo de Internet de Tu Dispositivo (por ejemplo, dirección IP), tipo de navegador, versión del navegador, las páginas de nuestro Servicio que Tu visitas, la hora y fecha de Tu visita, el tiempo que pasa en esas páginas, identificadores de dispositivos únicos y otros datos de diagnóstico. + +Cuando accedes al Servicio a través de un dispositivo móvil, Nosotros podemos recopilar cierta información automáticamente, incluido, entre otros, el tipo de dispositivo móvil que Tu utilizas, TU ID único de dispositivo móvil, la dirección IP de Tu dispositivo móvil, Tu sistema operativo móvil, el tipo de navegador de Internet móvil que Tu utilizas, identificadores de dispositivos únicos y otros datos de diagnóstico. + +Nosotros también podemos recopilar información que Tu navegador envía cada vez que visita Nuestro Servicio o cuando accedes al Servicio a través de un dispositivo móvil. + +## Tecnologías de seguimiento y cookies + +Nosotros utilizamos Cookies y tecnologías de seguimiento similares para rastrear la actividad en Nuestro Servicio y almacenar cierta información. Las tecnologías de seguimiento utilizadas son beacons, tags y scripts para recopilar y rastrear información y para mejorar y analizar Nuestro Servicio. Las tecnologías que utilizamos pueden incluir: + +* _Cookies o Cookies del Navegador_ - Una cookie es un pequeño archivo colocado en Tu Dispositivo. Puede instruir a Tu navegador para que rechace todas las Cookies o para que te indique cuándo se envía una Cookie. Sin embargo, si Tu no aceptas Cookies, es posible que no puedas utilizar algunas partes de nuestro Servicio. A menos que hayas ajustado Tu configuración del navegador para que rechace Cookies, nuestro Servicio puede utilizar Cookies. +* _Cookies Flash_ - Ciertas funciones de nuestro Servicio pueden utilizar objetos almacenados localmente (o Cookies Flash) para recopilar y almacenar información sobre Tus preferencias o Tu actividad en nuestro Servicio. Las Cookies Flash no son administradas por la misma configuración del navegador que se utiliza para las Cookies del Navegador. +* _Web Beacons_ - Ciertas secciones de nuestro Servicio pueden contener pequeños archivos electrónicos conocidos como web beacons (también denominadas clear gifs, pixel tags y gifs de píxeles únicos) que permiten a la Compañía, por ejemplo, contar usuarios que han visitado esas páginas o abierto un correo electrónico y para otras estadísticas relacionadas con el sitio web (por ejemplo, registrar la popularidad de una cierta sección y verificar la integridad del sistema y del servidor). + +Las Cookies pueden ser "Persistentes" o de "Sesión". Las Cookies Persistentes permanecen en Tu computadora personal o dispositivo móvil cuando te desconectas, mientras que las Cookies de Sesión se eliminan tan pronto como cierras Tu navegador web. + +## Use of Your Usage Data + +La Compañía puede utilizar Datos de Uso para los siguientes propósitos: + +**Proporcionar o mantener nuestro Servicio**, incluyendo el monitoreo del uso de nuestro Servicio. +**Para gestionar Tus peticiones:** Para atender y gestionar Tus solicitudes por Nosotros. + +**Para otros propositos:** Podemos utilizar Tus Datos de Uso para otros propósitos, tales como el análisis de datos, identificar tendencias de uso, determinar la eficacia de nuestras campañas publicitarias y para evaluar y mejorar nuestro Servicio y Tu experiencia. + +Puede que compartamos Tus Datos de Uso en las siguientes situaciones: + +**Con Proveedores de servicios:** Podemos compartir Tus Datos de Uso con Proveedores de servicios para monitorear y analizar el uso de Nuestro Servicio. + +**Con socios comerciales:** Podemos compartir Tus Datos de Uso con Nuestros socios comerciales que proporcionan contenido en este sitio web. + +**Con Tu consentimiento:** Podemos divulgar Tus Datos de Uso para cualquier otro propósito con Tu consentimiento. + +## Retención de Tus Datos de Uso + +La Compañía retendrá Tus Datos de Uso solo durante el tiempo que sea necesario para los fines establecidos en esta Política de Privacidad. Conservaremos y utilizaremos Tus Datos de Uso en la medida necesaria para cumplir con nuestras obligaciones legales (por ejemplo, si estamos obligados a conservar tus datos para cumplir con las leyes aplicables, fortalecer la seguridad o mejorar la funcionalidad de Nuestro Servicio, resolver disputas y hacer cumplir nuestros acuerdos y políticas legales. + +## Transferencia de Tus Datos de Uso + +Tus Datos de Uso son procesados en las oficinas operativas de la Compañía y en cualquier otro lugar donde se encuentren las partes involucradas del procesamiento. Esto significa que esta información puede ser transferida a — y mantenida en — computadoras ubicadas fuera de Tu estado, provincia, país u otra jurisdicción gubernamental donde las leyes de protección de datos pueden diferir de las de Tu jurisdicción. + +Tu consentimiento a esta Política de Privacidad seguido de Tu envío de dicha información representa Tu acuerdo con esa transferencia. + +## Divulgación de Tus Datos de Uso + +## Aplicación de la ley + +Bajo ciertas circunstancias, La Compañía puede estar obligada a divulgar Tus Datos de Uso si es requerido por la ley o en respuesta a peticiones válidas de autoridades públicas (por ejemplo, un tribunal o un agencia gubernamental). + +## Otros requisitos legales + +La Compañía puede divulgar Tus Datos de Uso en creencia de buena fe de que dicha accion es necesaria para: + +* Cumplir con una obligación legal +* Proteger y defender los derechos y propiedades de La Compañía +* Prevenir o investigar posibles irregularidades en relación con el Servicio +* Proteger la seguridad personal de los Usuarios del Servicio o del público +* Protegerse contra la responsabilidad legal + +## Seguridad de Tus Datos Personales + +La seguridad de Tus Datos es importante para Nosotros, pero recuerda que ningún método de transmisión por Internet o método de almacenamiento electrónico es 100% seguro. Si bien nos esforzamos por utilizar medios comercialmente aceptables para proteger Tus Datos, no podemos garantizar su seguridad absoluta. + +## Privacidad de los niños + +Nuestro Servicio no se dirige a nadie menor de 13 años. No recopilamos de manera consciente información de identificación personal de nadie menor de 13 años. Si Tu eres padre/madre o tutor y sabes que Tu hijo nos ha proporcionado Datos Personales, por favor, contáctanos. Si nos damos cuenta de que hemos recopilado Datos Personales de alguien menor de 13 años sin verificación del consentimiento de los padres, tomamos medidas para eliminar esa información de Nuestros servidores. + +Si necesitamos basarnos en el consentimiento como base legal para procesar Tu información y Tu país requiere consentimiento de un padre, podemos requerir el consentimiento de Tus padres antes de recopilar y usar esa información. + +## Enlaces a otros sitios web + +Nuestro Servicio puede contener enlaces a otros sitios web que no son operados por Nosotros. Si haces clic en un enlace de un tercero, serás dirigido a ese sitio web de terceros. Te recomendamos encarecidamente que revises la Política de Privacidad de cada sitio que visites. + +No tenemos control sobre, y no asumimos responsabilidad por el contenido, políticas de privacidad o prácticas de sitios o servicios de terceros. + +## Cambios en esta Política de Privacidad + +Podemos actualizar Nuestra Política de Privacidad de vez en cuando. Te notificaremos cualquier cambio publicando la nueva Política de Privacidad en esta página. Te proporcionaremos un aviso destacado en Nuestro Servicio, antes de que el cambio entre en vigor y actualizaremos la fecha de "Última actualización" en la parte superior de esta Política de Privacidad. + +Te recomendamos que revises esta Política de Privacidad periódicamente para ver si hay cambios. Los cambios a esta Política de Privacidad son efectivos cuando se publican en esta página. + +## Contáctanos + +Si tienes alguna pregunta sobre nuestra Política de Privacidad, puedes contactarnos: + +MTU XRP Ledger Trust + +**Oficina en Regd** +15, Ringtee +Kuressaare +Estonia 93815 + +**Oficina en Tallinn** +802, Lõõtsa tn 5 +Tallinn +Estonia 11415 + +**Por correo electrónico:** info@xrplf.org diff --git a/@i18n/es-ES/community/report-a-scam.md b/@i18n/es-ES/community/report-a-scam.md new file mode 100644 index 0000000000..591741af29 --- /dev/null +++ b/@i18n/es-ES/community/report-a-scam.md @@ -0,0 +1,31 @@ +--- +html: report-a-scam.html +parent: contribute.html +--- +# Reportar una estafa + +En una industria que evoluciona dónde la confianza y la seguridad son críticas, las estafas continuan impidiendo el progreso en cripto y blockchain. Individuos y equipos de la comunidad XRP Ledger, como el equipo de Xrplorer forensics, ayuda a mitigar a esos timadores ofreciendo herramientas gratuitas para reportar estafas. + +## Tomar medidas +Si piensas que has sido estafado, asegúrate de recoleccionar toda la información que puedas sobre la estafa y el estafador tan pronto como sea posible. Revisa las opciones abajo de cómo tomar medidas. + +**Atención:** Por favor, ten en cuenta que _nadie_ puede congelar cuentas o revertir transacciones en el XRP Ledger. Esto es debido al diseño descentralizado de la blockchain del XRP Ledger. + +1. Envía la cartera del estafador al [equipo Xrplorer forensics](https://xrplorer.com/forensics/submit). + + Esto ayuda a marcar cuentas usadas en actividades ilicitas e las incluye en un monitoreo adicional, auto-trazable, y con advertencias a otros usuarios, carteras, y exchanges. + +2. Reporta tu caso a tu autoridad policial local. Si el estafador es arrestado, es posible que consigas tu dinero de vuelta. + +3. Si el estafador envió tu XRP a un exchange, asegúrate de contactar con el equipo de soporte del exchange. El exchange puede congelar la cuenta del estafador en el exchange. Aquí hay enlaces de soporte a unos cuantos exchanges conocidos: + + - [Binance](https://www.binance.com/en/support) + - [Coinbase](https://help.coinbase.com/) + - [Uphold](https://support.uphold.com/hc/en-us/requests/new) + - [Bitrue](https://www.bitrue.com/exchange-web/footer/contactus.html) + +4. Si el estafador intercambió XRP por otro token en el XRP Ledger, contacta con el emisor del token. El emisor podría ser capaz [congelar la línea de confianza del estafador]((../docs/tutorials/how-tos/use-tokens/freeze-a-trust-line.md) de prevenir que el estafador pueda enviar esos tokens a otras personas. + +Para más detalles sobre reportar estafadores, consultar [Ayuda de Xrplorer Forensics](https://xrplorer.com/forensics/help). + +Para pedir ayuda de la comunidad de XRP Ledger, también puedes probar el [foro XRPChat](https://xrpchat.com). diff --git a/@i18n/es-ES/docs/concepts/accounts/account-types.md b/@i18n/es-ES/docs/concepts/accounts/account-types.md new file mode 100644 index 0000000000..92aeb2d387 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/account-types.md @@ -0,0 +1,84 @@ +--- +html: account-types.html +parent: accounts.html +seo: + description: Los negocios que envían transacciones en el XRP Ledger automáticamente, deben configurar direcciones separadas para diferentes propósitos para minimizar el riesgo. +labels: + - Tokens + - Seguridad +--- +# Tipos de cuenta + +{% partial file="/docs/_snippets/issuing-and-operational-addresses-intro.md" /%} + + +## Ciclo de vida de los fondos + +Cuando un emisor de tokens sigue esta separacion de roles, los fondos tienden a fluir en direcciones específicas, como se muetra en el siguiente diagrama: + +[{% inline-svg file="/docs/img/issued-currency-funds-flow.svg" /%}](/docs/img/issued-currency-funds-flow.svg "Diagrama: Los fondos fluyen desde la dirección emisora hasta las direcciones de reserva, a direcciones operacionales, hacia las direcciones de clientes y socios, y finalmente de regreso a la dirección emisora.") + +La dirección emisora crea tokens enviando pagos a direcciones de reserva. Esos tokens tienen un valor negativo desde la perspectiva de la dirección emisora, ya que (a menudo) representan obligaciones. Los mismos tokens tienen valor positivo desde la otras perspectivas, incluyendo desde la perspectiva de las direcciones de reserva. + +Las direcciones de reserva, que son operadas por personas reales, envían esos tokens a direcciones operacionales. Este paso permite que la dirección emisora sea utilizada lo menos posible después de este punto, mientras tienen al menos algunos tokens disponibles en espera. + +Las direcciones operacionales, las cuales son operadas por sistemas automatizados, envían pagos a otras contrapartes, como proveedores de liquidez, socios y otros clientes. Esas contrapartes pueden enviar fondos libremente entre ellas varias veces. + +Como siempre, los pagos con tokens deben moverse a través de líneas de confianza (trust lines) del emisor. + +Eventualmente, alguien envía tokens de vuelta al emisor. Esto destruye esos tokens, reduciendo las obligaciones del emisor con el XRP Ledger. Si el token es una stablecoin, esto es el primer paso para canjear los tokens por los activos correspondientes fuera del ledger. + + +## Dirección emisora + +La dirección emisora es como una caja fuerte. Los socios, clientes y direcciones operacionales crean, líneas de confianza (trust lines) a la dirección emisora, pero esta dirección envía la menor cantidad de transacciones posibles. Periodícamente, un operador humano crea y firma una transacción desde la dirección emisora para recargar los balances de una dirección operacional o de reserva. Idealmente, la clave secreta utilizada para firmar esas transacciones nunca debería ser accesible desde ningun equipo conectado a Internet. + +A diferencia de una caja fuerte, la dirección emisora puede recibir pagos directamente de clientes o socios. Como todas las transacciones en el XRP Ledger son públicas, los sistemas automatizados pueden observar los pagos a la dirección emisora sin necseisdad de una clave secreta. + +### Dirección emisora comprometida + +Si un actor malicioso descubre la clave secreta de la dirección emisora de una institución, ese actor puede crear nuevos tokens y enviarlos a usuarios o intercambiarlos en el exchange descentralizado. Esto puede hacer hacer a un emisor de stablecoin insolvente. Puede resultar dificil para la institución financiera distinguir los tokens obtenidos legítimanente y canjearlos de manera justa. Si una institución pierde el control de la dirección emisora, la institución debe crear una nueva dirección emisora, y todos los usuarios que tenían una trust line a la dirección emisora antigua, deben crear un nueva trust line a la nueva dirección. + +### Múltiples direcciones de emisión + +Una institución financiera puede emitir más de un token en el XRP Ledger desde una única dirección de emisión. Sin embargo, hay algunas configuraciones que se aplican por igual a todos los tokens (fungibles) emitidos desde una dirección, incluido el porcentaje de [comisiones de transferencia](../tokens/transfer-fees.md) y el estado [congelación global](../tokens/fungible-tokens/freezes.md). Si la intitución financiera quiere la flexibilidad de manejar las configuraciones de distinta manera para cada token, la institución debe tener múltiples direcciones emisoras. + + +## Direcciones operacionales + +Una dirección operacional es como una caja registradora. Realiza pagos en nombre de la institución para transferir tokens a clientes y socios. Para firmar transacciones automáticamente, la clave secreta para una dirección operacional debe ser alacenada en un servidor que está conectado a Internet. (La clave secreta puede estar almacenada encriptada, pero el servidor debe desencriptarla para firmar las transacciones.) Clientes y socios no crean ni deben crear trust lines a direcciones operacionales. + +Cada dirección operacional tiene un balance limitado de tokens y XRP. Cuando el balance de una dirección operacional disminuye, la institución financiera la recarga enviando un pago desde la dirección emisora o desde la dirección de reserva. + +### Direciones operacionales comprometidas + +Si un actor malicioso descubre la clave secreta detrás de una dirección operacional, la institución financiera sólo puede perder tanto como esa dirección operacional contiene. La institución puede cambiar a una nueva dirección operacional sin que los clientes y socios tengan que realizar ninguna acción. + + +## Direcciones de reserva + +Otro paso opcional que una institución puede equilibrar el riesgo y la convivencia es utilizada como "direcciones de reserva" como paso intermedio entre la dirección emisora y las direcciones operativas. La institución puede financiar direcciones XRP Ledger adicionales como direcciones de reserva, cuyas claves no están disponibles para los servidores siempre en línea, sino que confian a diferentes usuarios confiables. + +Cuando una dirección operacional se está quedando sin fondos (ya sea tokens o XRP), un usuario confiable pueed utilizar su dirección de reserva para recargar el balance de una dirección operacional. Cuando una dirección de reserva se queda sin fondos, la institución puede usar la dirección emisora para enviar más fondos a la dirección de reserva en una sola transacción, y la dirección de reserva puede distribuir esos fondos entre sí si es necesario. Esto mejora la seguridad de la dirección emisora, permitíendole hacer menos transacciones, sin dejar demasiado dinero en un único sistema automatizado. + +Como con las direcciones operacionales, una direccion de reserva debe tener una relación contable con la dirección emisora, y no con los clientes o socios. Todas las precauciones que aplican a las direcciones operacionales también aplican a las direcciones de reserva. + +### Dirección de reserva comprometida + +Si una dirección de reserva se ve comprometida, las consecuencias son similares a las de una dirección operacional. Un actor malintencionado puede robar cualquier saldo que posea la dirección de reserva, y la institución financiera puede cambiar a una nueva dirección de reserva sin que los clientes y socios realicen ninguna acción. + + +## Ver también + +- **Conceptos:** + - [Cuentas](index.md) + - [Claves criptográficas](cryptographic-keys.md) +- **Tutoriales:** + - [Asignar par de claves regulares](../../tutorials/how-tos/manage-account-settings/assign-a-regular-key-pair.md) + - [Cambiar o eliminar par de claves regulares](../../tutorials/how-tos/manage-account-settings/change-or-remove-a-regular-key-pair.md) +- **Referencias:** + - [metodo account_info][] + - [Transacción SetRegularKey][] + - [Objeto AccountRoot](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/addresses.md b/@i18n/es-ES/docs/concepts/accounts/addresses.md new file mode 100644 index 0000000000..4237382846 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/addresses.md @@ -0,0 +1,96 @@ +--- +html: addresses.html +parent: accounts.html +seo: + description: Las direcciones identifican de manera única las cuentas del XRP Ledger, utilizando el formato base58. +labels: + - Cuentas +--- +# Direcciones + +{% partial file="/docs/_snippets/data_types/address.md" /%} + +Cualquier dirección válida puede [convertirse en una cuenta en el XRP Ledger](index.md#creacion-de-cuentas) al recibir fondos. Puedes utilizar una cuenta que no ha recibido fondos para representar una [clave normal, regular key en inglés](cryptographic-keys.md) o ser miembro de una [lista de firmantes](multi-signing.md). Solo una cuenta que ha recibido fondos puede ser el remitente de una transacción. + +Crear una dirección válida es una tarea estríctamente matemática que empieza con el par de claves. Puedes generar un par de claves y calcular su dirección completamente offline sin comunicarte con el XRP Ledger o con cualquier otra entidad. La conversión desde una clave pública a una dirección implica una función hash unidireccional, por lo que es posible confirmar que esa clave pública coincide con una dirección pero es imposible derivar la clave pública únicamente a partir de la dirección. (Esta es parte de la razón por la que las transacciones firmadas incluyen la clave pública _y_ la dirección del remitente.) + + +## Direcciones especiales + +Algunas direcciones tienen un significado especial, o usos históricos, en el XRP Ledger. En muchos casos, se tratan de direcciones "black hole" o agujero negro, lo que significa que la dirección no se deriva de una clave secreta conocida. Como es efectivamente imposible adivinar una clave secreta a partir de una sola dirección, cualquier XRP que posean direcciones black hole estarán perdidos para siempre. + + +| Dirección | Nombre | Significado | ¿Black Hole? | +|-------------------------------|--------|-------------|--------------| +| `rrrrrrrrrrrrrrrrrrrrrhoLvTp` | ACCOUNT\_ZERO | Una dirección que es la codificación en [base58][] en el XRP Ledger del valor `0`. En comunicaciones peer-to-peer, `rippled` utiliza esta dirección como el emisor de XRP. | Sí | +| `rrrrrrrrrrrrrrrrrrrrBZbvji` | ACCOUNT\_ONE | Una dirección que es la codificación en [base58][] en el XRP Ledger del valor `1`. En el ledger, las [entradas RippleState](../../references/protocol/ledger-data/ledger-entry-types/ripplestate.md) utilizan esta dirección como marcador de posición para el emisor de un balance de una trust line. | Sí | +| `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` | La cuenta génesis | Cuando `rippled` inicia un nuevo ledger génesis desde el principio (por ejemplo, en modo solitario), esta cuenta contiene todo el XRP. Esta cuenta es generada con el valor semilla `masterpassphrase` el cual está [hard-coded](https://github.com/XRPLF/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184). | No | +| `rrrrrrrrrrrrrrrrrNAMEtxvNvQ` | black hole de reserva de nombre de Ripple | En el pasado, Ripple pedía a los usuarios enviar XRP a esta cuenta para reservar nombres Ripple.| Sí | +| `rrrrrrrrrrrrrrrrrrrn5RM1rHd` | Dirección NaN | Versiones previas de [ripple-lib](https://github.com/XRPLF/xrpl.js) generaban esta dirección cuando se codificaba el valor [NaN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN) utilizan el formato de codificación [base58][] del XRP Ledger. | Sí | + + +## Codificación de una dirección + +**Consejo:** ¡Estos detalles técnicos son solo relevantse para personas que crean librerias de software de bajo nivel para la compatibilidad con el XRP Ledger! + +[[Fuente]](https://github.com/XRPLF/rippled/blob/35fa20a110e3d43ffc1e9e664fc9017b6f2747ae/src/ripple/protocol/impl/AccountID.cpp#L109-L140 "Fuente") + +Las direcciones XRP Ledger están codificadas utilizando [base58][] con el _diccionario_ `rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz`. Como el XRP Ledger codifica varios tipos de claves con base58, antepone los datos codificados con un-byte de "prefijo de tipo" (también conocido como "prefijo de versión") para distinguirlos. El prefijo de tipo hace que las direcciones normalmente comiencen con diferentes letras en formato base58. + +El siguiente diagrama muestra la relación entre las claves y las direcciones: + +[{% inline-svg file="/docs/img/address-encoding.svg" /%}](/docs/img/address-encoding.svg "Clave pública maestra + Prefijo Tipo → ID de cuenta + Checksum → Dirección") + +La fórmula para calcular direcciones XRP Ledger desde una clave pública es la siguiente. Para ver el código de ejemplo completo, consulta [`encode_address.js`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/content/_code-samples/address_encoding/js/encode_address.js). Para el proceso de derivar la clave pública desde una passphrase a un valor semilla, consulta [Derivación de clave](cryptographic-keys.md#key-derivation). + +1. Importa los algoritmos necesarios: SHA-256, RIPEMD160, y base58. Configura el diccionario para base58. + + ``` + 'use strict'; + const assert = require('assert'); + const crypto = require('crypto'); + const R_B58_DICT = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'; + const base58 = require('base-x')(R_B58_DICT); + + assert(crypto.getHashes().includes('sha256')); + assert(crypto.getHashes().includes('ripemd160')); + ``` + +2. Empieza con una clave pública 33-byte ECDSA secp256k1, o una clave pública 32-byte Ed25519. Para claves Ed25519, prefija la clave con el byte `0xED`. + + ``` + const pubkey_hex = + 'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32'; + const pubkey = Buffer.from(pubkey_hex, 'hex'); + assert(pubkey.length == 33); + ``` + +3. Calcula el hash [RIPEMD160](https://en.wikipedia.org/wiki/RIPEMD) del hash SHA-256 de la clave pùblica. Este valor es el ID de cuenta o "Account ID". + + ``` + const pubkey_inner_hash = crypto.createHash('sha256').update(pubkey); + const pubkey_outer_hash = crypto.createHash('ripemd160'); + pubkey_outer_hash.update(pubkey_inner_hash.digest()); + const account_id = pubkey_outer_hash.digest(); + ``` + +4. Calcula el hash SHA-256 hash del hash SHA-256 del Account ID; toma los 4 primeros bytes. Este valor es el "checksum". + + ``` + const address_type_prefix = Buffer.from([0x00]); + const payload = Buffer.concat([address_type_prefix, account_id]); + const chksum_hash1 = crypto.createHash('sha256').update(payload).digest(); + const chksum_hash2 = crypto.createHash('sha256').update(chksum_hash1).digest(); + const checksum = chksum_hash2.slice(0,4); + ``` + +5. Concatena el payload y el checksum. Calcula el valor base58 del buffer concatenado. El resultado es la dirección. + + ``` + const dataToEncode = Buffer.concat([payload, checksum]); + const address = base58.encode(dataToEncode); + console.log(address); + // rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN + ``` + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/cryptographic-keys.md b/@i18n/es-ES/docs/concepts/accounts/cryptographic-keys.md new file mode 100644 index 0000000000..1fff285868 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/cryptographic-keys.md @@ -0,0 +1,259 @@ +--- +html: cryptographic-keys.html +parent: accounts.html +seo: + description: Utiliza las claves criptográficas para aprobar transacciones para que el XRP Ledger pueda ejecutarlas. +labels: + - Smart Contracts + - Seguridad +--- +# Claves criptográficas + +En el XRP Ledger, una firma digital _autoriza_ a una [transacción](../transactions/index.md) a hacer un grupo específico de acciones. Solo las transacciones firmadas pueden ser enviadas a la red y ser incluidas en un ledger validado. + +Para realizar una firma digital, utilizas un par de claves criptográficas asociadas con la cuenta de envío de la transacción. Un par de claves se puede generar utilizando cualquiera de los [algoritmos de firma criptorgráfica](#algoritmos-de-firma) soportados por el XRP Ledger. Un par de claves puede ser utilizado como [par de claves maestras](#par-de-claves-maestras), [par de claves normales](#par-de-claves-normales) o un miembro de una [lista de firmantes](multi-signing.md), sin importar qué algoritmo se ha utilizado para generarlo. + +**Atención:** Es importante mantener una seguridad adecuada sobre tus claves criptográficas. Las firmas digitales son la única forma de autorizar transacciones en el XRP Ledger, y no hay administrador privilegiado que pueda deshacer o revertir cualquier transacción tras haber sido aplicadas. Si alguien más conoce la semilla o la clave privada de tu cuenta del XRP Ledger, esa persona puede crear firmas digitales para autorizar cualquier transacción al igual que tú. + +## Generación de claves + +Muchas [librerías de cliente](../../references/client-libraries.md) y aplicaciones pueden generar un par de claves adecuadas para usar con el XRP Ledger. Sin embargo, solo deberías utilizar los pares de claves que fueron generados en dispositivos y software en los que confías. Las aplicaciones comprometidas pueden exponer tu secreto a usuarios maliciosos que pueden enviar transacciones desde tu cuenta luego. + + +## Componentes de clave + +Un par de claves criptográficas es una **clave privada** y una **clave pública** que están conectadas matemáticamente a través de un proceso de derivación de claves. Cada clave es un número; la clave privada debería elegirse usando una fuente de aleatoriedad fuerte. El [algoritmo de firma criptográfica](#algoritmos-de-firma) define el proceso de derivación de claves y establece restricciones en los números que pueden ser claves criptográficas. + +Al tratar con el XRP Ledger, también puedes utilizar algunos valores relacionados como passphrase, semilla, ID de cuenta, y dirección. + +[{% inline-svg file="/docs/img/cryptographic-keys.svg" /%}](/docs/img/cryptographic-keys.svg "Diagrama: Passphrase → Semilla → Clave privada → Clave pública → ID de cuenta ←→ Dirección") +_Figura: Una vista simplificada de la relación entre los valores de clave criptográfica._ + +La passphrase, semilla, y la clave privada son **secretos**: si conoces alguno de estos valores para una cuenta, puedes generar firmas válidas y tienes el control total sobre la cuenta. Si tienes una cuenta, se **muy cuidadoso** con la información secreta de tu cuenta. Si no tienes estos secretos, no puedes usar tu cuenta. Si alguien más tiene acceso a ellos, puede tener el control de tu cuenta. + +La clave pública, el ID de cuenta, y dirección son información pública. Puede haber situaciones en las que puedes conservar la clave pública para ti mismo, pero en algún momento necesites publicarla como parte de una transacción para que el XRP Ledger pueda verificar la firma y el proceso de la transacción. + +Para más detalles técnicos y como la derivación de clave funciona, ver [Derivación de claves](#derivación-de-claves). + +### Passphrase + +Puedes, opcionalmente, usar una passphrase u algún otro valor de entrada como forma de elegir una semilla o una clave privada. Esto es menos seguro que elegir la semilla o la clave privada desde la aleatoriedad, pero hay algunos casos excepcionales dónde quieras hacer esto. (Por ejemplo, en 2018 "XRPuzzler" regaló XRP a la primera persona [en resolver un puzzle](https://bitcoinexchangeguide.com/cryptographic-puzzle-creator-xrpuzzler-offers-137-xrp-reward-to-anyone-who-can-solve-it/); él utilizó la solución del puzzle como la passphrase para la cuenta que tenía el premio en XRP.) + +La passphrase es información secreta, por lo que debes protegerla con mucho cuidado. Cualquiera que conozca la passphrase de la dirección tiene control total efectivo sobre la cuenta. + +### Semilla + +Un valor _semilla_ es un valor compacto que se utiliza para [derivar](#derivación-de-claves) las claves privada y pública actual de una cuenta. En la respuesta de un [método wallet_propose][], las `master_key`, `master_seed`, y `master_seed_hex` todas representan el mismo valor semilla, en varios formatos. Cualquiera de esos formatos puede ser utilizado para firmar transacciones. A pesar de tener el prefijo `master_`, las claves que esta semilla representa no necesariamente representan las claves maestras de una cuenta; puedes usar un par de claves como una clave normal o un miembro de una lista de firmantes. + +El valor semilla es una información secreta, por lo que debes que protegerla con mucho cuidado. Cualquiera que conozca el valor semilla de una dirección tiene control total sobre la dirección. + +### Clave privada + +La _clave privada_ es un valor utilizado para crear una firma digital. La mayoría de software XRP Ledger no muestra explicitamente la clave privada, y [deriva la clave privada](#derivación-de-claves) desde el valor semilla cuando es necesario. Es técnicamente posible guardar la clave privada en vez de la semilla para usarla con el fin de firmar transacciones directamente, pero no es algo común. + +Como la semilla, la clave privada es información secreta, por lo que debes protegerla con mucho cuidado. Cualquiera que conozca la clave privada de la dirección tiene control total sobre la dirección. + +### Clave pública + +La _clave pública_ es un valor utilizado para verificar la autenticidad de una firma digital. La clave pública se deriva de una clave privada como parte de la derivación de clave. En la respuesta de un [método wallet_propose][], ambas, la `public_key` y `public_key_hex` representan el mismo valor de clave pública. + +Las transacciones en el XRP Ledger deben incluir las claves públicas para que la red pueda verificar las firmas de las transacciones. La clave pública no se puede utilizar para crear firmas válidas, así que es seguro compartirla públicamente. + + +### ID de cuenta y dirección + +El **ID de cuenta** es el identificador principal para una [cuenta](index.md) o para un par de claves. Se deriva de la clave pública. En el protocolo XRP Ledger, el ID de cuenta es un dato binario de 20 bytes. La mayoría de las APIs XRP Ledger representan la Account ID como una dirección, en uno de dos formatos: + +- Una "dirección clásica" escribe una ID de cuenta en [base58][] con un checksum. En una respuesta del [método wallet_propose][], este es el valor `account_id`. +- Una "dirección-X" combina una ID de cuenta _y_ un [Tag de destino](../transactions/source-and-destination-tags.md) y escribe el valor combinado en [base58][] con un checksum. + +El checksum en ambos formatos está ahi para que los resultados con pequeños cambios resulte en una dirección inválida, en lugar de cambiarla para que haga referencia a una cuenta diferente, pero aún potencialmente válida. De esta forma, si cometes un error tipográfico u ocurre un error de tranmisión, no enviarás dinero al lugar equivocado. + +Es importante saber que no todos los IDs de cuenta (o direcciones) se refieren a cuentas en el ledger. Derivar claves y direcciones es una operación puramente matemática. Para que una cuenta tenga un registro en el XRP Ledger, es necesario [recibir un pago en XRP](index.md#creating-accounts) que cumpla su [requisito de reservas](reserves.md). Una cuenta no puede enviar ninguna transacción hasta que se haya recibido fondos. + +Incluso si una ID de cuenta o dirección no se refiere a una cuenta con fodos, _puedes_ usar ese ID de cuenta o la dirección para representar un [par de claves](#par-de-claves-normales) o un [miembro de una lista de firmantes](multi-signing.md). + +### Tipo de clave + +El XRP Ledger soporta más de un [algoritmo de firma criptográfica](#algoritmos-de-firma). Cualquier par de claves determinado es únicamente válida para un algoritmo de firma criptográfica específico. Algunas claves privadas pueden técnicamente ser claves válidas para más de un algoritmo, pero esas claves privadas tendrían distintas claves públicas para cada algoritmo, y no deberías reutilizar las claves privadas. + +El campo `key_type` en el [método wallet_propose][] se refiere al algoritmo de firma criptográfica que se utilizará. + + +## Par de claves maestras + +El par de claves maestras consiste en una clave privada y una clave publica. La dirección de una cuenta es derivada del par de claves maestras, por lo que están intrinsecamente relacionadas. No puedes cambiar o eliminar el par de claves maestras, pero puedes desactivarlo. + +El [metodo wallet_propose][] es una forma de generar el par de claves maestras. La respuesta de este método muestra la semilla de la cuenta, dirección, y la clave pública maestra juntos. Para ver otros métodos para configurar pares de claves maestras, consultar [Firma segura](../transactions/secure-signing.md). + +**Atención:** Si un actor malicioso conoce tu clave privada maestra (o semilla), tendrá control completo sobre tu cuenta, a no ser que tu par de claves maestras se inhabilite. Puedes tomar todo tu dinero de la cuenta posee y causar un daño irreparable. ¡Trata tus valores secretos con cuidado! + +Dado que cambiar el par de claves maestras es imposible, debes cuidarlo en proporción al valor de lo que posea. Una buena práctica es [guardar tu par de claves maestras offline](../../tutorials/how-tos/manage-account-settings/offline-account-setup.md) y configurar un par de claves normales para firmar transacciones en tu cuenta. Al mantener el par de claves maestras activadas pero offline, puedes estar razonablemente seguro de que nadie puede acceder a él a través de Internet, pero aun así deberías encontrarlo en caso de una emergencia. + +Mantener tu par de claves maestras offline significa no colocar tu información secreta (passphrase, semilla, or clave privada) en cualquier sitio en que los actores maliciosos puedan tener acceso a él. En general, esto quiere decir que no está al alcance de un programa inofrmático que interactúe con Internet. Por ejemplo, puedes guardarlo en un equipo que no se conecta nunca a Internet, en un trozo de papel guardado en una caja fuerte, o tenerla completamente memorizada. (Memorizarla tiene algunos puntos inconvenientes, incluido ser imposible pasar la clave una vez muerto.) + + + +### Permisos especiales + +**Solo** el par de claves maestras pueden autorizar transacciones para hacer ciertas cosas: + +- Enviar la primera transacción de una cuenta, porque las cuentas no se pueden inicializar de otra manera que [autorizando transacciones](../transactions/index.md#authorizing-transactions). + +- Deshabilitar el par de claves maestras. + +- Renunciar permanentemente a la posibilidad de [congelar](../tokens/fungible-tokens/freezes.md#no-freeze). + +- Enviar una [transacción de reestablecimiento de clave](../transactions/transaction-cost.md#key-reset-transaction) especial con una transacción de 0 XRP de coste. + +Una clave normal o [multi-firma](multi-signing.md) puede hacer cualquier otra cosa igual que el par de claves maestras. En particular, una vez has deshabilitado el par de claves maestras, puedes volver a habilitarlo utilizando un par de claves normales o multi firma. También puedes [eliminar una cuenta](deleting-accounts.md) si cumple con los requisitos para su eliminación. + + +## Par de claves normales + +Una cuenta XRP Ledger puede autorizar un par de claves secundario, conocido como _par de claves normales_. Tras hacerlo, puedes utilizar cualquiera, el [par de claves maestras](#par-de-claves-maestras) o el par de claves normales para autorizar transacciones. Puedes eliminar o reemplazar tu par de claves normales en cualquier momento sin cambiar el resto de la cuenta. + +Un par de claves normales pueden autorizar la mayoría de tipos de transacciones que una par de claves maestras puede, con [ciertas excepciones](#pemrisos-especiales). Por ejemplo, un par de claves nomales _puede_ autorizar una transacción para cambiar el par de claves normales. + +Una buena práctica de seguridad es guardar tu clave privada maestra en algun sitio offline, y usar un par de claves normales la mayor parte del tiempo. Como precaución, puedes cambiar el par de claves normales regularmente. Si un usuario malicioso descubre tu clave privada normal, puedes tomar el par de claves maestras de tu escondite offline y usarlo para cambiar o eliminar el par de claves normales. De este modo, puedes volver a retomar el control de la cuenta. Incluso si no eres demasiado rápido para parar al usuario malicioso de robar tu dinero, al menos no tendrás necesidad de moverte a una nueva cuenta y tener que recrear tu configuración y relaciones desde el principio. + +El par de claves normales tiene el mismo formato que el par de claves maestras. Las generas de la misma forma (por ejemplo, usando el [método wallet_propose][]). La única diferencia es que el par de claves normales es que el par no está intrínsicamente vinculado a la cuenta para la que firma transacciones. Es posible (pero no es buena idea) utilizar el par de claves maestras de una cuenta como lel par de claves normales para otra cuenta. + +La [transacción SetRegularKey][] asigna o cambia el par de claves normales de una cuenta. Para un tutorial de asignación o cambio de un par de claves normales, ver [Asignar par de claves normales](../../tutorials/how-tos/manage-account-settings/assign-a-regular-key-pair.md). + + +## Algorítmos de firma + +Los pares de claves criptográficas están siempre atadas a un algorítmo de firma específico, el cual define la relación matemática entre la clave secreta y la clave pública. Los algorítmos de firma criptográficos tienen la propiedad de, dado el estado actual de las técnicas de criptografía, es "fácil" utilizar una clave secreta para clacular la clave pública coincidente, pero es imposible calcular la clave secreta vinculante partiendo de la clave pública. + +El XRP Ledger soporta los siguientes algoritmos de firma criptográfica: + +| Tipo de clave | Algoritmo | Descripción | +|-------------|-----------|---| +| `secp256k1` | [ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) usando la curva eliptica [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) | Este es el mismo esquema que utiliza Bitcoin. El XRP Ledger utiliza este tipo de claves por defecto. | +| `ed25519` | [EdDSA](https://tools.ietf.org/html/rfc8032) usando la curva elíptica [Ed25519](https://ed25519.cr.yp.to/) | Este es un algoritmo más novedoso que tiene mejor rendimiento y otras propiedades convenientes. Como las claves públicas Ed25519 son un byte menos que las claves secp256k1, `rippled` prefija las claves públicas Ed25519 con el byte `0xED` así ambos tipos de claves públicas son de 33 bytes. | + +Cuando generas un par de claves con el [método wallet_propose][], puedes especificar el `key_type` para elegir que tipo de algorítmo criptográfico se utiliza para derivar las claves. Si has generado un tipo de clave disitnto al de por defecto, debes especificar también el `key_type` cuando firmas transacciones. + +Los tipos de pares de claves admitidos pueden utilizarse indistintatemente en todo el XRP Ledger como pares de claves maestras, pares de claves normales, y miembros de listas de firmantes. El proceso de [derivación de una dirección](addresses.md#address-encoding) es el mismo para pares de claves secp256k1 y Ed25519. + + +### Algoritmos futuros + +En el futuro, es posible que el XRP Ledger necesite nuevos algoritmos de firma criptográficos para mantenerse al día con el desarrollo en criptográfia. Por ejemplo, si los ordenadores cuánticos utilizasen el [algoritmo de Shor](https://en.wikipedia.org/wiki/Shor's_algorithm) (o algo similar) no tardarán en romper la curva elíptica criptográfica, los desarrolladores XRP Ledger pueden añadir un algoritmo criptográfico que no es facil de romper. A mediados de 2020, no existe un algoritmo de firma "resistente a la cuántica" y los ordenadores cuánticos no son lo suficientemente prácticos para ser una amenaza, por lo que no hay planes inmediatos para añadir algoritmos específicos. + + +## Derivación de claves + +El proceso de derivar un par de claves depende del algoritmo de firma. En todos los casos, las claves son generadas desde un valor _seed_ (semilla) que es de 16 bytes (128 bits) de longitud. El valor semilla puede ser totalmente aleatorio (recomendado) o puede ser derivado de una passphrase específica tomando el [hash SHA-512][Hash] y manteniendo los primeros 16 bytes (como [SHA-512Half][], pero manteniendo solo 128 bits en vez de los 256 bits de la salida). + +### Código de ejemplo + +Los procesos de derivación de claves descritos aquí están implementados en múltiples lugares y lenguajes de programación: + +- En C++ en el código base de `rippled`: + - [Definición de semilla](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/Seed.h) + - [Derivación de clave general & Ed25519](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/impl/SecretKey.cpp) + - [Derivación de clave secp256k1](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/impl/SecretKey.cpp) +- En Python 3 en {% repo-link path="_code-samples/key-derivation/py/key_derivation.py" %}esta sección de códigos de ejemplo del repositorio{% /repo-link %}. +- En JavaScript en el paquete [`ripple-keypairs`](https://github.com/XRPLF/xrpl.js/tree/main/packages/ripple-keypairs). + +### Derivación de clave Ed25519 +[[Fuente]](https://github.com/XRPLF/rippled/blob/fc7ecd672a3b9748bfea52ce65996e324553c05f/src/ripple/protocol/impl/SecretKey.cpp#L203 "Fuente") + +[{% inline-svg file="/docs/img/key-derivation-ed25519.svg" /%}](/docs/img/key-derivation-ed25519.svg "Passphrase → Semilla → Clave secreta → Prefijo + Clave pública") + +1. Calcular el [SHA-512Half][] del valor de la semilla. El resultado es la clave secreta de 32-byte. + + **Consejo:** Todos los números 32-byte son válidos como claves secretas Ed25519. Sin embargo, Sin embargo, solo los números elegidos aleatoriamente son suficientemente seguros para ser usados como claves secretas. + +2. Para calcular una clave pública Ed25519, utiliza la derivación estandar de clave pública para [Ed25519](https://ed25519.cr.yp.to/software.html) para derivar una clave pública de 32-byte. + + **Atención:** Como con cualquier algoritmo criptográfico, utiliza una implementación estandar, reconocida y públicamente auditada cuando sea posible. Por ejemplo, [OpenSSL](https://www.openssl.org/) tiene implementaciones de las funciones principales para Ed25519 y secp256k1. + +3. Prefija el byte `0xED` en la clave pública 32-byte para indicar que es una clave pública Ed25519, resultando en 33 bytes. + + Si estás impementando código para firmar transacciones, elimina el prefijo `0xED` y utiliza la clave 32-byte para el proceso de firma actual. + +4. Cuando serializas una clave pública de cuenta a [base58][], utiliza el prefijo de la clave pública de cuenta `0x23`. + + Las claves efímeras de validador no pueden ser Ed25519. + +### Derivación de clave secp256k1 +[[Fuente]](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/impl/SecretKey.cpp "Fuente") + +[{% inline-svg file="/docs/img/key-derivation-secp256k1.svg" /%}](/docs/img/key-derivation-secp256k1.svg "Passphrase → Semilla → Par de claves inicial (Root Key Pair) → Par de claves intermedias → Par de claves maestras") + +La derivación de claves de cuentas XRP Ledger secp256k1 involucra más pasos que con la derivación de clave Ed25519 por el siguiente par de razones: + +- No todos los números 32-byte son válidos para claves secretas secp256k1. +- La implementación de referencia en XRP Ledger tiene un marco incompleto y no usado para derivar una familia de claves públicas desde un valor semilla único inicial. + +Los pasos para derivar par de claves de cuenta XRP Ledger secp256k1 desde un valor semilla es como sigue: + +1. Calcular un par de claves iniciales (root key pair) a partir del valor semilla, como sigue: + + 1. Concatenar lo siguiente en orden, para un total de 20 bytes: + - El valor semilla (16 bytes) + - El valor "sequencia root" (4 bytes), como un entero big-endian no asignado. Utiliza 0 como un valor inicial para la secuencia root. + + 2. Calcular el [SHA-512Half][] del valor concatenado ( semilla+secuencia root). + + 3. Si el resultado no es una clave secreta válida secp256k1, incrementa la secuencia root en 1 y vuelve a empezar. [[Fuente]](https://github.com/XRPLF/rippled/blob/fc7ecd672a3b9748bfea52ce65996e324553c05f/src/ripple/crypto/impl/GenerateDeterministicKey.cpp#L103 "Fuente") + + Una clave válida secp256k1 debe no ser cero, y debe ser numericamente menor que _secp256k1 group order_. El orden grupo secp256k1 es un valor constante `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141`. + + 4. Con una clave secreta secp256k1 válida, utiliza la derivación de clave pública ECDSA estandar con la curva secp256k1 para derivar la clave pública inicial (root). (Como siempre para algoritmos critográficos, utiliza una implementación auditada públicamente, conocida y estandar cuando sea posible. Por ejemplo, [OpenSSL](https://www.openssl.org/) tiene implementaciones para funciones principales de Ed25519 y secp256k1.) + + **Consejo:** Los validadores utilizan este par de claves iniciales (root). Si estás calculando un par de claves para un validador, puedes parar aquí. Para disntiguir entre estos dos tipos de claves públicas, la serialización para claves públicas de validador [base58][] usa el prefijo `0x1c`. + +2. Convierte la clave pública inicial (root) a su forma comprimida de 33-byte. + + La forma no comprimida de cualquier clave pública ECDSA consiste en un par de enteros de 32-byte: una coordinada X, y una coordinada Y. La forma comprimida es la coordinada X y un prefijo de one-byte: `0x02` si la coordinada Y es par, o `0x03` si la coordinada Y es impar. + + Puedes convertir una clave pública sin comprimir a la forma comprimida desde la herramienta de línea de comandos `openssl`. Por ejemplo, si la clave pública está en el fichero `ec-pub.pem`, puedes sacar el formato comprimido de esta manera: + + ``` + $ openssl ec -in ec-pub.pem -pubin -text -noout -conv_form compressed + ``` + +3. Deriva un "par de claves intermedio" desde la clave pública ráiz comprimida, así: + + 1. Concatena lo siguiente en orden, para un total de 41 bytes: + - La clave pública comprimida (33 bytes) + - `0x00000000000000000000000000000000` (4 bytes de ceros). (Este valor estaba pensado para derivar diferentes números de la misma familia, pero en la práctica solo el valor 0 es utilizado.) + - Una valor "secuencia clave" (4 bytes), como un entero no asignado big-endian. Utiliza 0 como valor inicial para la secuencia clave. + + 2. Calcula el [SHA-512Half][] del valor concatenado. + + 3. Si el resultado noes euna clave secreta válida secp256k1, incrementa la secuencia clave en 1 y reiniciala derivación de la cuenta desde el par de claves intermedio de la cuenta. + + 4. Con una clave secreta secp256k1 válida, utiliza la derivación de clave pública ECDSA estandar con la curva secp256k1 para derivar la clave pública intermedia. (Como siempre con los algoritmos criptográficos, utiliza una implementación públicamente auditada, conocida y estandar cuando sea posible. Por ejemplo, [OpenSSL](https://www.openssl.org/) tiene implementaciones de las funciones principales Ed25519 y secp256k1.) + +4. Deriva el par de claves públicas añadiendo la clave pública intermedia a la clave pública inicial (root). De manera similar, deriva la clave secreta añadiendo la clave secreta intermedia a la clave secreta inicial (root). + + - Una clave secreta ECDSA es un número entero muy largo, por lo que puedes calcular la suma de dos números secretos sumando el módulo el orden de grupo secp256k1. + + - Una clave pública ECDSA es un punto de la curva elíptica, por lo que necesitarás matemática de curva elíptica para sumar los puntos. + +5. Convierte la clave pública maestra asu forma comprimida de 33-byte, como antes. + +6. Cuando serialices la clave pública de la cuenta a su formato [base58][], utiliza el prefijo de la clave pública de la cuenta, `0x23`. + + Ver [Codificación de dirección](addresses.md#address-encoding) para información y códigos de ejemplo para convertir de una clave pública de cuenta a su dirección. + + +## Ver también + +- **Conceptos:** + - [Direcciones de emisión y operacionales](account-types.md) +- **Tutoriales:** + - [Asignación de par de claves normales](../../tutorials/how-tos/manage-account-settings/assign-a-regular-key-pair.md) + - [Cambiar o eliminar par de claves normales](../../tutorials/how-tos/manage-account-settings/change-or-remove-a-regular-key-pair.md) +- **Referencias:** + - [Transacción SetRegularKey][] + - [Objeto de ledger AccountRoot](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md) + - [método wallet_propose][] + - [método account_info][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/decentralized-identifiers.md b/@i18n/es-ES/docs/concepts/accounts/decentralized-identifiers.md new file mode 100644 index 0000000000..9bbed0905b --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/decentralized-identifiers.md @@ -0,0 +1,79 @@ +--- +html: decentralized-identifiers.html +parent: accounts.html +seo: + description: Los identificadores decentralizados permiten identidades digitales decentralizadas verificables. +status: not_enabled +labels: + - DID +--- +# Identificadores descentralizados + +_(REquiere de la [enmienda DID][] {% not-enabled /%})_ + +Un identificador descentralizado (DID) es un nuevo tipo de identificador definido por el World Wide Web Consortium (W3C) que permite identidades digitales verificables. Los DIDs están completamente bajo el control del dueño del DID, independientemente de cualquier registro centralizado, proveedor de identidad, o autoridad certificada. + +Los principios clave de un DID son: + +- **Descentralizacion:** No hay una agencia emisora central que controla el DID, lo que permite al propietario actualizar, resolver o desactivarlo. + +- **Criptográficamente verificable:** Los DIDs son verificados a través de pruebas criptográficas, lo que los hace a prueba de manipulaciones y seguros. + +- **Interoperabilidad:** Los DIDs están abiertos a cualquier solución que reconozca el estandar W3C DID. Esto quiere decir que un DID puede ser utilizado para autenticar y establecer confianza en varias transacciones digitales e interacciones. + +**Nota:** La implementación de DIDs en el XRP Ledger cumple con los requisitos de la [especificación DID v1.0](https://www.w3.org/TR/did-core/). + + +## Cómo funciona + +1. El dueño de una cuenta XRPL genera un DID que es controlado por la cuenta. +2. El DID se asocia a un documento DID definido por la especificaciones W3C. +3. El DID es usado para las siguientes tareas digitales como: + - Firmar documentos digitales. + - Realizar transacciones en linea seguras. + - Iniciar sesión en sitios web. +4. El verificador resuelve el DID a su docuemnto para verificar la identidad del sujeto. + + +## Documentos DID + +Los documentos DID contienen la información necesaria para verificar criptográficamente la identidad del sujeto descrito por el documento DID. El sujeto puede ser una persona, organización, o cosa. Por ejemplo, un documento DID podría contener claves criptográficas públicas que el sujeto DID puede utilizar para autenticarse y demostrar su asociación con el DID. + +**Nota:** Los documentos DID suelen serializarse en una representación JSON o JSON-LD. + +En el XRP Ledger, hay numerosas formas de asociar un DID a un documento DID: + +1. Almacenar una referencia al documento en el campo `URI` del objeto `DID`, que apunta al documento almacenado en otra red de almacenamiento descentralizado, como es IPFS o STORJ. +2. Almacenar un documento DID mínimo en el campo `DIDDocument` del objeto `DID`. +3. Utilizar un documento DID _implicito_ generado a partir del DID y otra información pública disponible. + **Nota:** Los casos de uso más simples pueden solo necesitar firmas y rokens de autorización simples. En casos donde no haya un documento DID explicitamente en el ledger, un documento implicito es utilizado en su lugar. Por ejemplo, el documento DID de `did:xrpl:1:0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020` habilita solo la clave única `0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020` para autorizar cambios en el documento DID o firmar credenciales en nombre del DID. + + +### Ejemplo de documento DID XRPL + +```json +{ + "@context": "https://w3id.org/did/v1", + "id": "did:xrpl:1:rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + "publicKey": [ + { + "id": "did:xrpl:1:rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn#keys-1", + "type": ["CryptographicKey", "EcdsaKoblitzPublicKey"], + "curve": "secp256k1", + "expires": 15674657, + "publicKeyHex": "04f42987b7faee8b95e2c3a3345224f00e00dfc67ba882..." + } + ] +} +``` + +Para aprender más sobre las propiedades principales de un documento DID, ver: [Decentralized Identifiers (DIDs) v1.0](https://www.w3.org/TR/did-core/#core-properties). + + +## Precauciones de privacidad y seguridad + +- Quien controla las claves privadas de la cuenta XRPL, controla el DID y las referencias al documento DID a la que resuelve. Asegúrate de que tus claves privadas no se comprometan. +- Puedes incluir cualquier contenido en un documento DID, pero deberías limitarlo a métodos de verificación y puntos de servicio. Como los DIDs en XRPL pueden ser resueltos por cualquiera, no deberías introducir ninguna información personal. +- IPFS permite a cualquiera almacenar contenido en los nodos de una red distribuida. Un error común es que cualquiera puede editar ese contenido; sin embargo, la capacidad de direccionamiento del contenido de IPFS significa que cualquier contenido editado tendrá una dirección diferente a la original. Mientras que cualquier entidad puede copiar un documento DID anclado a los campos `DIDDocument` o `URI` de una cuenta XRPL, no pueden cambiar el documento en sí a menos que controlen la clave privada que creó el objeto `DID`. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/deleting-accounts.md b/@i18n/es-ES/docs/concepts/accounts/deleting-accounts.md new file mode 100644 index 0000000000..47cedd2f29 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/deleting-accounts.md @@ -0,0 +1,38 @@ +--- +html: deleting-accounts.html +parent: accounts.html +blurb: Acerca de eliminar una cuenta XRP Ledger. +labels: + - Cuentas +--- +# Eliminar Cuentas + +El dueño de una cuenta puede enviar una [transacción AccountDelete][] para eliminar la cuenta y las entradas relativas del ledger, enviando la mayoría del XRP en balance restante a otra cuenta. Para evitar la creación y eliminación de cuentas sin sentido, eliminar una cuenta requiere quemar una cantidad superior a la usual utilizada como [coste de transacción](../transactions/transaction-cost.md). + +Algún tipo de entradas asociadas al ledger bloquean a una cuenta de ser eliminada. Por ejemplo, el emisor de un token fungible no puede ser borrad mientras cualquiera teng un saldo distinto a cero de ese token como balance. + +Una vez una cuenta ha sido eliminada, puede ser recreada en el eldger a través de un método normal de [creación de cuentas](index.md#creating-accounts). Una cuenta que ha sido eliminada y re-creada no es diferente de una cuenta que ha sido creada por primera vez. + +## Requisitos + +Para ser eliminada, una cuenta debe cumplir los siguientes requisitos: + +- El número de `Sequence` de la cuenta más 256 debe ser menor que el [Índice del ledger][] actual. +- La cuenta no debe estar enlazada a de los siguientes tipos de [entradas del ledger](../../references/protocol/ledger-data/ledger-entry-types/index.md) (como remitente o destinatario): + - `Escrow` + - `PayChannel` + - `RippleState` + - `Check` +- La cuenta debe tener menos de 1000 objetos en el ledger. +- La transacción debe pagar un [coste de transacción][] especial igual al menos a la [reserva de propietario](reserves.md) de un artículo (actualmente 2 XRP). + +## Coste de eliminación + +**Atención:** El coste de transacción de la [transacción AccountDelete][] siempre aplica cuando la transacción está incluida en un ledger validado, incluso si la transacción falla porque la cuenta no reune los requisitos para ser eliminada. Para reducir las posibilidades de pagar un coste de transacción alto si la cuenta no puede ser eliminada, utiliza la opción `fail_hard` cuando envíes una transacción AccountDelete. + +A diferencia de Bitcoin y muchas otras criptomonedas, cada nueva versión de la cadena del ledger público de XRP Ledger contiene el estado completo del ledger, lo cual incrementa en tamaño con cada cuenta nueva. Por esa razón, no deberías crear nuevas cuentas XRP Ledger si no tienes necesidad. Puedes recuperar parte de los 10 XRP de la cuenta [reserva](reserves.md) eliminado la cuenta, pero destruirás por lo menos 2 XRP haciéndolo. + +Instituciones que reciben y envían valor en nombre de muchos usuarios pueden utilizar [**Source Tags** y **Destination Tags**](../transactions/source-and-destination-tags.md) para distinguir pagos desde y para sus clientes usando una (o un puñado) de cuentas en el XRP Ledger. + + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/depositauth.md b/@i18n/es-ES/docs/concepts/accounts/depositauth.md new file mode 100644 index 0000000000..085bc16664 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/depositauth.md @@ -0,0 +1,119 @@ +--- +html: depositauth.html +parent: accounts.html +seo: + description: La configuración DepositAuth le permite a una cuenta bloquear pagos entrantes por defecto. +labels: + - Pagos + - Seguridad +--- +# Autorización para depositar + +_(Añadido por la [enmienda DepositAuth][].)_ + +La Autorización para depositar es una configuración opcional de la [cuenta](index.md) en el XRP Ledger. Si se activa, La Autorización para depositar, bloquea todas las transferencias de desconocidos, incluidas las transferencias de XRP o [tokens](../tokens/index.md). Una cuenta con Autorización para depositar solo puede recibir valor de dos maneras: + +- Desde cuentas que tiene [preautorizadas](#preautorización). +- Enviando una transacción para recibir los fondos. Por ejemplo, una cuenta con Autorización para depositar puede finalizar un [Escrow](../payment-types/escrow.md) que fue iniciado por un desconocido. + +Por defecto, las cuentas nuevas tienen DepositAuth desactivado y pueden recibir XRP de cualquiera. + +## Trasfondo + +Las regulaciones y licencias para servicios financieros pueden requerir a un negocio o entidad que deba conocer al remitente de todas las transacciones que recibe. Esto presenta un desafio en un sistema descentralizado como el XRP Ledger donde participantes son identificados con pseudónimos que son libremente generados y el comportamiento predeterminado es que cualquier dirección puede pagar a otra. + +La marca (flag) de Deposit Authorization introduce una opción para aquellos que utilizan el XRP Ledger para cumplir con las regulaciones sin cambiar la naturaleza fundamental del ledger descentralizado. Con La Autorización para depositar activada, una cuenta solo puede recibir fondos explícitamente aprobados enviando una transacción. El dueño de la uenta utilizando Deposit Authorization puede realizar la diligencia necesaria para identificar al remitente de cualquier fondo _antes_ de enviar la transacción que cuasa que la cuenta reciba el dinero. + +Cuando tienes la opción Deposit Authorization activada, puedes recibir dinero de [Checks](/resources/known-amendments.md#checks), [Escrow](../payment-types/escrow.md), y [Payment Channels](/resources/known-amendments.md#paychan). En esas transacciones de tipo "dos pasos", primero el origen manda una transacción para autorizar los fondos, después el destinatario manda una transacción que autoriza recibir esos fondos. + +Para recibir dinero de [transacciones Payment][] cuando tienes la opción Deposit Authorization activada, debes [preautorizar](#preautorización) los remitentes de esos Payments. _(Añadido por la [enmienda DepositPreauth][].)_ + +## Uso recomendado + +Para conseguir un efecto total de Deposit Authorization, Ripple recomienda además hacer lo siguiente: + +- Siempre mantener un balance en XRP superior al mínimo del [requisito de reserva](reserves.md). +- Mantener la marca (flag) Default Ripple en su estado por defecto (desactivada). No actives [rippling](../tokens/fungible-tokens/rippling.md) en ninguna trust lines. Cuando envíes [transacciones TrustSet][], siempre utiliza el [flag `tfSetNoRipple`](../../references/protocol/transactions/types/trustset.md). +- No crees [Offers](../../references/protocol/transactions/types/offercreate.md). Es imposible conocer de antemano que ofertas coincidentes serán utilizadas para ejecutar dicha operación. + +## Precisión en la semántica + +Una cuenta con Deposit Authorization activado: + +- **No puede** ser destinatario de [transacciones Payment][], con **las siguientes excepciones**: + - Si el destinatario tiene [preautorizado](#preautorización) al remitente del pago. _(Añadido con la [enmienda DepositPreauth][])_ + - Si el balance XRP de la cuenta es igual o inferior al [requisito de reserva](reserves.md) de la cuenta, puede ser el destinatario de un pago XRP cuya cantidad `Amount` es igual o menor que el mínimo de reserva de la cuenta (actualmente 10 XRP). Esto es para prevenir a una cuenta de quedarse "atascada" no siendo posible enviar transacciones ni tampoco recibir XRP. La reserva de la cuenta del propietario no importa en este caso. +- Puede recibir XRP de [transacciones PaymentChannelClaim][] **únicamente en los siguientes casos**: + - El remitente de la transacción PaymentChannelClaim es el destino del canal de pago (payment channel). + - El destino de la transacción del PaymentChannelClaim tiene [preautorizado](#preautorización) al remitente del PaymentChannelClaim. _(Añadido en la [enmienda DepositPreauth][])_ +- Puede recibir XRP de [transacciones EscrowFinish][] **únicamente en los siguientes casos**: + - El remitente de una transacción EscrowFinish es el destino de un escrow. + - El destino de una transacción EscrowFinish tiene [preautorizado](#preautorización) al remitente de un EscrowFinish. _(Añadido en la [enmienda DepositPreauth][])_ +- **Puede** recibir XRP o tokens enviando una transacción [CheckCash][]. _(Añadido por la [enmienda Checks][].)_ +- **Puede** recibir XRP o tokens enviando [transacciones OfferCreate][]. + - Si la cuenta envía una transacción OfferCreate que no está completamente ejecutada in mediatamente, **puede** recibir el resto del XRP o token solicitado después cuando la oferta sea consumida por otras transacciones [Payment][] y [OfferCreate][] de la cuenta. +- Si la cuenta ha creado cualquier línea de confianza (trust lines) sin la marca [No Ripple flag](../tokens/fungible-tokens/rippling.md) activada, o ha activado el flag Default Ripple y emitido una moneda, la cuenta **puede** recibir los tokens de esas trust lines en [transacciones Payment][] como resultado del rippling. No puede ser el destino de esas transacciones. +- En general, una cuenta en el XRP Ledger **no puede** recibir divisas no-XRP en el XRP Ledger mientras que lo siguiente sea cierto. (Esta regla no es específica del flag DepositAuth.) + - La cuenta no ha creado trust lines con límites distintos a cero. + - La cuenta no ha emitido tokens en trust lines creadas por otros. + - La cuenta no ha generado ninguna oferta. + +La siguiente tabla resume cuando un tipo de transacción puede depositar dinero con DepositAuth activado o desactivado: + +{% partial file="/docs/_snippets/depositauth-semantics-table.md" /%} + + + +## Activar o desactivar Deposit Authorization + +Una cuenta puede activar la autorización de depositar enviando una [transacción AccountSet][] con el campo `SetFlag` con el valor de `asfDepositAuth` (9). La cuenta puede desactivar la autorización de depositar enviando una [transacción AccountSet][] con el campo `ClearFlag` con el valor de `asfDepositAuth` (9). Para más información sobre flags en AccountSet, consultar [AccountSet flags](../../references/protocol/transactions/types/accountset.md). + +## Comprobar cuando una cuenta tiene DepositAuth activado + +Para ver cuando una cuenta tiene Deposit Authorization activado, utiliza el [método account_info][] para mirar en la cuenta. Compara el valor de los campos `Flags` (en el objeto `result.account_data`) con los [bitwise flags definidos para un objeto de ledger AccountRoot ](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md). + +Si el resultado de los valores bitwise `Flags` Y el valor del flag `lsfDepositAuth` (`0x01000000`) es distinto a cero, entonces la cuenta tiene el DepositAuth activado. Si el resultado es cero, entonces la cuenta tiene DepositAuth desactivado. + +## Preautorización + +_(Añadido por la [enmienda DepositPreauth][].)_ + +Las cuentas con DepositAuth activado pueden _preautorizar_ ciertos remitentes, para permitir pagos desde esos remitentes sean realizados aunque DepositAuth esté activado. Eseto permite a remitentes específicos enviar directamente fondos sin que el que vaya recibirlos tenga que tomar una acción para cada transacción individualmente. La preautorización no es obligatoria para usar DepositAuth, pero puede hacer ciertas opereaciones más sencillas. + +La preautorización es agnóstica en cuanto a divisas. No puede preautorizar cuentas para solo una moneda específicamente. + +Para preautorizar a un remitente en particular, envía una [transacción DepositPreauth][] con la dirección de otra cuenta para preautorizar en el campo `Authorize`. Para revocar la preautorización, facilita la dirección de la otra cuenta en el campo `Unauthorize`. Especifica tu propia dirección en el campo `Account` como de normal. Puedes preautorizar o desautorizar cuentas incluso si acutalmente no tienes activado DepositAuth; el estado preautorización que seleccionas para otras cuentas se guarda, pero no tiene efecto a no ser que actives DepositAuth. Una cuenta no puede preautorizarse a si misma. Las preautorizaciones son unidireccionales, y no tienen efecto en pagos que van en la otra dirección. + +Preautorizar otra cuenta añade un [objeto DepositPreauth](../../references/protocol/ledger-data/ledger-entry-types/depositpreauth.md) al ledger, el cual incrementa la [reserva del propietario](reserves.md#owner-reserves) de la cuenta que provee la autorización. Su la cuenta revoca la preautorización, elimina el objeto y hace decrecer las reservas del propietario. + +Una vez que la transacción DepositPreauth ha sido procesada, la cuenta autorizada puede enviar fondos a tu cuenta, incluso si tienes DepositAuth activado, usando cualquiera de los siguientes tipos de transacción: + +- [Payment][] +- [EscrowFinish][] +- [PaymentChannelClaim][] + +Las preautorización no tiene efecto sobre las otras formas de enviar dinero a una cuenta con DepositAuth activado. Ver [Precisión en la semántica](#precise-semantics) para las reglas exactas. + +### Comprobar la autorización + +Puedes utilizar el [método deposit_authorized][] para ver si una cuenta esta autorizada para despositar en otra cuenta. Este método comprueba dos cosas: + +- Si la cuenta de destino requiere de Deposit Authorization. (Si no requiere de autorización, todas las cuentas de origen son consideradas autorizadas.) +- Si la cuenta de origen es preautorizada para enviar dinero al destino. + + +## Ver también + +- La referencia [transación DepositPreauth][]. +- El [tipo de objeto del ledger DepositPreauth](../../references/protocol/ledger-data/ledger-entry-types/depositpreauth.md). +- El [método deposit_authorized][] de la [API `rippled`](../../references/http-websocket-apis/index.md). +- La característica [Authorized Trust Lines](../tokens/fungible-tokens/authorized-trust-lines.md) (`RequireAuth` flag) limita que contrapartes pueden poseer divisas no-XRP en la cuenta. +- El flag `DisallowXRP` indica que una cuenta no puede recibir XRP. Es una protencción más suave que Deposit Authorization, y no la aplica el XRP Ledger. (Las aplicaciones cliente deberían respetar este flag o al menos avisar de ello.) +- El flag `RequireDest` indica que una cuenta solo puede recibir cantidades de divisas si se especifica un [Destination Tag](../transactions/source-and-destination-tags.md). Esto protege a usuarios de olvidar incluir el propósito del pago, pero no protege a los destinatarios de remitentes desconocidos que pueden añadir destination tags arbitrarios. +- [Pagos parciales](../payment-types/partial-payments.md) provee una forma para que cuentas puedan devolver pagos no deseados restando los [costes de transferencia](../tokens/transfer-fees.md) y los ratios de exchanges de la cantidad enviada en lugar de sumarlos a la cantidad enviada. + + + +[enmienda DepositPreauth]: /resources/known-amendments.md#depositpreauth + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/index.md b/@i18n/es-ES/docs/concepts/accounts/index.md new file mode 100644 index 0000000000..cd00e9410f --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/index.md @@ -0,0 +1,69 @@ +--- +html: accounts.html +parent: concepts.html +seo: + description: Aprende sobre cuentas en el XRP Ledger. AccouLas cuentas pueden enviar transacciones y almacenar XRP. +labels: + - Cuentas + - Pagos +--- +# Cuentas + +Una "Cuenta" en el XRP Ledger representa a un titular de XRP y a un emisor de [transacciones](../../references/protocol/transactions/index.md). + +Una cuenta consiste en una dirección, un balance en XRP, un número de secuencia y un historial de sus transacciones. Para poder enviar transacciones, el dueño también necesita uno o más pares de claves criptográficas asociadas con la cuenta. + + +## Estructura de la cuenta + + Los elementos principales de una cuenta son: + +- Una **cuenta** identificable, como `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn`. +- Un **balance en XRP**. Parte de este XRP se aparte para la [Reserva](reserves.md). +- Un **número de secuencia**, el cual ayuda a asegurar que cualquier transacción que esta cuenta envíe se aplique en el orden correcto y solo una vez. Para ejecutar una transacción, el número de secuencia de la transacción y el número de secuencia de su remitente deben coincidir. Después, como parte de la aplicación de la transacción, el número de secuencia de la cuenta incrementa en 1. (Ver también: [Tipos de datos básicos: Secuencia de cuenta](../../references/protocol/data-types/basic-data-types.md#account-sequence).) +- Un **histórico de transacciones** que afectaron a la cuenta y sus balances. +- Una o más maneras de [autorizar transacciones](../transactions/index.md#authorizing-transactions), posiblemente incluyendo: + - Un par de claves maestras intrínseco a la cuenta. (Esto puedes desactivarse pero no cambiarse.) + - Una par de claves "normales" ("regular" en inglés) que se pueden rotar. + - Una lista de firmantes para [multi-firma](multi-signing.md). (Almacenado por separado de los datos principales de la cuenta.) + +Los datos principales de una cuenta se guardan en una entrada del ledger [AccountRoot](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md). Una cuenta puede ser también el dueña (o parcialmente dueña) de varios otros tipos de entradas del ledger. + +**Consejo:** Una "Cuenta" en el XRP Ledger está en algún lugar entre el uso financiero (como una "cuenta bancaria") y el uso informático (como una "cuenta UNIX"). Las monedas y activos no XRP no se guardan en una cuenta del XRP Ledger en sí misma; cada uno de estos activos se almacena en una relación contable llamada "Línea de confianza" (trust line en inglés) que conecta a dos partes. + + +## Creación de cuentas + +No hay una transacción dedicada a "crear una cuenta". La [transacción Payment][] automáticamente crea una nueva cuenta si el pago envía suficiente XRP a una dirección matemáticamente válida que aún no tiene una cuenta. Esto se llama _finnaciar_ una cuenta, y crea una [entrada AccountRoot](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md) en el ledger. No hay otra transacción que cree una cuenta. + +**Atención:** Financiar una cuenta **no te da** privilegios especiales sobre esa cuenta. Quien tenga la clave secreta correspondiente a la dirección de la cuenta tiene control total sobre la cuenta y todo el XRP que contiene. Para algunas direcciones, es posible que nadie tenga la clave secreta, en este caso la cuenta es un agujero negro [black hole](addresses.md#special-addresses) y el XRP se pierde para siempre. + +La forma típica de obtener una cuenta en el XRP Ledger es la siguiente: + +1. Genera un par de claves desde una fuente de fuerte aleatoriedad y calcula la dirección de ese par de claves. + +2. Hacer que alguien que ya tenga una cuenta en el XRP Ledger envíe XRP a la dirección que generaste. + + - Por ejemplo, puedes comprar XRP en un exchange privado, después retirar el XRP del exchange a la dirección que especificaste. + + **Atención:** La primera vez que recibes XRP en tu propia dirección del XRP Ledger, debes pagar la [reserva de la cuenta](reserves.md) (actualmente 10 XRP), lo que bloquea esa cantidad de XRP indefinidamente. En contraste, los exchanges privados suelen almacenar todo el XRP de los clientes en unas pocas cuentas del XRP Ledger compartidas, así los clientes no tienen que pagar la reserva de cuentas individuales en el exchange. Antes de retirar XRP, considera si pagar el precio de tener tu propia cuenta en el XRP Ledger merece la pena. + + + +## Ver también + +- **Conceptos:** + - [Reservas](reserves.md) + - [Claves criptográficas](cryptographic-keys.md) + - [Cuentas emisoras y operacionales](account-types.md) +- **Referencias:** + - [Método account_info][] + - [Método wallet_propose][] + - [Transacción AccountSet][] + - [Transacción Payment][] + - [Objeto AccountRoot](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md) +- **Tutoriales:** + - [Administrar configuración de la cuenta (Categoría)](../../tutorials/how-tos/manage-account-settings/index.md) + - [Monitorizar pagos entrantes con WebSocket](../../tutorials/http-websocket-apis/build-apps/monitor-incoming-payments-with-websocket.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/multi-signing.md b/@i18n/es-ES/docs/concepts/accounts/multi-signing.md new file mode 100644 index 0000000000..3bee2e4d0d --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/multi-signing.md @@ -0,0 +1,86 @@ +--- +html: multi-signing.html +parent: accounts.html +seo: + description: Utiliza la firma múltiple para mayor seguridad enviando transacciones. +labels: + - Smart Contracts + - Seguridad +--- +# Multi-Signing + +La firma múltiple o multi-signing en el XRP Ledger es un método para [autorizar transacciones](../transactions/index.md#authorizing-transactions) para el XRP Ledger usando una combinación de múltiples claves secretas. Puedes tener cualquier combinación de métodos de autorización activados para tu dirección, incluido el multi-signing, un [par de claves maestras](cryptographic-keys.md#par-de-claves-maestras), y un [par de claves normales](cryptographic-keys.md#par-de-claves-normales). (El único requisito es que _al menos un_ método debe estar activado.) + +Los beneficios del multi-signing incluyen: + +- Puedes requerir claves de distintos dispositivos, por lo que un actor malicioso deberá comprometer múltiples dispositivos para enviar transacciones en tu nombre. +- Puedes compartir la custodia de una cuenta entre varias personas, cada una de las cuales tiene una de las varias claves necesarias para enviar transacciones desde esa dirección. +- Puedes delegar el poder de enviar transacciones desde una dirección a un grupo de personas, puedes controlar tu dirección si no estás disponible o no puedes firmar normalmente. + +## Las listas de firmantes + +Antes de poder hacer multi-sign, debes crear una lista de direcciones que pueden firmar por ti. + +La [transacción SignerListSet][] define una _lista de firmantes_, un conjunto de direcciones que pueden autorizar una transacción desde tu dirección. Puedes incluir de 1 a 32 direcciones en la lista de firmantes. La lista no puede incluir tu dirección y no se puede duplicar las entradas. Puedes controlar cuantas firmas son necesarias, en que combinaciones, utilizando las opciones _Signer Weight_ (Peso de firmante) y _Quorum_ en la lista. + +_(Actualizado por la [enmienda ExpandedSignerList][].)_ + +### Peso del firmante + +Asignas un peso a cada firmantes de la lista. El peso representa la autoridad del firmante relativa a otros firmantes de la lista. Mientras más alto el valor, más autoridad. Los pesos individuales no pueden exceder 216-1. + +### Cuórum + +El valor cuórum de una lista es una peso mínimo total requerido para autorizar la transacción. El cuórum debe ser mayor a 0 pero menor o igual a la suma de los valores de los pesos en la lista de firmantes: lo que significa, que debe ser posible conseguir un cuórum con los pesos de firmante dados. + +### Localizador de cartera + + +También puedes añadir hasta 256 bits de datos arbitrarios para cada entrada por firmante de la lista. Estos datos no son necessarios o usados por la red, pero pueden ser utilizados por smart contracts u otras aplicaciones para identificar o confirmar otros datos sobre los firmantes. + +_(Añadido en la [enmienda ExpandedSignerList][].)_ + + +### Ejemplos uitilzando Signer Weight y Quorum + +Los pesos y el cuórum te permiten establecer un nivel apropiado de supervisión para cada transacción, en función de la confianza relativa y la autoridad relegada a los responsables que administran la cuenta. + +Para un caso de uso de una cuenta compartida, deberías crear una lista con un cuórum de 1, luego dar a todos los participantes un peso de 1. Una sola aprobación de uno de los participantes es necesario para aprobar una transacción. + +Para una cuenta muy importante, puedes configurar un cuórum de 3, con 3 partiicpantes que tienen un peso de 1. Todos los participantes deben estar de acuerdo y aprobar su transacción. + +Otra cuenta también podría tener un cuórum de 3. Asignas a tu CEO un peso de 3, 3 vicepresidentes un peso de 2 a cada uno, y 3 directores un peso de 1 a cada uno. Para aprobar una transacción en esta cuenta se requiere la aprobación de los 3 directores (peso total de 3), 1 vicepresidente y 1 director (peso total de 3), 2 vicepresidentes (peso total de 4), o del CEO (peso total de 3). + +En cada uno de los tres ejemplos anteriores, deshabilitarías la clave maestra sin configurar la clave normal, así la única forma de [autorizar transactiones](../transactions/index.md#authorizing-transactions) es el multi-signing. + +Podría darse el caso donde crees una lista de multi firma como "plan de respaldo". El dueño de la cuenta normalmente usa la clave normal para sus transacciones (no una clave multi-signing). Por seguridad, el propietario añade una lista de firmantes que contiene a 3 amigos, los tres con un peso de 1, y un cuórum de 3. Si el propietario de la cuenta perdiese la clave privada, puede pedir a sus amigos que multi firmen una transacción para reemplazar la clave normal. + + +## Mandar transacciones Multi-Signed + +Para enviar transacciones multi-signed de forma satisfactoria, debes de hacer todo lo siguiente: + +* La dirección que envía la transacción (especificada en el campo `Account`) debe tener un [objeto `SignerList` en el ledger ](../../references/protocol/ledger-data/ledger-entry-types/signerlist.md). Para instrucciones de cómo hacer esto, ver [Set Up Multi-Signing](../../tutorials/how-tos/manage-account-settings/set-up-multi-signing.md). +* La transacción debe incluir el campo `SigningPubKey` como un valor vacío. +* La transacción debe incluir el [campo `Signers`](../../references/protocol/transactions/common-fields.md#signers-field) conteniendo un array de firmas. +* Las firmas presentadas en el array `Signers` debe coincidir con los firmantes definidos en la `SignerList`. +* Para las firmas presentadas, el peso total asociado con esos firmantes debe ser igual o mayor al cuórum de la `SignerList`. +* El [coste de transacción](../transactions/transaction-cost.md) (especificado en el campo `Fee`) debe ser al menos (N+1) veces el coste de una transacción normal, donde N es el número de firmas presentadas. +* Todos los campos de la transacción deben ser definidos antes de recolectar las firmas. No puedes [auto-rellenar](../../references/protocol/transactions/common-fields.md#auto-fillable-fields) los campos. +* Si se presenta en forma binaria, el array de `Signers` debe estar ordenado en base al valor números de las direcciones de los firmantes, con el valor menor, primero . (Si se envía como JSON, el [método submit_multisigned][] se ocupa de ello automáticamente.) + +## Ver también + +- **Tutoriales:** + - [Configurar Multi-Signing](../../tutorials/how-tos/manage-account-settings/set-up-multi-signing.md) + - [Envíar una transacción Multi-Signed](../../tutorials/how-tos/manage-account-settings/send-a-multi-signed-transaction.md) +- **Conceptos:** + - [Claves criptográficas](cryptographic-keys.md) + - [Coste de transacción especial para transacciones Multi-signed](../transactions/transaction-cost.md#special-transaction-costs) +- **Referencias:** + - [Transacción SignerListSet][] + - [Objeto SignerList](../../references/protocol/ledger-data/ledger-entry-types/signerlist.md) + - [método sign_for][] + - [método submit_multisigned][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/reserves.md b/@i18n/es-ES/docs/concepts/accounts/reserves.md new file mode 100644 index 0000000000..b09442550d --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/reserves.md @@ -0,0 +1,81 @@ +--- +html: reserves.html +parent: accounts.html +seo: + description: Las cuentas XRP Ledger exigen una reserva de XRP para reducir el spam en la información del ledger. +labels: + - Comisiones + - Cuentas +top_nav_grouping: Páginas populares +--- +# Reservas + +El XRP Ledger aplica un _requisito de reserva_, en XRP, para proteger el ledger global compartido de crecer excesivamente como resultado del spam o del uso malicioso. El objetivo es limitar el crecimiento del ledger para coincida con las mejoras tecnológicas de tal forma que un equipo basico actual pueda siempre tener el ledger actual en RAM. + +Para tener una cuenta, una dirección debe tener una cantidad mínima de XRP en el ledger global compartido. Para financiar una nueva dirección, debes recibir el suficiente XRP en la dirección para coincidir con el requisito de reserva. No puedes enviar el XRP reservado a otros, pero puedes recuperar parte del XRP si [eliminas la cuenta](deleting-accounts.md). + +El requisito de reserva cambia de tanto en tanto debido al proceso de [Votación de fees](../consensus-protocol/fee-voting.md), donde los validadores pueden estar de acuerdo con nuevas configuraciones de reservas. + +## Reserva base y reserva de propietario + +Los requisito de reserva consta de dos partes: + +* La **reserva base** es la cantidad mínima de XRP que es necesaria para cada dirección en el ledger. +* La **reserva de propietario** es un incremento del requisito de reserva por cada objeto que la dirección posee en el ledger. El coste por artículo se le conoce como _reserva incremental_. + +Los requerimientos de reserva actuales en Mainnet son: + +- Reserva base: **10 XRP** +- Reserva de propietario: **2 XRP** por artículo + +Reservas en otras redes pueden variar. + +## Reservas de propietario + +Muchos objetos en el ledger (entradas en el ledger) pertenecen a una cuenta en particular. Normalmente, el propietario es una cuenta que ha creado el objeto. Cada objeto aumenta el requisito de reserva total en la reserva de propietario. Cuando los objetos son eliminados del ledger, ya no cuentan para el requisito de reserva. + +Los objetos que cuentan para el requisito de de reserva de su propietario son: [Cheques](../payment-types/checks.md), [Preatutorizaciones para depositar](depositauth.md#preauthorization), [Escrows](../payment-types/escrow.md), [Ofertas NFT](../tokens/nfts/trading.md), [Páginas NFT](../tokens/nfts/index.md), [Ofertas](../../references/protocol/ledger-data/ledger-entry-types/offer.md), [Canales de pago](../payment-types/payment-channels.md), [Listas de firmantes](multi-signing.md), [Tickets](tickets.md), y [Trust Lines](../tokens/fungible-tokens/index.md). + +Algunos casos especiales: + +- Non-Fungible Tokens (NFTs) están agrupados en páginas que contienen hasta 32 NFTs en cada una, y la reserva de propietario aplica por página más que por NFT. Debido al mecanismo para dividir y combinar páginas, la cantidad de NFTs almacenados por página puede variar. Ver también: [Reserva para objetos NFTokenPage](../../references/protocol/ledger-data/ledger-entry-types/nftokenpage.md#nftokenpage-reserve). +- Trust lines (entradas `RippleState`) son compartidas entre dos cuentas. La reserva del propietario puede aplicar a una o ambas. La mayoría de veces, el poseedor del token debe una reserva y el emisor no. Ver también: [RippleState: Contribuyendo a las reservas de propietario](../../references/protocol/ledger-data/ledger-entry-types/ripplestate.md#contributing-to-the-owner-reserve). +- Listas de firmantes creadas antes de la [enmienda MultiSignReserve][] activada en abril de 2019 cuentacon múltiples objetos. Ver también: [Listas de firmantes y reservas](../../references/protocol/ledger-data/ledger-entry-types/signerlist.md#signer-lists-and-reserves). +- Un [Directorio de propietario](../../references/protocol/ledger-data/ledger-entry-types/directorynode.md) es una entrada del ledger que lista todos los objetos relacionados a una cuenta, incluyendo toods los objetos que la cuenta posee. Sin embargo, el directorio del propietario en sí no cuenta para la reserva. + +### Buscando las reservas + +Las aplicaciones pueden buscar los valores de las reservas base e incremental actuales utilizando el [método server_info][] o el [método server_state][]: + +| Método | Unidades | Campo de reserva base | Campo de reserva incremental | +|-------------------------|----------------------|-------------------------------------|------------------------------------| +| [método server_info][] | Decimal XRP | `validated_ledger.reserve_base_xrp` | `validated_ledger.reserve_inc_xrp` | +| [método server_state][] | Drops enteros de XRP | `validated_ledger.reserve_base` | `validated_ledger.reserve_inc` | + +Para determinar las reservas de propietario de una cuenta, hay que multiplicar la reserva incremental por el número de objetos que la cuenta posee. Para mirar el número de objetos que una cuenta posee, llama al [método account_info][] y toma `account_data.OwnerCount`. + +Para calcular el requisito total de direcciones, multiplica `OwnerCount` por `reserve_inc_xrp`, y luego suma `reserve_base_xrp`. [Aquí tienes una demostración](../../tutorials/python/build-apps/build-a-desktop-wallet-in-python.md#codeblock-17) del cálculo en Python. + + +## Quedarse por debajo del requisito de reserva + +Durante el procesamiento de transacciones, el [coste de transacción](../transactions/transaction-cost.md) destruye parte del XRP del saldo de la dirección que envía la transacción. Esto puede causar que una dirección XRP se quede por debajo del requisito de reserva. Puedes incluso destruir _todo_ tu XRP de esta forma. + +Cuando tu cuenta posee menos XRP XRP que el requisito actual de reserva, no puedes enviar XRP a otros, o crear nuevos objetos que incremente el requisito de reserva de la cuenta. Aun así, la cuenta continua existiendo en el ledger y puedes enviar transacciones que no hagan esas cosas, siempre que tengas suficiente XRP para pagar el coste de transacción. Puedes volver a superar el requisito de reserva recibiendo suficiente XRP, o si el requisito de reserva decrece debajo de la cantidad que tiene. + +**Consejo:** Si tu dirección está debajo del requisito de reserva, puedes enviar unas [transacciones OfferCreate][] para aadquirir más XRP y volver a superar el requisito de reeerva. Sin embargo, dado que no puedes crear una [entrada en el ledger Offer](../../references/protocol/ledger-data/ledger-entry-types/offer.md) cuando estás por debajo de la reserva, esta transacción puede consumir solo Offers que ya esté en el libro de ordenes. + + +## Cambiar los requisitos de reserva + +El XRP Ledger tiene un mecanismo para ajustar los requisitos de reserva. Estos ajustes pueden considerar, por ejemplo, cambios a largo plazo del valor de XRP, mejoras en la capacidad del hardware de los equipos convencionales, o una eficiencia incrementada en la implementación del software del servidor. Cualquier cambio tiene que ser aprobado por un proceso de consenso. Ver [Votación de fee](../consensus-protocol/fee-voting.md) para más información. + +## Ver también + +- [método account_objects][] +- [Objeto AccountRoot][] +- [Votación de Fee](../consensus-protocol/fee-voting.md) +- [Pseudo-transacción SetFee][] +- [Tutorial: Calcular y mostrar los requisitos de reserva (Python)](../../tutorials/python/build-apps/build-a-desktop-wallet-in-python.md#3-display-an-account) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/accounts/tickets.md b/@i18n/es-ES/docs/concepts/accounts/tickets.md new file mode 100644 index 0000000000..4967187f8c --- /dev/null +++ b/@i18n/es-ES/docs/concepts/accounts/tickets.md @@ -0,0 +1,73 @@ +--- +html: tickets.html +parent: accounts.html +seo: + description: Envía transacciones en un orden no secuencial. +labels: + - Cuentas + - Enviar transacciones +--- +# Tickets + +_(Añadido por la [enmienda TicketBatch][].)_ + +Un Ticket en el XRP Ledger es una forma de reservar un [número secuencia][Sequence Number] para una transacción que no se envía de inmediato. Los tickets permiten que transacciones sean enviadas fuera del orden de secuencia normal. Un caso de uso de esto es permitir [transacciones multi-signed](multi-signing.md) donde tomará un tiempo recolectar las firmas necesarias: mientras se recogen las firmas para una transacción que utiliza un Ticket, puedes enviar otras transacciones. + +## Transfondo + +Las [transacciones](../transactions/index.md) tienen números de secuencia para que una transacción determinada no pueda ejecutarse más que una vez. Los números de secuencia también se aseguran de que la transacción dada sea única: si envías la misma cantidad de dinero a la misma persona varias veces, el número de secuencia es un detalle que se garantiza que será diferente cada vez. Finalmente, los números de secuencia brindan una una forma felegante de ordenar las transacciones de forma consistente, incluso si algunas de ellas llegan desordenadas cuando se envían desordenadas a través de la red. + +Sin embargo, hay situaciones donde los números de secuencia son demasiado limitantes. Por ejemplo: + +- Dos o más usuarios comparten acceso a una cuenta, cada una con la habilidad de enviar transacciones independientemente. Si esos usuarios intentan enviar transacciones al mismo tiempo sin coordinarse primero, cada uno de ellos puede utilizar el mismo número de secuencia para diferentes transacciones, y sólo uno lo conseguirá. +- Puede que quieras preparar y firmar una transacción por adelantado, luego guardarla en algún sitio seguro para que se pueda ejecutar en algún momento del futuro si ciertos eventos ocurren. Sin embargo, si quieres continuar usando la cuenta de forma normal mientras tanto, no sabes que número de secuencia apartar para la transacción. +- Cuando [múltiples personas deben firmar una transacción](multi-signing.md) para hacerla válida, puede ser dificil planificar más de una transacción a la vez. Si numeras las transacciones con números de secuencia separados, no puedes enviar transacciones numeradas más tarde hasta que todo el mundo haya firmado las transacciones anteriores; pero si usas el mismo número de secuencia para cada transacción pendiente, solo una de ellas podrá ocurrir. + +Los Tickets facilitan una solución para todos estos problemas apartando números de secuencia que se pueden uitlizar más adelante, fuera de su orden normal, pero aún así no más de una vez cada uno. + + +## Los tickets son números de secuencia reservados + +Un Ticket es un registro de que se ha apartado un número de secuencia para utilizar más adelante. Una cuenta envía primero una [transacción TicketCreate][] para apartar una o más números de secuencia como Tickets; esto deja un registro en los [datos de estado del ledger](../ledgers/index.md), en la forma de un [objeto Ticket][], para cada número de secuencia reservado. + +Los Tickets están numerados usando los números de secuencia que han sido apartado para crearlos. Por ejemplo, si un número de secuencia de cuenta actual es 101 y has creado 3 Tickets, esos Tickets tienen los números de secuencia de Ticket 102, 103, y 104. Haciendo esto se incrementa el número de secuencia de la cuenta a 105. + +[{% inline-svg file="/docs/img/ticket-creation.svg" /%}](/docs/img/ticket-creation.svg "Diagrama: Creación de tres tickets") + +Más tarde, puedes enviar una transacción utilizando un Ticket específico en vez de un número de secuencia; haciendo eso eliminas el Ticket correspondiente de los datos de estado del ledger y no cambia el número de secuencia normal de tu cuenta. También puedes todavía enviar transacciones utilizando el números de secuencia normal sin utilizar Tickets. Puedes utilizar cualquiera de tus Tickets disponibles en cualquier orden en cualquier momento, pero cada Ticket puede utilizarse solo una vez. + +[{% inline-svg file="/docs/img/ticket-usage.svg" /%}](/docs/img/ticket-usage.svg "Diagrama: Usando el ticket 103.") + +Continuando con el ejemplo anterior, puedes enviar una transacción utilizando el número de secuencia 105 o cualquiera de los tres Tickets que has creado. Si envías una transacción utilizando el Ticket 103, esto eliminará el Ticket 103 del ledger. Tu próxima transacción despues de esa puede uitlizar el número de secuencia 105, el Ticket 102, o el Ticket 104. + +**Atención:** Cada Ticket cuenta como un objeto separado para la [reserva de propietario](reserves.md), así que debes apartar 2 XRP por cada Ticket. (El XRP vuelve a estar disponible una vez que se haya utilizado el Ticket.) Este coste puede subir rápidamente si creas un grán número de Tickets a la vez. + +Como con los números de secuencia, enviar una transacción consume el Ticket _si y solo si_ la transacción es confirmada por [consenso](../consensus-protocol/index.md). Sin embargo, las transacciones que fallan en hacer lo que intentaban pueden ser confirmadas por el consenso con los [códigos de resultado de clase`tec`](../../references/protocol/transactions/transaction-results/tec-codes.md). + +Para conocer qué Tickets tiene una cuenta disponibles, utiliza los [métodos account_objects][]. + +## Limitaciones + +Cualquier cuenta puede crear y utilizar Tickets en cualquier tipo de transacciones. Sin embargo, puede haber algunas restricciones: + +- Cada Ticket puede ser utilizado solo una vez. Es posible tener múltiples transacciones diferentes candidatas que podrían usar el mismo Ticket Secuencia, pero solo uno de esos candidatos será validado por el consenso. +- Una cuenta no puede tener más de 250 Tickets en el ledger a la vez. No puedes crear más de 250 Tickets a la vez, tampoco. +- _Puedes_ usar un Ticket para crear más Tickets. Si lo haces, el Ticket utilizado no cuenta para el número total de Tickets que puedes tener a la vez. +- Cada Ticket cuenta para la [reserva de propietario](reserves.md), por lo que debes apartar 2 XRP por cada Ticket que no has usado todavía. El XRP vuelve a estar disponible para ti despues de utilizar el Ticket. +- Dentro de un ledger individual, las transacciones que usan Tickets se ejecutan después que otras transacciones desde el mismo remitente. Si una cuenta tiene múltiples transacciones utilizando Tickets en la misma versión del ledger, esos Tickets se ejecutan en orden desde el Ticket con la secuencia más baja hasta la más alta. (Para más información, ver la documentación del [orden canónico](../consensus-protocol/consensus-structure.md#calculate-and-share-validations) del consenso.) +- Para "cancelar" un Ticket, usa el Ticket para [realizar una operación no operativa](../transactions/finality-of-results/canceling-a-transaction.md) [transacción AccountSet][]. Esto elimina el Ticket y tu no tienes que cumplir con los requisitos de reserva. + +## Ver también + + +- **Conceptos:** + - [Multi-Signing](multi-signing.md) +- **Tutoriales:** + - [Usar Tickets](../../tutorials/how-tos/manage-account-settings/use-tickets.md) +- **Referencias:** + - [Transacción TicketCreate][] + - [Campos comunes de una transacción](../../references/protocol/transactions/common-fields.md) + - [Objeto Ticket](../../references/protocol/ledger-data/ledger-entry-types/ticket.md) + - [Método account_objects ][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-principles-and-rules.md b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-principles-and-rules.md new file mode 100644 index 0000000000..5f347840bb --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-principles-and-rules.md @@ -0,0 +1,131 @@ +--- +html: consensus-principles-and-rules.html +parent: consensus.html +seo: + description: Las reglas y principios del algoritmo de consenso que permite a los usuarios para transferir fondos (incluidas divisas fiat, divisas digitales y cualquier otra forma de valor) a través de fronteras nacionales igual de facil que enviar un correo electrónico. +labels: + - Blockchain +--- +# Los principios y reglas del consenso + +El XRP Ledger es un sistema de pagos universal que permite a los usuarios transferir fondos a través de fronteras nacionales de la misma forma que se envía un correo electrónico. Como otras redes de pagos peer-to-peer como Bitcoin, el XRP Ledger permite transacciones de liquidación peer-to-peer a través de una red descentralizada de ordenadores. A diferencia de otros protocolos de divisas digitales, el XRP Ledger permite a los usuarios denominar sus transacciones con cualquier divisa que prefieran, incluyendo divisas fiat, divisas digitales y cualquier otra forma de valor, y XRP (el activo nativo del XRP Ledger). + +La tencología del XRP Ledger permite liquidaciones casi en tiempo real (de tres a seis segundos) y contiene un exchange descentralizado, donde los pagos automáticamente usan las ordenes de intercambio de divisas más baratas para conectar divisas. + +## Transfondo + +### Mecánicas + +Principalmente, el XRP Ledger es una base de datos compartida que registra información como cuentas, balances, y ofertas para comerciar con activos. Las instrucciones firmadas llamadas "transacciones" generan cambios como la creación de cuentas, generación de pagos, y comerciar activos. + +Como sistema criptográfico, los dueños de cuentas del XRP Ledger son identificados como _identidades criptográficas_, las cuales corresponden a pares de claves públicas/privadas. Las transacciones son autorizadas por firmas criptográficas que coinciden con esas identidades. Cada servidor procesa cada transacción de acuerdo con las mismas reglas deterministas conocidas. Finalmente, el objetivo es para cada servidor en la red tener una copia completa de exactamente el estado del mismo ledger, sin necesidad de una única autoridad central que arbitre las transacciones. + + +### El problema del doble gasto + +El problema del "doble gasto" es un desafío fundamental para cualquier sistema de pagos digital. El problema viene del requisito de que cuando el dinero es gastado en un sitio, no puede ser gastado en otro lugar. Generalmente, el problema ocurre cuando tiene dos transacciones cualesquiera de las cuales una es válida pero no ambas juntas. + +Supongamos que Alice, Bob, y Charlie están usando un sistema de pagos, y Alice tiene un balance de 10$. Para que el sistema de pagos sea útil, Alice debe ser capaz de enviar sus 10$ a Bob, o a Charlie. Sin embargo, si Alice intenta enviar 10$ a Bob y también envía 10$ a Charlie al mismo tiempo, ahí es donde el problema del doble gasto aparece. + +Si Alice puede enviar los "mismos" 10$ a ambos Charlie y Bob, el sistema de pagos dejará de ser útil. El sistema de pagos necesita una forma de elegir que transacción debería suceder y cual debería fallar, de una forma que todos los participantes estén de acuerdo en que transacción ha ocurrido. Cualquiera de esas transacciones son igual de válidas por si mismas. Sin embargo, los distintos participantes pueden tener una diferente visión de que transacción llegó antes en el sistema de pagos. + +Convencionalmente, los sistemas de pagos resuelven el problema del doble gasto teniendo una autoridad central que rastrea y aprueba transaciones. Por ejemplo, un banco decide compensar un cheque en función del saldo disponible del emisor, del cual el banco es el único custodio. En tal sistema, todos los participantes siguen las deicisiones de la autoridad central. + +Las tecnologías de contabilidad distribuida, como el XRP Ledger, no tiene una autoridad central. Estas tecnologías deben resolver el problema del doble gasto de alguna otra forma. + + +## Cómo funciona el consenso + +### Simplificando el problema + +Gran parte del problema del doble gasto puede ser resuelto por unas reglas bien conocidas como prohibir a una cuenta que gaste fondos que no tiene. De hecho, el problema del doble gasto se puede reducir a poner transacciones en orden. + +Considerando el ejemplo de Alice intentando enviar los mismos 10$ a ambos Bob y Charlie. Si el pago se sabe que es el primero, entonces todo el mundo estará de acuerdo de que ella tiene los fondos para pagar a Bob. Si el pago a Charlie se sabe que es el segundo, entonces cualquiera estará de acuerdo de que ella no tiene esos fondos para Charlie porque el dinero ya ha sido enviado a Bob. + +También podemos ordenar transacciones por reglas deterministas. Porque las transacciones son colecciones de información digital, es trivial par aun ordenador ordenarlas. + +Esto sería suficiente para solventar el problema del doble gasto sin una autoridad central, pero requeriría tener cada transacción que ocurriese (para así poder ordenarlas) antes de poder estar seguros de los resultados de cualquier transacción. Obviamente, no es práctico. + +Si pudiesemos recopilar transacciones en grupos y acordar esas agrupaciones, podríamos ordenar las transacciones de ese grupo. Siempre que cada participante esté de acuerdo en qué transacciones se procesarán como una unidad, pueden usar reglas deterministas para resolver el problema del doble gasto sin necesidad de una autoridad central. Cada uno de los participantes clasifica las transacciones y las aplica de forma determinista siguiendo las reglas conocidas. El XRP Ledger resuelve el problema del doble gasto exáctamente de esta manera. + +El XRP Ledger permite que múltiples transacciones conflictivas estén en el grupo acordado. El grupo de transacciones es ejecutado de acuerdo a unas reglas deterministas, por lo que la transacción que ocurra primero según las reglas de clasificación tendrá éxito y la transacción conflictiva que ocurra en segundo lugar fallará. + +### Reglas de consenso + +La función principal del consenso es que los participantes en el proceso acuerden qué transacciones se procesarán como grupo para resolver el problema del doble gasto. Hay cuatro razones por las que este acuerdo es más fácil de conseguir de lo que cabría esperar: + +1. Si no hay ninguna razón por la que una transacción debería no estar incluida en dicho grupo de transacciones, todos los participantes honestos aceptan incluirla. Si todos los participantes ya están de acuerdo, el consenso no tiene trabajo que hacer. +2. Si hay alguna razón por la que una transacción no debe incluirse en dicho grupo de transacciones, todos los participantes honestos estarán dispuestos a excluirla. Si la transacción todavía es válida, no hay razón para incluirla en la siguiente ronda, y todos deberían aceptar incluirla en ese momento. +3. Es extremadamente raro para un participante que le importe cómo las transacciones fueron agrupadas. El acuerdo es más fácil cuando la prioridad de cualquiera es llegar a un acuerdo y sólo desafiarlo cuando hay intereses divergentes. +4. Las reglas deterministas pueden ser usadas incluso para formar agrupaciones, llegando a desacuerdos solo en los casos extremos. Por ejemplo, si hay dos transacciones conflictivas en una ronda, las reglas deterministas pueden ser utilizadas para determinar cuál se incluye en la siguiente ronda. + +La principal prioridad de cada participante es la exactitud. Primero deben hacer cumplir las reglas para estar seguros de que nadie viola la integridad del ledger compartido. Por ejemplo, una transacción que no está correctamente firmada nunca debe ser procesada (incluso si otros participantes quieren que se procese). Sin embargo, la segunda prioridad de cada participante honesto es el llegar a un acuerdo. Una red con posibles gastos dobles no tiene ninguna utilidad, así que cada participante honesto valora el acuerdo por encima de la exactitud. + +### Rondas de consenso + +Una ronda de consenso es una intento de ponerse de acuerdo en un grupo de transacciones para que puedan ser procesadas. Una ronda de consenso empieza con cada participante que lo desea tomando una posición inicial. Este es el conjunto de transacciones válidas que han visto. + +Después, los participantes se "avalanzan" al consenso: Si una transacción particular no tiene apoyo mayoritario, los participantes concuerdan apartar esa transacción. Si una transacción en concreto sí tiene el apoyo mayoritario, los participantes concuerdan incluir esa transacción. Así leves mayorías rápidamente consiguen apoyo completo y leves minorías rápidamente consiguen rechazo universal en la ronda actual. + +Para prevenir que el consenso se atasque cerca del 50% y para reducir el superposición requerida para una convergencia confiable, el umbral requerido para incluir una transacción incrementa con el tiempo. Inicialmente, los participantes continuan acordando incluir una transacción si el 50% o más del resto de participantes está de acuerdo. Si los participantes discrepan, ellos incrementan este umbral, primero a 60% y luego más mayor, hasta que todas las transacciones discutidas son eliminadas del conjunto actual. Cualquier transacción eliminada de este modo se apartan a la siguiente versión de un ledger. + +Cuando un participante ve a una sobremayoría que está de acuerdo en el conjunto de transacciones que van a ser procesadas, declara que un consenso ha sido alcanzado. + +### El consenso puede fallar + +No es práctico desarrollar un algoritmo de consenso que nunca falla para alcanzar un consenso perfecto. Para entender el por qué, considera cómo finaliza el proceso de consenso. En algún momento, cada participante debe declarar que ha alcanzado consenso y que un grupo de transacciones conocido ha sido el resultado de ese proceso. Esta declaración compromete al participante de que un particular grupo de transacciones como resultado de ese proceso de consenso. + +Algún participante debe hacer esto primero o ningún participante podrá hacerlo nunca, y nunca llegarán a alcanzar consenso. Ahora, considera al participante que hace esto primero. Cuando este participante decide que el consenso ha finalizado, otros participantes no han llegado todavía a tomar esa decisión. Si fuesen incapaces de cambiar el conjunto acordado desde su punto de vista, ellos habrían decidido que el consenso se había alacanzado ya. Por lo que deben todavía ser capaces de cambiar el conjunto agregado.. + +En otras palabras, para que el proceso de consenso pueda finalizar, algún participante debe declarar que el consenso se ha alcanzado en un conjunto de transacciones incluso aunque cualquier otro participante teóricamente puede todavía ser capaz de cambiar el conjunto acordado de transacciones. + +Imagina un grupod e personas en una habitación intentando acordar qué puerta deberían utilizar para salir. No importa cuanto discutan los participantes, en algún momento, _alguien_ tiene que ser el primero en pasar por la puerta, incluso aunque las personas después de esta persona puede todavía cambiar su opinión y salir por otra puerta. + +La probabilidad de este tipo de fallo puede ser muy baja, pero no se puede reducir a cero. El balance de ingeniería es tal que llevar esta probabilidad por debajo por debajo de uno entre mil hacer el consenso significamente más lento, y menos tolerable a fallos de endpoint o de red. + +### Cómo maneja los fallos de consenso el XRP Ledger + +Después de que una ronda de consenso se complete, cada participante aplica el conjunto de transacciones que cree que se ha agregado. Esto resulta en la contrucción de lo que ellos creen que será el próximo estado del ledger que debería ser. + +Los participantes que también son validadores publican entonces una huella criptográfica para el siguiente ledger. Llamamos a esa huella un "voto de validación". Si la ronda de consenso ocurre, la gran mayoría de validadores honestos deberían publicar la misma huella. + +Después, los participantes recolectan estos votos de validación. Con los votos de validación, pueden determinar si la ronda de consenso anterior resultó en una supermayoría de participantes acordando el conjunto de datos o no. + +Luego, los participantes se encontrarán a si mismos en uno de estos tres casos, en orden de probabilidad: + +1. Contruyeron el mismo ledger que la mayoría ha acordado. En este caso, pueden considerar que ese ledger está validado y se puede confiar en su contenido. +2. Construyeron un ledger diferente al acordado por la supermayoría. En este caso, deben construir y aceptar el ledger de la supermayoría. Esto suele indicar que han declarado conenso antes y otros participantes cambiaron después de eso. Deben "saltar" al ledger de la supermayoría para continuar la operación. +3. Si la supermayoría no está clara de las validaciones recibidas. En este caso, la ronda de consenso previa se ha malgastado y una nueva ronda debe ocurrir antes de que ningún ledger sea validado. + +Por supuesto, el caso 1 es el más común. El caso 2 no daña a la red en absoluto. Un pequeño porcentaje de participantes podría caer en el caso 2 cada ronda, y la red podría funcionar sin problemas. Incluso esos participantes pueden reconocer que no han construido el mismo ledger que la supermayoría, por lo que saben que no reportarán sus resultados hasta el final cuando estén de acuerdo con la supermayoría. + +El caso 3 resulta en la red perdiendo unos segundos en los que podría haber avanzado, pero esto es extremadamente raro. En este caso, la siguiente ronda de consenso es mucho menos probable que falle porque los desacuerdos están resueltos en el proceso de consenso y solo los descauerdos restantes pueden provocar un fallo. + +En raras ocasiones, la red como conjunto falla para progresar hacia adelante por unos segundos. A cambio, los tiempos de confirmaciones de transacciones son bajos. + +## Filosofía + +Una forma de confiar es la habilidad del sistema de proveer resultados incluso en situaciones donde algunos componentes han fallado, algunos participante son maliciosos, y así. Mientras esto es importante, hay otra forma de confiar que es mucho más importante en los sistemas de pagos criptográficos - la habilidad de un sistema para producir resultados en los que se puede confiar. Eso ocurre, cuando un sistema nos reporta un resultado es confiable, debemo ser capaces de confiar en ese resultado. + +Los sistemas del mundo real, sin embargo, se enfrentan a condiciones operacionales en que ambos tipos de confiabilidad puede ser comprometida. Esto incluye fallos de hardware, fallos de comunicación, incluso participantes deshonestos. Parte de la filosofía del diseño del XRP Ledger es detectar condiciones donde la confianza de resultados está dañada y hay que reportarlos, en vez de facilitar resultados en los que no se debe confiar. + +El algoritmo de consenso del XRP Ledger provee una alternativa robusta a sistemas de prueba de trabajo (proof of work), sin consumir recursos computacionales innecesariamente. Los fallos bizantinos son posibles, y ocurren, pero la consecuencia son solo retrasos menores. En todos los casos, el algoritmo de consenso de XRP Ledger informa que los resultados son confiables solo cuando de hecho lo son. + +## Ver también + +- **Conceptos:** + - [Consenso](index.md) + - [Investigación del consenso](consensus-research.md) + - [Vídeo del mecanismo de consenso del XRPL](https://www.youtube.com/watch?v=k6VqEkqRTmk&list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi&index=2) +- **Tutoriales:** + - [Envío de transacciones confiable](../transactions/reliable-transaction-submission.md) + - [Ejecutar `rippled` como Validador](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md) +- **Referencias:** + - [Referencia del formato ledger](../../references/protocol/ledger-data/index.md) + - [Referencia del formato de transacción](../../references/protocol/transactions/index.md) + - [método consensus_info][] + - [método validator_list_sites][] + - [método validators][] + - [método consensus_info][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-protections.md b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-protections.md new file mode 100644 index 0000000000..0dd08a2afc --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-protections.md @@ -0,0 +1,73 @@ +--- +html: consensus-protections.html +parent: consensus.html +blurb: Aprende cómo el Protocolo de Consenso del XRP Ledger se protege contra varios problemas y ataques que pueden ocurrir en un sistema financiero descentralizado. +labels: + - Blockchain +--- +# Protecciones del consenso contra ataques y modos de fallo + +El Protocolo de Consenso del XRP Ledger es un mecanismo de consenso _tolerante a fallos bizantinos_, lo que quiere decir que está diseñado para trabajar incluso si todo tipo de cosas salen mal: los participantes dependen de una red abierta poco confiable, y actores maliciosos pueden estar intentando controlar o interrumpir el sistema en un momento dado. Encima de eso, el conjunto de participantes en el Protocolo de Consenso del XRP Ledger no se conoce de antemano y puede cambiar con el tiempo. + +Confirmar transacciones de una forma rápida mientras se mantiene las propiedades deseadas de la red es un desafío complejo, y es imposible construir un sistema perfecto. El Protocolo de Conenso del XRP Ledger está diseñado para funcionar lo mejor posible en la mayoría de las situaciones, y para fallar elegántemente en aquellas que no es posible. + +Esta página describe algunos de los desafíos que el Protocolo de Consenso del XRP LEdger se encuentra y cómo se enfrenta a ellos. + +## Validadodes individuales con mal comportamiento + +Los _validadores_ son servidores que contribuyen activamente al proceso de decidir cada nueva versión del ledger. Los validadores tienen una influencia sobre servidores configurados para confiar en ellos (incluso indiréctamente). El consenso continua incluso si algunos validadores se comportan mal, incluyendo una larga variedad de casos de fallo, tales como: + +- No estar disponibles o sobrecargados. +- Estar parcialmente desconectados de la red, por lo que sus mensajes solo alcanzan a un subgrupo de participantes sin retraso. +- Comportarse intencionadamente para defraudar a otros o parar la red. +- Comportarse maliciosamente como resultado de la presión de factores externos, como amenzadas de un gobierno opresivo. +- Enviar accidentalmente mensajes confusos o malformados debido a un error o una software desactualizado. + +En general, el consenso puede continuar sin problemas mientras solo un pequeño porcentaje (menos del 20%) de los validadores confiables tengan mal comportamiento en un mismo momento. (Para las matemáticas que hay detrás y los porcentajes exactos, ver la última [Investigración del consenso](consensus-research.md).) + +Si más del 20% de los validadores son inalcanzables o no se comportan adecuadamente, la red falla al intentar consenso. Durante este tiempo, nuevas transacciones pueden ser tentativamente procesadas, pero las nuevas versiones del ledger no pueden ser validadas, así que los resultados finales de esas transacciones no son ciertos. En esta situación, se convierte en inmediatamente obvio que el XRP Ledger no se encuentra bien, lo que provocaría una intervención de participantes humanos que pueden decidir entre esperar, o reconfigurar el conjuntos de validadores confiables. + +La única forma de confirmar una transacción inválida sería conseguir que el 80% de los validadores confiables aprueben la transacción y estén de acuerdo en el resultado exacto. (Las transacciones inválidas incluyen ese dinero gastado que ya ha sido gastado, o de otra forma estaría rompiendo las reglas de la red.) En otras palabras, una gran mayoría de los validadores confiables habrían _colisionado_. Con docenas de validadores confiables corriendo por diferentes personas y negocios en diferentes partes del mundo, esto es muy dificil de conseguir intencionadamente. + + +## Vulnerabilidades de software + +Como con cualquier sistema de software, los bugs (o código intencionalmente malicioso) en la implementación del Protocolo de Consenso del XRP Ledger, los paquetes de software comúnmente implementados, o sus dependencias, son un problema que hay que tomarse seriamente. Incluso los bugs que causan que un servidor falle cuando ve valores de entrada cocinados pueden abusasrse para interrumpir el proceso de la red. Los desarrolladores del XRP Ledger toman precauciones para abordar esta amenaza en la referencia de implementaciones de software de XRP Ledger, incluyen: + +- Un [código fuente open-source](https://github.com/XRPLF/rippled/), por lo que cualquier miembro del público puede revisar, compilar, e independientemente probar el software relevante. +- Un proceso de revisión de código exhaustivo y sólido para todos los cambios de los repositorios oficiales del XRP Ledger. +- Las firmas digitales de desarrolladores muy conocidos en todas las publicaciones y paquetes de software. +- Revisiones profesionales encargadas periodicamentes para detectar vulnerabilidades e inseguridades. +- Un [programa de recompensas de bugs](https://ripple.com/bug-bounty/) que premia a investigadores de seguridad que revelan responsablemente las vulnerabilidades. + + +## Ataques Sybil + +Un _[ataque Sybil](https://en.wikipedia.org/wiki/Sybil_attack)_ es un intento de tomar el control de una red usando un gran número de identidades falsas. En el XRP Ledger, un ataque Sybil tomaría la forma de ejecutar un gran número de validadores, y luego convencer a otros de confiar en esos validadores. Este tipo de ataques son teóricamente posibles, pero sería muy dificil de hacer porque la intervención humana es necesaria para ser confiados por otros. + +No importa cuantos servidores un atacante ejecuta, esos servidores no tienen voz ni voto sobre lo que los participantes existentes consideran validados a no ser que esos participantes decidan confiar en los validadores del atacante. Otros servidores solo escuchan lo que los validadores que tienen configurados para confiar, ya sea por una lista de validodres o una configuración explícita. (Ver [requisitos de superposición de validador](#requisitos-de-superposición-del-validador) para un sumario de cómo una lista de validadores funciona.) + +Esta confianza no ocurre automáticamente, para realizar un ataque Sybil exitosamente habría que añadirle el laborioso trabajo de convencer a personas y empresas de reconfigurar sus servidores XRP Ledger para confiar en los validadores del atacante. Incluso en el caso de que una entidad individual sea engañada haciendo eso, esto tendrá un impacto mínimo en otros que no han cambiado sus configuraciones. + + +## Ataque del 51% + +Un "ataque de 51%" es un ataque en un sistema blockchain donde un bando controla más del 50% de todo el poder de minado o votación. (Técnicamente, el ataque está incorrectamente llamado porque _cualquier_ valor superior al 50% es suficiente.) El XRP Ledger no es vulnerable a un ataque del 51% porque no utiliza minería en su mecanismo de consenso. La analogía más cercana para el XRP Ledger es un [ataque Sybil](#ataques-sybil), el cuál sería complicado de realizar. + + +## Requisitos de superposición del validador + +Para todos los participantes en el XRP Ledger se pongan de acuerdo en qué consideran como validado, deben empezar eligiendo un conjunto de validadores confiables que son muy parecidos a los conjuntos elegidos por los demás. En el peor escenario, menos del 90% de superposición podría causar que algunos participantes diverjan entre ellos. Por esa razón, existen listas firmadas de validadores recomendados, destinadas a incluir servidores bien mantenidos y confiables administrados por la industria y la comunidad. + +Por defecto, los servidores XRP Ledger están configurados para utilizar sitios de listas de validadores mantenidas por la XRPL Foundation y Ripple. Los sitios proveen una lista de validadores recomendados (también conocidos como la _Lista de Nodos Únicos_ recomendada, o UNL), la cual se actualiza periódicamente. Los servidores configurados de esta forma confian en todos los validadores de la última versión de la lista, lo cual asegura un 100% de superposición con otros que usan la misma lista. La configuración por defecto incluye claves públicas para verificar la autenticidad de los contenidos de esos sitios. Los servidores de la red peer-to-peer XRP Ledger también comparten las actualizaciones firmadas de la lista entre ellos, reduciendo potenciales puntos de fallo. + +Técnicamente, si ejecutas un servidor, puedes configurar tu propia lista o explicitamente elegir validadores en los que confiar de forma individual, pero esto no se recomienda. Si el conjunto de validadores que has elegido no tiene suficiente superposición con otros, tu servidor podría divergir del resto de la red, y podrías perder dinero por culpa del estado divergente de tu servidor. + +Se está investigando un nuevo diseño del protocolo de consenso mejorado que permita listas de validadores más hetereogeneas. Para más información, ver la [Investigación del consenso](consensus-research.md) page. + + +## Ver también + +- Para una descripción detallada del protocolo de consenso, ver [Consenso](index.md). +- Para una explicación del **diseño de decisiones y transfondo** detrás del protocolo de consenso, cer [Principios y reglas del consenso](consensus-principles-and-rules.md). +- Para **investigaciones academicas** explorando las propiedades y limitaciones del protocolo, ver [Investigación del consenso](consensus-research.md). diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-research.md b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-research.md new file mode 100644 index 0000000000..f05bcc5eb3 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-research.md @@ -0,0 +1,19 @@ +--- +html: consensus-research.html +parent: consensus.html +seo: + description: Artículos académicos sobre algoritmos de consenso investigaciones relacionadas. +labels: + - Blockchain +--- +# Investigación del consenso + +Ripple investiga los límites teóricos y prácticos de los protocolos de consenso del XRP Ledger. La siguiente tabla enumera los artículas académicos publicados por Ripple: + +| Fecha | Título | Autores | Resumen | +|---|---|---|---| +| 2018-02-20 | [Cobalt: BFT Governance in Open Networks](https://arxiv.org/abs/1802.07240) | MacBrough | Introduce un novedoso algoritmo de transmisión a nivel atómico llamado Cobalt que permite más flexibilida d de consenso en las UNL. | +| 2018-02-20 | [Analysis of the XRP Ledger Consensus Protocol](https://arxiv.org/abs/1802.07242) | Chase, MacBrough | Un análisis actualizado y detallado del algoritmo de consenso del XRP Ledger y sus propiedad de seguridad y actividad. | +| 2014 | [The Ripple Protocol Consensus Algorithm](https://ripple.com/files/ripple_consensus_whitepaper.pdf) | Schwartz, Youngs, Britto | Introduce el algoritmo de consenso detrás del XRP Ledger. | + + diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-structure.md b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-structure.md new file mode 100644 index 0000000000..8380ea6077 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/consensus-structure.md @@ -0,0 +1,215 @@ +--- +html: consensus-structure.html +parent: consensus.html +seo: + description: Entender el rol del consenso en el XRP Ledger. +labels: + - Blockchain +--- +# Estructura de consenso + +Escrito por Dave Cohen, David Schwartz, y Arthur Britto._ + +Este artículo proporciona una visión a alto nivel del XRP Ledger, la información que almacena, y cómo las [transacciones](../../references/protocol/transactions/index.md) dan como resultado cambios en el ledger. + +Al crear aplicaciones en el XRP Ledger, es importante entender el proceso, para no sorprenderse por el comportamiento de las APIs de XRP Ledger y sus efectos. + + +## Introducción + +La red peer-to-peer XRP Ledger proporciona un libro de contabilidad (ledger) compartido a nivel mundial, que brinda información autorizada a aplicaciones sobre el estado de su contenido. Este estado de la información incluye: + +- Configuración de cada [cuenta](../accounts/index.md) +- Balances de XRP y [tokens](../tokens/index.md) +- Ofertas en el exchange distribuido +- Configuraciones de red, como los [costes de transacción](../transactions/transaction-cost.md) y las cantidades de [reserva](../accounts/reserves.md) +- Una marca de tiempo (timestamp) + +Para una descripción técnica completa de todos los datos que se incluyen en una versión de un ledger, ver la [Referencia de formato de ledger](../../references/protocol/ledger-data/index.md). + +[{% inline-svg file="/docs/img/anatomy-of-a-ledger-complete.svg" /%}](/docs/img/anatomy-of-a-ledger-complete.svg "Figura 1: Elementos del XRP Ledger") + +_Figura 1: Elementos del XRP Ledger_ + +El XRP Ledger tiene una nueva versión de un ledger cada ciertos segundos. Cuando la red acuerda el contenido de una nueva versión del ledger, la versión del ledger es _validado_, y sus contenidos no se pueden cambiar nunca. Las versiones validadadas de ledgers que precedieron forman el histórico del ledger. Incluso el ledger validado más reciente es parte del histórico, ya que representa el estado de la red hasta hace poco tiempo. En la actualidad, la red está evaluando transacciones que pueden aplicarse y finalizarse en la próxima versión del ledger. Mientras la evaluación está ocurriendo, la red tiene versiones de ledger que aun no están validadas. + +[{% inline-svg file="/docs/img/ledger-history.svg" /%}](/docs/img/ledger-history.svg "Figura 2: Histórico del XRP Ledger") + +_Figure 2: Histórico del XRP Ledger_ + +Una versión de ledger tiene dos identificadores. Un identificador es su _ledger index_ o índice del ledger. Las versiones de ledger son numeradas incrementalmente. Por ejemplo, si la versión del ledger actual tiene un ledger index de 100, el previo tiene un ledger index 99 y el siguiente ledger tendrá index 101. El otro identificador es un _ledger hash_, el cual es una huella digital de los contenidos del ledger. + +A medida que los servidores proponen trnsacciones para aplicar en el ledger, pueden crear varias versiones del ledger con contenidos ligeramente diferentes. Estas versiones candidatas del ledger tienen el mismo ledger index pero diferentes ledger hashes. De los muchas candidatas, solo una puede ser validada. Todas las otras versiones ledger candidatas son descartadas. Por lo tanto, hay exactamente un ledger hash validado para cada ledger index en el histórico. + +Los cambios a nivel de usuario son el resultado de transacciones. Ejemplos de [transacciones](../../references/protocol/transactions/index.md) incluyen pagos, cambios de la configuración de cuenta o trust lines, y ofertas para intercambiar. Cada transacción autoriza uno o más cambios en el ledger, y está firmada criptográficmente por el dueño de la cuenta. Las transacciones son la única manera para autorizar cambios de una cuenta, o para cambiar algo más en el ledger. + +Cada versión del ledger también contiene un conjunto de transacciones y metadata sobre esas transacciones. Las transacciones que incluye son solo aquellas que han sido aplicadas para la anterior versión del ledger para crear la nueva versión del ledger. Los metadatos o metadata se registran a los mismos efectos en el estado del dato del ledger. + +[{% inline-svg file="/docs/img/ledger-changes.svg" /%}](/docs/img/ledger-changes.svg "Figura 3: Transacciones aplicadas a la versión del ledger") + +_Figure 3: Transacciones aplicadas a la versión del ledger_ + +El conjunto de transacciones incluidas en una instancia ledger se guardan en ese ledger y permite auditorías de la historia del XRP Ledger. Si un balance de cuenta es diferente en un ledger N+1 respecto al ledger N, entonces el ledger N+1 contiene las transacciones responsables del cambio. + +Las transacciones que aparecen en un ledger validado pueden haber logrado cambiar el ledger, o pueden haberse procesado sin haber realizado la acción requerida. Las transacciones exitosas tienen el [código resultado](../../references/protocol/transactions/transaction-results/index.md) **`tesSUCCESS`** el cual indica los cambios solicitados para aplicar en el ledger. Las transacciones fallidas en el ledger tienen el código de resultado de clase **`tec`**.1 + +Todas las transacciones incluidas en un ledger destruyen algo de XRP como un [coste de transacción](../transactions/transaction-cost.md), sin importar si tenían un código **`tes`** o **`tec`**. La cantidad exacta de XRP destruido es definido por las instrucciones de transacción firmadas. + +Hay otras clases de códigos de resultado además de **`tes`** y **`tec`**. Cualquier otras clases de códigos de resultados indican fallos provisionales devueltos por las llamadas API. Solo los códigos **`tes`** y **`tec`** aparecen en los ledgers. Las transacciones que no aparecen incluidas en ledger no pueden tener efecto en el estado del ledger (incluyendo balances XRP), pero transacciones que son provisionalmente fallidas pueden acabar sucediendo. + +Cuando se trabaja con [APIs del XRP Ledger](../../references/http-websocket-apis/index.md), las aplicaciones deben distinguir entre transacciones candidatas propuestas para la inclusión en un ledger y transacciones validadas que están incluidas en un ledger. Solo los resultados de transacciones encontrados en un ledger validado son inmutables. Una transacción candidata puede eventualmente estar incluida en un leger validado, o puede que no. + +Importante: Algunas [APIs `rippled`](../../references/http-websocket-apis/index.md) proporcionan resultados provisionales, basados en transacciones candidatas 2. Las aplicaciones nunca deben basarse en resultados provisionales para determinar el resultado final de una transacción. La única forma de conocer si finalmente una transacción se ha realizado correctamente, es comprobar el estado de la transacción hasta que esté en un ledger validado y además tenga el código de resultado `tesSUCCESS`. Si la transacción está en un ledger validado con otro código de resultado, ha fallado. Si el ledger especificado en [`LastLedgerSequence`](../../references/protocol/transactions/common-fields.md) en una transacción ha sido validado, pero la transacción no aparece en ese ledger o en alguno anterior, entonces esa transacción ha fallado y nunca aparecerá en ningún ledger. Un resultado es definitivo solo para transacciones en un ledger validado o nunca podrán aparecer por las restricciones de `LastLedgerSequence` explicadas más adelante en este documento. + +## El protocolo XRP Ledger – Consenso y validación + +La red peer-to-peer XRP Ledger consiste en muchos servidores independientes XRP Ledger (normalmente ejecutando [`rippled`](../networks-and-servers/index.md)) que aceptan y procesan transacciones. Las aplicaciones cliente firman y envían transacciones a servidores XRP Ledger, que transmiten estas transacciones candidatas a través de la red de procesamiento. Ejemplos de aplicaciones cliente incluyen carteras web y móvil, conexiones con instituciones financieras, y plataformas de trading electrónicas. + +[{% inline-svg file="/docs/img/xrp-ledger-network.svg" /%}](/docs/img/xrp-ledger-network.svg "Figura 4: Participantes en el Protocolo XRP Ledger") + +_Figura 4: Participantes en el Protocolo XRP Ledger_ + +Los servidores que reciben, transmiten y procesan transacciones pueden ser servidores de seguimiento o validadores. Las funciones principales de los servidores de seguimiento incluyen distribución de transacciones de clientes y responder a consultas sobre el ledger. Los servidores de validación realizan las mismas funciones que los servidores de seguimiento y también contribuyen a avanzar en el histórico del ledger. 3. + +Cuando se aceptan transacciones enviadas por aplicaciones de cliente, cada servidor de seguimiento utiliza el último ledger validado como punto de inicio. Las transacciones aceptadas son candidatas. Los servidores envían sus transacciones candidatas a sus pares, permitiendo a las transacciones candidatas propagarse a través de la red. Idealmente, cada transacción candidata debería ser conocida por todos los servidores, permitiendo a cada uno considerar el mismo conjunto de transacciones a aplicar al último ledger validado. Sin embargo, como las transacciones tardan tiempo en propagarse, los servidores no trabajan con el mismo conjunto de transacciones candidatas todas las veces. Para tener en cuenta esto, el XRP Ledger utiliza un proceso llamado consenso para asegurar que las mismas transacciones son procesadas y los ledger validados son consistentes a través de la red peer-to-peer XRP Ledger. + +### Consenso + +Los servidores de la red comparten información sobre transacciones candidatas. A través del proceso de consenso, los validadores agregan en un subconjunto de transacciones candidatas para ser consideradas en el siguiente ledger. El consenso es un proceso iterativo en el cual los servidores transmiten propuestas, o conjuntos de transacciones candidatas. Los servidores comunican y actualizan las propuestas hasta que haya supermayoría 4 de los validadores elegidos que acuerdan el mismo conjuntos de transacciones candidatas. + +Durante el consenso, cada servidor evalúa propuestas de un específico grupo de servidores, conocidos como validadores confiables por ese servidor, o _Unique Node List (UNL)_.5 Los validadores confiables representan un subconjunto de la red la cual, en conjunto, es "confiable" para no confabular en un intento de defraudar al servidor que evalúa las propuestas. Esta definición de "confianza" no requiere que se confie en cada validador individual elegido. Más bien, los validadores son elegidos en base a la expectativa de que no confabularán en un esfuerzo coordinado para falsificar los datos transmitidos en la red 6. + +[{% inline-svg file="/docs/img/consensus-rounds.svg" /%}](/docs/img/consensus-rounds.svg "Figura 5: Los validadores proponen y revisar conjuntos de transacciones") + +_Figura 5: Validadores proponen y revisan conjuntos de transacciones — Al comienzo del consenso, los validadores pueden tener un conjunto distinto de transacciones. En siguientes rondas, los servidores modificarán sus propuestas para coincidir con las propuestas de sus validadores confiables. Este proceso determina qué transacciones deberían aplicar a la versión del ledger que se está actualmente debatiendo, y cuales deberían posponerse para próximas versiones del ledger._ + +Las transacciones candidatas que no están incluidas en la propuesta acordada siguen siendo transacciones candidatas. Pueden ser consideradas otra vez en la nueva versión del ledger. Normalmente, una transacción que ha sido omitida en una versión del ledger se incluye en la siguiente versión del ledger. + +En algunas circunstancias, una transacción puede fallar para conseguir alcanzar consenso indefinidamente. Una de esas circunstancias es si la red incrementa el [coste de transacción](../transactions/transaction-cost.md) requerido a un valor superior al que proporciona la transacción. La transacción podría ser exitosa si las comisiones se reducen en algún momento futuro. Para asegurar que una transacción tenga éxito o falle dentro de una limitada cantidad de tiempo, las transacciones se pueden preparar para caducar si no son procesadas por un determinado ledger index. Para más información, ver [Envío de transacciones confiables](../transactions/reliable-transaction-submission.md). + +### Validación + +La validación es la segunda etapa del proceso de consenso general, que verifica que los servidores tienen los mismos resultados y declara la versión final del ledger. En raras ocasiones, la primera etapa del [consenso puede fallar](consensus-principles-and-rules.md#consensus-can-fail); la validación proporciona una confirmación posterior para que los servidores puedan reconocer esto y actuar en consecuencia. + +La validación puede dividirse en aproximadamente dos partes: + +- Calcular la versión de ledger resultante del conjunto de transacciones acordado. +- Comparar resultados y declarar validada la versión del ledger si suficientes validadores confiables están de acuerdo. + +Cada servidor en la red realiza una validación separada y local. + + +#### Calcular y compartir validaciones + +Cuando el proceso de consenso se completa, cada servidor independientemente computa un nuevo ledger a partir del conjunto de transacciones acordado. Cada servidor calcula los resultados siguiendo las mismas reglas, las cuales pueden ser resumidas de la siguiente manera: + +1. Empezar con el ledger validado anterior. + +2. Colocar el conjunto de transacciones acordado en _orden canónico_ para que cada servidor la procese de la misma forma. + + [Orden canónico](https://github.com/XRPLF/rippled/blob/8429dd67e60ba360da591bfa905b58a35638fda1/src/ripple/app/misc/CanonicalTXSet.cpp#L25-L36) no es el orden de cómo las transacciones fueron recibidas, porque los servidores pueden recibir las mismas transacciones en diferente orden. Para prevenir a los participantes de competir sobre el orden de las trnasacciones, el orden canónico es difícil de manipular. + +3. Procesar cada transacción según sus instrucciones, en orden. Actualizar el estado del dato del ledger en consecuencia. + + Si la transacción no puede ser ejecutada exitósamente, incluye la transacción con un [código de resultado de clase `tec`](../../references/protocol/transactions/transaction-results/tec-codes.md).1 + + Para ciertos fallos de transacciones "recuperables", se mueve la transacción al final del orden canónico para volver a intentarla después de que se hayan ejecutado otras transacciones del mismo ledger. + +4. Actualizar la cabecera del ledger con el apropiado metadata. + + Esto incluye datos tales como el ledger index o índice del ledger, el hash identificativo del ledger previo validado (el "padre" de este), la hora de cierre aproximada de esta versión del ledger, y los hashes criptográficos de los contenidos de este ledger. + +5. Calcular el hash identificativo de la nueva versión del ledger. + +[{% inline-svg file="/docs/img/consensus-calculate-validation.svg" /%}](/docs/img/consensus-calculate-validation.svg "Figura 7: Un servidor XRP Ledger calcula la validación de un ledger") + +_Figura 7: Un servidor XRP Ledger calcula la validación de un ledger — Cada servidor aplica transacciones acordadas por el anterior ledger validado. Los validadores envían sus resultados a toda la red._ + +#### Comparar resultados + +Cada validador transmite sus resultados en forma de un mensaje firmado que contiene el hash de la versión de ledger calculada. Estos mensajes, llamados _validaciones_, permiten a cada servidor comparar el ledger que calculó con el de sus pares. + +[{% inline-svg file="/docs/img/consensus-declare-validation.svg" /%}](/docs/img/consensus-declare-validation.svg "Figura 8: El ledger es validado cuando la supermayoría de pares calcula el mismo resultado") + +_Figura 8: El ledger es validado cuando la supermayoría de pares calcula el mismo resultado - Cada servidor compara su su ledger calculado con los hashes recibidos de sus validadores elegidos. Si no hay acuerdo, el servidor debe recaluclar o recuperar el ledger correcto._ + +Los servidores de la red reconocen una instancia ledger como validada cuando una supermayoría de pares han firmado y difundido el mismo hash de validación 7. Más adelante, las transacciones son aplicadas a este ahora ledger validado y actualizado con el ledger index N+1. + +En casos donde el servidor se encuentra en una minoría, habiendo generado un ledger que difiere de sus pares, el servidor ignora el ledger que ha generado 8. Regenera el ledger correcto, o recupera el ledger correcto según sea necesario. + +Si la red no logra un acuerdo de supermayoría sobre las validaciones, esto implica que el volumen de transacciones era muy alto o la latencia de la red es demasiado grande para que el proceso de consenso para producir propuestas consistentes. En este caso, los servidores repiten el proceso de consenso con una nueva versión del ledger. A medida que pasa el tiempo desde el consenso comenzó, es cada vez más probable que la mayoría de los servidores haya recibido el mismo conjunto de transacciones candidatas, ya que cada ronda de consenso reduce el desacuerdo. El XRP Ledger ajusta dinámicamente los [costes de transacciones](../transactions/transaction-cost.md) y el tiempo de espera para el consenso en respuesta a estas condiciones. + +Una vez que alcanzan supermayoría en el acuerdo de las validaciones, los servidores trabajan con el nuevo ledger validado, ledger index N+1. El consenso y el proceso de validación se repite 9, considerando transacciones candidatas que no fueron incluidas en la última ronda junto con nuevas transacciones presentadas mientras tanto. + + +## Conclusiones claves + +Las transacciones enviadas al XRP Ledger no son procesadas inmediatamente. Durante un periodo de tiempo, cada transacciones permanece como candidata. + +El ciclo de vida de una sola transacción es el siguiente: + +- Una transacción es creada y firmada por un dueño de una cuenta. +- La transacción es enviada a la red. + - Transacciones mal formadas podrán ser rechazadas inmediatamente. + - Transacciones bien formadas pueden ser provisionalmente exitosas, y luego fallar. + - Transacciones bien formadas pueden provisionalmente fallar, y luego fallar. +- Durante el consenso, la transacción es incluida en el ledger. + - El resultado de un consenso exitoso es un ledger validado. + - Si una ronda de consenso falla, el proceso de consenso se repita hasta que es exitoso. +- El ledger validado incluye la transacción y esta afecta al estado del ledger. + +Las aplicaciones deben solo confiar en información de ledgers validados, no en resultados provisionales de transacciones candidatas. Algunas [APIs de `rippled`](../../references/http-websocket-apis/index.md) devuelven inicialmente unos resultados provisionales para las transacciones. Los resultados de una transacción se convierten en inmutables solo si la transacción es incluida en un ledger validado, o la transacción incluye `LastLedgerSequence` y no aparece en ningún ledger validado con ese ledger index o menor. + +Buenas prácticas para aplicaciones enviando transsacciones incluyen: + +- Utilizar el parámetro `LastLedgerSequence` para asegurar que las transacciones se validen o fallen de forma determinista y rápida. +- Comprobar los resultados de transacciones en ledgers validados. + - Hasta que el ledger que contiene la transacción es validado, o haya pasado `LastLedgerSequence`, los resultados son provisionales. + - Transacciones con el código resultado **`tesSUCCESS`** y `"validated": true` se han realizado correctamente de forma inmutable. + - Transacciones con otro código resultado y `"validated": true` han fallado de forma inmutable. + - Transacciones que no aparecen en ningún ledger validado, incluido el ledger validado identificado por el `LastLedgerSequence` de la transacción ha fallado de forma inmutable. + - Tener cuidado de usar un servidor con un histórico de ledger continuo para detectar este caso 10. + - Puede ser necesario comprobar el estado de una transacción repetidamente hasta que el identificado por `LastLedgerSequence` es validado. + +## Ver también + +- **Conceptos:** + - [Investigación del consenso](consensus-research.md) + - [El mecanismo del consenso (YouTube)](https://www.youtube.com/watch?v=k6VqEkqRTmk&list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi&index=2) +- **Tutoriales:** + - [Envío de transacciones de forma correcta](../transactions/reliable-transaction-submission.md) + - [Ejecutar `rippled` como un validator](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md) +- **Referencias:** + - [Referencia del fromato del ledger](../../references/protocol/ledger-data/index.md) + - [Referencia del formato de la transacción](../../references/protocol/transactions/index.md) + - [método consensus_info][] + - [método validator_list_sites][] + - [método validators][] + + + + + +## Pies de notas + +1 – Transacciones con [códigos de resultado **tec**](../../references/protocol/transactions/transaction-results/tec-codes.md) no proporcionan la acción solicitada, pero tienen efecto en el ledger. Para prevenir el abuso de la red y pagar por el coste de distribución de la transacción, destruyen el XRP del [coste de la transacción](../transactions/transaction-cost.md). Para no bloquear otras transacciones enviadas por el mismo remitente al mismo tiempo, se incrementa el [sequence number](../../references/protocol/data-types/basic-data-types.md#account-sequence) de la cuenta emisora. Transacciones con el tipo resultado `tec` a veces también realizan mantenimiento como borrar objetos caducados u ofertas de mercado sin fondos. + +2 – Por ejemplo, consideramos un escenario donde Alice tiene 100$, y envía todo a Bob. Si una aplicación primero envía esa transacción de pago, entonces inmediatamente tras comprobar el balance de Alice, la API devuelve 0$. Este valor está basado en el resultado provisional de una transacción candidata. Hay circunstancias en las cuales el pago falla y el balance de Alice se mantiene a 100$ (o, debido a otras transacciones, se convierte en otra cantidad). El único método para conocer con certeza que el pago de Alice a Bob ha ocurrido es comprobar el estado de la tranacción hasta que está en el ledger validado y además el código de resultado es **`tesSUCCESS`**. Si la transacción está en un ledger validado con cualquier otro código resultado, el pago ha fallado. + +3 – Hablando estríctamente, los validadores son un subconjunto de servidores de seguimiento. Proporcionan las mismas características y adicionalmente envían mensajes de "validación". Los servidores de seguimiento pueden clasificarse según si mantienen el histórico del ledger parcial o completo. + +4 – Transacciones que fallan en pasar la ronda de consenso cuando el porcentaje de pares que reconoce la transacción cae por debajo del umbral. Cada ronda es un proceso iterativo. Al principio de la primera ronda, al menos el 50% de pares deben estar de acuerdo. El umbral final para la ronda de consenso es un 80% de acuerdo. Estos valores específicos estan sujetos a cambio. + +5 – Cada servidor define su propios validadores confiables, pero la consistencia de la red depende en diferentes servidores eligiendo listas que tienen un mayor grado de superposición. Por esta razón, Ripple publica una lista de validadores recomendados. + +6 – Si las propuestas de todos los validadores fueron evaluadas, en lugar de exclusivamente por los validadores elegidos para no confabular, un atacante malicioso podría ejecutar más validadores para ganar poder desproporcionado sobre el proceso de validación, así podrían introducir transacciones inválidas u omitir transacciones válidas de las propuestas. La lista de validadores elegida [defiende de ataques Sybil](consensus-protections.md#ataques-sybil). + +7 – El umbral de supermayoría, a partir de noviembre del 2014, requiere que al menos el 80% de pares deben estar de acuerdo en un ledger para ser validado. Est el mismo porcentaje necesario para una ronda de consenso. Ambos umbrales están sujetos a cambio y no necesitan ser iguales. + +8 – En la práctica, el servidor detecta que está en una minoría antes de recibir las validaciones de todos los pares. Lo sabe cuando recibe validaciones no coincidentes de más del 20% de pares que su validación no puede alcanzar el 80% del umbral. En ese momento, puede empezar a recalcular su ledger. + +9 – En la práctica, el XRP Ledger corre más eficientemente empezando una nueva ronda de consenso al mismo timepo, antes de que la validación se haya completado. + +10 – Un servidor `rippled` puede responder a las peticiones API incluso sin tener un histórico del ledger completo. Interrupciones en el servicio o en la conectividad de la red puede llevar a ledgers perdidos, o a lagunas, en el histórico del ledger del servidor. Con el tiempo, si se configura así, `rippled` llena los vacíos en su histórico. Cuando prueba transacciones perdidas, es importante verificar contra un servidor con ledgers completos continuos desde que la transacción que se ha enviado hasta su `LastLedgerSequence`. Utiliza el [método server_info][] para determinar qué ledgers están disponibles para un servidor en partícular. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/fee-voting.md b/@i18n/es-ES/docs/concepts/consensus-protocol/fee-voting.md new file mode 100644 index 0000000000..30488760a9 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/fee-voting.md @@ -0,0 +1,67 @@ +--- +html: fee-voting.html +parent: consensus.html +seo: + description: Cómo los validadores votan las comisiones o fees (coste de transacción y requisitos de reserva). +labels: + - Fees + - XRP +--- +# Votación de comisiones o fees + +Los validadores pueden votar por cambiar los [costes de transacción](../transactions/transaction-cost.md) básicos como los [requisitos de reserva](../accounts/reserves.md). Si las preferencias en la configuración de un validador son diferentes a los ajustes actuales de la red, el validador expresa sus preferencias a la red periódicamente. Si un cuórum de validadores está de acuerdo en un cambio, pueden aplicar un cambio que se haga efectivo a partir de entonces. Los validadores pueden hacer esto por varias razones, especialmente para adaptarse a cambios en el valor de XRP a largo plazo. + +Los operadores de [validadores `rippled`](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md) pueden configurar sus preferencias para el coste de transacción y los requisitos de reserva en el apartado de `[voting]` del fichero `rippled.cfg`. + +**Atención:** Los requisitos insuficientes, en caso de ser adoptados por un consenso de validadores confiables, podrían exponer a la red peer-to-peer XRP Ledger a ataques de denegación de servicio. + +Los parámetros que puedes configurar son los siguientes: + +| Parámetro | Descripción | Valor recomendado | +|-----------|-------------|-------------------| +| `reference_fee` | Cantidad de XRP, en _drops_ (1 XRP = 1 millón de drops.), que debe ser destruido para enviar la transacción de referencia, la transacción más barata posible. El coste de una transacción real es un múltiplo de ese valor, escalado dinámicamente basado en la carga de de los servidores individuales. | `10` (0.00001 XRP) | +| `account_reserve` | Cantidad mínima de XRP, en _drops_, que una cuenta debe tener en reserva. Esta es la cantidad más pequeña que se puede enviar para financiar una nueva cuenta en el ledger. | `10000000` (10 XRP) | +| `owner_reserve` | XRP de más, en _drops_, que se debe poseer en una dirección por _cada_ objeto que posees en el ledger. | `2000000` (2 XRP) | + +## Proceso de votación + +Cada 256º ledger se denomina un "flag" ledger. (Un flag ledger se define de manera que el `ledger_index` [modulo](https://en.wikipedia.org/wiki/Modulo_operation) `256` es igual a `0`.) En el ledger inmediatamente antes del flag ledger, cada validador cuyas preferencias de reserva de cuenta o coste de transacción son diferentes a la configuración actual de la red distribuye un mensaje de "voto" junto con su validación del ledger, indicando los valores que prefiere ese validador. + +En el propio flag ledger en sí, no ocurre nada, pero los validadores reciben y toman nota de los votos de los otros validadores en los que confían. + +Después de contar los votos de otros validadores, cada validador intenta llegar a un acuerdo entre sus propias preferencias y las preferencias de la mayoría de validadores en los que confía. (Por ejemplo, si un validador quiere aumentar el coste de transacción mínima de 10 a 100, pero la mayoría de los validadores solo quiere aumentarla de 10 a 20, el validador decide aumentar el coste de transacción a 20. Sin embargo, el validador nunca estará de acuerdo en un valor menor a 10 o superior a 100.) Si es posible llegar a un compromiso, el validador inserta una [pseudo transacción SetFee](../../references/protocol/transactions/pseudo-transaction-types/setfee.md) en su propuesta para el ledger siguiente al flag ledger. Otros validaodres que quieran el mismo cambio, insertan la misma pseudo-transacción SetFee en sus propuestas para el mismo ledger. (Los validadores cuyas preferencias coincidan con las existentes en la red no hacen nada.) Si una pseudo-transacción SetFee sobrevive al proceso de consenso para ser incluida en un ledger validado, entonces el nuevo coste de transacción y configuración de reservas indicados por la pseudo transacción SetFee toman efecto empezando por el siguiente ledger. + +En resumen: + +* **Flag ledger -1**: Los validadores emiten sus votos. +* **Flag ledger**: Los validadores cuentan sus votos y deciden qué SetFee incluir, si hay alguna. +* **Flag ledger +1**: Los validadores incluyen una pseudo-transacción SetFee pseudo-transaction en sus ledgers propuestos. +* **Flag ledger +2**: La nueva configuración toma efecto, si la pseudo-transacción alcanza consenso. + +## Valores máximos de comisiones o fees + +Los valores máximos posibles para las comisiones están limitadas por los tipos de datos internos almacenados en el [objeto de ledger FeeSettings](../../references/protocol/ledger-data/ledger-entry-types/feesettings.md). Los valores son los siguientes: + +| Parámetro | Valor máximo (drops) | Valor máximo (XRP) +|-----------|-----------------------|----| +| `reference_fee` | 264 | (Más XRP del que nunca ha existido.) | +| `account_reserve` | 232 drops | Aproximadamente 4294 XRP | +| `owner_reserve` | 232 drops | Aproximadamente 4294 XRP | + + +## Ver también + +- **Conceptos:** + - [Enmiendas](../networks-and-servers/amendments.md) + - [Coste de transacción](../transactions/transaction-cost.md) + - [Reservas](../accounts/reserves.md) + - [Cola de transacción](../transactions/transaction-queue.md) +- **Tutoriales:** + - [Configurar `rippled`](../../infrastructure/configuration/index.md) +- **Referencias:** + - [Método fee][] + - [Método server_info][] + - [Objeto FeeSettings](../../references/protocol/ledger-data/ledger-entry-types/feesettings.md) + - [Pseudo-transacción SetFee][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/index.md b/@i18n/es-ES/docs/concepts/consensus-protocol/index.md new file mode 100644 index 0000000000..567a85925f --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/index.md @@ -0,0 +1,72 @@ +--- +html: consensus.html +parent: concepts.html +seo: + description: El consenso es cómo los nuevos bloques de transacciones son confirmados por la blockchain XRP Ledger. +labels: + - Blockchain +top_nav_grouping: Popular Pages +--- +# El protocolo de consenso + +Este tema explica cómo el XRP Ledger descentralizado confirma nuevas transacciones y nuevas versiones de ledgers, creando una blockchain. + +El consenso es la propiedad más importante de cualquier sistema de pagos descentralizado. En sistemas de pagos centralizados tradicionales, un administrador autorizado tiene la última palabra en cómo los pagos deben ocurrir. En sistemas descentralizados, por definición, no hay un administrador para hacerlo. En cambio, los sistemas descentralizados como el XRP Ledger definen un conjunto de reglas que todos los participantes siguen, así cada participante puede estar de acuerdo en la misma exacta serie de eventos y sus resultados en cualquier momento. A este conjunto de reglas les llamamos un _protocolo de consenso_. + + +## Propiedades del protocolo de consenso + +El XRP Ledger utiliza el protocolo de consenso de una forma diferente a todos los activos digitales anteriores. Este protocolo, conocido como el Protocolo de Consenso de XRP Ledger, está diseñado para tener las siguientes propiedades importantes: + +- Todos los que utilizan el XRP Ledger pueden ponerse de acuerdo en el último estado, y qué operaciones se han producido y en qué orden. +- Todas las transacciones válidas son procesadas sin necesidad de un operador central o sin tener un único punto de fallo. +- El ledger puede progresar incluso si algunos participantes se incorporan, se marchan o tienen un comportamiento inapropiado. +- Si demasiados participantes son incontactables o se comportan inadecuadamente, la red fallará a la hora de progresar en vez de divergir o confirmar transacciones inválidas. +- Confirmar transacciones no requiere un uso de recursos competitivos o malgastados, como en muchos otros sistemas blockchains. + +Estas propiedades se resumen a veces en los siguientes principios, en orden de prioridad: **Correción, Acuerdo, Progreso**. + +Este protocolo sigue evolucionando, al igual que nuestro conocimiento de sus límites y posibles casos de fallo. Para investigaciones academicas del protocolo en sí, ver [Investigación del consenso](consensus-research.md). + +## Trasfondo + +Los protocolos de consenso son una solución al _problema del doble gasto_: el desafío de prevenir a alguien de gastar con éxito dos veces el mismo dinero digital. La parte más dificil de este problema es poner las transacciones en orden: sin una autoridad central, puede ser dificil resolver disputas sobre qué transacciones van primero cuando dos o más transacciones mutuamente excluyentes se envían al mismo tiempo. Para un análisis del problema del doble gasto, cómo el Protocolo de Consenso XRP Ledger resuelve este problema, las concesiones y limitaciones involucradas, ver [Principios y reglas del consenso](consensus-principles-and-rules.md). + + +## Histórico del ledger + +El XRP Ledger procesa transacciones en bloques llamadados "versiones del ledger", o "ledgers" abreviado. Cada versión del ledger contiene tres partes: + +- El estado actual de todos los balances y objetos guardados en el ledger. +- El conjunto de transacciones que han sido aplicadas en el ledger anterior para dar como resultado este. +- Metadatos sobre la versión actual del ledger, como el índice del ledger, un [hash criptográfico](https://en.wikipedia.org/wiki/Cryptographic_hash_function) que identifica de forma única su contenido, e información sobre el ledger parental que se usó como base para construir este. + +[{% inline-svg file="/docs/img/anatomy-of-a-ledger-simplified.svg" /%}](/docs/img/anatomy-of-a-ledger-simplified.svg "Figura 1: Anatomía de una versión de un ledger, que incluye transacciones, estado, y metadatos") + +Cada versión del ledger está numerado por un _ledger index_ o índice ledger y se basa en una versión anterior del ledger cuyo índice es uno menos, y se remonta hasta el punto de partida llamado el _ledger génesis_ con un índice ledger 1.[¹](#footnote-1) Como Bitcoin y otras tecnologías blockchain, esto forma el histórico público de todas las transacciones y sus resultados. A diferencia de otras tecnologías blockchain, cada nuevo "bloque" en el XRP Ledger contiene la totalidad del estado actual, por lo que no tienes que recopilar toda el histórico completo para conocer qué esta pasando ahora.[²](#footnote-2) + +El objetivo principal del Protocolo de Consenso del XRP Ledger es acordar un conjunto de transacciones para añadir la nueva siguiente versión del ledger, aplicarlos en un orden bien definido, y después confirmar con todo el mundo para tener los mismos resultados. Cuando esto ocurre satisfactoriamente, una versión del ledger es considerado _validado_, y definitivo. A partir de aquí, el proceso continua construyendo la siguiente versión del ledger. + + +## Validación basada en la confianza + +El principio básico detrás del mecanismo de consenso del XRP Ledger es que un poco de confianza ayuda mucho. Cada participante en la red elige un conjunto de _validadores_, servidores [configurados específicamente para participar activamente en el consenso](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md), gestionados por diferentes equipos que se espera que se comporten honestamente la mayor parte del tiempo según el protocolo. Aún más importante, el conjunto de validadores elegidos no deberían confabular entre sí para infringir las reglas de la misma manera. Esta lista se llama _Lísta Única de Nodos_, o UNL. + +A medida que la red avanza, cada servidor escucha a sus validadores de confianza[³](#footnote-3); siempre y cuando un porcentaje lo suficientemente grande de ellos esté de acuerdo en que un conjunto de transacciones debería ocurrir y que un ledger dado es el resultado, el servidor declara un consenso. Si no están de acuerdo, los validadores modifican sus propuestas para que coincidan más con las de otros validadores en los que confían, repitiendo el proceso en varias rondas hasta alcanzar un consenso. + +[{% inline-svg file="/docs/img/consensus-rounds.svg" /%}](/docs/img/consensus-rounds.svg "Figura 2: Rondas de consenso. Los validadores revisan sus propuestas para coincidir con otros validadores en los que confían") + +Esta bien si una pequeña porción de los validadores no funciona correctamente todo el tiempo. Siempre que menos del 20% de los validadores de confianza fallen, el consenso puede continuar sin impedimentos; y confirman una transacción inválida requeriría que más del 80% de los validadodres de confianza se confabulasen. Si más del 20% o menos del 80% de los validadores confiables fallan, la red para de progresar. + +Para una exploración de cómo el Protocolo de Consenso del XRP Ledger responde a varios desafíos, ataques, y casos de fallo, ver [Protecciones del Consenso contra Ataques y Modos de Fallo](consensus-protections.md). + + +---- + +## Pies de página + +1. Debido a un percance ocurrido al inicio de la historia de XRP Ledger, [se perdieron los ledgers del 1 al 32569](http://web.archive.org/web/20171211225452/https://forum.ripple.com/viewtopic.php?f=2&t=3613). (Esta pérdida representa aproximadamente la primera semana de la historia del ledger.) Por lo tanto, el ledger #32570 es el ledger más antiguo disponible. Porque el estado del XRP Ledger se guarda en cada versión de cada ledger, el ledger puede continuar sin la historia perdida. Las nuevas redes de prueba seguirán empezando con el índice del ledger 1. + +2. En Bitcoin, el estado actual a veces se llama conjunto de "UTXOs" (salidas de transacción no gastadas). A diferencia que el XRP Ledger, un servidor Bitcoin debe descargar el histórico completo de transacciones para conocer el conjunto completo de UTXOs y procesar nuevas transacciones. Desde 2018, ha habido varias propuestas para modificar el mecanismo de consenso de Bitcoin para periódicamente resumir las últimas UTXOs para que los nuevos servidores no necesiten hacerlo. Ethereum utiliza un enfoque similar al del XRP Ledger, con un resumen del estado actual (conocido como _state root_) en cada bloque, pero la sincronización tarda más en Ethereum porque almacena más información en su estado de datos. + +3. Un servidor no necesita una conexión directa con sus validadores de confianza para escucharlos. La red peer-to-peer del XRP Ledger utiliza un _protocolo de cotilleo_ donde los servidores se identifican entre ellos con una clave pública y transmiten mensajes firmados digitalmente por otros. diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/invariant-checking.md b/@i18n/es-ES/docs/concepts/consensus-protocol/invariant-checking.md new file mode 100644 index 0000000000..774991aade --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/invariant-checking.md @@ -0,0 +1,172 @@ +--- +html: invariant-checking.html +parent: consensus.html +seo: + description: Entender qué es la verificación invariantes, por qué existe, cómo funciona, y qué comprobaciones de invariantes están activas. +labels: + - Blockchain + - Seguridad +--- +# Comprobación de invariantes + +La comprobación de invariantes es una característica de seguridad del XRP Ledger. Consiste en un conjunto de comprobaciones, separadas del procesamiento normal de transacciones, que garantiza que ciertas _invariantes_ se mantienen ciertas en todas las transacciones. + +Como muchas características de seguridad, todos esperamos que la comprobación de invariantes nunca necesite hacer nada. Sin embargo, puede ser útil entender las invariantes del XRP Ledger porque definen los límites estrictos del procesamiento de transacciones en el XRP Ledger, y reconocer el problema en el improbable caso que una transacción falle porque ha violado una comprobación de invariantes. + +Las invariantes no deberían activarse, pero aseguran la integridad del XRP Ledger contra errores aún por descubrir o incluso creados. + + +## Por qué existe + +- El código fuente del XRP Ledger es complejo y extenso; hay un potencial alto de que el código se ejecute incorrectamente. +- El coste de la ejecutar incorrectamente una transacción es alto y no es aceptable bajo ningún estándar. + +Específicamente, la ejecución de transacciones incorrectas podría crear datos inválidos o corruptos que luego hagan que servidores en la red fallen consistentemente en un estado "imposible" que pudiese detener toda la red. + +El procesamiento de transacciones incorrectas socavaría el valor de confianza en el XRP Ledger. Las comprobación de invariantes proporciona valor a todo el XRP Ledger porque agrega la característica de confiabilidad. + + + +## Cómo funciona + +El comprobador de invariantes es una segunda capa de código que se ejecuta automáticamente en tiempo real después de cada transacción. Antes de que los resultados de la transacción se confirmen en el ledger, el comprobador de invariantes examina esos cambios en busca de corrección. Si los resultados de la transacción rompieran una de las reglas estrictas del XRP Ledger, el comprobador de invariantes rechazará la transacción. Las transacciones que son rechazadas de esta manera tienen el código de resultado `tecINVARIANT_FAILED` y se incluyen en el ledger sin efectos. + +Para incluir la transacción en el ledger con un código de clase `tec`, es necesario realizar algún procesamiento mínimo. Si este procesamiento mínimo aún rompe un invariante, la transacción falla con el código `tefINVARIANT_FAILED` en su lugar, y no se incluye en el ledger en absoluto. + + +## Invariantes activas + +El XRP Ledger comprueba todas las siguientes invariantes en cada transación: + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L92 "Fuente") + +- [Comprobación de coste de transacción](#comprobación-de-coste-de-transacción) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L118 "Fuente") + +- [XRP no creado](#xrp-no-creado) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L146 "Fuente") + +- [Account Roots no eliminadas](#account-roots-no-eliminadas) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L173 "Fuente") + +- [Comprobaciones de balance XRP](#comprobaciones-de-balance-XRP) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L197 "Fuente") + +- [Coincidencia de tipos de entradas ledger](#coincidencia-de-tipos-de-entradas-de-ledger) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L224 "Fuente") + +- [No XRP Trust Lines](#no-xrp-trust-lines) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L251 "Fuente") + +- [No malas ofertas](#no-malas-ofertas) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L275 "Fuente") + +- [No escrow cero](#no-escrow-cero) + +[[Fuente]](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h#L300 "Fuente") + +- [Nueva Account Root válida](#nueva-account-root-válida) + + +### Comprobación de coste de transacción + +- **Condicion(es) invariantes:** + - La cantidad de [coste de transacción](../transactions/transaction-cost.md) nunca debe ser negativa, ni tampoco más grande que la especificada en el coste de la transacción. + + +### XRP no creado + +- **Condicion(es) invariantes:** + - Una transacción no debe crear XRP y solo debería destruir el XRP del [coste de transacción](../transactions/transaction-cost.md). + + +### Account Roots no eliminadas + +- **Condicion(es) invariantes:** + - Una [cuenta](../accounts/index.md) no puede ser eliminada del ledger excepto por una [transacción AccountDelete][]. + - Una transacción AccountDelete exitosa siempre borra exactamente 1 cuenta. + + +### Comprobaciones de balance XRP + +- **Condicion(es) invariantes:** + - El balance de XRP de una cuenta debe ser de tipo XRP, y no puede ser menor a 0 o más de 100 mil millones XRP exactamente. + + +### Coincidencia de tipos de entrada de ledger + +- **Condicion(es) invariantes:** + - Las entradas de los ledgers modificados deberían coincidir en tipo y las entradas añadidas deben ser de un [tipo válido](../../references/protocol/ledger-data/ledger-entry-types/index.md). + + +### No XRP Trust Lines + +- **Condicion(es) invariantes:** + - [Trust lines](../tokens/fungible-tokens/index.md) o líneas de confianza utilizando XRP no están permitidas. + + +### No malas ofertas + +- **Condicion(es) invariantes:** + - Las [ofertas](../../references/protocol/ledger-data/ledger-entry-types/offer.md) deben ser de cantidades no negativas y no pueden ser de XRP para XRP. + + +### No escrow cero + +- **Condicion(es) invariantes:** + - Una entrada [escrow](../../references/protocol/ledger-data/ledger-entry-types/escrow.md) debe contener más de 0 XRP y menos que 100 mil millones de XRP. + + +### Nueva Account Root válida + +- **Condicion(es) invariantes:** + - Una nueva [account root](../../references/protocol/ledger-data/ledger-entry-types/accountroot.md) debe ser la consecuencia de un pago. + - Una nueva account root debe tener la correcta [secuencia](../../references/protocol/data-types/basic-data-types.md#account-sequence) de inicio. + - Una transacción no debe crear más de una nueva [cuenta](../accounts/index.md). + +### ValidNFTokenPage + +- **Condicion(es) invariantes:** + - El número de NFTs acuñados o quemados solo puede ser cambiado por transacciones `NFTokenMint` o `NFTokenBurn`. + - Una transacción NFTokenMint exitosa debe incrementar el número de NFTs. + - Una transacción NFTokenMint fallida no puede cambiar el número de NFTs acuñados. + - Una transacción NFTokenMint no puede cambiar el número de NFTs quemados. + - Una transacción NFTokenBurn debe incrementar el número de NFTs quemados. + - Una transacción NFTokenBurn no debe cambiar el número de NFTs quemados. + - Una transacción NFTokenBurn no puede cambiar el número de NFTs acuñados. + +### NFTokenCountTracking + +- **Condicion(es) invariantes:** + - La página está correctamente asociada al dueño. + - La página está correctamente ordenada entre el siguiente y el anterior enlace. + - La página contiene un número válido de NFTs. + - Los NFTs en esta página no pertenecen a una página anterior o posterior. + - Los NFTs están correctamente ordenados en la página. + - Cada URI, si está presente, no está vacío. + +## Ver también + +- **Blog:** + - [Protegiendo el ledger: Comprobación de invariantes](https://xrpl.org/blog/2017/invariant-checking.html) + +- **Repositorio:** + - [Invariant Check.h](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.h) + - [Invariant Check.cpp](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/app/tx/impl/InvariantCheck.cpp) + - [Parámetros del sistema](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/SystemParameters.h#L43) + - [Cantidad XRP](https://github.com/XRPLF/rippled/blob/develop/src/ripple/basics/XRPAmount.h#L244) + - [Formatos de ledger](https://github.com/XRPLF/rippled/blob/023f5704d07d09e70091f38a0d4e5df213a3144b/src/ripple/protocol/LedgerFormats.h#L36-L94) + + +- **Otros:** + - [Trust Lines autorizadas](../tokens/fungible-tokens/authorized-trust-lines.md) + - [Calculando cambios de balance para una transacción](https://xrpl.org/blog/2015/calculating-balance-changes-for-a-transaction.html#calculating-balance-changes-for-a-transaction) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/consensus-protocol/negative-unl.md b/@i18n/es-ES/docs/concepts/consensus-protocol/negative-unl.md new file mode 100644 index 0000000000..1fe6d50962 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/consensus-protocol/negative-unl.md @@ -0,0 +1,178 @@ +--- +html: negative-unl.html +parent: consensus.html +seo: + description: Comprende cómo la UNL negativa mejora la resiliencia durante interrupciones parciales. +labels: + - Blockchain +--- +# UNL negativa + +_Añadida por la [enmienda NegativeUNL](/resources/known-amendments.md#negativeunl)._ + +La _UNL negativa_ es una característica del [protocolo de consenso](index.md) del XRP Ledger que mejora la _viveza_, la habilidad de la red a seguir progresando hacia adelante durante una interrupción parcial. Utilizando la UNL negativa, los servidores ajustan sus UNLs efectivas en función de los validadores que están actualmente en línea y operativos, de modo que una nueva [versión ledger](../ledgers/index.md) puede ser declarada _validada_ incluso si varios validadores confiables están offline. + +La UNL negativa no tiene impacto en cómo la red procesa los resultados de las transacciones o en los resultados de las transacciones, excepto que mejora la habilidad de la red para declarar resultados finales durante algunos tipos de interrupciones parciales. + +## Transfondo + +Cada servidor en el protocolo XRP Ledger tiene su propia UNL (Lista de Nodos Únicos), una lista de validadores en los que se confía para no colisionar, y cada servidor decide independientemente cuándo se valida una versión del ledger basándose en el consenso cuando suficientes de sus validadores confiables están de acuerdo en una nueva versión del ledger. (La configuración predeterminada utiliza una UNL recomendada, firmada por Ripple, que consiste en validadores que Ripple considera suficientemente únicos, confiables e independientes). El requisito del cuórum estándar es que al menos el 80% de los validadores confiables deben estar de acuerdo. + +Si más del 20% de los validadores confiables se desconectan o no pueden comunicarse con el resto de la red, la red deja de validar nuevos ledgers porque no puede alcanzar un cuórum. Esta es una elección de diseño para garantizar que los resultados de las transacciones no puedan cambiarse después de que se declaren definitivos. Durante dicha situación, los servidores restantes seguirían en línea y podrían proporcionar datos de transacciones pasadas y tentativas, pero no podrían confirmar el resultado final, inmutable, de nuevas transacciones. + +Sin embargo, esto significa que la red podría dejar de avanzar si algunos validadores ampliamente confiables se desconectaran. A partir del 6 de octubre de 2020, hay 34 validadores en la UNL recomendada de Ripple, por lo que la red dejaría de avanzar si 7 o más de ellos estuvieran desconectados. Además, si uno o dos validadores están desconectados por un período prolongado, la red tiene menos margen para el desacuerdo entre los validadores restantes, lo que puede hacer que tarde más en alcanzar un consenso. + +## Resumen + +No es razonable esperar que un conjunto diverso de validadores mantenga un tiempo de actividad del 100%: muchas cosas pueden hacer que un validador se vuelva temporalmente indisponible, como: mantenimiento de hardware, actualizaciones de software, problemas de conectividad a Internet, ataques dirigidos, errores humanos, fallos de hardware y circunstancias externas como desastres naturales. + +La "UNL negativa" es una **lista de validadores de confianza que se cree que están desconectados o con mal funcionamiento**, según lo declarado por un consenso de los validadores restantes. Los validadores en la UNL negativa son ignorados para determinar si una nueva versión del ledger ha alcanzado un consenso. + +Cuando un validador que está en la UNL negativa vuelve a estar en línea y envía votos de validación consistentes, los validadores restantes lo eliminan de la UNL negativa después de un tiempo corto. + +En casos donde los validadores se desconecten uno o dos a la vez, los validadores restantes pueden usar la UNL negativa para ajustar gradualmente sus UNL efectivas, de modo que la red solo necesite el 80% de los validadores _en línea_ para alcanzar un cuórum. Para evitar que la red se fragmente, el cuórum tiene un mínimo estricto del 60% de los validadores _totales_. + +Si más del 20% de los validadores de repente se desconectan todos a la vez, los servidores restantes no pueden alcanzar el quórum necesario para validar un nuevo ledger, por lo que no se podrían validar nuevos ledgers. Sin embargo, esos servidores aún pueden avanzar tentativamente a través de rondas de consenso sucesivas. Con el tiempo, los validadores restantes continuarían aplicando cambios a la UNL negativa a los ledgers tentativos y ajustarían sus UNL efectivas; eventualmente, si la situación persiste, la red podría reanudar la validación completa de ledgers utilizando la UNL negativa ajustado de las versiones de ledgers tentativas. + +La UNL negativa no tiene efecto sobre el modo solitario o [stand-alone mode](../networks-and-servers/rippled-server-modes.md) porque el servidor no utiliza el consenso en el modo solitario. + + +## Cómo funciona + +La UNL negativa está estrechamente ligada al [proceso de consenso](index.md) y está diseñada con salvaguardas para mantener la continuidad y confiabilidad de la red en situaciones adversas. Cuando todos los validadores confiables están funcionando normalmente, la UNL negativa no se utiliza y no tiene efecto. Cuando algunos validadores parecen estar desconectados o desincronizados, se aplican las reglas de la UNL negativa. + +La UNL negativa está diseñada intencionalmente para cambiar a una velocidad lenta, para evitar desacuerdos basados en el tiempo sobre qué la UNL negativa debería aplicarse al proceso de consenso de una versión dada del ledger. + + +### Medición de fiabilidad + +Cada servidor en la red tiene una UNL, la lista de validadores en los que confía para no colisionar. (Por defecto, la UNL exacta de un servidor se configura implícitamente en función de la lista de validadores recomendada que Ripple publica). Cada servidor sigue la _fiabilidad_ de sus validadores de confianza utilizando una métrica única: el porcentaje de los últimos 256 ledgers donde el voto de validación del validador coincidió con la vista de consenso del servidor. En otras palabras: + +> Fiabilidad = Va ÷ 256 + +Va es el número total de votos de validación recibidos de un validador en los últimos 256 ledgers que coincidieron con la vista de consenso del servidor. + +Esta métrica de fiabilidad mide la disponibilidad de un validador _y_ el comportamiento de ese validador. Un validador debería tener una puntuación de fiabilidad alta si está sincronizado con el resto de la red y sigue las mismas reglas de protocolo que el servidor que lo califica. La puntuación de fiabilidad de un validador puede verse afectada por cualquiera de las siguientes razones: + +- Los votos de validación del validador no están llegando al servidor debido a una mala conectividad de red entre ellos. +- El validador deja de funcionar o se sobrecarga. +- El validador no sigue las mismas reglas de protocolo que el servidor, por diversas razones. Las posibilidades incluyen una mala configuración, errores de software, seguir intencionalmente una [red distinta](../networks-and-servers/parallel-networks.md), o un comportamiento malicioso. + +Si la fiabilidad de un validador es **inferior al 50%**, es candidato para ser agregado al Negative UNL. Para ser eliminado de la UNL negativa, la fiabilidad de un validador debe ser **superior al 80%**. + +Cada servidor, incluidos los validadores, calcula de forma independiente las puntuaciones de fiabilidad para todos sus validadores confiables. Diferentes servidores pueden llegar a diferentes conclusiones sobre la fiabilidad de un validador, ya sea porque los votos de ese validador llegaron a un servidor y no al otro, o porque desacordaban sobre ledgers específicos con más o menos frecuencia. Para añadir o eliminar un validador en la UNL negativa, se debe lograr un consenso de los validadores confiables sobre si un validador en particular está por encima o por debajo del umbral de fiabilidad. + +**Consejo:** Los validadores siguen su propia fiabilidad, pero no proponen agregarse a la UNL negativa. La medida de fiabilidad de un validador por sí sola no puede tener en cuenta cuán exitosamente se propagan sus votos de validación a través de la red, por lo que es menos confiable que las mediciones de servidores externos. + + + +### Modificación de la UNL negativa + +Una versión del ledger se considera un _flag ledger_ si su índice de ledger o index es divisible entera por 256. La UNL negativa solo se puede modificar en flag ledgers. (Los flag ledgers ocurren una vez cada 15 minutos en la red principal, Mainnet, de XRP Ledger. Pueden estar más separados en redes de prueba (test) que tienen un volumen de transacciones bajo). + +En cada flag ledger, se aplican todos los siguientes cambios: + +1. Los cambios la UNL negativa que se programaron en el flag ledger anterior entran en vigencia para la siguiente versión del ledger. El proceso de consenso para validar este flag ledger en sí mismo no utiliza el cambio programado. + + **Nota:** Esto es uno de los únicos momentos en los que el estado de datos del ledger se modifica sin una [transacción](../transactions/index.md) o [pseudo-transacción](../../references/protocol/transactions/pseudo-transaction-types/pseudo-transaction-types.md). + +2. Si la UNL negativa no está llena, cada servidor propone añadir **hasta 1** validador a la UNL negativa entre sus validadores confiables con una fiabilidad inferior al 50%. +3. Si la UNL negativa no está vacía, cada servidor propone eliminar **hasta 1** validador de la UNL negativa. Un servidor puede proponer eliminar un validador de la UNL negativa por dos motivos: + - Califica a ese validador con una fiabilidad > 80%. + - No tiene a ese validador en su UNL. (Si un validador deja de funcionar permanentemente, esta regla garantiza que se elimine de la UNL negativa en el ledger después de que se haya eliminado de las UNL configuradas de los servidores). +4. Si un cambio propuesto a la UNL negativa logra un consenso, el cambio se programa para entrar en vigencia en el siguiente flag ledger. Se puede programar hasta una adición y una eliminación de esta manera. + +Las propuestas para agregar y eliminar validadores de la UNL negativa toman la forma de [pseudo-transacciones de UNLModify][]. El proceso de consenso determina si cada pseudo-transacción logra un consenso o se descarta, de la misma manera que otras [pseudo-transacciones](../../references/protocol/transactions/pseudo-transaction-types/pseudo-transaction-types.md). En otras palabras, para que un validador en particular se agregue o elimine a la UNL negativa, se debe lograr un consenso de servidores sobre el mismo cambio. + +Los cambios programados y efectivos de la UNL negativa se rastrean en el [objeto NegativeUNL](../../references/protocol/ledger-data/ledger-entry-types/negativeunl.md) en los datos de estado del ledger. + + +### Límites de la UNL negativa + +Para prevenir que la red se fragmente en dos o más subredes, la UNL negativa no puede reducir el requisito de cuórum a menos del 60% de las entradas de UNL _totales_. Para hacer cumplir esto, un servidor considera que la UNL negativa está "llena" si el número de validadores en la UNL negativa es del 25% (redondeado hacia abajo) del número de validadores en la UNL configurada del servidor. (El 25% se basa en el cálculo de que si se eliminan el 25% de los validadores, un consenso del 80% del 75% restante equivale al 60% del número original). Si un servidor considera que la UNL negativa está llena, no propondrá nuevas adiciones a la UNL negativa; pero, como siempre, el resultado final depende de lo que haga un consenso de validadores de confianza. + + +### Elección de múltiples validadores candidatos + +Es posible que múltiples validadores sean candidatos para ser agregados a la UNL negativa, según el umbral de fiabilidad. Dado que como máximo se puede agregar un validador a la UNL negativa a la vez, los servidores deben elegir qué validador proponer agregar. Si hay múltiples candidatos, el servidor elige cuál proponer con el siguiente mecanismo: + +1. Comienza con el hash del ledger de la versión anterior. +0. Toma la clave pública de cada validador candidato. +0. Cacula el valor de exclusión-o (XOR) del validador candidato y el hash del ledger padre. +0. Propón el validador con el resultado numéricamente más bajo de la operación XOR. + +Si hay múltiples candidatos para ser eliminados de la UNL negativa en un flag ledger dado, los servidores utilizan el mismo mecanismo para elegir entre ellos. + +Este mecanismo tiene varias propiedades útiles: + +- Utiliza información que está fácilmente disponible para todos los servidores y se puede calcular rápidamente. +- La mayoría de los servidores eligen el mismo candidato incluso si calculan puntuaciones ligeramente diferentes para sus validadores de confianza. Esto se mantiene incluso si esos servidores discrepan sobre qué validador es _menos_ o _más_ confiable. Esto incluso se mantiene en muchos casos en los que los servidores discrepan sobre si algunos validadores están por encima o por debajo de los umbrales de fiabilidad. Por lo tanto, es probable que la red llegue a un consenso sobre qué validador agregar o eliminar. +- No siempre da los mismos resultados en cada versión del ledger. Si un cambio propuesto a la UNL negativa no logra un consenso, la red no queda atrapada con algunos servidores intentando y fallando en agregar o eliminar ese validador cada vez. La red puede intentar agregar o eliminar un candidato diferente de la UNL negativa en un flag ledger posterior. + + +### Filtrado de validaciones + +Durante [el paso de validación del proceso de consenso](consensus-structure.md#validation), se desactivan los validadores en la UNL negativa del ledger padre. Cada servidor calcula una "UNL efectiva" que consiste en su UNL configurada con los validadores desactivados eliminados, y recalcula su cuórum. (El cuórum siempre es al menos el 80% de la UNL efectiva y al menos el 60% de la UNL configurada). Si un validador desactivado envía votos de validación, los servidores siguen esos votos para fines de cálculo de la medida de fiabilidad del validador desactivado, pero no utilizan esos votos para determinar si una versión del ledger ha alcanzado un consenso. + +**Nota:** La UNL negativa ajusta el número _total_ de validadores de confianza a partir del cual se calcula el cuórum, no el cuórum directamente. El cuórum es un porcentaje pero el número de votos es un número entero, por lo que reducir el total de validadores de confianza no siempre cambia el número de votos requeridos para alcanzar un cuórum. Por ejemplo, si hay 15 validadores en total, el 80% es exactamente 12 validadores. Si reduces el total a 14 validadores, el 80% es 11.2 validadores, lo que significa que aún se requieren 12 validadores para alcanzar un cuórum. + +La UNL negativa no tiene impacto en otras partes del proceso de consenso, como la elección de qué transacciones incluir en el conjunto de transacciones propuestas. Esos pasos siempre se basan en la UNL configurada, y los umbrales se basan en cuántos validadores de confianza están participando activamente en la ronda de consenso. Incluso un validador que esté en la UNL negativa puede participar en el proceso de consenso. + +### Ejemplo + +El siguiente ejemplo demuestra cómo afecta la UNL negativa al proceso de consenso: + +1. Supón que la UNL de tu servidor consta de 38 validadores de confianza, por lo que un cuórum del 80% es al menos 31 de 38 validadores. + +[{% inline-svg file="/docs/img/negative-unl-01.svg" /%}](/docs/img/negative-unl-01.svg "Diagrama: Caso normal: UNL negativa sin utilizar, el cuorum es 80% de los validadores configurados.") + +2. Imagina que 2 de esos validadores, llamados MissingA y UnsteadyB, parecen haberse desconectado. (Ambos tienen puntuaciones de fiabilidad < 50%.) Durante el proceso de consenso para el ledger _N_, muchos de los validadores restantes proponen agregar a UnsteadyB en la UNL negativa. La moción pasa mediante un cuórum de al menos 31 de los validadores restantes, y el ledger _N_ se valida con UnsteadyB programado para ser desactivado. + +[{% inline-svg file="/docs/img/negative-unl-02.svg" /%}](/docs/img/negative-unl-02.svg "Diagrama: UnsteadyB está programado para desactivarse.") + + +3. Para ledgers desde _N+1_ hasta _N+256_, el proceso de consenso continua sin cambios. + +4. En el siguiente flag ledger, ledger _N+256_, UnsteadyB se mueve automáticamente de "programado" a la lista "desconectados" en el ledger. Además, dado que MissingA está todavía offline, un consenso de validadores programa a MissingA para ser desactivado en el siguiente flag ledger. + +[{% inline-svg file="/docs/img/negative-unl-04.svg" /%}](/docs/img/negative-unl-04.svg "Diagrama: UnsteadyB se desactiva y MissingA es programado para ser desactivado, también.") + +5. Para los ledgers _N+257_ a _N+512_, el cuorum es ahora 30 de 37 validadores. + +6. UnsteadyB vuelve a estar online en el ledger _N+270_. Envía votos de validación que están de acuerdo con el resto de la red de los ledgers _N+270_ a _N+511_, dándole una puntuación de confiabilidad de > 80%. + +[{% inline-svg file="/docs/img/negative-unl-06.svg" /%}](/docs/img/negative-unl-06.svg "Diagrama: UnsteadyB vuelve a estar online, pero sigue desactivado.") + +7. En el siguiente flag ledger, _N+256_, MissingA se mueve automáticamente a la lista de desactivados, como estaba programado. Mientras tanto, un consenso de validadores programa que UnsteadyB sea eliminado de la UNL negativa, debido a su mejora en la puntuación de confianza. + +[{% inline-svg file="/docs/img/negative-unl-07.svg" /%}](/docs/img/negative-unl-07.svg "Diagrama: MissingA está desactivado y UnsteadyB está programado para ser reactivado.") + +8. Para los ledgers _N+513_ a _N+768_, el cuorum es 29 de 36 validadores. UnsteadyB continua enviando validaciones de manera estable mientras que MissingA continua offline. + +9. En el flag ledger _N+768_, UnsteadyB es automáticamente eliminado de la lista de desactivados, como estaba programado. + +[{% inline-svg file="/docs/img/negative-unl-09.svg" /%}](/docs/img/negative-unl-09.svg "Diagrama: UnsteadyB es eliminado de la lista de desactivados.") + +10. Eventualmente, tú decides que MissingA es probable que no vuelva, así que lo eliminas de tu UNL. Tu servidor empieza a proponer eliminando a MissingA de la UNL negativa en cada flag ledger posterior. + +[{% inline-svg file="/docs/img/negative-unl-10.svg" /%}](/docs/img/negative-unl-10.svg "Diagrama: Después de eliminar a MissingA de tu UNL, se propone eliminarlo de la UNL negativa también.") + +11. A medida que los operadores de validadores eliminar a MissingA de sus UNLs, sus validadores también votan para eliminar MissingA de la UNL negativa. Cuando suficientes validadores lo han hecho, la propuesta de eliminar a MissingA consigue un consenso, y MissingA está programado para ser eliminado de la UNL negativa. + +[{% inline-svg file="/docs/img/negative-unl-11.svg" /%}](/docs/img/negative-unl-11.svg "Diagrama: MissingA es eliminado de la UNL negativa.") + + +## Ver también + +- **Conceptos:** + - [Protocolo de consenso](index.md) +- **Tutoriales:** + - [Conecta tu `rippled` a la red paralela](../../infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net.md) + - [Ejecuta `rippled` como validador](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md) +- **Referencias:** + - [Objeto NegativeUNL](../../references/protocol/ledger-data/ledger-entry-types/negativeunl.md) + - [Pseudo-transacción UNLModify][] + - [método ledger_entry][] + - [método consensus_info][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/ledgers/index.md b/@i18n/es-ES/docs/concepts/ledgers/index.md new file mode 100644 index 0000000000..dd2c9c5783 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/ledgers/index.md @@ -0,0 +1,35 @@ +--- +html: ledgers.html +parent: concepts.html +seo: + description: Los libros contables o ledgers son la estructura de datos que contiene datos en la red compartida de XRP Ledger. Una cadena de ledgers registra el historial de transacciones y cambios de estado. +labels: + - Blockchain + - Retención de datos +--- +# Ledgers + +El XRP Ledger es un libro contable global compartido que está abierto para todos. Participantes individuales pueden confiar en la la integridad del ledger sin tener que confiar en una única institución para manejarlo. El protocolo XRP Ledger logra esto mediante la gestión de la base de datos de contabilidad que solo puede ser actualizada de acuerdo a unas reglas específicas. Cada servidor en la reed peer-to-peer guarda una copia completa de la base de datos del ledger o libro contable, y la red distribuye transacciones candidatas, las cuales se incluyen en bloques de acuerdo al [proceso de consenso](../consensus-protocol/index.md). + +[{% inline-svg file="/docs/img/ledger-changes.svg" /%}](/docs/img/ledger-changes.svg "Diagrama: Cada ledger es el resultado de aplicar transacciones a la anterior versión del ledger.") + +El ledger global compartido consiste en una serie de bloques, llamadas versiones del ledger o simplemente _ledgers_. Cada versión del ledger tiene un índice o [Ledger Index][] el cual identifica el orden correcto de los ledgers. Cada ledger cerrado es permanente y también tiene un único valor hash que lo identifica. + +En cualquier momento, cada servidor XRP Ledger tiene un ledger _abierto_ en progreso, un número de ledgers _cerrados_ pendientes, y un histórico de ledgers _validados_ que son inmutables. + +Una versión del ledger consta de varias partes: + +[{% inline-svg file="/docs/img/anatomy-of-a-ledger-simplified.svg" /%}](/docs/img/anatomy-of-a-ledger-simplified.svg "Diagrama: Un ledger tiene transacciones, un arbol de estado, y una cabecera con la hora de cierre y la información de validación") + +* Una **cabecera** - El índice del ledger o [Ledger Index][], hashes de sus otros contenidos, y otros metadatos. +* Un **arbol de transacciones** - Las [transacciones](../../references/protocol/transactions/index.md) que se aplicaron al ledger anterior para hacer este. +* Un **arbol de estado** - Todos los datos en el ledger, como [entradas del ledger](../../references/protocol/ledger-data/ledger-entry-types/index.md): balances, configuraciones, y demás. + + + +## Ver también + +- Para más información sobre las cabeceras de ledger, IDs de objetos del ledger, y tipos de objetos del ledger, ver [Formatos de datos del ledger](../../references/protocol/ledger-data/index.md) +- Para información de cómo los servidores rastrean el historial de cambios del estado del ledger, ver [Historia del ledger](../networks-and-servers/ledger-history.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/ledgers/ledger-close-times.md b/@i18n/es-ES/docs/concepts/ledgers/ledger-close-times.md new file mode 100644 index 0000000000..265e172f62 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/ledgers/ledger-close-times.md @@ -0,0 +1,41 @@ +--- +html: ledger-close-times.html +parent: ledgers.html +seo: + description: Cómo el XRP Ledger calcula el valor de tiempo de cierre para cada versión del ledger. +labels: + - Blockchain +--- +# Tiempos de cierre del ledger + +La hora exacta en la que la versión del ledger se ha cerrado se queda guardada en el campo `close_time` de la cabecera del ledger o [ledger header](../../references/protocol/ledger-data/ledger-header.md). Para hacer más facil a la red llegar a un consenso en un tiempo de cierre exacto, este valor es redondeado a un número de segundos basado en el momento de resolución del cierre, actualmente 10 segundos. Si redondear causase a un tiempo de cierre ser igual que (o anterior) a su ledger padre, el ledger hijo tendrá su tiempo de cierre igual al tiempo de cierre del ledger padre más 1. Esto garantiza que los tiempos de cierre de los ledgers validados son estríctamente incrementales. + +Dado que las nuevas versiones de ledgers se suelen cerrar cada 3 a 5 segundos, estas reglas resultan en un patrón laxo donde el tiempo de cierre de los ledgers termina en :00, :01, :02, :10, :11, :20, :21, y demás. Los tiempos terminados en 2 son menos comunes y los tiempos terminados en 3 son muy raros, pero ambos pueden ocurrir aleatoriamente cuando más ledgers aleatoriamente cierran en ventanas de 10 segundos. + +Generalmente hablando, el ledger no puede realizar medidas basadas en el tiempo que la resolución del tiempo de cierre. Por ejemplo, para comprobar si un objeto ha pasado su fecha de caducidad, se utiliza la regla para compararlo con el tiempo de cierre del ledger padre. (El tiempo de cierre de un ledger no es conocido todavía cuando está ejecutando transacciones para introducir en ese ledger.) Esto quiere decir que, por ejemplo, un [Escrow](../payment-types/escrow.md) podría finalizar satisfactoriamente en un momento de la vida real que es 10 segundos después de la caducidad basada en el tiempo especificado en el objeto del Escrow. + +### Ejemplo + +Los siguientes ejemplos muestran el comportamiento de redondeo en los tiempos de cierre del ledger, desde la perspectiva de un validador por ejemplo, siguiendo un ledger con el tiempo de cierre **12:00:00**: + +**Ronda actual de consenso** + +1. Un validador observa que eran las **12:00:03** cuando el ledger cierra y entra en consenso. El validador incluye este tiempo de cierre en sus propuestas. +2. El validador observa que la mayoría de otros validadores (en su UNL) propusieron un tiempo de cierre de 12:00:02, y otro ha propuesto un tiempo de cierre de 12:00:03. Esto cambia su tiempo de cierre propuesto para que coincida con el del consenso de **12:00:02**. +3. El validador redondea su valor al intervalo de tiempo de cierre más cercano, resultando en **12:00:00**. +4. Como 12:00:00 no es mayor que el tiempo de cierre del ledger anterior, el validador ajusta el tiempo de cierre para ser exactamente 1 segundo después del tiempo de cierre del anterior ledger. El resultado es un tiempo de cierre ajustado a **12:00:01**. +5. El validador construye el ledger con estos detalles, calcula el hash resultante, y confirma en el paso de validación lo que otros hicieron del mismo modo. + +Los servidores que no validan hacen todos los mismos pasos, exceptuando que no proponen sus tiempos de cierre registrados al resto de la red. + +**Siguiente ronda de consenso** + +1. El siguiente ledger entra en consenso a las **12:00:04** de acuerdo con la mayoría de los validadores. +2. Esto vuelve a redondear hacia abajo otra vez, a un tiempo de cierre de **12:00:00**. +3. Como no es mayor al anterior tiempo de cierre del ledger anterior de las 12:00:01, el tiempo de cierre ajustado es **12:00:02**. + +**La siguiente ronda después de esa** + +1. El siguiente ledger entra en consenso a las **12:00:05** de acuerdo con la mayoría de validadores. +2. Esto se redondea hacia arriba, según la resolución de tiempo de cierre, a las **12:00:10**. +3. Como el valor es mayor que el tiempo de cierre del ledger anterior, no necesita ser ajustado. **12:00:10** se convierte en la hora de cierre oficial. diff --git a/@i18n/es-ES/docs/concepts/ledgers/ledger-structure.md b/@i18n/es-ES/docs/concepts/ledgers/ledger-structure.md new file mode 100644 index 0000000000..0a9c4e1452 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/ledgers/ledger-structure.md @@ -0,0 +1,70 @@ +--- +html: ledger-structure.html +parent: ledgers.html +seo: + description: Un vistazo más cercano a los elementos de un bloque de ledger individual. +--- +# La estructura del ledger + +El XRP Ledger es una blockchain, lo que quiere decir que consiste en un histórico de bloques de datos consecutivos. Un bloque en la blockchain XRP Ledger se denomina una _versión del ledger_ o _ledger_ abreviado. + +El protocolo de consenso toma la última versión del ledger como punto de partida, forma un acuerdo entre los validadores sobre un conjunto de transacciones para aplicar a continuación, después confirma que todo el mundo obtuvo los mismos resultados aplicando esas transacciones. Cuando esto ocurre satisfactoriamente, el resultado es una nueva versión de un ledger _validado_. Desde aquí, el proceso se repite para construir la próxima versión del ledger. + +Cada versión del ledger contiene _datos de estado_, un _conjunto de transacciones_, y una _cabecera_ que contiene metadatos. + +[{% inline-svg file="/docs/img/ledger.svg" /%}](/docs/img/ledger.svg "Diagrama: Un ledger está formado por una cabecera, un conjunto de transacciones, y datos de estado.") + + +## Estado de datos + +[{% inline-svg file="/docs/img/ledger-state-data.svg" /%}](/docs/img/ledger-state-data.svg "Diagrama: Los datos de estado de un ledger, en forma de varios objetos los cuales a veces están unidos como en un grafo.") + +Los _datos de estado_ representan una fotografía de todas las cuentas, balances, configuraciones, y otra información de esta versión del ledger. Cuando un servidor se conecta a la red, una de las primeras cosas que hace es descargar un conjunto completo de los datos de estado actuales para poder procesar nuevas transacciones y responder consultas sobre el estado actual. Como cada servidor de la red tiene una copia completa de los datos del estado, todos los datos son públicos y cada copia es igualmente válida. + +Los datos de estado consisten en objetos individuales llamados _entradas de ledger_, almacenados en un formato de árbol. Cada entrada del ledger tiene un ID único 256-bit que puedes usar para buscar en el árbol de estado. + +## Conjunto de transacciones + +[{% inline-svg file="/docs/img/ledger-transaction-set.svg" /%}](/docs/img/ledger-transaction-set.svg "Diagrama: Un conjunto de transacciones del ledger, un grupo de transacciones organizado en orden canónico.") + +Cada cambio realizado en el ledger es el resultado de una transacción. Cada versión del ledger contiene un _conjunto de transacciones_ que es un grupo de transacciones que se han aplicado recientemente en un orden específico. Si tomas los datos de estado de la versión anterior del ledger y aplicas este conjunto de transacciones del ledger encima de él, obtienes los datos de estado de este ledger como resultado. + +Cada transacción en el conjunto del ledger tiene ambas de la siguientes partes: + +- _Instrucciones de la transaccion_ mostrando lo que el remitente le pidió hacer. +- _Metadatos de la transacción_ mostrando exáctamente cómo la transacción debe ser procesada y cómo afecta a los datos de estado del ledger. + + +## Cabecera del ledger + +La _cabecera del ledger_ es un bloque de datos que resume la versión del ledger. Como la portada de un informe, identifica de forma única la versión del ledger, enumera sus contenidos, y muestra la hora en la que se creó, junto con algunas otras notas. La cabecera del ledger contiene la siguiente información: + + + +- [{% inline-svg file="/docs/img/ledger-index-icon.svg" /%}](/docs/img/ledger-index-icon.svg "") El _ledger index_, o índice del ledger identifica la posición del ledger en la cadena. Se construye en el ledger con un índice restando uno, hasta llegar hasta el punto de inicio llamado como el _genesis ledger_. Esto forma un histórico público con todas las trnasacciones y resultados. +- [{% inline-svg file="/docs/img/ledger-hash-icon.svg" /%}](/docs/img/ledger-hash-icon.svg "") El _ledger hash_, que identifica de manera única los contenidos del ledger. El hash es calculado de manera que si cambia algún detalle, la versión del ledger cambia, el hash es completamente diferente, lo que lo convierte también en un checksum que muestra que ninguno de los datos en el ledger se ha perdido, modificado, o corrompido. +- [{% inline-svg file="/docs/img/ledger-parent-icon.svg" /%}](/docs/img/ledger-parent-icon.svg "") El _parent ledger hash_ o el hash del ledger padre. Una versión del ledger es definida en gran parte por la diferencia con el _parent ledger_ que viene antes de el, por lo que la cabecera también contiene el hash único para su ledger padre. +- [{% inline-svg file="/docs/img/ledger-timestamp-icon.svg" /%}](/docs/img/ledger-timestamp-icon.svg "") El _close time_ u hora de cierre, la timestamp que marca cuando se finalizaron los contenidos del ledger. Este número se redondea por un número de segundos, generalmente 10. +- [{% inline-svg file="/docs/img/ledger-state-data-hash-icon.svg" /%}](/docs/img/ledger-state-data-hash-icon.svg "") Un _hash de datos del estado_ el cual actua de checksum para los datos del estado. +- [{% inline-svg file="/docs/img/ledger-tx-set-hash-icon.svg" /%}](/docs/img/ledger-tx-set-hash-icon.svg "") Un _hash del conjunto de transacciones_ el cual actua como checksum de los datos del conjuntos de transacciones. +- [{% inline-svg file="/docs/img/ledger-notes-icon.svg" /%}](/docs/img/ledger-notes-icon.svg "") Algunas otras notas como la cantidad total de XRP en existencia y la cantidad que se redondeó la hora de cierre. + +Un conjunto de transacciones y los datos de estado son ilimitados en espacio, pero la cabecera del ledger siempre es de un tamaño fijo. Para los datos exactos y el formato binario de una cabecera del ledger, ver [Cabecera del leder](../../references/protocol/ledger-data/ledger-header.md). + + +## Estado de validación + +[{% inline-svg file="/docs/img/ledger-validated-mark.svg" /%}](/docs/img/ledger-validated-mark.svg "Diagrama: Un estado de validación de un ledger, el cual es añadido encima del ledger y no es parte del ledger en sí.") + +Cuando un consenso de la Lista de Nodos Únicos de un servidor está de acuerdo en los contenidos de una versión del ledger, esa versión del ledger es marcada como validada e inmutable. Los contenidos del ledger solo pueden cambiar mediante transacciones posteriores que creen una nueva versión del ledger, continuando la cadena. + +Cuando una versión del ledger es creada por primera vez, no está todavía validada. Debido a las diferencias en cuanto llegan las transacciones a diferentes servidores, la red puede construir y proponer múltiples versiones diferentes del ledger para ser el siguiente en la cadena. El [protocolo de consenso](../consensus-protocol/index.md) decide cual de ellas se valida. (Las transacciones candidatas que no estén en la versión del ledger validado pueden generalmente incluirse en el conjunto de transacciones la siguiente versión del ledger en su lugar.) + + +## ¿Índice del ledger o Hash del ledger? + +Hay dos formas diferentes de identificar la versión del ledger: Su _ledger index_ o índice del ledger y su _ledger hash_ o hash del ledger. Estos dos campos identifican un ledger, pero tienen propósitos distintos. El índice del ledger te informa de la posición del ledger en la cadena, y el hash del ledger refleja los contenidos del ledger. + +Ledgers de diferentes cadenas pueden tener el mismo índice ledger pero distintos hashes. Además, al tratar con versiones del ledger no validadas, puede haber múltiples ledgers candidatos con el mismo índice pero contenidos diferentes y, por lo tanto, hashes diferentes. + +Dos ledgers con el mismo hash ledger son siempre completamente idénticos. diff --git a/@i18n/es-ES/docs/concepts/ledgers/open-closed-validated-ledgers.md b/@i18n/es-ES/docs/concepts/ledgers/open-closed-validated-ledgers.md new file mode 100644 index 0000000000..a33105b045 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/ledgers/open-closed-validated-ledgers.md @@ -0,0 +1,24 @@ +--- +html: open-closed-validated-ledgers.html +parent: ledgers.html +seo: + description: Los objetos del ledger tienen uno de los tres estados — abierto, cerrado, o validado. +labels: + - Blockchain +--- +# Ledgers abiertos, cerrados, y validados + +El servidor `rippled` hace una distinción entre versiones de ledgers que están _abiertas_, _cerradas_, y _validadas_. Un servidor tiene un ledger abierto, cualquier número de ledgers cerrados pero no validados, y un historial inmutable de ledgers validados. La siguiente tabla resume las diferencias: + +| Tipo de ledger: | Abierto | Cerrado | Validado | +|:---------------------------------|:----------------------------|:-------------------------------------------|:--| +| **Propósito:** | Espacio de trabajo temporal | Próximo estado propuesto | Estado previo confirmado | +| **Número usado:** | 1 | Cualquier número, normalmente 0 o 1 | Uno por ledger index, crece con el tiempo | +| **¿Pueden los contenidos cambiar?** | Sí | No, pero el ledger completo se podría reemplazar | Nunca | +| **Transacciones se aplican en:** | El orden que son recibidas | Orden canónico | Orden canónino | + +No intuitivamente, el XRP Ledger nunca "cierra" un ledger abierto para convertirlo en un ledger cerrado. En cambio, el servidor descarta el ledger abierto, crea un nuevo ledger cerrado aplicando transacciones encima de los ledgers cerrados previos, entonces crea un nuevo ledger abierto utilizando el último ledger cerrado como base. Esto es una consecuencia de [cómo el consenso resuelve el problema del doble gasto](../consensus-protocol/consensus-principles-and-rules.md#simplificando-el-problema). + +Para un ledger abierto, los servidores aplican transacciones en el orden en el que esas transacciones aparecen, pero diferentes servidores puede que vean transacciones en diferentes órdenes. Como no hay un vigilante del tiempo para decidir qué transacción fue actualmente la primera, los servidores pueden no estar de acuerdo en el orden exacto de las transacciones que fueron enviadas casi al mismo tiempo. Por lo tanto, el proceso para calcular una versión de ledger cerrado que es elegible para [validación](../consensus-protocol/consensus-structure.md#validación) es diferente que el proceso de construir un ledger abierto con transacciones propuestas en su orden de llegada. Para crear un ledger "cerrado", cada servidor XRP Ledger comienza con un cojunto de transacciones y una versión anterior de ledger, o "padre". El servidores pone las transacciones en orden canónico, después las aplica al anterior ledger en ese orden. El orden canónico está diseñado para ser determinístico y eficiente, pero dificil de manipular, para incrementar la dificultad de adelantarse (o front-running) a las Ofertas en el [exchange descentralizado](../tokens/decentralized-exchange/index.md). + +Por lo tanto, un ledger abierto es solo utilizado como un espacio de trabajo temporal, lo cual es una de las principales razones por las cuales [los resultados tentativos pueden variar de los resultados finales](../transactions/finality-of-results/index.md) en las transacciones. diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/amendments.md b/@i18n/es-ES/docs/concepts/networks-and-servers/amendments.md new file mode 100644 index 0000000000..a9c7663edc --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/amendments.md @@ -0,0 +1,88 @@ +--- +html: amendments.html +parent: networks-and-servers.html +seo: + description: Las enmiendas representan nuevas funcionalidades u otros cambios para el procesamiento de transacciones. Los validadores se coordinan a través del consenso para aplicar estas mejoras al XRP Ledger de manera ordenada. +labels: + - Blockchain +--- +# Enmiendas + +Las enmiendas representan nuevas funcionalidades u otros cambios en el procesamiento de transacciones. + +El sistema de enmiendas utiliza el proceso de consenso para aprobar cualquier cambio que afecte el procesamiento de transacciones en el XRP Ledger. Los cambios en el proceso de transacción completamente funcionales se introducen como enmiendas; luego, los validadores votan sobre estos cambios. Si una enmienda recibe más del 80% de apoyo durante dos semanas, la enmienda se aprueba y el cambio se aplica permanentemente a todas las versiones de ledgers subsiguientes. Deshabilitar una enmienda aprobada requiere una nueva enmienda para hacerlo. + +**Nota:** Las correcciones de errores que cambian los procesos de transacción también requieren enmiendas. + + + +## Proceso de enmienda + +El apartado [Código de contribución al XRP Ledger](/resources/contribute-code/index.md) describe el flujo de trabajo para desarrollar una enmienda desde una idea hasta su activación en el XRP Ledger. + +Después de que el código para una enmienda se incluye en una versión de software o software release, el proceso para habilitarlo ocurre dentro de la red del XRP Ledger, que verifica el estado de las enmiendas en cada _flag_ ledger (generalmente cada 15 minutos). + +Cada 256º ledger se llama **flag** ledger. El flag ledger no tiene contenidos especiales, pero el proceso de enmienda ocurre alrededor suyo. + +1. **Flag Ledger -1:** Cuando los validadores `rippled` envían mensajes de validación, también envían sus votos sobre enmiendas. +2. **Flag Ledger:** Los servidores interpretan los votos de los validadores confiables. +3. **Flag Ledger +1:** Los servidores insertan la pseudo transacción `EnableAmendment` y marcan dependiendo de lo que piensan que ha pasado: + * El flag (o marca) `tfGotMajority` significa que la enmienda tiene más del 80% del apoyo. + * El flag (o marca) `tfLostMajority` significa que el apoyo de la enmienda ha descendido al 80% o menos. + * Que no haya flag (o marca) significa que la enmienda está activada. + + **Nota:** Es posible para una enmienda perder el 80% del apoyo en el mismo ledger en el que alcanza el periodo de dos semanas para ser activada. En esos casos, una pseudo-transaccion `EnableAmendment` es añadida en ambos escenarios, pero la enmienda es activada finalmente. + +4. **Flag Ledger +2:** Enmiendas activadas aplican a transacciones en este ledger en adelante. + + +## Votación de enmienda + +Cada versión de `rippled` es compilada con una lista de [enmiendas conocidas](/resources/known-amendments.md) y el código para implementar esas enmiendas. Los operadores de los validadores `rippled` configuran sus servidores para votar en cada enmienda y cambiarlo en cada momento. Si un operador no elige un voto, el servidor por defecto tiene un voto definido en el códido fuente. + +**Nota:** El voto por defecto cambia entre las publicaciones del software. {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.8.1" %}Actualizado en: rippled 1.8.1{% /badge %} + +Las enmiendas deben mantener dos semanas el apoyo de más del 80% de los validadores confiables para activarse. Si el apoyo baja por debajo del 80%, la enmienda es temporalmente rechazada , y el periodo de dos semanas se reinicia. Las enmiendas pueden ganar y perder una mayoría cualquier cantidad de veces antes de que se habiliten permanentemente. + +Las enmiendas que hayan tenido su código fuente removido sin haberse activado on consideradas **vetadas** por la red. + + +## Servidores bloqueados por enmienda + + +El bloqueo por enmienda es una característica de seguridad para proteger la precisión de los datos del XRP Ledger. Cuando una enmienda se activa, los servidores ejecutando versiones anteriores de `rippled` sin el código fuente de la enmienda ya no consiguen entender las reglas de la red. En vez de adivinar y malinterpretar los datos del ledger, estos servidores se convierten en servidores **bloqueados por enmienda** y no pueden: + +* Determinar la validez de un ledger. +* Enviar o procesar transacciones. +* Participar en el proceso de consenso. +* Votar sobre futuras enmiendas. + +La configuración de votación de un servidor `rippled` no tiene impacto en convertirse en un servidor bloqueado por enmienda. Un servidor `rippled` siempre sigue las enmiendas activadas por el resto de la red, por lo que los bloqueos solo se basan en tener el código para entender los cambios de reglas. Esto significa que tu también te puedes convertir en alguien bloqueado por enmienda si conectas tu servidor a una red paralela con enmiendas activadas. Por ejemplo, La Devnet de XRP normalmente tiene enmiendas experimentales activadas. Si estás utilizando la última publicación o release en producción, tu servidor no tendrá ese código de esas enmiendas experimentales. + +Puedes debloquear servidores bloqueados por enmienda actualizando a la última versión de `rippled`. + +### Servidores Clio bloqueados por enmienda + +Los servidores Clio pueden bloquearse por enmienda si se encuentran un tipo de campo desconocido mientras cargan los datos del ledger. Esto ocurre si el campo es más nuevo que la dependencia de `libxrpl` usada cuando se construye Clio. Para desbloquear tu servidor Clio, actualiza a la última release de Clio que se publicó con un `libxrpl` compatible. + +## Retiro de enmiendas + +Cuando las enmiendas son activadas, el código fuente de comportamientos previos a la enmienda permanece en `rippled`. Mientras hay casos de uso para mantener el código antiguo, como la reconstrucción de resultados de los ledgers para verificación, el seguimiento de enmiendas y código heredado agrega complejidad con el tiempo. + +El [Estándar 11d de XRP Ledger](https://github.com/XRPLF/XRPL-Standards/discussions/19) define un proceso para retirar enmiendas antiguas y código asociado previo a la enmienda. Después de que una enmienda haya sido activada en Mainnet por dos años, puede ser retirado. Retirar una enmienda la convierte en parte del protocolo central incondicionalmente; ya no se sigue ni se trata como una enmienda, y todo el código anterior a la enmienda es eliminado. + + +## Ver también + +- **Conceptos:** + - [Consenso](../consensus-protocol/index.md) +- **Tutoriales:** + - [Ejecutar rippled como un validador](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md) + - [Configurar votación de enmiendas](../../infrastructure/configuration/configure-amendment-voting.md) + - [Contribuir al código del XRP Ledger](/resources/contribute-code/index.md) +- **Referencias:** + - [Enmiendas conocidas](/resources/known-amendments.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/clustering.md b/@i18n/es-ES/docs/concepts/networks-and-servers/clustering.md new file mode 100644 index 0000000000..7fa50c6afc --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/clustering.md @@ -0,0 +1,29 @@ +--- +html: clustering.html +parent: networks-and-servers.html +seo: + description: Ejecuta servidores rippled en un cluster para compartir la carga criptográfica entre ellos. +labels: + - Servidor principal +--- +# Clustering + +Si estás ejecutando varios servidores `rippled` en un único datacenter, puedes configurar esos servidores dentro de un cluster para maximizar la eficiencia. Ejecutar tus servidores `rippled` en un cluster proporciona los siguientes beneficios: + +- Los servidores `rippled` clusterizados comparten el trabajo critográfico. Si un servidor ha verificado la autenticidad del mensaje, los otros servidores en el cluster confian en él y no lo vuelven a verificar. +- Los servidores clusterizados comparten información sobre pares y clientes API que están comportandose mal o abusando de la red. Esto dificulta atacar todos los servidores del cluster a la vez. +- Los servidores clusterizados siempre propagan las transacciones a través del cluster, incluso si la transacción no cumple con el coste de transacción actual basada en la carga en alguno de ellos. + +Si estás ejecutando un validador como un [par privado](peer-protocol.md#pares-privados), Ripple recomienda utilizar un cluster de servidores `rippled` como servidores proxy. + +## Ver también + +- **Tutoriales:** + - [Cluster de servidores `rippled`](../../infrastructure/configuration/peering/cluster-rippled-servers.md) + - [Ejecutar rippled como validador](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md) +- **Referencias:** + - [método peers][] + - [método connect][] + - [Peer Crawler](../../references/http-websocket-apis/peer-port-methods/peer-crawler.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/index.md b/@i18n/es-ES/docs/concepts/networks-and-servers/index.md new file mode 100644 index 0000000000..d58c5b42f3 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/index.md @@ -0,0 +1,41 @@ +--- +html: networks-and-servers.html +parent: concepts.html +seo: + description: rippled es el servidor peer-to-peer principal que maneja el XRP Ledger. +metadata: + indexPage: true +--- +# Redes y servidores + +Hay dos tipos principales de software de servidores que alimentan el XRP Ledger: + +- El servidor principal, `rippled`, ejecuta la red peer-to-peer la cual procesa transacciones y alcanza un consenso en sus resultados. +- El servidor API, [Clio](the-clio-server.md), proporciona potentes interfaces para obtener o consultar datos desde el ledger. + +Cualquiera puede ejecutar instancias de uno o ambos de estos tipos de servidores basado en sus necesidades. + +## Razones por las que ejecutar tu propio servidor + +Para casos de uso más livianos y servidores individuales, puedes depender de [servidores públicos][]. Sin embargo, cuanto más serio sea tu uso del XRP Ledger, más importante será tener tu propia infraestructura. + +Hay multitud de razones por las que quieres ejecutar tus propios servidores, pero la mayoría de ellas se pueden resumir en: puedes confiar en tu propio servidor, tienes control sobre la carga de trabajo, y no estás a merced de otros que decidan cuando y cómo puedes acceder. Por supuesto, debes tener tener unas buenas prácticas respecto a la seguridad de la red para proteger tu servidor de hackers maliciosos. + +Necesitas confiar en el servidor que utilizas. Si te conectas a un servidor malicioso, hay muchas maneras en las que se pueda aprovechar de ti o hacerte perder dinero. Por ejemplo: + +* Un servidor malicioso podría informar que has sido pagado cuando no se ha hecho el pago. +* Podría selectivamente mostrar u ocultar los caminos (o paths) de pago y las foertas de intercambio de divisas para garantizar su propio beneficio mientras no te ofrece la mejor oferta. +* Si le enviaste la clave secreta de tu dirección, esto podría generar transacciones arbitrarias en tu nombre e incluso transferir o destruir todo el dinero que la dirección posee. + +Adicionalmente, ejecutar tu propio servidor te da [acceso de administrador](../../tutorials/http-websocket-apis/build-apps/get-started.md#admin-access), lo que te permite ejecutar comandos exclusivos de administrador y de carga intensa. Si utilizas un servidor compartido, debes preocuparte por los otros usuarios del mismo servidor compitiendo contra ti por el poder de computación del servidor. Muchos de los comandos en el API WebSocket puede poner mucha presión sobre el servidor, por lo que el servidor tiene la opción de reducir sus respuestas cuando lo necesite. Si compartes un servidor con otros, puede que no siempre consigas los mejores resultados posibles. + +Finalmente, si ejecutas un servidor de validación, puedes utilizar un servidor común como proxy a la red pública mientras mantienes tu servidor de vaalidación en una red privada la cual es solo accesible desde el mundo exterior desde tu servidor común. Esto hace más difícil comprometer la integridad de tu servidor de validación. + +## Características y temas del servidor + + + +{% raw-partial file="/docs/_snippets/common-links.md" /%} + + +{% child-pages /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/ledger-history.md b/@i18n/es-ES/docs/concepts/networks-and-servers/ledger-history.md new file mode 100644 index 0000000000..5fb4e10d49 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/ledger-history.md @@ -0,0 +1,88 @@ +--- +html: ledger-history.html +parent: networks-and-servers.html +seo: + description: Los servidores rippled almacenan una cantidad variable de transacciones e historial del estado localmente. +labels: + - Retención de datos + - Blockchain + - Servidor principal +--- +# Histórico del ledger + +El [proceso de consenso](../consensus-protocol/index.md) crea una cadena de [versiones de ledgers validados](../ledgers/index.md), cada uno derivado del anterior aplicando un conjunto de [transacciones](../transactions/index.md). Cada [servidor `rippled`](index.md) almacena versiones de ledgers y el historial de transacciones locálmente. La cantidad de histórico de transacciones que un servidor almacena depende de cuanto tiempo ese servidor ha estado online y cuanto histórico está configurado para recuperar y mantener. + +Los servidores en la red peer-to-peer XRP Ledger comparten transacciones y otros datos entre sí como parte del proceso de consenso. Cada servidor construye de forma independiente una nueva versión del ledger y compara los resultados con sus validadores de confianza para asegurar la consistencia. (Si un consenso de validadores de confianza no está de acuerdo con los resultados de un servidor, ese servidor recupera los datos necesarios de sus pares para lograr consistencia.) Los servidores pueden descargar datos más antiguos de sus pares para completar huecos en su historial disponible. La estructura del ledger utiliza [hashes](../../references/protocol/data-types/basic-data-types.md#hashes) criptográficos de los datos para que cualquier servidor pueda verificar la integridad y consistencia de los datos. + +## Bases de datos + +Los servidores mantienen datos del estado del ledger y transacciones en un almacén de clave-valor llamada almacén del ledger o _ledger store_. Además, `rippled` mantiene algunos archivos de base de datos SQLite para un acceso más flexible a cosas como el historial de transacciones y para rastrear ciertos cambios de configuración. + +Normalmente, es seguro eliminar todos los archivos de base de datos de un servidor `rippled` cuando ese servidor no está en funcionamiento. (Es posible que quieras hacer esto, por ejemplo, si cambias la configuración de almacenamiento del servidor o si estás cambiando de una red de prueba a la red de producción). + +## Historial disponible + +Por diseño, todos los datos y transacciones en el XRP Ledger son públicos y cualquiera puede buscar o consultar cualquier cosa. Sin embargo, tu servidor solo puede buscar datos que tenga disponibles localmente. Si intentas buscar una versión del ledger o una transacción que tu servidor no tenga disponible, tu servidor responderá que no puede encontrar esos datos. Otros servidores que tengan el historial necesario pueden responder con éxito a la misma consulta. Si tienes un negocio que utiliza datos del XRP Ledger, debes tener cuidado de cuánto historial tiene disponible tu servidor. + +El [método server_info][] reporta cuántas versiones del ledger tiene disponibles en el campo `complete_ledgers`. + +## Recuperar el histórico + +Cuando un servidor del XRP Ledger se inicia, su primera prioridad es obtener una copia completa del último ledger validado. A partir de ahí, se mantiene al día con los avances en el progreso del ledger. El servidor completa cualquier agujero en su historial del ledger que ocurra después de sincronizar y puede rellenar el historial desde antes de que se sincronizara. (Los huecos en el historial del ledger pueden ocurrir si un servidor temporalmente se vuelve demasiado ocupado para mantenerse al día con la red, pierde su conexión de red u experimenta otros problemas temporales).Cuando descarga el historial del ledger, el servidor solicita los datos faltantes a sus [servidores pares](peer-protocol.md), y verifica la integridad de los datos utilizando [hashes][Hash] criptográficos. + +Rellenar el histórico es uno de las prioridades más bajas del servidor, por lo que puede llevar mucho tiempo completar el historíal faltante, especialmente si el servidor está ocupado o si las especificaciones del hardware y la red no son lo suficientemente buenas. Para recomendaciones en especificaciones de hardware, ver [Planificación de capacidad](../../infrastructure/installation/capacity-planning.md). Completar el histórico también requiere que al menos uno de los pares directos del servidor tenga el histórico en cuestión. Para más información de cómo administrar las conexiones peer-to-peer de tu servidor, consulta [Configurar Peering](../../infrastructure/configuration/peering/index.md). + +El XRP Ledger identifica datos (en varios niveles diferentes) mediante un hash único de sus contenidos. Los datos de estado del XRP Ledger contienen un resumen breve del histórico del ledger, en forma de [tipos de objeto LedgerHashes](../../references/protocol/ledger-data/ledger-entry-types/ledgerhashes.md). Los serivodres usan los objetos LedgerHashes para conocer qué versiones del ledger hay que buscar, y confirmar que los datos del ledger que recibe son correctos y completos. + + + +### Rellenar +{% badge href="https://github.com/XRPLF/rippled/releases/tag/1.6.0" %}Actualizado en: rippled 1.6.0{% /badge %} + +La cantidad de histórico que un servidor intenta descargar depende de su configuración. El servidor automáticamente intenta rellenar los huecos descargando el histórico hasta **el ledger más antiguo que está actualmente disponible**. Pues utilizar el campo `[ledger_history]` para hacer al servidor rellenar el histórico más allá de ese punto. Sin embargo, el servidor nunca descarga ledgers que estuviesen programados para su [eliminación](../../infrastructure/configuration/data-retention/online-deletion.md). + +El campo `[ledger_history]` define el número mínimo de ledgers que se acumulan antes del ledger actual validado. Utiliza el valor especial `full` para descargar el [histórico completo](#full-history) de la red. Si especificas un número de ledgers, debe ser igual o mayor que el campo `online_deletion`; no puedes utilizar `[ledger_history]` para hacer al servidor descargar _menos_ histórico. Para reducir la cantidad de histórico que un servidor almacena, cambia el ajuste [online deletion](../../infrastructure/configuration/data-retention/online-deletion.md). + + + +## Histórico completo + +Algunos servidores en la red XRP Ledger están configurados como servidores "full-history". Estos servidores, los cuales requieren sifnificativamente más espacio de disco que otros servidores de seguimiento, almacenan todo el histórico disponible XRP Ledger y **no usan la opción online deletion**. + +La XRP Ledger Foundation proporciona acceso a un cojunto de servidores full history operados por miembros de la comunidad (ver [xrplcluster.com](https://xrplcluster.com) para más detalles). +Ripple también proporciona un conjunto de servidores full-history públicos como un servicio público en `s2.ripple.com`. + +Los proveedores de servidores Full History se reservan el derecho de bloquear acceso a aquellos que abusen de los rescursos, o generen una carga desproporcionada a los sistemas. + +**Consejo:** A diferencia de algunas redes de criptomonedas, los servidores en el XRP Ledger no necesitan un full history para conocer el estado actual y mantenerse a día con las transacciones actuales. + +Para instrucciones de cómo configurar un servidor full history, consultar [Configurar Full History](../../infrastructure/configuration/data-retention/configure-full-history.md). + +## Fragmentación del historial + +Una alternativa para almacenar todo el histórico completo del XRP Ledger en una única máquina cara es configurar muchos servidores para que cada uno almacene una parte del histórico completo del ledger. La función [Fragmentación del histórico](../../infrastructure/configuration/data-retention/history-sharding.md) hace esto posible, almacenando rangos del histórico del ledger en áreas de almacenamiento separadas llamadas almacenes de fragmentación o _shard store_. Cuando un servidor par solicita datos específicos (como se describe en [fetching history](#recuperar-el-histórico) arriba), un servidor puede responder usando datos de su ledger store o shard store. + +Online deletion **no** borra desde un shard store. Sin embargo, si configuras online deletion para mantener al menos 32768 versiones de ledger en el ledger store de tu servidor, tu servidor puede copiar shards completos desde el ledger store al shard store antes de borrarlos automáticamente del ledger store. + +Para más información, ver [Configurar History Sharding](../../infrastructure/configuration/data-retention/configure-history-sharding.md). + + +## Ver también + +- **Conceptos:** + - [Ledgers](../ledgers/index.md) + - [Consenso](../consensus-protocol/index.md) +- **Tutoriales:** + - [Configurar `rippled`](../../infrastructure/configuration/index.md) + - [Configurar Online Deletion](../../infrastructure/configuration/data-retention/configure-online-deletion.md) + - [Configurar Advisory Deletion](../../infrastructure/configuration/data-retention/configure-advisory-deletion.md) + - [Configurar History Sharding](../../infrastructure/configuration/data-retention/configure-history-sharding.md) + - [Configurar Full History](../../infrastructure/configuration/data-retention/configure-full-history.md) +- **Referencias:** + - [método ledger][] + - [método server_info][] + - [método ledger_request][] + - [método can_delete][] + - [método ledger_cleaner][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/parallel-networks.md b/@i18n/es-ES/docs/concepts/networks-and-servers/parallel-networks.md new file mode 100644 index 0000000000..eb949096b5 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/parallel-networks.md @@ -0,0 +1,52 @@ +--- +html: parallel-networks.html +parent: networks-and-servers.html +seo: + description: Entender cómo las redes de prueba (test) y cadenas ledger alternativas se relacionan con el XRP Ledger en producción. +labels: + - Blockchain +--- +# Redes paralelas + +Existe una red peer-to-peer en producción del XRP Ledger, y todos los negocios que tienen lugar en el XRP Ledger ocurren dentro de la red de producción: la Mainnet. + +Para ayudar a miembros de la comunidad del XRP Ledger a interactuar con la tecnología sin afectar nada a la Mainnet, hay redes alternativas, o altnets. Aquí hay un desglose de algunas altnets públicas: + +| Red | Cadencia de actualización | Descripción | +|:--------|:----------------|:-------------------------------------------------| +| Mainnet | Lanzamientos estables | _El_ [XRP Ledger](/about/), un libro contable criptográfico descentralizado impulsado por una red de servidores peer-to-peer y el hogar de [XRP](../../introduction/what-is-xrp.md). | +| Testnet | Lanzamientos estables | Una red de "universo alternativo" que actua como un campo de pruebas para el software construido en el XRP Ledger, sin impactar a los usuarios del XRP Ledger de producción y sin arriesgar dinero real. El [estado de enmienda](/resources/known-amendments.md) de Testnet está destinado a reflejar de cerca el de la Mainnet, aunque pueden ocurrir ligeras variaciones en el tiempo debido a la naturaleza impredecible de los sistemas descentralizados. | +| Devnet | Lanzamientos Beta | Una vista previa de las próximas atracciones, donde cambios inestables en el software principal de XRP Ledger se pueden probar. Los desarrolladores pueden utilizar esta altnet para interactuar y aprender sobre funcionalidades nuevas planficiadas para el XRP Ledger y enmiendas que no están habilitadas en la Mainnet. | +| [Hooks V3 Testnet](https://hooks-testnet-v3.xrpl-labs.com/) | [Servidor Hooks](https://github.com/XRPL-Labs/xrpld-hooks) | Una vista previa de la funcionalidad de smart contract en la cadena utilizando [hooks](https://xrpl-hooks.readme.io/). | +| Sidechain-Devnet | Lanzamientos Beta | Una sidechain para probar funcionalidades en puentes cross-chain. Devnet se trata como la cadena de bloqueo y esta sidechain es la cadena de emisión.
Soporte a la librería:
- [xrpl.js 2.12.0](https://www.npmjs.com/package/xrpl/v/2.12.0)
- [xrpl-py 2.4.0](https://pypi.org/project/xrpl-py/2.4.0/)
**Nota**: También puedes usar la herramienta de línea de comandos [`xbridge-cli`](https://github.com/XRPLF/xbridge-cli) para configurar un puente entre cadenas en tu máquina local. | + +Cada altnet tiene su propia distribución separada de XRP de prueba, que se [regala gratis](/resources/dev-tools/xrp-faucets) a partes interesadas en experimentar con el XRP Ledger y desarrollar aplicaciones e integraciones. El XRP test no tiene valor en el mundo real y se pierde cuando la red se reinicia. + +**Atención:** A diferencia de la Mainnet del XRP Ledger, las redes de prueba suelen ser _centralizadas_ y no hay garantías sobre la estabilidad y disponibilidad de estas redes. Han sido y siguen siendo utilizadas para probar diversas propiedades de la configuración del servidor, la topología de la red y el rendimiento de la red. + + +## Redes paralelas y consenso + +El factor principal en determinar qué red sigue un servidor es su UNL configurado-la lista de validadores en los que confía para no colisionar. Cada servidor utiliza su UNL configurada para saber qué ledger aceptar como la verdad. Cuando diferentes grupos de consenso de instancias de `rippled` solo confían en otros miembros del mismo grupo, cada grupo continúa como una red paralela. Incluso si equipos maliciosos o malintencionados se conectan a ambas redes, el proceso de consenso evita la confusión siempre y cuando los miembros de cada red no estén configurados para confiar en miembros de otra red en exceso de su configuración de cuórum. + +Ripple ejecuta los servidores principales en la Testnet y Devnet; también puedes [conectar tu propio servidor `rippled` para estas redes](../../infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net.md). La Testnet y Devnet no utilizan conjuntos de validadores diversos y resistentes a la censura. Esto hace posible que Ripple reinicie la Testnet o Devnet en cualquier momento. + + +## Ver también + +- **Herramientas:** + - [XRP Testnet Faucet](/resources/dev-tools/xrp-faucets) +- **Conceptos:** + - [Consenso](../consensus-protocol/index.md) + - [Enmiendas](amendments.md) +- **Tutoriales:** + - [Conectar tu `rippled` en laTestnet XRP](../../infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net.md) + - [Usar rippled en modo Stand-Alone](../../infrastructure/testing-and-auditing/index.md) +- **Referencias:** + - [método server_info][] + - [método consensus_info][] + - [método validator_list_sites][] + - [método validators][] + - [Opciones modo Daemon](../../infrastructure/commandline-usage.md#daemon-mode-options) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/peer-protocol.md b/@i18n/es-ES/docs/concepts/networks-and-servers/peer-protocol.md new file mode 100644 index 0000000000..99f13eb38b --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/peer-protocol.md @@ -0,0 +1,174 @@ +--- +html: peer-protocol.html +parent: networks-and-servers.html +seo: + description: El protocolo de pares especifica el lenguaje en el que los servidores rippled hablan entre sí. +labels: + - Servidor principal + - Blockchain +--- +# Protocolo de pares + +Los servidores en el XRP Ledger se comunican entre sí utilizando el protocolo de pares del XRP Ledger. + +El protocolo de pares es el modo principal de comunicación entre servidores en el XRP Ledger. Toda la información sobre el comportamiento, progreso, y conectividad en el XRP Ledger pasa a través del protocolo de pares. Ejemplos de comunicación peer-to-peer incluyen todos los siguientes: + +- Solicitar una conexión a otros servidores en la red peer-to-peer, o anunciar que hay huecos de conexión disponibles. +- Compartir transacciones candidatas con el resto de la red. +- Solicitar datos de ledger de ledgers históricos, o proporcionar esos datos. +- Proponer una conjunto de transacciones para el consenso, o compartir el resultado calculado de aplicar el conjunto de transacciones de consenso. + +Para establecer una conexión peer-to-peer, un servidor se conecta a otro usando HTTPS y solicita una [actualización HTTP](https://tools.ietf.org/html/rfc7230#section-6.7) para cambiar al protocolo `XRPL/2.0` (anteriormente `RTXP/1.2`). (Para más información, consultar el artículo [Red de superposición](https://github.com/XRPLF/rippled/blob/96bbabbd2ece106779bb544aa0e4ce174e99fdf6/src/ripple/overlay/README.md#handshake) en el [repositorio `rippled`](https://github.com/ripple/rippled).) + +## Descubrimiento de pares + +El XRP Ledger utiliza el protocolo del "chismorreo" para ayudar a servidores a encontrar otros servidores para conectarse en la red XRP Ledger. Cuando un servidor se inicia, se reconecta a cualquier otro par al que se haya conectado anteriormente. Como alternativa, utiliza los [hubs públicos hardcodeados](https://github.com/XRPLF/rippled/blob/fa57859477441b60914e6239382c6fba286a0c26/src/ripple/overlay/impl/OverlayImpl.cpp#L518-L525). Después de que un servidor se conecte correctamente a un par, le pregunta a ese par por información de contacto (generalmente, dirección IP y puerto) de otros servidores XRP Ledger que también pueden estar buscando pares. El servidor puede conectarse entonces a esos servidores, y preguntarles por información de contacto de todavía más servidores a los que conectarse. A través de este proceso, el servior hace suficientes conexiones de pares para que pueda permanecer contectado con el resto de la red incluso si pierde la conexión con cualquier par en particular. + +Normalmente, un servidor necesita conectarse a un hub público solo una vez, durante un corto período de tiempo, para encontrar otros pares. Después de hacerlo, el servidor puede o no permanecer conectado al hub, dependiendo de la estabilidad de su conexión de red, de lo ocupado que esté el hub y de cuántos otros pares de alta calidad encuentre el servidor. El servidor guarda las direcciones de estos otros pares para poder intentar reconectarse directamente a esos pares más tarde, después de una interrupción en la red o un reinicio. + +El [método peers][] muestra una lista de pares a los que tu servidor está actualmente conectado. + +Para ciertos servidores de alto valor (tan importantes como [validadores](rippled-server-modes.md#modos-de-servidor-rippled)) puedes preferir no conectarte a pares no confiables a través del proceso de descubrimiento de pares. En este caso, puedes configurar tu servidor para usar solo [pares privados](#pares-privados). + + +## Puerto del protocolo de pares + +Para participar en el XRP Ledger, los servidores `rippled` conectan con pares arbitrarios utilizando el protocolo de pares. (Todos los pares son como no confiables, a no ser que sean de tipo [clusterizado](clustering.md) con el servidor actual.) + +Idealmente, el servidor debería poder enviar _y_ recibir conexiones en el puerto de pares. Debes [redireccionar el puerto utilizado por el protocolo de pares a través de tu firewall](../../infrastructure/configuration/peering/forward-ports-for-peering.md) para el servidor `rippled`. + +IANA [ha asignado el puerto **2459**](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=2459) para el protocolo de pares del XRP Ledger, pero para la compatibilidad con sistemas antiguos, el [fichero de configuración por defecto de `rippled`](https://github.com/XRPLF/rippled/blob/master/cfg/rippled-example.cfg) escucha las conexiones entrantes de pares con el **port 51235** en todas las interfaces de la red. Si ejecutas un servidor, puedes configurar qué puerto(s) escucha tu servidor utilizando el fichero `rippled.cfg`. + +Ejemplo: + +``` +[port_peer] +port = 2459 +ip = 0.0.0.0 +protocol = peer +``` + +El puerto del protocolo de pares también sirve para [métodos especiales del puerto de pares](../../references/http-websocket-apis/peer-port-methods/index.md). + +## Par de claves de nodo + +Cuando un servidor se inicia por primera vez, genera un _par de claves de nodo_ para usarlo para identificarse en las comunicaciones del protocolo de pares. El servidor utiliza su clave para firmar todas sus comunicaciones del protocolo de pares. Esto hace posible identificar y verificar de manera confiable la integridad de los mensajes de otro servidor en la red peer-to-peer incluso si los mensajes de ese servidor están siendo transmitidos por pares no confiables. + +El par de claves de nodo se guarda en la base de datos y se reutiliza cuando el servidor se reinicia. Si eliminas las bases de datos del servidor, crea un nuevo par de claves de nodo, lo que efectivamente le hace iniciar con una identidad diferente. Para reutilizar el mismo par de claves incluso si las bases de datos se eliminan, puedes configurar el servidor en el apartado `[node_seed]`. Para generar un valor adecuado para usar en el apartado `[node_seed]`, utiliza el [método validation_create][]. + +El par de claves de nodo también identifican otros servidores para propositos de [clustering](clustering.md) o [reservar huecos de pares](#pares-fijos-y-reservas-de-pares). Si tienes un cluster de servidores, debes configurar cada servidor en el cluster con un valor único en el apartado `[node_seed]`. Para más información de cómo configurar un cluster, ver [Servidores `rippled` clusterizados](../../infrastructure/configuration/peering/cluster-rippled-servers.md). + + +## Pares fijos y reservas de pares + +Normalmente, un servidor `rippled` intenta mantener un número saludable de pares, y se conecta automáticamente a pares no confiables hasta un número máximo. Puedes configurar un servidor `rippled` para permanecer conectado a servidores de pares específicos de varias maneras: + +- Utiliza **Pares fijos** para permanecer siempre conectado a pares específicos basado en sus direcciones IP. Esto solo funciona si los pares tienen direcciones IP fijas. Usa el apartado `[ips_fixed]` para configurar pares fijos. Esto es una parte necesaria para [clustering](clustering.md) o [pares privados](#pares-privados). Los pares fijos están definidos en el fichero de configuración, pero los cambios solo se aplican una vez se reinicia el servidor. Los pares fijos son más útiles para mantener servidores conectados si esos servidores son administrados por la misma persona u organización. +- Utiliza **Reservas de pares** para priorizar pares específicos. Si tu servidor tiene una reserva de pares para un par específico, entonces tu servidor siempre acepta peticiones de conexión desde ese par incluso si tu servidor está ya en su número máximo de pares conectados. (Esto puede causar que tu servidor _supere_ el número máximo de pares.) Identificas a un par reservado por su [par de claves de nodo](#par-de-claves-de-nodo), así puedes hacerlo incluso para pares con una direcciones IP dinamicas. Las reservas de pares son configurados a través de comandos de administrador y guardados en las bases de datos del servidor, por lo que se pueden ajustar mientras el servidor está online y son salvados durante los reinicios. Las reservas de pares más útiles para conectarse a servidor administrados por diferentes personas u organización. + +En los siguientes casos, un servidor `rippled` no se conecta a pares no confiables: + +- Si el servidor es configurado como un [par privado](#pares-privados), se conecta _solo_ a sus pares fijos. +- Si el servidor esta ejecutando en [modo solitario][] no se conecta a _ningún_ par. + + +## Pares privados + +Puedes configurar un servidor `rippled` para actuar como un servidor "privado" para mantener oculta su dirección IP del público general. Esta puede ser una precaución útil contra ataques de denegación de servicio e intentos de intrusión en servidores `rippled` importantes como los validadores de confianza. Para participar en la red peer-to-peer, un servidor privado debe estar configurado para conectarse a al menos un servidor no privado, que transmita sus mensajes al resto de la red. + +**Atención:** Si configuras un servidor privado sin ningún [par fijo](#pares-fijos-y-reservas-de-pares), el servidor no puede conectarse a la red, por lo que no puede conocer el estado de la red, transmitir transacciones o participar en el proceso de consenso. + +Configurar un servidor como un servidor privado tiene varios efectos: + +- El servidor no hace conexiones salientes a otros servidores en la red peer-to-peer a menos que se haya configurado explícitamente para conectarse a esos servidores. +- El servidor no acepta conexiones entrantes de otros servidores a menos que se haya configurado explícitamente para aceptar conexiones de esos servidores. +- El servidor pide a sus pares directos no revelar su dirección IP a comunicaciones no confiables, incluyendo a la [respuesta de la API del peer crawler](../../references/http-websocket-apis/peer-port-methods/peer-crawler.md). Esto no afecta a las comunicaciones confiables como el [método peers admin][peers method]. + + Los servidores siempre piden a sus pares ocultar las direcciones IP de validadores, independientemente de la configuración del servidor privada. Esto ayuda a proteger validadores de ser sobrecargados por ataques de denegación de servicio. + + **Atención:** Es posible modificar el código fuente de un servidor para que ignore esta petición y comparta las direcciones IP de sus pares inmediatos de todos modos. Debes configurar tu servidor privado para que se conecte solo a servidores que sepas que no están modificados de esta manera. + +### Pros y contras de las configuraciones de pares + +Para ser parte del XRP Ledger, un servidor `rippled` debe estar conectado al resto de la red abierta peer-to-peer. A grandes rasgos, hay tres categorías de configuraciones para cómo un servidor `rippled` se conecta a la red: + +- Usando **pares descubiertos**. El servidor se conecta a cualquier servidor no confiable que encuentre y permanece conectado siempre que esos servidores se comporten adecuadamente. (Por ejemplo, no solicitan demasiados datos, sus conexiones de red son estables y parecen estar siguiendo la misma [red](parallel-networks.md).) Esto es lo predeterminado. +- Como un **servidor privado utilizando proxies** ejecutado por la misma persona u organización. Los proxies son servidores stock `rippled` (también conectados a pares descubiertos) que mantienen una conexión de emparejamiento fija con el servidor privado. +- Como un **servidor privado utilizando hubs públicos**. Esto es similar a utilizar proxies, pero depende de terceros específicos. + +Los pros y contras de cada configuración son los siguientes: + + + + + + + + + + + + + + + + + + + + +
Configuración Pros Contras
Pares descubiertos
    +
  • La configuración más simple, con una carga de mantenimiento baja.

  • +
  • Crea la oportunidad para una gran cantidad de conexiones directas de pares. Tener más pares directos tiene varios beneficios. Tu servidor puede recuperar histórico de múltiples pares en paralelo, tanto al sincronizar como al rellenar el histórico. Como no todos los pares mantienen el histórico completo, tener acceso a una gama más amplia de datos históricos.

  • +
  • Reduce la posibilidad de desconexión de la red porque tu servidor puede reemplazar los pares desconectados con otros nuevos.

  • +
    +
  • No te permite seleccionar los pares de tu servidor, lo que significa que no tienes idea de si tus pares pueden decidir actuar maliciosamente. Aunque los servidores `rippled` están diseñados para protegerse contra pares maliciosos, siempre existe el riesgo de que los pares maliciosos puedan atacar fallos en el software para afectar a tu servidor.

  • +
  • Los pares de tu servidor pueden desconectarse o cambiar a menudo.

  • +
Servidor privado utilizando proxies
    +
  • Configuración más segura y confiable cuando se implementa correctamente.

  • +
  • Tan confiable y redundante como quieras hacerla.

  • +
  • Puedes optimizar el rendimiento del servidor privado con clustering.

  • +
  • Te permite crear tantas conexiones directas de pares como desees. Tu servidor privado puede obtener histórico desde múltipes pares en paralelo. Dado que administras los pares, también puedes controlar cuanto histórico del ledger cada par puede mantener.

  • +
    +
  • Carga de mantenimiento y costos más altos debido a la ejecución de múltiples servidores.

  • +
  • No elimina por completo la posibilidad de interrupciones en la conexión de pares. No importa cuántos proxies ejecutes, si todos existen en el mismo rack de servidores, entonces una interrupción de red o de luz puede afectar a todos ellos.

  • +
Servidor privado utilizando hubs públicos
    +
  • Carga de mantenimiento baja con una pequeña cantidad de configuración.

  • +
  • Proporciona acceso a conexiones seguras a la red.

  • +
  • En comparación con la conexión utilizando proxies, es menos probable que cause que tu servidor privado se desconecte de la red debido a una interrupción simultánea de pares.

  • +
    +
  • Depende de terceros con una alta reputación para mantenerse confiable.

  • +
  • +

    Puede hacer que tu servidor se desconecte de la red si los hubs públicos en los que confías están demasiado ocupados. Debido a la naturaleza de los hubs públicos, son los más populares y es posible que no puedan mantener una conexión estable abierta para todos.

    +

    Para evitar este problema, usa más hubs públicos; cuanto más, mejor. También puede ayudar usar hubs no predeterminados, que son menos propensos a estar ocupados.

    +
  • +
+ +### Configurando un servidor privado + +Para configurar tu servidor como un servidor privado, establece la opción `[peer_private]` a `1` en el fichero de configuración. Para intrudciones más detalladas, ver [Configurar un servidor privado](../../infrastructure/configuration/peering/configure-a-private-server.md). + + +## Ver también + +- **Conceptos:** + - [Consenso](../consensus-protocol/index.md) + - [Redes paralelas](parallel-networks.md) +- **Tutoriales:** + - [Cluster de servidores rippled](../../infrastructure/configuration/peering/cluster-rippled-servers.md) + - [Configurar un servidor privado](../../infrastructure/configuration/peering/configure-a-private-server.md) + - [Configurar el Peer Crawler](../../infrastructure/configuration/peering/configure-the-peer-crawler.md) + - [Redireccionar puertos para pares](../../infrastructure/configuration/peering/forward-ports-for-peering.md) + - [Conectarse manualmente a un par específico](../../infrastructure/configuration/peering/manually-connect-to-a-specific-peer.md) + - [Establecer número máximo de pares](../../infrastructure/configuration/peering/set-max-number-of-peers.md) + - [Utilizar la reserva de pares](../../infrastructure/configuration/peering/use-a-peer-reservation.md) +- **Referencias:** + - [método peers][] + - [método peer_reservations_add][] + - [método peer_reservations_del][] + - [método peer_reservations_list][] + - [método connect][] + - [método fetch_info][] + - [Peer Crawler](../../references/http-websocket-apis/peer-port-methods/peer-crawler.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/rippled-server-modes.md b/@i18n/es-ES/docs/concepts/networks-and-servers/rippled-server-modes.md new file mode 100644 index 0000000000..77ea40b6aa --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/rippled-server-modes.md @@ -0,0 +1,97 @@ +--- +html: rippled-server-modes.html +parent: networks-and-servers.html +seo: + description: Aprende sobre los modos de servidor rippled, incluyendo servidores stock, servidores validadores y servidores que se ejecutan en modo solitario. +labels: + - Servidor principal +--- +# Modos de servidor rippled + +El software del servidor `rippled` puede ejecutarse en varios modos dependiendo de su configuración, incluyendo: + +- [**Modo P2P**](#modo-p2p) - Este es el modo principal del servidor: sigue la red peer-to-peer, procesa transacciones, y mantiene cierta cantidad de [histórico del ledger](ledger-history.md). Este modo se puede configurar para alguno o todos los siguientes roles: + - [**Validador**](#validadores) - Ayuda a asegurar la red participando en el consenso. + - [**Servidor API**](#servidores-api) - Proporciona [acceso API](../../tutorials/http-websocket-apis/build-apps/get-started.md) para leer datos del ledger compartido, enviar transacciones, y mirar la actividad en el ledger. Opcionalmente, puede ser un [**servidor full history**](#servidores-full-history), el cual guarda un registro completo de transacciones y el histórico del ledger. + - [**Servidor hub**](#hubs-públicos) - Transmite mensajes entre muchos otros miembros de la red peer-to-peer. +- [**Modo Reporting**](#modo-reporting) - Un modo especializado para servir consultas API desde una base de datos relacional. No participa en la red peer-to-peer, por lo que necesitas ejecutar un servidor en modo P2P y conectarle el servidor modo reporting usando una conexión gRPC de confianza. +- [**Modo solitario**](#modo-solitario) - Un modo offline para pruebas. No se conecta a la red peer-to-peer ni usa consenso. + +Tambien puedes ejecutar el ejecutable `rippled` como una aplicación cliente para acceder [APIs `rippled`](../../references/http-websocket-apis/index.md) localmente. (Dos instancias del mismo binario pueden ejecutarse uno al lado del otro en este caso; uno como un servidor, y el otro ejecutándose brevemente como cliente y luego apagarlo.) + +Para más información sobre los comandos que ejecutar `rippled` en cada uno de estos modos, ver la [Referencia de línea de comandos](../../infrastructure/commandline-usage.md). + + +## Modo P2P + +El Modo P2P es el modo principal y predeterminado del servidor `rippled`, y puede manejar casi cualquier cosa que desees que haga tu servidor. Estos servidores forman una red peer-to-peer que procesa transacciones y mantiene el estado compartido del XRP Ledger. Si deseas enviar transacciones, leer datos del ledger o participar de otra manera en la red, tus solicitudes deben pasar por un servidor en Modo P2P en algún momento. + +Los servidores en Modo P2P también pueden configurarse para proporcionar funcionalidades adicionales. Un servidor ejecutando en Modo P2P con un archivo de configuración mínimamente modificado también se llama un servidor de stock o _stock server_. Otras configuraciones incluyen: + +- [Validador](#validadores) +- [Servidor API](#servidores-api) +- [Hubs públicos](#hubs-publicos) + +Los servidores Modo P2P se conecta a [Mainnet](parallel-networks.md) por defecto. + + +### Servidores API + +Todos los servidores en Modo P2P proporcionan [APIs](../../references/http-websocket-apis/index.md) para propósitos como enviar transacciones, verificar balances y configuraciones, y administrar el servidor. Si consultas el XRP Ledger para obtener datos o enviar transacciones para uso comercial, puede ser útil [ejecutar tu propio servidor](index.md#razones-por-las-que-ejecutar-tu-propio-servidor). + +#### Servidores Full History + +A diferencia de algunas otras blockchains, el XRP Ledger no requiere que los servidores tengan un historial completo de transacciones para conocer el estado actual y procesar nuevas transacciones. Como operador de servidor, tú decides cuánto [histórico del ledger](ledger-history.md) almacenar en un momento dado. Sin embargo, un servidor en Modo P2P solo puede responder a solicitudes de API utilizando el historial del ledger que tiene disponible localmente. Por ejemplo, si conservas seis meses de historial, tu servidor no puede describir el resultado de una transacción de hace un año. Los servidores API con histórico completo o [full history](ledger-history.md#full-history) pueden informar de todas las transacciones y balances desde el inicio del XRP Ledger. + + +### Hubs públicos + +Un servidor hub es un servidor en Modo P2P con muchas [conexiones del protocolo de pares](peer-protocol.md) a otros servidores. Los servidores hub, especialmente los _hubs públicos_ que permiten conexiones desde Internet abierto, ayudan a la red del XRP Ledger a mantener una conectividad eficiente. Los hubs públicos exitosos encarnan las siguientes características: + +- Buen ancho de banda. + +- Conexiones con muchos pares confiables. + +- Capacidad para transmitir mensajes de maneja confiable. + +Para configurar tu servidor como un hub, aumenta el número máximo de pares permitidos y asegúrate de haber [redireccionado los puertos apropiados](../../infrastructure/configuration/peering/forward-ports-for-peering.md) a través de tu firewall y enrutador de NAT (traducción de dirección de red) según corresponda. + +### Validadores + +La robustez del XRP Ledger depende de una red interconectada de _validadores_ que confían mutuamente en algunos otros validadores para _no colisionar_. Además de procesar cada transacción y calcular el estado del ledger exactamente como otros servidores en Modo P2P, los validadores participan activamente en el [protocolo de consenso](../consensus-protocol/index.md). Si tú o tu organización dependen del XRP Ledger, es de tu interés contribuir al proceso de consenso ejecutando _un_ servidor como validador. + +La validación utiliza solo una pequeña cantidad de recursos informáticos, pero no hay mucho beneficio para una sola entidad u organización en ejecutar varios validadores porque hacerlo no proporciona más protecciones contra las colisiones. Cada validador se identifica con un par de claves criptográficas único que debe ser gestionado cuidadosamente; múltiples validadores no deben compartir un par de claves. Por estas razones, la validación está desactivada de forma predeterminada. + +Puedes habilitar de forma segura la validación en un servidor que también se utiliza para otros fines; este tipo de configuración se llama un _servidor multiuso_. Alternativamente, puedes ejecutar un _validador dedicado_ que no realice otras tareas, posiblemente en un [cluster](clustering.md) con otros servidores `rippled` en Modo P2P. + +Para más información sobre como ejecutar un validador, ver [Ejecutar `rippled` como un validador](../../infrastructure/configuration/server-modes/run-rippled-as-a-validator.md). + + +## Modo reporting + + +El modo reporting es un modo especializado para servir solicitudes API de manera más eficiente. En este modo, el servidor obtiene los datos del ledger validados más recientes a través de [gRPC](../../infrastructure/configuration/configure-grpc.md) desde un servidor `rippled` separado en Modo P2P, luego carga esos datos en una base de datos relacional ([PostgreSQL](https://www.postgresql.org/)). El servidor en modo reporting no participa directamente en la red peer-to-peer, aunque puede reenviar solicitudes como el envío de transacciones al servidor en Modo P2P que utiliza. + +Varios servidores en modo reporting pueden compartir acceso a una base de datos PostgreSQL y a un clúster [Apache Cassandra](https://cassandra.apache.org/) para servir una gran cantidad de historial sin que cada servidor necesite una copia redundante de todos los datos. Los servidores en modo reporting proporcionan estos datos a través de las mismas [`rippled` APIs](../../references/http-websocket-apis/index.md) con algunos cambios leves para adaptarse a las diferencias en cómo almacenan los datos subyacentes. + +Especialmente, los servidores en modo reporting no informan sobre datos pendientes de validación del ledger o transacciones no validadas. Esta limitación es relevante para ciertos casos de uso que dependen de un acceso rápido a datos en flujo, como realizar arbitraje en el [exchange descentralizado](../tokens/decentralized-exchange/index.md). + + + + +## Modo solitario + +En el modo solitario, el servidor opera sin conectarse a la red y sin participar en el proceso de consenso. Sin el proceso de consenso, debes avanzar manualmente el ledger y no se hace ninguna distinción entre "cerrado" y "validado" ledgers. Sin embargo, el servidor sigue proporcionando acceso a la API y procesa transacciones de la misma manera. Esto te permite: + +- [Probar los efectos de enmiendas](../../infrastructure/testing-and-auditing/test-amendments.md) antes de que esas enmiendas hayan entrado en efecto en toda la red descentralizada. +- [Crear un nuevo ledger génesis](../../infrastructure/testing-and-auditing/start-a-new-genesis-ledger-in-stand-alone-mode.md) desde el inicio. +- [Cargar una versión de ledger existente](../../infrastructure/testing-and-auditing/load-a-saved-ledger-in-stand-alone-mode.md) desde el disco, luego reproducir transacciones específicas para recrear sus resultados y probar otras posibilidades. + + +## Ver también + +- **Tutoriales:** + - [Configurar `rippled`](../../infrastructure/configuration/index.md) + - [Usar rippled en modo solitario](../../infrastructure/testing-and-auditing/index.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/the-clio-server.md b/@i18n/es-ES/docs/concepts/networks-and-servers/the-clio-server.md new file mode 100644 index 0000000000..c910cc7980 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/the-clio-server.md @@ -0,0 +1,51 @@ +--- +html: the-clio-server.html +parent: networks-and-servers.html +seo: + description: Clio es un servidor XRP Ledger optimizado para llamadas API. +--- +# El servidor Clio + +Clio es un servidor API del XRP Ledger optimizado para llamadas de WebSocket o HTTP API para datos del ledger validados. + +Un servidor Clio no se conecta a la red peer-to-peer. En su lugar, extrae datos de un servidor `rippled` especifico que está conectado a la red P2P. Al manejar las llamadas API de manera eficiente, los servidores Clio pueden ayudar a reducir la carga en los servidores `rippled` que se ejecutan en modo P2P. + +Clio almacena datos históricos del ledger y transacciones validadas en un formato eficiente de espacio, utilizando hasta 4 veces menos espacio que `rippled`. Clio utiliza Cassandra o ScyllaDB, lo que permite una capacidad de lectura escalable. Multiples servidores Clio pueden compartir acceso al mismo conjunto de datos, lo que le permite construir un clúster altamente disponible de servidores Clio sin necesidad de almacenamiento o cálculo de datos redundantes o computación + +Clio requiere acceso a un servidor `rippled`, que pueda ejecutarse en la misma máquina que Clio o por separado. + +Mientras que Clio ofrece las [APIs HTTP / WebSocket](../../references/http-websocket-apis/index.md) completas, por defecto, solo devuelve datos validados. Para cualquier solicitud que requiera acceso a la red P2P, Clio reenvía automáticamente la solicitud al servidor `rippled` en la red P2P y devuelve la respuesta. + +## ¿Por qué debería ejecutar un servidor Clio? + +Hay multitud de razones por las que podrías querer ejecutar tu propio servidor Clio, pero la mayoría se pueden resumir en: carga reducida en el/los servidor(es) `rippled` conectado(s) a la red P2P, menor uso de memoria y sobrecarga de almacenamiento, escalabilidad horizontal más fácil y mayor rendimiento para las solicitudes API. + +* Carga reducida en el/los servidor(es) `rippled` - Un servidor Clio no se conecta a la red peer-to-peer. Utiliza gRPC para obtener datos validados de uno o más servidores `rippled` de confianza que están conectados a la red P2P. Por lo tanto, un servidor Clio maneja las solicitudes de manera más eficiente y reduce la carga en los servidores `rippled` que se ejecutan en modo P2P. + +* Menor uso de memoria y sobrecarga de almacenamiento - Clio utiliza Cassandra como base de datos y almacena datos en un formato eficiente en espacio, utilizando hasta 4 veces menos espacio que `rippled`. + +* Escalabilidad horizontal más fácil - Múltiples servidores Clio pueden compartir acceso al mismo conjunto de datos, lo que le permite construir un clúster altamente disponible de servidores Clio. + +* Mayor rendimiento para las solicitudes API - Un servidor Clio extrae datos validados de uno o más servidores `rippled` confiables y almacena estos datos de manera eficiente. Por lo tanto, maneja las llamadas API de manera eficiente, lo que resulta en un mayor rendimiento y, en algunos casos, una latencia más baja también. + + +## ¿Cómo funciona un servidor Clio? + +[{% inline-svg file="/docs/img/clio-basic-architecture.svg" /%}](/docs/img/clio-basic-architecture.svg "Figura 1: ¿Cómo funciona un servidor Clio?") + +Cuando un servidor Clio almacena datos del ledger validados, como metadatos de transacciones, estados de cuentas y encabezados de ledger, en un almacén de datos persistente. + +Cuando un servidor Clio recibe una solicitud API, busca datos en estos almacenes de datos. Para solicitudes que requieren datos de la red P2P, el servidor Clio reenvía la solicitud a un servidor P2P y luego pasa la respuesta de vuelta al cliente. + +Clio **siempre** reenvía a `rippled` si alguna de las siguientes condiciones es verdadera: + +- `ledger_index` está establecido a `current` o `closed`. +- `accounts`, `queue` o `full` están establecidos en `true` para la API de `ledger`. +- `queue` está establecido en `true` para la API de `account_info`. +- El método solicitado de API (`"command"`) es `submit`, `submit_multisigned`, `fee`, `ledger_closed`, `ledger_current`, `ripple_path_find`, `manifest`, `channel_authorize` o `channel_verify`. + +## Ver también + +- [Código fuente Clio](https://github.com/XRPLF/clio) +- **Tutoriales:** + - [Instalar servidor Clio en Ubuntu](../../infrastructure/installation/install-clio-on-ubuntu.md) diff --git a/@i18n/es-ES/docs/concepts/networks-and-servers/transaction-censorship-detection.md b/@i18n/es-ES/docs/concepts/networks-and-servers/transaction-censorship-detection.md new file mode 100644 index 0000000000..5fe5ed841e --- /dev/null +++ b/@i18n/es-ES/docs/concepts/networks-and-servers/transaction-censorship-detection.md @@ -0,0 +1,77 @@ +--- +html: transaction-censorship-detection.html +parent: networks-and-servers.html +seo: + description: El XRP Ledger proporciona un detector de censura de transacciones automatizado que está disponible en todos los servidores rippled. +labels: + - Blockchain +--- +# Detección de censura de transacciones + +{% badge href="https://github.com/XRPLF/rippled/releases/tag/1.2.0" %}Nuevo en: rippled 1.2.0{% /badge %} + +El XRP Ledger está diseñado para ser resistente a la censura. En apoyo a este diseño, el XRP Ledger proporciona un detector automatizado de censura de transacciones que está disponible en todos los servidores `rippled`, permitiendo que todos los participantes vean si la censura está afectando a la red. + +Mientras un servidor `rippled` está sincronizado con la red, el detector rastrea todas las transacciones que deberían haber sido aceptadas en la última ronda de [consensus](../consensus-protocol/index.md) e incluidas en el último ledger validado. El detector emite mensajes de registro de severidad creciente cuando ve transacciones que no han sido incluidas en un ledger validado después de varias rondas de consenso. + + + +## ¿Cómo funciona? + +A alto nivel, así es cómo el detector de censura de transacciones funciona: + +1. El detector agrega todas las transacciones en la propuesta de consenso inicial del servidor al rastreador. + +2. Al cierre de la ronda de consenso, el detector elimina todas las transacciones incluidas en el ledger validado resultante del rastreador. + +3. El detector emite un [mensaje de advertencia](#ejemplo-de-mensaje-de-advertencia) en el registro para cualquier transacción que permanezca en el rastreador durante 15 ledgers, mostrándola como una transacción potencialmente censurada. La presencia de la transacción en el rastreador en este momento significa que no ha sido incluida en un ledger validado después de 15 rondas de consenso. Si la transacción permanece en el rastreador durante otros 15 ledgers, el detector emite otro mensaje de advertencia en el registro. + + Mientras la transacción permanezca en el rastreador, el detector continuará emitiendo un mensaje de advertencia en el registro cada 15 ledgers, hasta cinco mensajes de advertencia. Después del quinto mensaje de advertencia, el detector emite un [mensaje de error](#ejemplo-de-mensaje-de-error) final en el registro y luego deja de emitir mensajes de advertencia y error. + + Si ves estos mensajes en el registro de tu servidor rippled, debes investigar por qué otros servidores no están incluyendo la transacción, comenzando con la suposición de que la causa es más probable que sea un [falso positivo](#potenciales-falsos-positivos) (error inocente) que una censura maliciosa. + +## Ejemplo de mensaje de advertencia + +Esto es un ejemplo de mensaje de advertencia emitido por el detector de censura de transacciones de que la transacción E08D6E9754025BA2534A78707605E0601F03ACE063687A0CA1BDDACFCD1698C7 permaneciese en el rastreador por 15 ledgers, desde el ledger 18851530 hasta el ledger 18851545. + +```text +LedgerConsensus:WRN Potential Censorship: Eligible tx E08D6E9754025BA2534A78707605E0601F03ACE063687A0CA1BDDACFCD1698C7, which we are tracking since ledger 18851530 has not been included as of ledger 18851545. +``` + + +## Ejemplo de mensaje de error + +Este es un ejemplo de mensaje de error emitido por el detector de censura de transacciones después de que la transacción E08D6E9754025BA2534A78707605E0601F03ACE063687A0CA1BDDACFCD1698C7 permaneciese en el rastreador por 75 ledgers (5 conjuntos de 15 ledgers), desde el ledger 18851530 hasta el ledger 18851605. + +```text +LedgerConsensus:ERR Potential Censorship: Eligible tx E08D6E9754025BA2534A78707605E0601F03ACE063687A0CA1BDDACFCD1698C7, which we are tracking since ledger 18851530 has not been included as of ledger 18851605. Additional warnings suppressed. +``` + + +## Potenciales falsos positivos + +El detector de censura de transacciones puede emitir falsos positivos en ciertos escenarios. En este caso, un falso positivo significa que el detector ha marcado una transacción que ha permanecido en el rastreador durante 15 ledgers o más, pero por razones inocentes. + +Aquí hay algunos escenarios que podrían causar que el detector emita mensajes de falsos positivos: + +- Tu servidor está ejecutando una compilación con código diferente al resto de la red. Esto puede hacer que tu servidor aplique transacciones de manera diferente, lo que resulta en falsos positivos. Si bien este tipo de falsos positivos es poco probable en general, es crucial que ejecutes una versión compatible del servidor principal del XRP Ledger. + +- Tu servidor está fuera de sincronización con la red y aún no lo ha notado. + +- Los servidores en la red, incluido posiblemente tu propio servidor, tienen un error que les hace transmitir transacciones de manera inconsistente a otros servidores en la red. + + Actualmente, no se conocen errores que causen este comportamiento inesperado. Sin embargo, si ves el impacto de lo que sospechas que es un error, considera reportarlo al programa [Ripple Bug Bounty](https://ripple.com/bug-bounty/). + + +## Ver también + +- **Conceptos:** + - [Principio de consenso y reglas](../consensus-protocol/consensus-principles-and-rules.md) + - [Cola de transacciones](../transactions/transaction-queue.md) +- **Tutoriales:** + - [Envío confiable de transacciones](../transactions/reliable-transaction-submission.md) + - [Entendiendo los mensajes de registro](../../infrastructure/troubleshooting/understanding-log-messages.md) +- **Referencias:** + - [Resultados de transacciones](../../references/protocol/transactions/transaction-results/index.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/bouncing-payments.md b/@i18n/es-ES/docs/concepts/payment-types/bouncing-payments.md new file mode 100644 index 0000000000..e70bd3d950 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/bouncing-payments.md @@ -0,0 +1,19 @@ +--- +html: bouncing-payments.html +parent: payment-types.html +seo: + description: Cuando el propósito de un pago no esté claro, devuélvelo al remitente. +labels: + - Tokens +--- +# Devolver pagos + +Cuando una de tus direcciones recibe un pago cuyo propósito no está claro, te recomendamos que intentes devolver el dinero a su remitente. Si bien esto requiere más trabajo que quedarse con el dinero, demuestra buena fe hacia los clientes. Puedes hacer que un operador rechace los pagos manualmente o crear un sistema para hacerlo automáticamente. + +El primer requisito para devolver pagos es [monitorizar de manera robusta los pagos entrantes](robustly-monitoring-for-payments.md). ¡No querrás devolver accidentalmente a un cliente más de lo que te ha enviado! (Esto es particularmente importante si tu proceso de devolución está automatizado.) Usuarios maliciosos pueden tomar ventaja de una integración inocente al enviar [pagos parciales](partial-payments.md#exploit-de-pagos-parciales). + +En segundo lugar, deberías enviar los pagos devueltos como Pagos Parciales (partial payments). Dado que terceras partes pueden manipular el coste de los caminos entre direcciones, los Pagos Parciales te permiten desprenderte de la cantidad completa sin preocuparte por los tipos de cambio dentro del XRP Ledger. Deberías publicar tu política de devolución de pagos como parte de tus términos de uso. Envía el pago devuelto desde una dirección operacional o una dirección de reserva. + +Para enviar un Pago Parcial, activa el [flag `tfPartialPayment`](../../references/protocol/transactions/types/payment.md#flags-de-pago) en la transacción. Introduce la cantidad en el campo `Amount` con la cantidad que recibiste y omite el campo `SendMax`. Deberías utilizar el valor `SourceTag` del pago entrante como el `DestinationTag` de tu pago de devolución. + +Para prevenir que dos sistemas estén devolviendo pagos uno al otro indefinidamente, puedes establecer un nuevo Source Tag para el pago de devolución saliente. Si recibes un pago inesperado cuyo Destination Tag coincide con el Source Tag de una devolución que enviaste, no lo rechaces nuevamente. diff --git a/@i18n/es-ES/docs/concepts/payment-types/checks.md b/@i18n/es-ES/docs/concepts/payment-types/checks.md new file mode 100644 index 0000000000..ef52798ea0 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/checks.md @@ -0,0 +1,67 @@ +--- +html: checks.html +parent: payment-types.html +seo: + description: Los cheques permiten a los usuarios a crear pagos diferidos que pueden ser cancelados o cobrados por los destinatarios deliberados. +labels: + - Cheques + - Pagos + - Tokens +--- +# Cheques + + +La función de Cheques permite a los usuarios crear pagos aplazados similares a cheques en papel. A diferencia de un depósito en garantía (escrow) o canal de pago (payment channel), los fondos no se reservan cuando se crea un cheque, por lo que el dinero solo se mueve cuando se cobra el cheque. Si el remitente no tiene los fondos en el momento en que se cobra un cheque, la transacción falla; los destinatarios pueden intentar nuevamente las transacciones fallidas hasta que el cheque expire. + +Los Cheques del XRP Ledger pueden tener tiempos de vencimiento después de los cuales ya no pueden ser cobrados. Si el destinatario no cobra con éxito el Cheque antes de que expire, el Cheque ya no se podrá cobrar, pero el objeto permanece en el XRP Ledger hasta que alguien lo cancele. Cualquiera puede cancelar el Cheque después de que expire. Solo el remitente y el destinatario pueden cancelar el Cheque antes de que expire. El objeto del Cheque se elimina del ledger cuando el remitente cobra con éxito el cheque o alguien lo cancela. + +## Casos de uso + +- Los Cheques permiten a las personas intercambiar fondos utilizando un proceso familiar y aceptado por la industria bancaria. + +- Si tu destinatario previsto utiliza autorización de deposito, [Deposit Authorization](../accounts/depositauth.md) para bloquear pagos directos de extraños, un cheque es una buena alternativa. + +- Cobros de cheques flexibles. El destnatario puede canjear el Cheque entre un nínimo y un máximo. + + +## Ciclo de vida de un cheque + +1. El remitente envía una [transacción CheckCreate][], que define: + - El destinatario. + - Una fecha de caducidad. + - La cantidad máxima que se puede cargar de su cuenta. + +2. Cuando una transacción es procesada, el XRP Ledger crea un objeto `Check`. El cheque puede ser cancelado por el destinatario o el remitente con una [transacción CheckCancel][]. + +3. El destinatario envía una [transacción CheckCash][] que transfiere los fondos y destruye el objeto `Check`. Los destinatarios tienen dos opciones para cobrar los cheques: + - Cantidad exacta: Se especifica la cantidad exacta de dinero a cobrar que no puede exceder el máximo del cheque. + - Cantidad flexible: Se especifica una cantidad mínima para cobrar y el XRP Ledger manda tanto como sea posible hasta el máximo del cheque. Si el remitente no tiene fondos para cumplir al menos el mínimo específicado, la transacción falla. + +4. Si el cheque vence antes de que el destinatario lo cobre, el objeto `Check` permanece hasta que alguien lo cancele. + + + +## Ver también + +Para más información sobre Cheques en el XRP Ledger, ver: + +- [Referencia transacción](../../references/protocol/transactions/types/index.md) + - [CheckCreate][] + - [CheckCash][] + - [CheckCancel][] +- [Tutoriales de cheques](../../tutorials/how-tos/use-specialized-payment-types/use-checks/use-checks.md) + - [Enviar un cheque](../../tutorials/how-tos/use-specialized-payment-types/use-checks/send-a-check.md) + - [Buscar cheques por dirección del remitente](../../tutorials/how-tos/use-specialized-payment-types/use-checks/look-up-checks-by-sender.md) + - [Buscar cheques por dirección del destinatario](../../tutorials/how-tos/use-specialized-payment-types/use-checks/look-up-checks-by-recipient.md) + - [Canjear un cheque por la cantidad exacta](../../tutorials/how-tos/use-specialized-payment-types/use-checks/cash-a-check-for-an-exact-amount.md) + - [Canjear un cheque por una cantidad flexible](../../tutorials/how-tos/use-specialized-payment-types/use-checks/cash-a-check-for-a-flexible-amount.md) + - [Cancelar un cheque](../../tutorials/how-tos/use-specialized-payment-types/use-checks/cancel-a-check.md) +- [Enmienda Cheques][] + +Para más información sobre funciones relacionadas, ver: + +* [Autorización de deposito](../accounts/depositauth.md) +* [Escrow](escrow.md) +* [Tutorial de canales de pago](../../tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/cross-currency-payments.md b/@i18n/es-ES/docs/concepts/payment-types/cross-currency-payments.md new file mode 100644 index 0000000000..b973833746 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/cross-currency-payments.md @@ -0,0 +1,42 @@ +--- +html: cross-currency-payments.html +parent: payment-types.html +seo: + description: Los pagos entre divisas entregan atómicamente una moneda diferente a la que envían mediante la conversión a través de rutas y libros de pedidos. +labels: + - Entre divisas + - Pagos +--- +# Pagos entre divisas + +El XRP Ledger te permite realizar pagos entre divisas de XRP y tokens. Los pagos entre divisas dentro del XRP Ledger son complétamente atómicos, lo que quiere decir que el pago se ejecuta por completo o no se ejecuta en absoluto. + +Por defecto, los pagos entre divisas entregan una cantidad fija a su destino a un coste variable para su origen. Los pagos entre divisas también pueden ser [pagos parciales](partial-payments.md) que entregan una cantidad variable dentro de un límite de envío establecido. + + +## Prerrequisitos + +- Por definición, un pago entre divisas implica al menos dos monedas, lo que significa que al menos una fivisa involucrada debe ser un [token](../tokens/index.md) que no sea XRP. +- Debe existir al menos una ruta o [Path](../tokens/fungible-tokens/paths.md) entre el remitente y el receptor, y la liquidez total a lo largo de todas las rutas debe ser suficiente para ejecutar el pago. Los pagos entre divisas se convierten de una divisa a otra consumiendo ofertas u [Offers](../tokens/decentralized-exchange/offers.md) en el [exchange descentralizado](../tokens/decentralized-exchange/index.md) del XRP Ledger. + + +## Auto-puente + +Los pagos entre divisas que intercambian un token por otro token pueden utilizar automáticamente XRP como puente entre los tokens, cuando esto reduce el coste del pago. Por ejemplo, un pago que envía de USD a MXN convierte automáticamente USD a XRP y luego XRP a MXN si hacerlo es más barato que convertir USD a MXN diréctamente. Operaciones más grandes pueden utilizar una combinación de conversiones directas (USD-MXN) y puentes automáticos (USD-XRP-MXN). + +Para más información, ver auto-puente o [Auto-Bridging](../tokens/decentralized-exchange/autobridging.md). + + +## Ver también + +- **Conceptos:** + - [Tokens](../tokens/index.md) + - [Exchange descentralizado](../tokens/decentralized-exchange/index.md) + - [Paths](../tokens/fungible-tokens/paths.md) +- **References:** + - [Tipos de transacciones de pago][Payment transaction] + - [método path_find][] + - [método ripple_path_find][] + - [Interpretando metadatos de pagos entre divisas](../transactions/finality-of-results/look-up-transaction-results.md#token-payments) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/direct-xrp-payments.md b/@i18n/es-ES/docs/concepts/payment-types/direct-xrp-payments.md new file mode 100644 index 0000000000..8178e8b9e1 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/direct-xrp-payments.md @@ -0,0 +1,49 @@ +--- +html: direct-xrp-payments.html +parent: payment-types.html +seo: + title: Pagos directos en XRP + description: Los pagos directos en XRP son la forma más rápida y sencilla de enviar valor en el XRP Ledger. Conoce ahora los conceptos básicos del ciclo de vida de pago directo en XRP. +labels: + - XRP + - Pagos +--- +# Pagos directos en XRP + +La base de cualquier sistema financiero es la transferencia de valor. El método más rápido y sencillo en el XRP Ledger es un pago directo en XRP de una cuenta a otra. A diferencia de otros métodos de pago que requieren múltiples transacciones para completarse, un pago directo en XRP se ejecuta en una sola transacción sin intermediarios, y típicamente se completa en 8 segundos o menos. Solo puedes hacer pagos directos cuando XRP es la moneda enviada y recibida. + + + +## Ciclo de vida de pagos XRP directos + +1. El remitente crea una [transacción Payment][], que define los parámetros del pago. La transacción es un pago directo en XRP si XRP es la divisa enviada y recibida. + +2. El procesamiento de la transacción verifica los parámetros y circunstancias de la transacción; si la comprobación falla, el pago falla. + + - Todos los campos están formateados correctamente. + - La dirección de envío es una cuenta activada en el XRP Ledger. + - Todas las firmas proporcionadas son válidas para la dirección de envío. + - La dirección de destino es diferente que la dirección de envío. + - El remitente tiene suficiente XRP en balance para enviar el pago. + +2. El procesamiento del pago comprueba la dirección de destino; si alguna comprobación falla, el pago falla. + + - Si la dirección de recepción está activada, el motor hace comprobaciones adicionales basados en sus configuraciones, como la autorización de depósito o [Deposit Authorization](../accounts/depositauth.md). + - Si la dirección de recepción no está activada, comprueba si el pago enviará suficiente XRP para cumplir con el mínimo del requisito de la [reserva de cuenta](../accounts/reserves.md). Si la reserva se cumple, una nueva cuenta es creada para la dirección y el balance inicial es la cantidad recibida. + +4. El ledger quita y acredita a las correspondientes cuentas. + + **Nota:** Al remitente también se le carga el [coste de transacción](../transactions/transaction-cost.md) en XRP. + + +## Ver también + +- **Tutoriales:** + - [Enviar XRP (Tutorial interactivo)](../../tutorials/how-tos/send-xrp.md) + - [Monitorizar pagos entrantes con WebSocket](../../tutorials/http-websocket-apis/build-apps/monitor-incoming-payments-with-websocket.md) +- **Referencias:** + - [Transacción Payment][] + - [Resultados de Transaction](../../references/protocol/transactions/transaction-results/index.md) + - [método account_info][] - para comprobar balances en XRP + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/escrow.md b/@i18n/es-ES/docs/concepts/payment-types/escrow.md new file mode 100644 index 0000000000..d5b74ba7d2 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/escrow.md @@ -0,0 +1,96 @@ +--- +html: escrow.html +parent: payment-types.html +seo: + description: El Escrow retiene fondos hasta que las condiciones específicas se cumplan. +labels: + - Escrow +--- +# Escrow + +Tradicionalmente, un escrow es un contrato entre dos partes para facilitar transacciones financieras. Un tercero imparcial recibe y retiene los fondos, y solo los libera al destinatario previsto cuando se cumplen las condiciones especificadas en el contrato. Este método asegura que ambas partes cumplan con sus obligaciones. + +El XRP Ledger lleva el escrow un paso más allá, reemplazando al tercero con un sistema automatizado integrado en el ledger. Un escrow bloquea el XRP, que no puede ser utilizado o destruido hasta que se cumplan las condiciones. + +## Tipos de escrow + +El XRP Ledger soporta tres tipos de escrow: + +- **Escrow basado en el tiempo:** Los fondos solo están disponibles después de que haya pasado cierta cantidad de tiempo. +- **Escrow condicional:** Este escrow se crea con una condición correspondiente y un cumplimiento. La condición sirve como un bloqueo en los fondos y no se liberará hasta que se proporcione la clave de cumplimiento correcta. +- **Escrow combinado:** Este escrow combina las características de un escrow basado en el tiempo y uno condicional. El escrow es completamente inaccesible hasta que pase el tiempo especificado, después de lo cual los fondos pueden ser liberados proporcionando el cumplimiento correcto. + +## Ciclo de vida de un escrow + +1. El remitente crea un escrow utilizando la transacción `EscrowCreate`. Esta transacción define: + + - Una cantidad de XRP para bloquear. + - Las condiciones para liberar el XRP. + - El destinatario del XRP. + +2. Cuando se procesa la transacción, el XRP Ledger crea un objeto `Escrow` que retiene el XRP en el escrow. + +3. El destinatario envía una transacción `EscrowFinish` para entregar el XRP. Si las condiciones se han cumplido, esto destruye el objeto `Escrow` y entrega el XRP al destinatario. + + **Nota:** Si el escrow tiene una fecha de caducidad y no se completa con éxito antes de este tiempo, el escrow se caduca. Un escrow caducado permanece en el ledger hasta que una transacción `EscrowCancel` lo cancele, destruyendo el objeto `Escrow` y devuelve el XRP al remitente. + +## Estados del escrow + +El siguiente diagrama muestra los estados por los que puede pasar un escrow: + +[![El diagrama de estados muestra al escrow pasar desde Retenido → Preparado/Condicionalmente preparado → Caducado](/docs/img/escrow-states.png)](/docs/img/escrow-states.png) + +El diagrama muestra tres casos diferentes para tres posibles combinaciones de los escrows de tiempo "terminar trás" (campo `FinishAfter`), cripto-condición (campo `Condition`), y tiempo de caducidad (campo `CancelAfter`): + +- **Escrow basado en el tiempo (izquierda):** Con solo un tiempo de finalización, el escrow se crea en el estado **Retenido**. Después de que haya pasado un tiempo especificado, se convierte en **Preparado** y cualquiera puede finalizarlo. Si el escrow tiene una fecha de caducidad y nadie finaliza el escrow antes de que el tiempo pase, entonces el escrow pasa a estar **Caducado**. En el estado de caducado, un escrow no puede finalizarse, y cualquiera puede cancelarlo. Si el escrow no tiene un campo `CancelAfter`, nunca caduca y nunca puede cancelarse. + +- **Escrow combinado (centro):** Si el escrow especifica tanto como una criptocondición (campo `Condition`) _y_ una fecha "terminar tras" (campo `FinishAfter`), el escrow es **Retenido** hasta que la fecha "terminar-tras" ha pasado. Luego se convierte en **Condicionalmente preparado**, y puede finalizarlo si se suministra el cumplimiento correcto de la criptocondición. Si el escrow tiene una fecha de caducidad (campo `CancelAfter`), y nadie lo completa antes de que pase ese tiempo, entonces el escrow se convierte en **Caducado**. En el estado de caducado, un escrow no se puede finalizar, y cualquiera puede cancelarlo. Si el escrow no tiene un campo `CancelAfter`, nunca caducará y no podrá ser cancelado. + +- **Escrow condicional (derecha):** Si el escrow especifica una criptocondición (campo `Condition`) y no por una fecha "terminar trás", el escrow se convierte en **Condicionalmente preparado** inmediatamente cuando se crea. Durante este tiempo, cualquiera puede finalizar el escrow, pero solo si suministran el cumplimiento correcto a la criptocondición. Si nadie finaliza el escrow antes de la fecha de caducidad (campo `CancelAfter`), el escrow se convierte en **Caducado**. (Un escrow sin una fecha de "finalizar-tras" _debe_ tener una fecha de caducidad.) En el estado de caducado, el escrow no puede ser finalizado, y cualquiera puede cancelarlo. + + +## Limitaciones + +- El escrow solo funciona con XRP, no con tokens. +- Los costes pueden hacerlo poco práctico para cantidades pequeñas. + - El escrow requiere de dos transacciones: una para crear el escrow, y una para finalizarlo o cancelarlo. Las criptocondiciones incurren en un [coste de transacción](../transactions/transaction-cost.md) mayor al usual. + - Mientras que el escrow no se completa, el remitente es responsable del [requisito de reserva](../accounts/reserves.md) del objeto del `Escrow`. +- No puedes crear un escrow con valores de fechas pasados. +- Las liberaciones y caducidad se resuelven en [tiempos de cierre de ledgers](../ledgers/ledger-close-times.md). En la práctica, los tiempos de liberaciones o caducidad pueden variar en 5 segundos respecto a los cierres de ledgers. +- El único tipo de criptocondición aceptado es PREIMAGE-SHA-256. + + +## Coste de la transacción EscrowFinish + +Cuando uses criptocondiciones, la transacción EscrowFinish debe pagar un [mayor coste de transacción](../transactions/transaction-cost.md#special-transaction-costs) por la carga de procesamiento involucrada en la verificación de la criptocondición introducida. + +El coste de transacción adicional requerido es proporcional al tamaño de la condición introducida. Si la transacción es multi-firma o [multi-signed](../accounts/multi-signing.md), el coste de la multi-firma es añadido al coste de la introducción de la condición. + +Actualmente, un EscrowFinish con introducción requiere un mínimo de coste de transacción de **330 [drops de XRP](../../references/protocol/data-types/basic-data-types.md#specifying-currency-amounts) más 10 drops por cada 16 bytes del tamaño de la introducción**. + +**Nota:** La fórmula de arriba está basada en la asunción de que el coste de referencia de la transacción es 10 drops de XRP. + +Si el [coste de votar](../consensus-protocol/fee-voting.md) cambia el valor de `reference_fee`, la fórmula escala basado en el nuevo coste de referencia. La fórmula general de una transacción EscrowFinish con un crypto-cumplimiento es como sigue: + +``` +reference_fee * (signer_count + 33 + (fulfillment_bytes / 16)) +``` + + + +## Ver también + +Para más información sobre Escrow en el XRP Ledger, consulta lo siguiente: + +- [Tutoriales Escrow](../../tutorials/how-tos/use-specialized-payment-types/use-escrows/index.md) +- [Referencia de transacciones](../../references/protocol/transactions/index.md) + - [Transacción EscrowCreate][] + - [Transacción EscrowFinish][] + - [Transacción EscrowCancel][] +- [Referencia Ledger](../../references/protocol/ledger-data/index.md) + - [Objeto Escrow](../../references/protocol/ledger-data/ledger-entry-types/escrow.md) + + +Para más información sobre el bloqueo de 55 mil millones de Ripple, consulta [Ripple's Insights Blog](https://ripple.com/insights/ripple-to-place-55-billion-xrp-in-escrow-to-ensure-certainty-into-total-xrp-supply/). + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/index.md b/@i18n/es-ES/docs/concepts/payment-types/index.md new file mode 100644 index 0000000000..bec5055e9d --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/index.md @@ -0,0 +1,16 @@ +--- +html: payment-types.html +parent: concepts.html +metadata: + indexPage: true +seo: + title: Point-to-Point & Specialized Ledger Payment Types + description: Mientras que el XRP Ledger admite pagos XRP de punto a punto, también es compatible con tipos de pago más especializados. Descubre qué métodos de pago del ledger aquí. +--- +# Ledger Payment Types + + +El XRP Ledger admite pagos de XRP de punto a punto junto con otros tipos de pago más especializados. + + +{% child-pages /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/partial-payments.md b/@i18n/es-ES/docs/concepts/payment-types/partial-payments.md new file mode 100644 index 0000000000..3f1f5a1f8a --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/partial-payments.md @@ -0,0 +1,140 @@ +--- +html: partial-payments.html +parent: payment-types.html +seo: + description: Los pagos parciales restan costes a la cantidad enviada, entregando una cantidad flexible. Los pagos parciales son útiles para devolver pagos no deseados sin incurrir en costes adicionales. +labels: + - Pagos + - Seguridad +--- +# Pagos parciales + +El remitente de cualquier [transacción de pago][] puede habilitar el [flag de"Partial Payment"](../../references/protocol/transactions/types/payment.md#payment-flags) y enviar un pago que entregue menos de lo que indica el campo `Amount`. Al procesar cualquier Pago, utiliza el campo de metadatos `delivered_amount`, no el campo `Amount`. El `delivered_amount` es la cantidad que un pago realmente entregó. + +Si un Pago no habilita el flag de Pago Parcial, el campo `Amount` de una [transacción Payment][] en el XRP Ledger especifica la cantidad a entregar después de cobrar por tasas de cambio y [costes de transferencia](../tokens/transfer-fees.md). El flag de Pago Parcial ([`tfPartialPayment`](../../references/protocol/transactions/types/payment.md#payment-flags)) permite que un pago tenga éxito al reducir la cantidad recibida en lugar de aumentar la cantidad enviada. Los pagos parciales son útiles para [devolver pagos](bouncing-payments.md) sin incurrir en costos adicionales para uno mismo. + +La cantidad de XRP utilizada para el [coste de transacción](../transactions/transaction-cost.md) siempre se deduce de la cuenta del remitente, independientemente del tipo de transacción. Este coste de transacción, o comisión, no se incluye en la `Amount`. + +Los pagos parciales se pueden utilizar para explotar integraciones ingenuas con el XRP Ledger para robar dinero de exchanges y gateways. La sección [Explotación de Pagos Parciales](#exploit-de-pagos-parciales) de este documento describe cómo funciona esta explotación y cómo puedes evitarla. + +## Semántica + +### Sin pagos parciales + +Al enviar un Pago que no utiliza el flag de Pago Parcial, el campo `Amount` de la transacción especifica la cantidad exacta a entregar, y el campo `SendMax` especifica la cantidad máxima y la divisa a enviar. Si un pago no puede entregar la cantidad completa de `Amount` sin exceder el parámetro `SendMax`, o si la cantidad completa no se puede entregar por cualquier otro motivo, la transacción falla. Si el campo `SendMax` se omite de las instrucciones de la transacción, se considera igual a la `Amount`. En este caso, el pago solo puede tener éxito si la cantidad total de las tarifas es 0. + +En otras palabras: + +``` +Cantidad + (costes) = (cantidad enviada) ≤ SendMax +``` + +En esta fórmula, "costes" o fees se refiere a [costes de transferencia](../tokens/transfer-fees.md) y tipos de cambio de las divisas. La "cantidad enviada" y la cantidad enviada (`Amount`) pueden estar denominadas en distintas divisas y convertirse por la consumición de Ofertas en el exchange descentralizado del XRP Ledger. + +**Nota:** El campo `Fee` de la transacción se refiere al [coste de transacción](../transactions/transaction-cost.md) en XRP, que se destruye para enviar la transacción a la red. El coste de transacción exacto especificado se carga siempr al remitente y se separa completamente de los cálculos de costes para cualquier tipo de pago. + +### Con pagos parciales + +Cuando se envía un Pago que tiene habilitado el flag de Pago Parcial, el campo `Amount` de la transacción especifica una cantidad máxima a entregar. Los pagos parciales pueden tener éxito al enviar _parte_ del valor previsto a pesar de limitaciones que incluyen costes, falta de liquidez, falta de espacio en las líneas de confianza (trustlines) de la cuenta receptora, u otras razones. + +El campo opcional `DeliverMin` especifica una cantidad mínima a entregar. El campo `SendMax` funciona de la misma manera que con los pagos no parciales. La transacción de pago parcial tiene éxito si entrega cualquier cantidad igual o mayor que el campo `DeliverMin` sin exceder la cantidad `SendMax`. Si el campo `DeliverMin` no está especificado, un pago parcial puede tener éxito al entregar cualquier cantidad positiva. + +En otras palabras: + +``` +Cantidad ≥ (Cantidad enviada) = SendMax - (Costes) ≥ DeliverMin > 0 +``` + +### Limitaciones de los pagos parciales + +Los pagos parciales tienen las siguientes limitaciones: + +- Un pago parcial no puede proporcionar el XRP para crear una dirección; en este caso se devuelve el [código de resultado][] `telNO_DST_PARTIAL`. +- Pagos directoss de XRP a XRP no pueden ser pagos parciales; este caso devuelve el [código de resultado][] `temBAD_SEND_XRP_PARTIAL`. + - Sin embargo, los pagos entre divisas que involucran a XRP como una de las divisas _pueden_ ser pagos parciales. + +[código de resultado]: ../../references/protocol/transactions/transaction-results/index.md + +### El campo `delivered_amount` + +Para ayudar a entender cuánto entregó realmente un pago parcial, los metadatos de una transacción de Pago exitosa incluyen un campo `delivered_amount`. Este campo describe la cantidad realmente entregada, en el [mismo formato](../../references/protocol/data-types/basic-data-types.md#specifying-currency-amounts) que el campo `Amount`. + +Para pagos no parciales, el campo `delivered_amount` de los metadatos de la transacción es igual al campo `Amount` de la transacción. Cuando un pago entrega [tokens](../tokens/index.md), el campo `delivered_amount` puede ser ligeramente diferente al campo `Amount` debido al redondeo. + +La cantidad entregada **no está disponible** para transacciones que cumplen **ambos** de los siguientes criterios: + +- Es un pago parcial +- Está incluido en un ledger validado anterior al 20 de enero de 2014 + +Si ambas condiciones son verdaderas, entonces `delivered_amount` contiene el valor del string `unavailable` en lugar de una cantidad real. Si esto ocurre, solo puedes determinar la cantidad entregada real leyendo los `AffectedNodes` en los metadatos de la transacción. Si la transacción entregó tokens y el `issuer` del `Amount` es la misma cuenta que la dirección `Destination`, la cantidad entregada puede dividirse entre varios miembros de `AffectedNodes` que representan líneas de confianza (trustlines) con distintas contrapartes. + +Puedes encontrar el campo `delivered_amount` en los siguientes lugares: + +| API | Método | Campo | +|-----|--------|-------| +| [JSON-RPC / WebSocket][] | [método account_tx][] | `result.transactions` miembros del array `meta.delivered_amount` | +| [JSON-RPC / WebSocket][] | [método tx][] | `result.meta.delivered_amount` | +| [JSON-RPC / WebSocket][] | [método transaction_entry][] | `result.metadata.delivered_amount` | +| [JSON-RPC / WebSocket][] | [método ledger][] (con las transacciones ampliadas) | `result.ledger.transactions` miembros del array `metaData.delivered_amount` | +| [WebSocket][] | [subscripciones Transaction](../../references/http-websocket-apis/public-api-methods/subscription-methods/subscribe.md#transaction-streams) | Mensajes de subscripción de `meta.delivered_amount` | +| ripple-lib v1.x | método `getTransaction` | `outcome.deliveredAmount` | +| ripple-lib v1.x | método `getTransactions` | miembros del array `outcome.deliveredAmount` | + +[WebSocket]: ../../references/http-websocket-apis/index.md +[JSON-RPC / WebSocket]: ../../references/http-websocket-apis/index.md + +## Exploit de pagos parciales + +Si la integración de una institución financiera con el XRP Ledger asume que el campo `Amount` de un Pago es siempre la cantidad completa entregada, actores maliciosos podrían aprovechar esa suposición para robar dinero de la institución. Este exploit puede utilizarse contra pasarelas, exchanges o comerciantes siempre que el software de esas instituciones no procese los pagos parciales correctamente. + +**La forma correcta de procesar las transacciones de Pago entrantes es utilizar [el campo `delivered_amount` de los metadatos](#the-delivered_amount-field),** no el campo `Amount`. De este modo, una institución nunca se equivocará sobre cuanto recibe _realmente_. + + +### Pasos del escenario del Exploit + +Para realizar un exploit a una institución financiera vulnerable, un actor malicioso puede hacer lo siguiente: + +1. El actor malicioso envía una transacción de Pago a la institución. Esta transacción tiene un campo `Amount` grande y tiene el flag de **`tfPartialPayment`** activado. +2. El pago parcial tiene éxito (código de resultado `tesSUCCESS`) pero en realidad entrega una cantidad muy pequeña de la divisa especificada. +3. La institución vulnerable lee el campo `Amount` sin mirar el campo `Flags` o el campo de metadatos `delivered_amount`. +4. La institutución vulnerable acredita al actor malicioso en un sistema externo, como el propio ledger de la institución, por el `Amount` completo, a pesar de recibir solo un `delivered_amount` pequeño en el XRP Ledger. +5. El actor malicioso retira tanto saldo como sea posible antes de que la institución vulnerable note la discrepancia. + - Los actores maliciosos suelen preferir convertir el saldo a otra criptomoneda como Bitcoin, porque las transacciones de blockchain suelen ser irreversibles. Con un retiro a un sistema de moneda fiduciaria, la institución financiera podría revertir o cancelar la transacción varios días después de que se ejecute inicialmente. + - En el caso de un exchange, el actor malicioso también puede retirar un saldo de XRP directamente de nuevo al XRP Ledger. + +En el caso de un comerciante, el orden de las operaciones es ligeramente diferente, pero el concepto es el mismo: + +1. El actor malicioso solicita comprar una gran cantidad de bienes o servicios. +2. El comerciante vulnerable factura al actor malicioso por el precio de esos bienes o servicios. +3. El actor malicioso envía una transacción de Pago al comerciante. Esta transacción tiene un campo `Amount` grande y tiene el flag **`tfPartialPayment`** activado. +4. El pago parcial tiene éxito (código de resultado `tesSUCCESS`) pero entrega solo una cantidad muy pequeña de la divisa especificada. +5. El comerciante vulnerable lee el campo `Amount` de la transacción sin mirar el campo `Flags` o el campo de los metadatos `delivered_amount`. +6. El comerciante vulnerable trata la factura como pagada y proporciona los bienes o servicios al actor malicioso, a pesar de recibir solo una mucho menor `delivered_amount` en el XRP Ledger. +7. El actor malicioso utiliza, revende, o se marcha con los bienes y servicios antes de que el comerciantes note la discrepancia. + +### Mitigaciones adicionales + +Utilizar [el campo `delivered_amount`](#the-delivered_amount-field) al procesar transacciones entrantes es suficiente para evitar este exploit. Aún así, prácticas de negocio proactivas adicionales también pueden evitar o mitigar la probabilidad de esta o exploits similares. Por ejemplo: + +- Añade chequeos adicionales a la lógica de tu negocio para procesar los retiros. Nunca proceses un retiro si el balance total que tienes en el XRP Ledger no coincide con tus activos y obligaciones esperados. +- Sigue las directrices "Know Your Customer" y verifica estrictamente las identidades de tus clientes. Puede que reconozcas y bloquees usuarios maliciosos de antemano, o emprender acciones legales contra el actor malicioso que genera exploits a tu sistema. + + +## Ver también + +- **Herramientas:** + - [Remitente de la transacción](/resources/dev-tools/tx-sender) +- **Conceptos:** + - [Transacciones](../transactions/index.md) +- **Tutoriales:** + - [Buscar resultados de transacciones](../transactions/finality-of-results/look-up-transaction-results.md) + - [Monitorear pagos recibidos con WebSocket](../../tutorials/http-websocket-apis/build-apps/monitor-incoming-payments-with-websocket.md) + - [Usar tipos de pagos especializados](../../tutorials/how-tos/use-specialized-payment-types/index.md) + - [Listar XRP en un Exchange](../../use-cases/defi/list-xrp-as-an-exchange.md) +- **Referencias:** + - [Transacción de Pago][] + - [Metadatos de transacción](../../references/protocol/transactions/metadata.md) + - [método account_tx][] + - [método tx][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/payment-channels.md b/@i18n/es-ES/docs/concepts/payment-types/payment-channels.md new file mode 100644 index 0000000000..b55523560a --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/payment-channels.md @@ -0,0 +1,52 @@ +--- +html: payment-channels.html +parent: payment-types.html +seo: + description: Los canales de pago que activan pagos XRP asíncronos rápidos que pueden dividirse en incrementos muy pequeños y liquidarse más después. +labels: + - Canales de pago + - Smart Contracts +--- +# Canales de pago + +Los Canales de Pago son una función avanzada para enviar pagos de XRP "asíncronos" que pueden dividirse en incrementos muy pequeños y liquidarse más tarde. + +El XRP para un canal de pago se reserva temporalmente. El remitente crea reclamaciones o _Claims_ contra el canal, que el destinatario verifica sin enviar una transacción al XRP Ledger o esperar a que se apruebe una nueva versión del ledger por [consenso](../consensus-protocol/index.md). (Este es un proceso _asíncrono_ porque ocurre separado del patrón habitual de obtener transacciones aprobadas por consenso). En cualquier momento, el destinatario puede _canjear_ una reclamación (Claim) para recibir una cantidad de XRP autorizada por esa _Claim_. Liquidar una _Claim_ de esta manera utiliza una transacción estándar del XRP Ledger, como parte del proceso de consenso habitual. Esta única transacción puede abarcar cualquier cantidad de transacciones garantizadas por _Claims_ más pequeñas. + +Debido a que las reclamaciones pueden verificarse individualmente pero liquidarse en bloque más adelante, los canales de pago hacen posible realizar transacciones a una velocidad limitada solo por la capacidad de los participantes para crear y verificar las firmas digitales de esas Reclamaciones. Este límite se basa principalmente en la velocidad del hardware de los participantes y la complejidad de los algoritmos de firma. Para obtener la máxima velocidad, utiliza firmas Ed25519, que son más rápidas que las firmas ECDSA secp256k1 predeterminadas del XRP Ledger. La investigación ha [demostrado la capacidad de crear más de 100.000 firmas Ed25519 por segundo y verificar más de 70.000 por segundo](https://ed25519.cr.yp.to/ed25519-20110926.pdf) en hardware estándar en 2011. + + +## ¿Por qué usar canales de pago? + +El proceso de usar un canal de pago siempre implica dos partes, un pagador y un beneficiario. El pagador es una persona o institución que utiliza el XRP Ledger y es cliente del beneficiario. El beneficiario es una persona o empresa que recibe XRP como pago por bienes o servicios. + +Los Canales de Pago no especifican intrínsecamente nada sobre lo que puedes comprar y vender con ellos. Sin embargo, los tipos de bienes y servicios que son adecuados para los canales de pago son: + +- Cosas que pueden transmitirse casi instantaneamente, como artículos digitales +- Cosas baratas, donde el coste de procesar una transacción es una parte no trivial del precio +- Cosas que normalmente se compran en bloque, donde la cantidad exacta deseada no se conoce de antemano + + +## Ciclo de vida de un canal de pago + +El siguiente diagrama resume el ciclo de vida de un canal de pago: + +[{% inline-svg file="/docs/img/paychan-flow.svg" /%}](/docs/img/paychan-flow.svg "Diagrama de flujo de un canal de pago") + + +## Ver también + +- **Conceptos relacionados:** + - [Escrow](escrow.md), una función similar para pagos XRP condicionales de mayor valor y menor velocidad. +- **Tutoriales y casos de uso:** + - [Utilizar canales de pago](../../tutorials/how-tos/use-specialized-payment-types/use-payment-channels/index.md), un tutorial que guía a través del proceso de utilizar un canal de pago. + - [Abrir un canal de pago para activar una red de intercambio](../../tutorials/how-tos/use-specialized-payment-types/use-payment-channels/open-a-payment-channel-to-enable-an-inter-exchange-network.md) +- **Referencias:** + - [Método channel_authorize][] + - [Método channel_verify][] + - [Objeto PayChannel](../../references/protocol/ledger-data/ledger-entry-types/paychannel.md) + - [Transacción PaymentChannelClaim][] + - [Transacción PaymentChannelCreate][] + - [Transacción PaymentChannelFund][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/payment-types/robustly-monitoring-for-payments.md b/@i18n/es-ES/docs/concepts/payment-types/robustly-monitoring-for-payments.md new file mode 100644 index 0000000000..110e9bcb6e --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/robustly-monitoring-for-payments.md @@ -0,0 +1,27 @@ +--- +html: robustly-monitoring-for-payments.html +parent: payment-types.html +seo: + description: Recomendaciones para monitorizar pagos entrantes de una variedad e posibles irregularidades. +labels: + - Tokens +--- +# Monitoreo robusto de pagos + +Para verificar robustamente los pagos entrantes, los emisores deberían hacer lo siguiente: + +* Mantener un registro de la transacción y el ledger más recientemente procesados. De esta manera, si pierdes temporalmente la conectividad, sabrás hasta dónde retroceder. +* Verificar el código de resultado de cada pago entrante. Algunos pagos ingresan al ledger para cobrar una tarifa contra el spam, incluso si fallan. Solo las transacciones con el código de resultado `tesSUCCESS` pueden cambiar saldos que no sean de XRP. Solo las transacciones de un ledger validado son definitivas. +* Mirar los [pagos parciales](partial-payments.md). Los pagos con el flag de pago parcial activado pueden ser condierados "exitosos" si se entrega cualquier cantidad distinta a cero, incluso cantidades minúsculas. + * Comprobar la transacción en busca del [campo `delivered_amount`](partial-payments.md#el-campo-delivered_amount). Si está presente, el campo indica cuanto dinero _realmente_ se envió a la dirección `Destination`. + * En xrpl.js, puedes usar el [método `xrpl.getBalanceChanges()`](https://js.xrpl.org/modules.html#getBalanceChanges) para ver cuánto recibió cada dirección. En algunos casos, esto puede dividirse en varias partes en diferentes líneas de confianza (trustlines). +* Algunas transacciones cambian tus balances sin ser pagos directos hacia o desde una de tus direcciones. + +Para simplificar las cosas para tus clientes, te recomendamos aceptar pagos tanto en tu dirección operacional como en tus direcciones de emisoras. + +Como precaución adicional, te recomendamos comparar los balances de tus direcciones emisoras con los fondos de garantía en tu sistema de contabilidad interna en cada nueva versión del ledger del XRP Ledger. Los saldos negativos de la dirección emisora deben coincidir con los activos que has asignado al XRP Ledger fuera de la red. Si ambos no coinciden, deberías suspender el procesamiento de pagos hacia y desde el XRP Ledger hasta que hayas resuelto la discrepancia. + +* Utiliza el método `gateway_balances` para comprobar tus balances. +* Si tienes un coste de transferencia (transfer fee) establecido, entonces tus obligaciones dentro del XRP Ledger disminuyen ligeramente cada vez que otras direcciones del XRP Ledger transfieran tus tokens entre sí. + +Para más detalles en cómo se leen los detalles de transacciones entrantes, visita [Buscar resultados de transacciones](../transactions/finality-of-results/look-up-transaction-results.md). diff --git a/@i18n/es-ES/docs/concepts/payment-types/sending-payments-to-customers.md b/@i18n/es-ES/docs/concepts/payment-types/sending-payments-to-customers.md new file mode 100644 index 0000000000..453abbf78f --- /dev/null +++ b/@i18n/es-ES/docs/concepts/payment-types/sending-payments-to-customers.md @@ -0,0 +1,24 @@ +--- +html: sending-payments-to-customers.html +parent: payment-types.html +seo: + description: Construye los pagos con cuidado para frustrar a los actores maliciosos. +labels: + - Tokens +--- +# Enviar pagos a clientes + +Cuando construyes un sistema automatizado para enviar pagos al XRP Ledger para tus clientes, debes asegurarte de que construyes los pagos cuidadosamente. Los actores maliciosos están constantemente tratando de encontrar formas de engañar a un sistema para que les pague más dinero del que debería. + +Generalmente, al enviar stablecoins, utilizas una [transacción Payment][]. Algunos detalles son diferentes dependiendo de si estás emitiendo tokens por primera vez o transfiriéndolos desde una cartera activa a un cliente. Cosas a tener en cuenta incluyen: + +- Siempre especifica tu dirección emisora como el emisor del token. De lo contrario, podrías usar accidentalmente rutas (paths) que entreguen la misma divisa emitida por otras direcciones. +- Antes de enviar un pago al XRP Ledger, comprueba el coste del pago. Un pago desde tu dirección operacional a un cliente no debe costar más que la cantidad de destino más cualquier coste de transferencia que hayas establecido. +- Cuando emites nuevos tokens desde tu dirección emisora, debes omitir el campo `SendMax`. De lo contrario, los usuarios malintencionados pueden configurar sus ajustes para que emitas la cantidad completa de `SendMax` en lugar de solo la `Amount` de destino prevista. +- Cuando envías tokens _desde una cartera caliente_, debes especificar `SendMax` si tienes un coste de transferencia distinto de cero. En este caso, establece el campo `SendMax` en la cantidad especificada en el campo `Amount` más el coste de transferencia. (Puede que desees redondear ligeramente hacia arriba, en caso de que la precisión de tus cálculos no coincida exactamente con la del XRP Ledger). Por ejemplo, si envías una transacción cuyo campo `Amount` especifica 99.47 USD, y tu coste de transferencia es del 0.25%, deberías establecer el campo `SendMax` en 124.3375, o 124.34 USD si redondeas hacia arriba. +- Omitir el campo `Paths`. Este campo es innecesario cuando se envía directamente desde el emisor, o desde una cartera caliente siempre y cuando los tokens que se envían y los que se reciben tengan el mismo código de divisa y emisor, es decir, sean la misma stablecoin. El campo `Paths` está destinado a [Pagos entre divisas](cross-currency-payments.md) y a pagos multi-salto (rippling) más largos. Si realizas una búsqueda de rutas (paths) de manera ingenua y adjuntas las rutas a tu transacción, tu pago puede tomar un camino indirecto más costoso en lugar de fallar si el camino directo no está disponible; los usuarios malintencionados incluso pueden configurar esto. +- Si recibes un código de resultado `tecPATH_DRY`, esto suele indicar que el cliente no tiene configurada la línea de confianza (trustline) necesaria, o que los ajustes de rippling de tu emisor no están configurados correctamente. + +Para un tutorial detallado sobre cómo emitir un token en el XRP Ledger, ya sea una stablecoin u otro tipo, visita [Emitir un token fungible](../../tutorials/how-tos/use-tokens/issue-a-fungible-token.md). + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/autobridging.md b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/autobridging.md new file mode 100644 index 0000000000..79ba7e1de0 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/autobridging.md @@ -0,0 +1,26 @@ +--- +html: autobridging.html +parent: decentralized-exchange.html +seo: + description: El puente automático conecta automáticamente los libros de órdenes utilizando XRP como intermediario cuando reduce los costes. +labels: + - XRP + - Exchange Descentralizado +--- +# Puente automático + +Cualquier [Oferta](offers.md) en el [exchange descentralizado](index.md) del XRP Ledger que intercambie dos tokens podría potencialmente utilizar XRP como moneda intermediaria en un libro de órdenes sintético. Esto se debe al _puente automático_, que sirve para mejorar la liquidez en todos los pares de activos utilizando XRP cuando es más barato que intercambiar directamente. Esto funciona debido a la naturaleza de XRP como criptomoneda nativa del XRP Ledger. La ejecución de la oferta puede utilizar una combinación de ofertas directas y ofertas auto-puenteadas para lograr la mejor tasa de cambio total. + +Ejemplo: _Anita crea una oferta para vender GBP y comprar BRL. Ella podría encontrar que este mercado poco común tiene pocas ofertas. Hay una oferta con una buena tasa, pero tiene una cantidad insuficiente para satisfacer el intercambio de Anita. Sin embargo, tanto GBP como BRL tienen mercados activos y competitivos para XRP. El sistema de puente automático del XRP Ledger encuentra una forma de completar la oferta de Anita comprando XRP con GBP de un trader, luego vendiendo el XRP a otro trader para comprar BRL. Anita obtiene automáticamente la mejor tasa posible combinando la pequeña oferta en el mercado directo de GBP:BRL con las mejores tasas compuestas creadas emparejando las ofertas GBP:XRP y XRP:BRL._ + +El puente automático ocurre automáticamente en cualquier [transacción OfferCreate][]. Las [transacciones de Payment](../../../references/protocol/transactions/types/payment.md) _no_ usan auto-puente por defecto, pero path-finding pueden encontrar [rutas o paths](../fungible-tokens/paths.md) que tengan el mismo efecto. + +## Ver también + +- [Dev Blog: Introducción al Autopuente](https://xrpl.org/blog/2014/introducing-offer-autobridging.html) + +- [Preferencia de oferta](offers.md#offer-preference) + +- [Rutas de pago](../fungible-tokens/paths.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md new file mode 100644 index 0000000000..5adf0ada89 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md @@ -0,0 +1,109 @@ +--- +html: automated-market-makers.html +parent: decentralized-exchange.html +seo: + title: ¿Qué es un Automated Market Maker (AMM)? + description: Los Automated Market Makers (AMMs) son una parte esencial de las criptomonedas, proveen liquidez entre dos pares de activos. Aprende más sobre AMMs y el XRP Ledger. +labels: + - XRP + - Exchange Descentralizado + - AMM +--- +# ¿Qué es un Automated Market Maker (AMM)? + +_(Requiere la [enmienda AMM][] XLS-30)_ + +Los Creadores de Mercado Automatizados o Automated Market Maker (AMMs) son contratos inteligentes que proporcionan liquidez en el exchange descentralizado del XRP Ledger. Cada AMM posee un pool de dos activos y permite a los usuarios intercambiar entre ellos a una tasa de cambio establecida por una fórmula. + +Para cualquier par de activos dado, puede haber hasta un AMM en el ledger. Cualquiera puede crear el AMM para un par de activos si aún no existe, o depositar en un AMM existente. Aquellos que depositan activos en un AMM se llaman proveedores de liquidez o _liquidity providers_ (LPs) y reciben "Tokens LP" del AMM. Los Tokens LP permiten a los proveedores de liquidez: + +- Canjear sus Tokens LP por una parte de los activos en el pool del AMM, incluidas las tarifas recolectadas. +- Votar para cambiar la configuración de tarifas del AMM. Los votos están ponderados en función de cuántos Tokens LP poseen los votantes. +- Pujar con algunos de sus Tokens LP para recibir un descuento temporal en las tarifas de intercambio del AMM. + +Cuando el flujo de fondos entre los dos activos en un pool es relativamente activo y equilibrado, las tarifas proporcionan una fuente de ingresos pasivos para los proveedores de liquidez. Sin embargo, cuando el precio relativo entre los activos cambia, los proveedores de liquidez pueden sufrir una pérdida en el [riesgo de divisa](https://www.investopedia.com/terms/c/currencyrisk.asp). + +## ¿Cómo funciona el AMM? + +Un AMM posee dos activos diferentes: como máximo, uno de estos puede ser XRP, y uno o ambos pueden ser [tokens](../index.md). Los tokens con diferentes emisores se consideran activos diferentes para este propósito. Esto significa que puede haber un AMM para dos tokens con el mismo código de moneda pero diferentes emisores ("FOO emitido por WayGate" es diferente de "FOO emitido por StableFoo"), o el mismo emisor pero diferentes códigos de moneda. El orden no importa; el AMM para FOO.WayGate a XRP es el mismo que para XRP a FOO.WayGate. + +Cuando los usuarios desean comerciar en el exchange descentralizado, sus [Ofertas](offers.md) y [Pagos entre divisas](../../payment-types/cross-currency-payments.md) pueden utilizar automáticamente los AMMs para completar el intercambio. Una sola transacción podría ejecutarse mediante la coincidencia de Ofertas, AMMs o una combinación de ambos, dependiendo de lo que sea más económico. + +Un AMM establece su tasa de cambio en función del saldo de activos en el pool. Cuando intercambias contra un AMM, la tasa de cambio se ajusta según cuánto tu intercambio desequilibre el saldo de activos que el AMM posee. A medida que su suministro de un activo disminuye, el precio de ese activo sube; a medida que su suministro de un activo aumenta, el precio de ese activo baja. Un AMM ofrece tasas de cambio generalmente mejores cuando tiene cantidades más grandes en general en su pool. Esto se debe a que cualquier intercambio dado causa un cambio más pequeño en el equilibrio de los activos del AMM. Cuanto más desequilibre un intercambio el suministro de los dos activos del AMM, más extrema se vuelve la tasa de cambio. + +El AMM también cobra una tarifa de intercambio porcentual además de la tasa de cambio. + +El XRP Ledger implementa un AMM de _media geométrica_ con un parámetro de peso de 0.5, por lo que funciona como un creador de mercado de _producto constante_. Para obtener una explicación detallada de la fórmula AMM de _producto constante_ y la economía de los AMMs en general, consulta [Introducción a los Automated Market Makers de Kris Machowski](https://www.machow.ski/posts/an_introduction_to_automated_market_makers/). + +### Restricciones sobre los activos + +Para evitar el mal uso, se aplican algunas restricciones a los activos utilizados en un AMM. Si intentas crear un AMM con un activo que no cumple con estas restricciones, la transacción falla. Las reglas son las siguientes: + +- El activo no debe ser un Token LP de otro AMM. +- Si el activo es un token cuyo emisor utiliza [Authorized Trust Lines](../fungible-tokens/authorized-trust-lines.md), el creador del AMM debe estar autorizado para poseer esos tokens. Solo los usuarios cuyas líneas de confianza (trustlines) estén autorizadas pueden depositar ese token en el AMM o retirarlo; sin embargo, los usuarios aún pueden depositar o retirar el otro activo. +- Si la [enmienda Clawback][] está habilitada, el emisor del token no debe haber habilitado la capacidad de recuperar sus tokens. + + +## Tokens LP + +Quien crea el AMM se convierte en el primer proveedor de liquidez y recibe Tokens LP que representan el 100% de la propiedad de los activos en el pool del AMM. Pueden canjear algunos o todos esos Tokens LP para retirar activos del AMM en proporción a las cantidades actualmente allí. (Las proporciones cambian con el tiempo a medida que las personas comercian contra el AMM). El AMM no cobra una tarifa al retirar ambos activos. + +Por ejemplo, si creaste un AMM con 5 ETH y 5 USD, y luego alguien cambió 1.26 USD por 1 ETH, el pool ahora tiene 4 ETH y 6.26 USD en él. Puedes gastar la mitad de tus Tokens LP para retirar 2 ETH y 3.13 USD. + +Cualquiera puede depositar activos en un AMM existente. Cuando se hace, se reciben nuevos Tokens LP según lo que depositaron. La cantidad que un proveedor de liquidez puede retirar de un AMM se basa en la proporción de los Tokens LP del AMM que poseen en comparación con el número total de Tokens LP pendientes. + +Los Tokens LP son como otros tokens en el XRP Ledger, por lo que puedes usarlos en muchos [tipos de pagos](../../payment-types/index.md) o intercambiarlos en el exchange descentralizado. (Para recibir Tokens LP como pago, debes configurar una [trust line](../fungible-tokens/index.md) con un límite distinto de cero con la cuenta del AMM como emisor). Sin embargo, _solo_ puedes enviar Tokens LP directamente al AMM (canjeándolos) usando el tipo de transacción [AMMWithdraw][], no a través de otros tipos de pagos. Del mismo modo, solo puedes enviar activos al pool del AMM a través del tipo de transacción [AMMDeposit][]. + +El AMM está diseñado de manera que el pool de activos de un AMM esté vacío si y solo si el AMM no tiene Tokens LP pendientes. Esta situación solo puede ocurrir como resultado de una transacción [AMMWithdraw][]; cuando ocurre, el AMM se elimina automáticamente. + +### Códigos de moneda de Tokens LP + +Los Tokens LP utilizan un tipo especial de código de moneda en el formato hexadecimal de 160 bits ["no estándar"](../../../references/protocol/data-types/currency-formats.md#nonstandard-currency-codes). Estos códigos tienen los primeros 8 bits `0x03`. El resto del código es un hash SHA-512, truncado a los primeros 152 bits, de los códigos de moneda de los dos activos y sus emisores. (Los activos se colocan en un "orden canónico" con el par de moneda+emisor numéricamente inferior primero). Como resultado, los Tokens LP para un par de activos dado de un AMM tienen un código de moneda predecible y consistente. + + +## Tarifas de intercambio + +Las tarifas de intercambio son una fuente de ingresos pasivos para los proveedores de liquidez, y compensan el riesgo cambiario de permitir que otros intercambien activos del pool. Las tarifas de intercambio se pagan al AMM, no directamente a los proveedores de liquidez, pero estos se benefician porque sus Tokens LP se pueden canjear por un porcentaje del pool del AMM. + +Los proveedores de liquidez pueden votar para establecer la tarifa del 0% al 1%, en incrementos de 0.001%. Los proveedores de liquidez tienen un incentivo para establecer las tarifas de intercambio a una tasa adecuada: si las tarifas son demasiado altas, los intercambios usarán libros de pedidos para obtener una mejor tasa; si las tarifas son demasiado bajas, los proveedores de liquidez no obtienen ningún beneficio por contribuir al pool. Cada AMM da a sus proveedores de liquidez el poder de votar sobre sus tarifas, en proporción a la cantidad de Tokens LP que poseen esos proveedores de liquidez. + +Para votar, un proveedor de liquidez envía una [transacción AMMVote][]. Cada vez que alguien realiza una nueva votación, el AMM recalcula su tarifa para ser un promedio de las últimas votaciones ponderadas por la cantidad de Tokens LP que poseen esos votantes. Se pueden contar hasta 8 votos de proveedores de liquidez de esta manera; si más proveedores de liquidez intentan votar, solo se contarán los 8 mejores votos (por la mayor cantidad de Tokens LP que poseen). Aunque la participación de los proveedores de liquidez en Tokens LP puede cambiar rápidamente por muchas razones (como el comercio de esos tokens usando [Ofertas](offers.md)), las tarifas de intercambio solo se recalculan cuando alguien realiza una nueva votación (incluso si esa votación no está entre los 8 mejores). + +### Slot de subasta + +A diferencia de cualquier Automated Market Maker anterior, el diseño de AMM del XRP Ledger tiene un _slot de subasta_ en la que un proveedor de liquidez puede pujar para obtener un descuento en la tarifa de intercambio durante un período de 24 horas. La oferta debe pagarse en Tokens LP, que se devuelven al AMM. No más de una cuenta puede tener el slot de subasta al mismo tiempo, pero el ofertante puede nombrar hasta 4 cuentas adicionales para también recibir el descuento. No hay una oferta mínima, pero si el slot está ocupado actualmente, debes superar al titular actual del slot para desplazarlos. Si alguien te desplaza, recuperas parte de tu oferta según el tiempo restante. Mientras mantengas un slot de subasta activo, pagas una tarifa de intercambio con descuento igual a 1/10 (una décima parte) de la tarifa de intercambio normal al realizar operaciones contra ese AMM. + +Con cualquier AMM, cuando el precio de sus activos cambia significativamente en los mercados externos, los traders pueden usar arbitraje para obtener beneficios del AMM, lo que resulta en una pérdida para los proveedores de liquidez. El mecanismo de subasta tiene como objetivo devolver más de ese valor a los proveedores de liquidez y llevar los precios del AMM más rápidamente de vuelta al equilibrio con los mercados externos. + + +## Representación en el Ledger + +En los datos de estado del ledger, un AMM consiste en múltiples [entradas de ledger](../../../references/protocol/ledger-data/ledger-entry-types/index.md): + +- Una [entrada AMM][] que describe el creador de mercado automatizado en sí mismo. + +- Una [entrada AccountRoot][] especial que emite Tokens LP del AMM, y tiene XRP del AMM (si lo tiene). + + La dirección de esta AccountRoot se elige de forma algo aleatoria cuando se crea el AMM, y es diferente si el AMM se elimina y se vuelve a crear. Esto puede prevenir que las personas financien la cuenta AMM con XRP excesivo por adelantado. + +- Las [Trust lines](../fungible-tokens/index.md) a la cuenta especial AMM para los tokens en el pool del AMM. + +Estas entradas de ledger no son propiedad de ninguna cuenta, por lo que el [requisito de reserva](../../accounts/reserves.md) no se aplica a ellas. Sin embargo, para prevenir el spam, la transacción para crear un AMM tiene un [coste de transacción](../../transactions/transaction-cost.md) especial que requiere que el remitente queme una cantidad de XRP mayor de lo habitual. + + +## Eliminación + +Un AMM se elimina cuando una [transacción AMMWithdraw][] retira todos los activos de su pool. Esto solo ocurre canjeando todos los Tokens LP pendientes del AMM. La eliminación del AMM incluye la eliminación de todas las entradas del ledger asociadas con él, como: + +- AMM +- AccountRoot +- Trust lines para los Tokens LP del AMM. Estas trust lines tendrían un saldo de 0 pero pueden tener otros detalles como el límite, establecido en un valor no predeterminado. +- Las Trust lines para los tokens que estaban en el pool del AMM. + +Si hay más de 512 trust lines enlazadas a la cuenta del AMM cuando se eliminase, el proceso de retiro tiene éxito y elimina tantas trust lines como puede, pero deja el AMM en el ledger sin activos en su pool. + +Mientras un AMM no tenga activos en su pool, cualquiera puede eliminarlo enviando una [transacción AMMDelete][]; si el número restante de líneas de confianza sigue siendo mayor que el límite, pueden ser necesarias múltiples transacciones AMMDelete para eliminar completamente el AMM. Alternativamente, cualquier persona puede realizar un [depósito especial](../../../references/protocol/transactions/types/ammdeposit.md#empty-amm-special-case) para financiar el AMM como si fuera nuevo. + +No hay reembolso o incentivo para eliminar un AMM vacío. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/index.md b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/index.md new file mode 100644 index 0000000000..778b5d1a5f --- /dev/null +++ b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/index.md @@ -0,0 +1,74 @@ +--- +html: decentralized-exchange.html +parent: tokens.html +metadata: + indexPage: true +seo: + description: El XRP Ledger contiene un exchange completamente funcional donde los usuarios pueden intercambiar tokens por XRP o entre sí. +targets: + - en +--- +# Exchange descentralizado + +El XRP Ledger posiblemente tenga el _exchange descentralizado_ más antiguo del mundo (a veces abreviado como "DEX"), operando de manera continua desde el lanzamiento del XRP Ledger en 2012. Este exchange permite a los usuarios comprar y vender [tokens](../index.md) por XRP u otros tokens, con [costes](../../transactions/fees.md) mínimos cargados a la red misma (no pagados a ninguna parte). + +**Atención**: Cualquiera puede [emitir un token](../../../tutorials/how-tos/use-tokens/issue-a-fungible-token.md) con el código de moneda o símbolo de ticker que desee y venderlo en el exchange descentralizado. Siempre realiza una debida diligencia antes de comprar un token y presta atención al emisor. De lo contrario, podrías entregar algo de valor y recibir tokens sin valor a cambio. + +## Estructura + +El exchange descentralizado del XRP Ledger consta de un número ilimitado de pares de divisas, rastreados según la demanda cuando los usuarios realizan intercambios. Un par de divisas puede consistir en XRP y un token o dos tokens diferentes; los tokens siempre se identifican por la combinación de un emisor y un código de moneda. Es posible comerciar entre dos tokens con el mismo código de moneda y diferentes emisores, o el mismo emisor y diferentes códigos de moneda. + +Como con todos los cambios en el XRP Ledger, necesitas enviar una [transacción](../../transactions/index.md) para realizar un intercambio. Un intercambio en el XRP Ledger se conoce como Oferta u [Offer](offers.md). Una Oferta es efectivamente una [_Orden límite_](https://en.wikipedia.org/wiki/Order_(exchange)#Limit_order) para comprar o vender una cantidad específica de una moneda (XRP o un token) por una cantidad específica de otra. Cuando la red ejecuta una Oferta, si hay otras Ofertas coincidentes para el mismo par de divisas, estas se consumen comenzando con la mejor tasa de cambio primero. + +Una Oferta puede llenarse completamente o parcialmente; si no se llena completamente de inmediato, se convierte en un objeto de Oferta pasiva en el ledger para la cantidad restante. Más adelante, otras Ofertas o [pagos entre divisas](../../payment-types/cross-currency-payments.md) pueden coincidir y consumir la Oferta. Debido a esto, las Ofertas pueden ejecutarse a un mejor precio que el solicitado inicialmente, o exactamente al tipo de cambio indicado más tarde (excepto por diferencias menores para tener en cuenta el redondeo). + +Las Ofertas pueden cancelarse manual o automáticamente después de ser colocadas. Para obtener detalles sobre esto y otras propiedades de las Ofertas, consulta [Ofertas](offers.md). + +Al comerciar con dos tokens, el [puente automático](autobridging.md) mejora las tasas de cambio y la liquidez al intercambiar automáticamente token por XRP y XRP por token cuando hacerlo es más barato que intercambiar directamente token por token. + +### Ejemplo de intercambio + +[{% inline-svg file="/docs/img/decentralized-exchange-example-trade.svg" /%}](/docs/img/decentralized-exchange-example-trade.svg "Diagrama: Oferta parcialmente completada para comprar un token con XRP.") + +El diagrama anterior muestra un ejemplo de intercambio en el exchange descentralizado. En este ejemplo, un trader llamado Tran coloca una Oferta para comprar 100 tokens con el código de moneda FOO emitido por un negocio ficticio llamado WayGate. (Por brevedad, "FOO.WayGate" se refiere a estos tokens.) Tran especifica que está dispuesto a gastar hasta 1000 XRP en total. Cuando la transacción de Tran es procesada, ocurren las siguientes cosas: + +1. La red calcula la tasa de cambio de la Oferta de Tran, dividiendo la cantidad a comprar por la cantidad a pagar. +0. La red encuentra el libro de órdenes para el reverso de la Oferta de Tran: en este caso, eso significa el libro de órdenes para vender FOO.WayGate y comprar XRP. Este libro de órdenes ya tiene varias Ofertas existentes de otros traders para diferentes cantidades y tasas de cambio. +0. La Oferta de Tran "consume" Ofertas coincidentes, comenzando con la mejor tasa de cambio y trabajando hacia abajo, hasta que la Oferta de Tran se haya llenado por completo o no haya más Ofertas cuya tasa de cambio sea igual o mejor que la tasa especificada en la Oferta de Tran. En este ejemplo, solo hay disponibles 22 FOO.WayGate a la tasa solicitada o mejor. Las Ofertas consumidas se eliminan del libro de órdenes. +0. Tran recibe la cantidad de FOO.WayGate que el intercambio pudo adquirir, de los varios traders que previamente habían colocado órdenes para venderlo. Estos tokens van a la [trust line](../fungible-tokens/index.md) de Tran a WayGate para FOO. (Si Tran no tenía esa trust line previamente, se crea automáticamente una). +0. A cambio, esos traders reciben XRP de Tran de acuerdo con sus tasas de cambio declaradas. +0. La red calcula el resto de la Oferta de Tran: dado que la Oferta original era para comprar 100 FOO.WayGate y hasta ahora Tran ha recibido 22, el resto es de 78 FOO.WayGate. Usando la tasa de cambio original, eso significa que el resto de la Oferta de Tran ahora es comprar 78 FOO.WayGate por 780 XRP. +0. El "resto" resultante se coloca en el libro de órdenes para intercambios en la misma dirección que la de Tran: vendiendo XRP y comprando FOO.WayGate. + +Las transacciones posteriores, incluidas aquellas ejecutadas inmediatamente después de las de Tran en el _mismo_ ledger, utilizan los libros de órdenes actualizados para sus intercambios, por lo que pueden consumir parte o toda la Oferta de Tran hasta que se llene por completo o Tran la cancele. + +**Nota**: El orden canónico en el que las transacciones se ejecutan cuando se cierra y valida un ledger no es el mismo que el orden en el que se enviaron esas transacciones. Cuando varias transacciones afectan al mismo libro de órdenes en el mismo ledger, los resultados finales de esas transacciones pueden ser muy diferentes a los resultados tentativos calculados en el momento del envío de la transacción. Para obtener más detalles sobre cuándo los resultados de las transacciones son o no finales, consulta [Finalidad de resultados](../../transactions/finality-of-results/index.md). + + +## Limitaciones + +El exchange descentralizado está diseñado con las siguientes limitaciones: + +Debido a que los intercambios se ejecutan solo cada vez que se cierra un nuevo ledger (aproximadamente cada 3-5 segundos), el XRP Ledger no es adecuado para el [trading de alta frecuencia](https://en.wikipedia.org/wiki/High-frequency_trading). El orden en el que las transacciones se ejecutan dentro de un ledger está diseñado para ser impredecible, para desalentar el [front-running](https://en.wikipedia.org/wiki/Front_running). + +El XRP Ledger no representa nativamente conceptos como órdenes de mercado, órdenes de stop o trading con apalancamiento. Algunos de estos pueden ser posibles con el uso creativo de tokens personalizados y propiedades de Oferta. + +Como sistema descentralizado, el XRP Ledger no tiene información sobre las personas y organizaciones reales detrás de las [cuentas](../../accounts/index.md) involucradas en el trading. El Ledger en sí no puede implementar restricciones sobre quién puede o no puede participar en el trading, y los usuarios y emisores deben tener cuidado de seguir todas las leyes relevantes para regular el trading de tokens que representan varios tipos de activos subyacentes. Funciones como [congelamientos](../fungible-tokens/freezes.md) y [trust lines autorizadas](../fungible-tokens/authorized-trust-lines.md) están destinadas a ayudar a los emisores a cumplir con las leyes y regulaciones relevantes. + +## Ver también + +- **Conceptos:** + - Ver [Ofetas](offers.md) para obtener detalles sobre cómo funcionan los intercambios en el XRP Ledger. + - Ver [Tokens](../index.md) para obtener una descripción general de cómo se pueden representar diversos tipos de valor en el XRP Ledger. +- **Referencias:** + - [método account_offers][] para buscar Ofertas creadas por una cuenta + - [método book_offers][] para buscar Ofertas de compra o venta según un par de divisas dado + - [transacción OfferCreate][] para crear una Oferta nueva o reemplazar una Oferta existente + - [transacción OfferCancel][] para cancelar una Oferta existente + - [objeto Offer][] para la estructura de datos de las Ofertas pasivas en el ledger + - [objeto DirectoryNode][] para la estructura de datos que sigue todas las Ofertas para un par de divisas y tarifa de intercambio dados. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} + + +{% child-pages /%} diff --git a/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/offers.md b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/offers.md new file mode 100644 index 0000000000..3b00dfb497 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/offers.md @@ -0,0 +1,114 @@ +--- +html: offers.html +parent: decentralized-exchange.html +seo: + description: Las ofertas son la forma de órdenes de comercio de divisas del XRP Ledger. Comprende su ciclo de vida y propiedades. +labels: + - Exchange Descentralizado +--- +# Ofertas + +En el [exchange descentralizado](index.md) del XRP Ledger, las órdenes de intercambio se llaman "Ofertas". Las Ofertas pueden intercambiar XRP con [tokens](../index.md), o tokens por otros tokens, incluyendo tokens con el mismo código de moneda pero diferentes emisores. (Los tokens con el mismo código pero diferentes emisores también a veces pueden intercambiarse a través de [rippling](../fungible-tokens/rippling.md).) + +- Para crear una Oferta, envía una [transacción OfferCreate][]. +- Las Ofertas que no se completan totalmente inmediatamente se convierten en [objetos Offer](../../../references/protocol/ledger-data/ledger-entry-types/offer.md) en los datos del ledger. Ofertas posteriores o Pagos pueden consumir el objeto Oferta desde el ledger. +- [Pagos entre divisas](../../payment-types/cross-currency-payments.md) consumen Ofertas para proveer liquidez, nunca crean objetos de Oferta en el ledger. + +## Ciclo de vida para una Oferta + +Una [transacción OfferCreate][] es una instrucción para realizar un intercambio, ya sea entre dos tokens, o un token y XRP. Cada transacción de este tipo contiene una cantidad de compra (`TakerPays`) y una cantidad de venta (`TakerGets`). Cuando se procesa la transacción, consume automáticamente Ofertas coincidentes o cruzadas en la medida de lo posible. Si eso no llena completamente la nueva Oferta, entonces el resto se convierte en un objeto de Oferta en el ledger. + +El objeto de Oferta espera en el ledger hasta que otras Ofertas o pagos entre divisas lo consumen completamente. La cuenta que colocó la Oferta se llama el _propietario_ de la Oferta. Puedes cancelar tus propias Ofertas en cualquier momento, usando la [transacción OfferCancel][] dedicada, o como opción de la [transacción OfferCreate][]. + +Mientras tengas una Oferta en el ledger, se aparta parte de tu XRP hacia la [reserva de propietario](../../accounts/reserves.md). Cuando se elimina la Oferta, por cualquier motivo, ese XRP se libera nuevamente. + +### Variaciones + +- **Compra vs. Venta**: Por defecto, las Ofertas son Ofertas de "compra" y se consideran completamente llenas cuando has adquirido la cantidad total de "compra" (`TakerPays`). (Puedes gastar menos de lo esperado mientras recibes la cantidad especificada.) En contraste, una Oferta de "venta" solo se considera completamente llena cuando has gastado la cantidad total de "venta" (`TakerGets`). (Puedes recibir más de lo esperado mientras gastas la cantidad especificada.) Esto solo es relevante si la Oferta se ejecuta _inicialmente_ a un tipo de cambio mejor que el solicitado: después de que la Oferta se coloca en el ledger, solo se ejecuta _exactamente_ al tipo de cambio solicitado. +- Una Oferta **Inmediata o Cancelar** no se coloca en el ledger, por lo que solo intercambia hasta la cantidad que coincide con Ofertas existentes en el momento en que se procesa la transacción. +- Una Oferta **Completar o Cancelar** no se coloca en el ledger, _y_ se cancela si la cantidad total no se completa cuando se ejecuta inicialmente. Esto es similar a "Inmediata o Cancelar", excepto que _no puede_ completarse parcialmente. +- Una Oferta **Pasiva** no consume Ofertas coincidentes que tengan el mismo tipo de cambio (en la otra dirección), y en su lugar se coloca directamente en el ledger. Puedes usar esto para crear un peg exacto entre dos activos. Las Ofertas Pasivas aún consumen otras Ofertas que tienen un tipo de cambio _mejor_ en la otra dirección. + + +### Requisitos de financiación + +Cuando intentas realizar una Oferta, la transacción se rechaza como "no financiada" si no tienes al menos parte del activo que la operación vendería. Más específicamente: + +**Para vender un token,** debes: + +- Tener una cantidad positiva de ese token, _o_ +- Ser el emisor del token. + +Sin embargo, no necesitas tener la cantidad completa especificada en la Oferta. Colocar una Oferta no bloquea tus fondos, por lo que puedes colocar múltiples Ofertas para vender los mismos tokens (o XRP), o colocar una Oferta y esperar obtener suficientes tokens o XRP para financiarla completamente más adelante. + +**Para vender XRP**, debes tener suficiente XRP para cumplir con todos los [requisitos de reserva](../../accounts/reserves.md), incluida la reserva para que el objeto de Oferta se coloque en el ledger y para la trust line para mantener el token que estás comprando. Mientras tengas XRP restante después de apartar la cantidad de reserva, puedes colocar la Oferta. + +Cuando otra Oferta coincide con la tuya, ambas Ofertas se ejecutan en la medida en que los fondos de sus propietarios lo permitan en ese momento. Si hay Ofertas coincidentes y te quedas sin fondos antes de que la tuya se finalice por completo, el resto de tu Oferta se cancela. Una Oferta no puede hacer que tu saldo de un token sea negativo, a menos que seas el emisor de ese token. (Si eres el emisor, puedes usar Ofertas para emitir nuevos tokens hasta el monto total especificado en tus Ofertas; los tokens que emites se representan como saldos negativos desde tu perspectiva.) + +Si colocas una Oferta que cruza alguna de tus propias Ofertas que existen en el ledger, las Ofertas antiguas cruzadas se cancelan automáticamente independientemente de las cantidades involucradas. + +Es posible que una Oferta se vuelva temporal o permanentemente _no financiada_ en los siguientes casos: + +- Si el propietario ya no tiene ningún activo de venta. + - La Oferta se vuelve financiada nuevamente cuando el propietario obtiene más de ese activo. +- Si el activo en venta es un token en una [trust line congelada](../fungible-tokens/freezes.md). + - La Oferta se vuelve financiada nuevamente cuando la trust line ya no está congelada. +- Si la Oferta necesita crear una nueva trust line, pero el dueño no tiene suficiente XRP para el aumento de la [reserva](../../accounts/reserves.md). (Ver [Ofertas y confianza](#offers-and-trust).) + - La oferta vuelve a estar financiada cuando el propietario obtiene más XRP, o los requisitos de reserva disminuyen. +- Si la Oferta ha expirado. (Ver [Expiración de ofertas](#offer-expiration).) + +Una Oferta no financiada permanece en el ledger hasta que una transacción la elimine. Las formas en que una Oferta puede ser eliminada del ledger incluyen: + +- Una Oferta coincidente o [Pago entre divisas](../../payment-types/cross-currency-payments.md) que consuman completamente la Oferta. +- El propietario cancela explicitamente la Oferta. +- El propietario cancela implícitamente la Oferta enviando una nueva Oferta que la cruza. +- La Oferta es encontrada sin financiar o expirada durante el procesamiento de la transacción. Normalmente esto significa que otra Oferta intentó consumirla y no pudo hacerlo. + - Esto incluye casos donde la cantidad restante puede ser pagada mediante la Oferta redondeada a cero. + +### Seguimiento de ofertas no financiadas + +Seguir el estado de financiación de todas las Ofertas puede ser computacionalmente exigente. En particular, las direcciones que están operando activamente pueden tener un gran número de Ofertas abiertas. Un solo balance puede afectar el estado de financiación de muchas Ofertas. Debido a esto, el XRP Ledger no encuentra y elimina _proactivamente_ Ofertas no financiadas o expiradas. + +Una aplicación de cliente puede seguir localmente el estado de financiación de las Ofertas. Para hacerlo, primero recupera un libro de órdenes utilizando el [método book_offers][] y verifica el campo `taker_gets_funded` de las Ofertas. Luego, [suscríbete](../../../references/http-websocket-apis/public-api-methods/subscription-methods/subscribe.md) al flujo de `transactions` y observa los metadatos de transacción para ver qué Ofertas se modifican. + + +## Ofertas y confianza + +Los valores límite de las [trust lines](../fungible-tokens/index.md) no afectan a las Ofertas. En otras palabras, puedes usar una Oferta para adquirir más de la cantidad máxima en la que confías en un emisor. + +Sin embargo, mantener tokens aún requiere una trust line con el emisor. Cuando una Oferta se consume, automáticamente crea cualquier trust line necesaria, estableciendo sus límites en 0. Debido a que [las trust lines aumentan la reserva que una cuenta debe mantener](../../accounts/reserves.md), cualquier Oferta que requiera una nueva trust line también requiere que la dirección tenga suficiente XRP para cumplir con la reserva de esa trust line. + +Los límites de la trust line te protegen de recibir más de un token como pago de lo que deseas. Las Ofertas pueden superar esos límites porque son una declaración explícita de cuánto del token deseas. + + +## Preferencia de Oferta + +Las Ofertas existentes se agrupan por tipo de cambio, que se mide como la relación entre `TakerGets` y `TakerPays`. Las Ofertas con un tipo de cambio más alto se toman preferentemente. (Es decir, la persona que acepta la oferta recibe tanto como sea posible por la cantidad de moneda que paga). Las Ofertas con el mismo tipo de cambio se toman en función de cuál se colocó primero. + +Cuando las Ofertas se ejecutan en el mismo bloque del ledger, el orden en que se ejecutan se determina por el [orden canónico](https://github.com/XRPLF/rippled/blob/release/src/ripple/app/misc/CanonicalTXSet.cpp "Código fuente: Ordenación de transacciones") en el que las transacciones fueron [aplicadas en el ledger](https://github.com/XRPLF/rippled/blob/5425a90f160711e46b2c1f1c93d68e5941e4bfb6/src/ripple/app/consensus/LedgerConsensus.cpp#L1435-L1538 "Código fuente: Aplicando transacciones"). Este comportamiento está diseñado para ser determinista, eficiente y difícil de manipular. + + +## Caducidad de la oferta + +Cuando colocas una Oferta, puedes opcionalmente añadirle un tiempo de caducidad. Por defecto, las Ofertas no caducan. No puedes crear una nueva Oferta que ya esté caducada. + +Los tiempos de caducidad se especifican hasta el segundo, pero el momento exacto en el que una Oferta caduca en el mundo real es menos preciso. Una Oferta caduca si tiene una hora de caducidad que es _anterior o igual al_ momento de cierre del ledger anterior. De lo contrario, la Oferta aún puede ejecutarse, incluso si el momento real es posterior a la caducidad de la Oferta. En otras palabras, una Oferta sigue "activa" si su hora de caducidad es posterior al momento de cierre del último ledger validado, independientemente de lo que diga tu reloj. + +Esto es una consecuencia de cómo la red alcanza un acuerdo. Para que toda la red peer-to-peer alcance un consenso, todos los servidores deben estar de acuerdo en qué Ofertas han caducado al ejecutar transacciones. Los servidores individuales pueden tener pequeñas diferencias en su configuración interna de reloj, por lo que podrían no llegar a las mismas conclusiones sobre qué Ofertas han caducado si cada uno usara el tiempo "actual". El momento de cierre de un ledger no se conoce hasta después de que las transacciones en ese ledger se hayan ejecutado, por lo que los servidores utilizan el momento oficial de cierre del ledger _anterior_ en su lugar. Los [tiempos de cierre de los ledgers se redondean](../../ledgers/ledger-close-times.md), lo que aumenta aún más la diferencia potencial entre el tiempo real y el tiempo utilizado para determinar si una Oferta ha caducado. + +**Nota:** Las Ofertas caducadas permanecen en los datos del ledger hasta que una transacción las elimine. Hasta entonces, pueden continuar apareciendo en los datos recuperados a través de la API (por ejemplo, utilizando el [método ledger_entry][]). Las transacciones eliminan automáticamente cualquier Oferta caducada y no financiada que encuentren, generalmente mientras ejecutan Ofertas o pagos de monedas cruzadas que las hubieran igualado o cancelado. La reserva del propietario asociada con una Oferta solo vuelve a estar disponible cuando la Oferta se elimina realmente. + + +## Ver también + +- **Conceptos:** + - [Tokens](../index.md) + - [Paths](../fungible-tokens/paths.md) +- **Referencias:** + - [método account_offers][] + - [método book_offers][] + - [transacción OfferCreate][] + - [transacción OfferCancel][] + - [Objeto Offer](../../../references/protocol/ledger-data/ledger-entry-types/offer.md) + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/ticksize.md b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/ticksize.md new file mode 100644 index 0000000000..f993936a12 --- /dev/null +++ b/@i18n/es-ES/docs/concepts/tokens/decentralized-exchange/ticksize.md @@ -0,0 +1,28 @@ +--- +html: ticksize.html +parent: decentralized-exchange.html +seo: + description: Los emisores pueden establecer tamaños de ticks personalizados para las monedas para reducir la rotación de libros de pedidos por diferencias minúsculas en los tipos de cambio. +labels: + - Exchange Descentralizado + - Tokens +--- +# Tamaño de Tick + +Cuando se coloca una Oferta en un libro de órdenes, su tasa de cambio se trunca en base a los valores de `TickSize` establecidos por los emisores de las monedas involucradas en la Oferta. Cuando se negocia XRP y un token, se aplica el `TickSize` del emisor del token. Cuando se negocian dos tokens, la Oferta utiliza el valor de `TickSize` más pequeño (es decir, el que tiene menos dígitos significativos). Si ninguno de los tokens tiene un `TickSize` establecido, se aplica el comportamiento predeterminado. + +El valor de `TickSize` trunca la cantidad de _dígitos significativos_ en la tasa de cambio de una oferta cuando se coloca en un libro de órdenes. Los emisores pueden establecer `TickSize` como un número entero de `3` a `15` usando una [transacción AccountSet][]. La tasa de cambio se representa como dígitos significativos y un exponente; el `TickSize` no afecta al exponente. Esto permite que el XRP Ledger represente tasas de cambio entre activos que varían considerablemente en valor (por ejemplo, una moneda altamente inflada en comparación con un activo raro). Cuanto menor sea el `TickSize` que establezca un emisor, mayor será el incremento que los traders deben ofrecer para considerarse una tasa de cambio más alta que las Ofertas existentes. + +El `TickSize` no afecta a la parte de una Oferta que se puede ejecutar inmediatamente. (Por esa razón, las transacciones OfferCreate con `tfImmediateOrCancel` no se ven afectadas por los valores de `TickSize`.) Si la Oferta no puede ejecutarse completamente, el motor de procesamiento de transacciones calcula la tasa de cambio y la trunca en base a `TickSize`. Luego, el motor redondea la cantidad restante de la Oferta desde el lado "menos importante" para que coincida con la tasa de cambio truncada. Para una transacción OfferCreate predeterminada (una Oferta de "compra"), la cantidad de `TakerPays` (la cantidad que se compra) se redondea. Si se activa la bandera `tfSell` (una Oferta de "venta"), la cantidad de `TakerGets` (la cantidad que se vende) se redondea. + +Cuando un emisor habilita, deshabilita o cambia el `TickSize`, las Ofertas que se colocaron bajo la configuración anterior no se ven afectadas. + +## Ver también + +- [Dev Blog: Introducción a la enmienda TickSize](https://xrpl.org/blog/2017/ticksize-voting.html#ticksize-amendment-overview) +- **Referencias:** + - [transacción AccountSet][] + - [método book_offers][] + - [transacción OfferCreate][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/es-ES/docs/introduction/crypto-wallets.md b/@i18n/es-ES/docs/introduction/crypto-wallets.md new file mode 100644 index 0000000000..0a0706f434 --- /dev/null +++ b/@i18n/es-ES/docs/introduction/crypto-wallets.md @@ -0,0 +1,49 @@ +--- +html: crypto-wallets.html +parent: intro-to-xrpl.html +seo: + description: Las carteras brindan una forma conveniente de administrar tu XRP en el XRP Ledger. +labels: + - Blockchain +--- +# Carteras cripto + +Las carteras cripto brindan una forma de administrar tu cuenta y tus fondos en el XRP Ledger. Hay muchas carteras para elegir. Al final, elegir la cartera adecuada se reduce a tus necesidades y a tus gustos al trabajar con XRP. + + +## Carteras con custodia vs carteras sin custodia + +Un factor importante cuando se elige una cartera es si se desea que sea una cartera con custodia o sin custodia. + +Una cartera con custodia significa que un tercero tiene tus fondos, normalmente en una cuenta que ellos manejan en el XRP Ledger. Una cartera con custodia puede considerarse como un banco, donde confias que otra entidad mantenga tu dinero seguro. Muchos exchanges centralizados ofrecen carteras con custodia, por lo que cuando creas una cuenta con ellos y usas su app, técnicamente no tienes una cuenta en el libro contable (ledger). + +Para los pagos del día a día, esto puede ser preferible, ya que este tipo de carteras son fáciles de usar: si te olvidas de tu contraseña, puedes resetearla. Además, si no tienes una cuenta propia en el XRP Ledger, el requisito de tener una reserva en la cuenta no te aplica. El custodio actua como intermediario ante cualquier problema que encuentres en el XRP Ledger, y puede ofrecerte asistencia si no estás seguro de como hacer algo. + +![Carteras con custodia vs carteras sin custodia](/docs/img/introduction15-custodial-non-custodial.png) + +Una cartera sin custodia, como [XUMM](https://xumm.app/), es aquella donde tienes las claves secretas (secret keys) de tu cuenta. Esto significa que eres el último reponsable de la administración de la seguridad de tu cuenta. + +**Atención:** Si pierdes tus claves, perderás el acceso a tu cuenta del XRP Ledger y no hay opciones de recupereación. + +Las carteras sin custodia te permiten tener más libertad. Como estás interactuando directamente con el XRP LEdger, puedes manejar cualquier tipo de transacción que tu quieras sin que nadie restrinja tus opciones. Si el libro contable (ledger) lo permite, lo puedes hacer. Las carteras sin custodia no requieren confiar tu dinero a una institución, lo que permite alejarte de los factores del mercado fuera de tu control. + +Tanto los usuarios de carteras con custodia como los usuarios de carteras sin custodia deben protegerse de usuarios malintencionados que podrían intentar robar tus fondos. Con una cartera con custodia, debes administrar tu nombre de usuario y contraseña en la app o en el sitio web; en una cartera sin custodia, tienes que administrar las claves secretas (secrect keys) de tu cuenta en el libro contable (ledger). En ambos casos, las prácticas de seguridad propias del proveedor de la cartera también son importantes para protegerte de vulnerabilidades como ataques a la cadena de suministro, donde un atacante carga código malicioso en la cartera a través de actualizaciones o dependencias. Sin embargo, las carteras con custodia pueden ser un objetivo mayor para los atacantes, ya que tienen acceso inmediato a los fondos de múltiples usuarios. + + +## Carteras de software vs Carteras de hardware + +Otro factor decisivo a la hora de elegir una cartera es elegir entre una cartera de hardware o de software. + +Las carteras de hardware son dispositivos físicos que almacenan tus claves privadas/secretas. El beneficio principal de usar carteras de hardware es que puedes proteger tu información desconectándola de Internet cuando no se esté usando; Las carteras de hardware aíslan totalmente sus claves de ordenadores y teléfonos inteligentes más faciles de hackear. + +![Carteras de Hardware vs. Software](/docs/img/introduction16-hardware-software.png) + +Las carteras de software por el otro lado, son completamente digitales. Mientras esto las hace mucho más fáciles, también las convierte en el método menos seguro de los dos, pero generalmente vienen con funciones adicionales para mejorar la experiencia. Como última instancia, la decisión entre las dos dependerá de tu nivel de comidad y de lo importante que sea para ti la facilidad de uso. + + +## Crear tu propia cartera + +El XRP Ledger es un proyecto de código abierto con librerías de cliente y métodos API disponibles públicamente. Si bien técnicamente se puede interactuar con el ledger utilizando herramientas HTTP/WebSocket, no es práctico para el uso del día a día. Puedes crear tu propia cartera para interactuar con el ledger, pero necesitarás entender exáctamente cómo funcionan las cuentas, transacciones y el ledger juntas antes de comprometerte con esta opción. + + +Siguiente: [Transacciones y peticiones](transactions-and-requests.md) diff --git a/@i18n/es-ES/docs/introduction/index.md b/@i18n/es-ES/docs/introduction/index.md new file mode 100644 index 0000000000..0bd34dd9e2 --- /dev/null +++ b/@i18n/es-ES/docs/introduction/index.md @@ -0,0 +1,12 @@ +--- +html: introduction.html +parent: docs.html +metadata: + indexPage: true +top_nav_grouping: Article Types +--- +# Introducción + +El XRP Ledger es una blockchain que permanentemente registra transacciones digitales de tokens entre cuentas. Las secciones de abajo amplian los conceptos introducidos en esa frase. + +{% child-pages /%} diff --git a/@i18n/es-ES/docs/introduction/software-ecosystem.md b/@i18n/es-ES/docs/introduction/software-ecosystem.md new file mode 100644 index 0000000000..dc5db67d64 --- /dev/null +++ b/@i18n/es-ES/docs/introduction/software-ecosystem.md @@ -0,0 +1,66 @@ +--- +html: software-ecosystem.html +parent: introduction.html +seo: + description: Obtén una descripción general de qué es el software XRP Ledger disponible y como funciona en conjunto. +labels: + - Servidor central +--- +# Ecosistema software + +El XRP Ledger alberga un ecosistema profundo de varias capas de proyectos de software que impulsan y permiten el Internet del Valor. Es imposible listar cada proyecto, herramienta, y negocio que interactua con el XRP Ledger, asi que esta página solo lista algunas categorías y destaca algunos proyectos centrales que están documentados en este sitio web. +![El ecosistema XRPL](/docs/img/ecosystem-apps-and-services.svg) + +## Niveles de stack + +- [_Servidores Principales](#servidores-principales) forman la base del XRP Ledger, una red peer-to-peer que transmite y procesa transacciones en todo momento. + +- [_Librerías de cliente_](#librerías-cliente) existen en software de alto nivel, donde se importan directamente al código del programa, y contiene métodos para acceder al XRP Ledger. + +- [_Middleware_](#middleware) proporciona acceso indirecto a los datos del XRP Ledger. Las aplicaciones en esta capa suelen tener su propio almacenamiento y procesamiento de datos. + +- [_Apps y servicios_](#apps-y-servicios) proporcionan interación con el XRP Ledger a nivel usuario, o proporcionan una base para aplicaciones y servicios de aun más alto nivel. + + +### Servidores principales + +La red peer-to-peer en el corazón del XRP Ledger requiere de un servidor altamente confiable y eficiente para hacer cumplir las reglas de consenso y el procesamiento de las transacciones. La Fundación XRP Ledger publica una implementación de referencia de este software de sevidor, llamada [**`rippled`**](../concepts/networks-and-servers/index.md) (pronunciado en inglés como "ripple-dee"). El servidor está disponible bajo [una licencia permisiva de código abierto](https://github.com/XRPLF/rippled/blob/develop/LICENSE.md), por lo que cualquiera puede inspeccionar y modificar su propia instancia del servidor, y volver a publicar con pocas restricciones. + +![Servidores principales](/docs/img/ecosystem-peer-to-peer.svg) + +Cada servidor central sincroniza con la misma red (a no ser que esté configurado para seguir una [red de test](../concepts/networks-and-servers/parallel-networks.md)) y tiene acceso a todas las comunicaciones a través de la red. Cada servidor de la red guarda una copia completa de lod datos de estado para todo el XRP Ledger, junto con transacciones recientes y un registro de los cambios que esas transacciones han realizado, y cada servidor procesa cada transacción independientemente mientras verifican que el resultado coincide con el resto de la red. Los servidores pueden ser configurados para mantener más [histórico del ledger](../concepts/networks-and-servers/ledger-history.md) y para participar en el proceso de consenso como un [validador](../concepts/networks-and-servers/rippled-server-modes.md#validators). + +Los servidores Core exponen [APIs HTTP / WebSocket](../references/http-websocket-apis/index.md) para que los usuarios busquen datos, administren el servidor, y envíen transacciones. Algunos servidores también ofrecen APIs HTTP / WebSocket pero no conectan directamente con la red peer-to-peer y no procesan transacciones ni participan en el consenso. Estos servidores, como servidores `rippled` ejecutan en modo Reporting y servidores Clio, que dependen de un servidor central en modo P2P para procesar las transacciones. + + +### Librerías cliente + +Las librerias simplifican parte del trabajo básico de acceder al XRP Ledger, normalmente a través de las APIs HTTP / WebSocket. Convierten los datos en formas que son más familiares y convenientes para varios lenguajes de programación e incluyen implementaiones de operaciones básicas. + +![Librerías cliente](/docs/img/ecosystem-client-libraries.svg) + +Una característica prinicpal de la mayoría de las librerías cliente es la firma de transacciones localmente, así los usuarios no tienen que enviar sus claves privadas a través de la red. + +Muchos servicios middleware utilizan librerías cliente internamente. + +Ver [Librerías Cliente](../references/client-libraries.md) para más información sobre las librerías cliente disponibles actualmente. + + +### Middleware + +Los servicios middleware son programas que consumen las APIs del XRP Ledger por un lado y proporcionan sus propias APIs por el otro. Porporcionan una capa de abstracción para facilitar la creación de aplicaciones a mayor nivel proporcionando funcionalidades comunes como servicios. + +![Middleware](/docs/img/ecosystem-middleware.svg) + +A diferencia de las librerías cliente, en donde se crean instancias nuevas y se cierran con el programa que las importa, los servicios middleware generalmente permanecen ejecutándose indefinidamente y pueden tener sus propias bases de datos (bases de datos relacionales SQL o de otro tipo) y archivos de configuración. Algunos están disponibles como servicios en la nube con varios precios o limitaciones de uso. + + +### Apps y servicios + +En lo alto del stack es donde suceden las cosas realmente interesantes. Las apps y servicios ofrecen una forma para que usuarios y dispositivos se conecten al XRP Ledger. Los servicios como los exchanges privados, los acuñadores de tokens, marketplaces, interfaces al exchanges descentralizado, y carteras brindan interfaces de usuario para comprar, vender y comerciar varios activos incluyendo XRP y tokens de todo tipo. Existen muchas otras posibilidades, incluyendo servicios adicionales en capas superiores. + +![Apps y servicios](/docs/img/ecosystem-apps-and-services.svg) + +Ver [Casos de uso](../use-cases/index.md) para más ejemplos que pueden ser construidos en o encima de esta capa. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} \ No newline at end of file diff --git a/@i18n/es-ES/docs/introduction/transactions-and-requests.md b/@i18n/es-ES/docs/introduction/transactions-and-requests.md new file mode 100644 index 0000000000..8329151ae2 --- /dev/null +++ b/@i18n/es-ES/docs/introduction/transactions-and-requests.md @@ -0,0 +1,115 @@ +--- +html: txn-and-requests.html +parent: intro-to-xrpl.html +seo: + description: Todas las interacciones con el ledger son transacciones o solicitudes. +labels: + - Blockchain +--- + +## Transacciones y solicitudes + +La mayoría de interacciones con el XRP Ledger implican enviar una transacción que realiza cambios en el ledger o enviar una solicitud de información al ledger. También puedes subscribirte para monitorear constantemente notificaciones de interés. + +## ¿Cómo funcionan las transacciones? + +Utiliza las transacciones para realizar cambios en el ledger, como transferir XRP y otros tokens entre cuentas; acuñar (minting) y quemar (burn) NFTs; y crear, aceptar y cancelar ofertas. Para ejecutar una transacción, envías un comando al XRP Ledger y esperas la confirmación de que la transacción se ha completado. El formato de sintaxis del comando es el mismo para cada transacción. + +- Siempre debes proporcionar el _TransactionType_ y la dirección pública de la _Account_ que realiza la transacción. + +- Dos campos obligatorios son la _Fee_ (comisión) de la transacción y el siguiente número de la _Sequence_ (secuencia) para las transacciones de la cuenta. Estos campos se pueden completar automáticamente. + +- Las transacciones también pueden tener campos obligatorios específicos del tipo de transacción. Por ejemplo, una transacción _Payment_ requiere un valor (cantidad) _Amount_ (en _drops_, o millonésimas de un XRP) y una dirección pública _Destination_ (destino) donde los fondos son acreditados. + +Aquí hay un ejemplo de transacción en formato JSON. Esta transacción transfiere 1 XRP de la cuenta _rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn_ a la cuenta destino _ra5nK24KXen9AHvsdFTKHSANinZseWnPcX_. + +```json +{ + "TransactionType": "Payment", + "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + "Amount": "1000000", + "Destination": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX" +} +``` + +Hay campos opcionales disponibles para todas las transacciones, con campos adicionales disponibles para transacciones específicas. Puedes incluir tantos campos opcionales como necsites, pero no es necesario incluir todos los campos en cada transacción. + +Puedes enviar la transacción al ledger como un comando de JavaScript, Python, línea de comandos, o cualquier servicio compatible. Los servidores rippled proponen las transacciones al XRPL. + +![Transacciones propuestas](/docs/img/introduction17-gather-txns.png) + +Cuando el 80% de los validadores aprueban un conjunto actual de transacciones propuestas, se registran como parte del ledger permanente. Los servidores rippled devuelven los resultados de la transacción que enviaste. + +Para más información sobre Transacciones, ver [Transacciones](../concepts/transactions/index.md). + +## ¿Cómo funcionan las solicitudes? + +Las solicitudes son utilizadas para obtener información del ledger, pero no realizan cambios en el ledger. La información está disponible para cualquiera que quiera consultarla, por lo que no hay necesidad de iniciar sesión con la información de tu cuenta. + +Los campos que envías pueden variar según el tipo de información que solicitas. Normalmente tienen varios campos opcionales, pero solo unos pocos son campos obligatorios. + +Cuando envías tu solicitud, puede ser procesada por un servidor rippled o por un servidor Clio, un servidor dedicado para responder solicitudes. + +![Servidor Clio](/docs/img/introduction19-clio.png) + +Los servidores Clio quitan parte de la carga a los servidores rippled en el XRPL para mejorar la velocidad de procesamiento y la confiabilidad. + +Esto es un ejemplo de solicitud en formato JSON. Esta solicitud obtiene la información de la cuenta actual para el número de cuenta que facilitas. + +```json +{ + "command": "account_info", + "account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn" +} +``` + +La solicitud devuelve una gran cantidad de información. Aquí hay un ejemplo de respuesta para la información de la cuenta solicitada en formato JSON. + +```json +{ + "result": { + "account_data": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "999999999960", + "Flags": 8388608, + "LedgerEntryType": "AccountRoot", + "OwnerCount": 0, + "PreviousTxnID": "4294BEBE5B569A18C0A2702387C9B1E7146DC3A5850C1E87204951C6FDAA4C42", + "PreviousTxnLgrSeq": 3, + "Sequence": 6, + "index": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F" + }, + "ledger_current_index": 4, + "queue_data": { + "auth_change_queued": true, + "highest_sequence": 10, + "lowest_sequence": 6, + "max_spend_drops_total": "500", + "transactions": [ + { + "auth_change": false, + "fee": "100", + "fee_level": "2560", + "max_spend_drops": "100", + "seq": 6 + }, + ... (recortado por la longitud) ... + { + "LastLedgerSequence": 10, + "auth_change": true, + "fee": "100", + "fee_level": "2560", + "max_spend_drops": "100", + "seq": 10 + } + ], + "txn_count": 5 + }, + "status": "success", + "validated": false + } +} +``` +Para obtener información sobre los campos de un registro de información de una cuenta, ver [Cuentas](../concepts/accounts/index.md). + +Siguiente: [Ecosistema de software](software-ecosystem.md) diff --git a/@i18n/es-ES/docs/introduction/what-is-the-xrp-ledger.md b/@i18n/es-ES/docs/introduction/what-is-the-xrp-ledger.md new file mode 100644 index 0000000000..b676a930fa --- /dev/null +++ b/@i18n/es-ES/docs/introduction/what-is-the-xrp-ledger.md @@ -0,0 +1,70 @@ +--- +html: what-is-the-xrp-ledger.html +parent: introduction.html +seo: + description: Aprende sobre la blockchain XRP Ledger (XRPL). +labels: + - Blockchain +--- +# ¿Qué es el XRP Ledger? + +El XRP Ledger es una blockchain descentralizada que usa su propia moneda digital para procesar y registrar transacciones financieras. + + +## ¿Qué es una blockchain? + +Una blockchain es una lista de registros en continuo creciemiento. La blockchain comienza con un bloque de datos. + +![Un bloque de datos](/docs/img/introduction2-data-block.png) + +Un grupo de nodos validadores confiables llega a un consenso de que los datos son válidos. + +![Nodos validadores](/docs/img/introduction3-validators.png) + +El bloque se identifica de forma única con un número hash criptográfico, muy elaborado, complejo, generado por un ordenador, que tiene 64 caracteres hexadecimales. + +![Hash criptográfico](/docs/img/introduction4-hash.png) + +El bloque también se identifica con una marca de tiempo (timestamp) con su hora de creación. + +![Timestamp](/docs/img/introduction5-time-stamp.png) + +Cada nodo validador obtiene su propia copia del bloque de datos. No existe una única autoridad central. Todas las copias son igualmente válidas. + +![Validadores con copias válidas](/docs/img/introduction6-valid-copies.png) + +Cada bloque contiene un puntero hash como enlace al bloque anterior. También tiene una marca de tiempo (timestamp), nuevos datos, y su propio número hash único. + +![Puntero hash](/docs/img/introduction7-two-blocks.png) + +Utilizando esta estructura, cada bloque tiene una posición clara en la cadena, enlazandose al bloque de datos anterior. Esto crea una cadena de bloques inmutable. Siempre puedes verificar toda la información actual en la cadena rastreando los bloques anteriores. + +![Tres bloques de datos](/docs/img/introduction8-3-blocks.png) + +Por diseño, las blockchains son resistentes a la modificación de datos. Cada nodo del libro contable (ledger) obtiene una copia exacta de la blockchain. + +![Dos validadores con copias idénticas de la blockchain](/docs/img/introduction9-2-sets-of-3.png) + +Esto crea un libro contable (ledger) abierto y distribuido que registra las transacciones entre partes de manera eficiente, verificable y permanente. + +Una vez registrados, los datos de cualquier bloque no se pueden modificar retroactivamente, a no ser que la mayoría de validadores se pongan de acuerdo en el cambio. Si es así, todo los bloques posteriores se modifican de la misma manera (un hecho muy raro y extremo). + +### ¿Cómo funciona el proceso de consenso federado? + +La mayoría de los servidores rippled en XRPL monitorean o proponen transacciones. Un importante subconjunto de servidores se ejecutan como validadores. Estos servidores confiables acumulan listas de nuevas transacciones en una nueva posible instancia del libro contable (ledger) (un nuevo bloque en la blokchain). + +![Recopilación de transacciones](/docs/img/introduction17-gather-txns.png) + +Los validadores comparten sus listas con el resto de validadores. Los validadores incorporan los cambios propuetos entre sí y distribuyen una nueva versión de la propuesta del libro contable (ledger). + +![80% de consenso](/docs/img/introduction18-80-percent-consensus.png) + +Cuando el 80% de los validadores acuerdan un conjunto de transacciones, crean una nueva instancia del libro contable (ledger) al final de la cadena y empiezan el proceso otra vez. Este proceso de consenso tarda entre 4 y 6 segundos. Puedes monitorizar cómo se crean las instancias del libro contable (ledger) en tiempo real visitando [https://livenet.xrpl.org/](https://livenet.xrpl.org/). + +### ¿Qué redes están disponibles? + +El XRPL está abierto a cualquiera que quiera configurar su propia instancia de servidor rippled y conectarse. El nodo puede monitorizar la red, realizar transacciones, o convertirse en validador. La red XRPL activa se denomina normalmente como _Mainnet_. + +Para los desarrolladores o nuevos usuarios que quieran probar las características de XRPL sin invertir sus propios fondos, existen dos entornos para desarrolladores, _Testnet_ y _Devnet_. Los usuarios pueden crear una cuenta con 1.000 XRP (falsos) y conectarse a cualquiera de los entornos para interactuar con el XRPL. + +Siguiente: [¿Qué es XRP?](what-is-xrp.md) diff --git a/@i18n/es-ES/docs/introduction/what-is-xrp.md b/@i18n/es-ES/docs/introduction/what-is-xrp.md new file mode 100644 index 0000000000..4629e99b9b --- /dev/null +++ b/@i18n/es-ES/docs/introduction/what-is-xrp.md @@ -0,0 +1,75 @@ +--- +html: what-is-xrp.html +parent: introduction.html +seo: + title: ¿Qué es XRP y por qué es valioso? + description: XRP, la criptomoneda respaldada por el XRP Ledger (XRPL), permite transacciones más rápidas y económicas. Descubre cómo opera XRP en una blockchain de código abierto. +labels: + - Blockchain +--- +# ¿Qué es XRP? + +XRP es la criptomoneda respaldada por el XRP Ledger. + +## ¿Qué es una criptomoneda? + +Una criptomoneda es una moneda virtual o digital que está protegida por criptografía y que es rastreada usando la blockchain. La seguridad y la integridad de las criptomonedas hace casi imposible falsificarlas o generar un doble gasto. + +![XRP en la blockchain](/docs/img/introduction10-xrp-on-chain.png) + +Critopmonedas, monedas digitales, y activos digitales, todos caen en la misma categoría general. Las criptomonedas son: + +- nativas digitalmente (quiere decir que se crearon para internet) +- programables +- rápidas de transferir a un coste bajo +- abiertas y trasparentes +- no están restringidas por fronteras o gobiernos (por lo que no necesita cuentas nostro que tengan fondos en otro país) +- no están sujetas a falsificación +- no requieren una cuenta bancaria o infraestructura para liquidar los pagos. + +![Ventajas de las criptomonedas](/docs/img/introduction11-all-the-things.png) + +Las criptomonedas son _tokens fungibles_. _Fungible_ significa que tu puedes reemplazar un token por otro token de mismo valor. El franqueo es un ejemplo de un token fungible: si cuesta 50 céntimos enviar una carta, puedes utilizar 2 sellos de 25 centimos o 5 de 10 centimos para el envío, porque el franqueo de sellos es fungible (consistente en valor relativo e intercambiable). + +Las criptomonedas además son descentralizadas. No hay una entidad central que dobierna la moneda. Una vez que la transacción está en la blockchain no se puede cambiar. Es dificil censurar una criptomoneda: mientras que el sistema sea los suficientemente descentralizado, nadie puede dar marcha atrás transacciones, congelar balances, o impedir que alguien pueda utilizar un activo digital descentralizado. Las reglas no cambian sin una coordinación significativa entre todos los participantes. + +Las criptomonedas son atractivas para inversores y desarrolladores porque ninguna entidad por sí sola puede "tirar del cable" y hacerlas desaparecer. + +## ¿Pero por qué es valioso? + +![Ventajas de las criptomonedas](/docs/img/introduction12-diamond.png) + +Puede parecer raro que las criptomonedas se basen únicamente en datos informáticos, y no en ninguna tipo de bien tangible como un metal precioso. Tradicionalmente, las monedas se han basado en ganado, conchas de mar, metales raros, piedras u otro objeto físico. Pero estos elementos tienen valor solo porque hubo un acuerdo entre personas de una cultura. + +Aunque puede parecer mucho más seguro tener algo "real en la mano, muchas personas no distinguirán el oro real del falso, o la circonita cúbica de un diamante auténtico. El papel moneda puede ser falsificado. Puedes olvidar que tienes un billete de 10$ en tu bolsillo y arruinarlo al lavarlo. Es costoso almacenar y transportar de manera segura artículos valiosos para pagar. + +El valor de las criptomonedas proviene de la confianza que sus poseedores depositan en la moneda. Debido a la naturaleza distribuida de los registros y la protección criptográfica para asegurar los fondos, las criptomonedas podrían considerarse mucho más robustas, seguras, y convenientes que las monedas fiduciarias tradicionales. + + +## XRP es una criptomoneda + +El XRP Ledger fue construido entre 2011 y principios de 2012 por Jed McCaleb, Arthur Britto y David Schwartz. En el momento de su creación, había 100 mil millones de XRP. En septiembre de 2012, Jed y Arthur, junto con Chris Larsen formaron Ripple (la compañía, llamada en ese momento OpenCoin Inc.) y decidieron donar 80 mil millones XRP a Ripple a cambio de que Ripple desarrollase en el XRP Ledger. + +![Cien mil millones con "M"](/docs/img/introduction14-hundred-billion.png) + +Desde entonces, la compañía ha vendido XRP regularmente, lo ha utilizado para fortalecer los mercados de XRP y mejorar la liquidez de la red, e incentivar el desarrollo del ecosistema. En 2017, la compañía colocó [55 mil millones de XRP en escrow](https://ripple.com/insights/ripple-escrows-55-billion-xrp-for-supply-predictability/?__hstc=78174987.8aa695b6d0420a940041f1842edfd8a6.1692378128025.1692644550213.1692652561840.8&__hssc=78174987.3.1692652561840&__hsfp=3379522993) para asegurar que la cantidad que entra al suministro general [crece de manera predecible](https://ripple.com/insights/ripple-to-place-55-billion-xrp-in-escrow-to-ensure-certainty-into-total-xrp-supply/?__hstc=78174987.8aa695b6d0420a940041f1842edfd8a6.1692378128025.1692644550213.1692652561840.8&__hssc=78174987.3.1692652561840&__hsfp=3379522993) en el futuro inmediato,. Ripple [sitio de rendimiento del mercado XRP](https://ripple.com/xrp/?__hstc=78174987.8aa695b6d0420a940041f1842edfd8a6.1692378128025.1692644550213.1692652561840.8&__hssc=78174987.3.1692652561840&__hsfp=3379522993) informa cuánto XRP tiene la compañía disponible y cuanto tiene bloqueado en escrow en la actualidad. + +![Hombre con un XRP](/docs/img/introduction13-x-prefix.png) + + +### El nombre + +Originalmente, el XRP Ledger se llamaba "Ripple" por la forma en que la tecnología permitía que los pagos [se propagaran a través de múltiples saltos y monedas](../concepts/tokens/fungible-tokens/rippling.md). Para el activo nativo construido dentro del ledger, los creadores eligieron las siglas "XRP" del término "créditos ripple" o "ripples" y el prefijo X por ser una moneda no nacional según el estandar de la [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). La compañía se registró como "Ripple Labs". El nombre "XRP" empezó a usarse para referirse al activo en todos los contextos, para evitar confusiones con nombres similares de la tecnología y la compañía, y finalmente la empresa acortó su propio nombre a "Ripple". En mayo de 2018, [la comunidad seleccionó un nuevo símbolo "X"](https://twitter.com/xrpsymbol/status/1006925937571713025) para representar XRP y diferenciarlo del logotipo triskelion con el que se conocía anteriormente tanto a la empresa como al activo digital + +| XRP "X" Logo | Ripple triskelion | +|:---------------------------------------|:------------------------------------| +| !["X" logo](/img/xrp-x-logo.png) | ![Triskelion](/docs/img/ripple-triskelion.png) | + + +### Marca comercial + +"XRP" es una marca registrada de la XRPL Foundation en EE.UU. y otros países como China y Estonia. + +La solicitud de marca se registró en la Oficina de Patentes y Marcas de los Estados Unidos (USPTO) en 2013 con OpenCoin Inc y Ripple Labs Inc como cesionarios. En 2022, la asignación de marca fue actualizada y ahora está asignada a MITTETULUNDUSÜHING XRP LEDGER TRUST (“XRPLF”). + +Siguiente: [Carteras Cripto](crypto-wallets.md) diff --git a/@i18n/es-ES/translations.yaml b/@i18n/es-ES/translations.yaml new file mode 100644 index 0000000000..82473c34d2 --- /dev/null +++ b/@i18n/es-ES/translations.yaml @@ -0,0 +1,306 @@ +theme.navbar.about: Acerca de +theme.navbar.docs: Docs +theme.navbar.resources: Recursos +theme.navbar.community: Comunidad +theme.footer.about: Acerca de +theme.footer.docs: Docs +theme.footer.resources: Recursos +theme.footer.community: Comunidad +sidebar.docs: Docs +sidebar.docs.tutorials: Tutoriales +sidebar.docs.references: Referencias +sidebars.resources: Recursos +sidebar.resources.codesamples: Ejemplos de código +topnav.docs.title: Documentación +topnav.docs.description: Sumérgete en la tecnología XRP Ledger y empieza a integrar +topnav.resources.current-status: Estado actual +topnav.resources.explorer: Explorador del ledger +topnav.community.title: Contribuye a la comunidad XRPL +topnav.community.description: Únete a la conversación +Open Source.: Código abierto +Jump to top of page: Saltar arriba +Edit page: Editar página +Search: Buscar +Search site...: Buscar sitio... +Search for articles, training, and code samples...: Buscar artículos, entrenamientos, ejemplos de código... +Become an XRP Ledger Campus Ambassador: Conviertete en un Embajador de Campus XRP Ledger +Join the Student Cohort: Únete al grupo de estudiantes +XRPL Campus Ambassadors: Embajadores de Campus XRPL +Current Students: Estudiantes actuales +Why become an XRPL Campus Ambassador?: ¿Por qué convertirse en un Embajador de Campus? +Benefits: Beneficios +Join a global cohort of students empowering others to build on the XRPL.: Únete al grupo global de estudiantes animando a otros a construir en el XRPL. +Exclusive Opportunities: Oportunidades exclusivasa +Education: Educación +Tutorials and workshops from leading XRPL and blockchain developers: Tutoriales y workshops de desarrolladores líderes de la blockchain XRPL +Swag: Estilo +New XRPL swag for Ambassadors and swag to share with other students: Nuevo estilo XRPL para embajadores y estilo para compartir con otros estudiantes +Mentorship: Mentorías +Career Acceleration: Aceleración de tu carrera +Stipend: Paga +Should You Apply?: ¿Debería aplicar? +Eligibility for XRPL Campus Ambassadors: Requisitos para embajadores de campus XRPL +A Leader: Un lider +Active: Activo +Curious: Curioso +Eager to learn more about technical blockchain topics and the XRPL: Con ganas de aprender más sobre los temas técnicos de blockchain y XRPL +Passionate: Apasionado +Creative: Creativo +Ability to think outside the box to grow the XRPL student community: Habilidad para pensar de forma distinta para hacer crecer la comunidad de estudiantes del XRPL +Process to become a Campus Ambassador: Proceso para convertirse en embajador de campus +How it Works: Cómo funciona +Apply now to become an XRPL Campus Ambassador.: Aplica ahora para convertirte en embajador de campus XRPL +Apply: Aplicar +Submit an application to be considered for the Campus Ambassador program.: Envía una aplicación para ser considerado por el programa de embajador del campus. +Interview: Entrevista +Join: Únete +Learn: Aprender +Apply for Fall 2023: Aplicar para otoño de 2023 +Join a global cohort of Student Ambassadors: Únete al grupo global de estudiantes embajadores +Global Community: Comunidad global +Stay connected to the XRPL Campus Ambassadors: Mantente en contacto con embajadores de campus XRPL +Connect: Conecta +MeetUp: Quedadas +Attend an XRPL Meetup in your local area: Acude a quedadas XRPL en tu zona +Dev.to Blog: Blog Dev.to +Read more about the activity of the XRPL Ambassadors: Lee más sobre la actividad de embajadores XRPL +Join the conversation on the XRPL Developer Discord: Únete a la conversación del Discord de desarrolladores XRPL +Start Building with Example Code: Empiza a construir con ejemplos de código +Code Samples: Ejemplos de código +Browse sample code for building common use cases on the XRP Ledger: Navega entre los códigos de ejemplo para construir casos de uso comunes en el XRP Ledger +Contribute Code Samples: Contribuye con ejemplos de código +Help the XRPL community by submitting your
own code samples: Ayuda a la comunidad XRPL añadiendo tus propios ejemplos de código +The XRPL Community: La comunidad XRPL +Find the community on the platforms below: Encuentra a la comunidad en la plataforma de abajo. +Join the Conversation: Entra en la conversación +Run an XRP Ledger network node: Ejecuta un nodo de la red XRP Ledger +Contribute to Consensus: Contribuye al consenso +Apply for funding to build your XRPL project: Aplica para financiar la construcción de tu proyecto XRPL +Awarded in a single grant: Premiado en una financiación +Distributed to grant recipients: Distribuido entre los recibidores de la financiación +Open-source projects funded : Proyectos de código abierto financiados +Learn More: Leer más +Showcase your XRPL project, application or product: Muestra tu proyecto XRPL, aplicación o producto +XRPL Community Spotlight: Destacado en la comunidad XRPL +Submit Your Projects: Envía tus proyectos +Read the Blog: Leer el blog +Check out global events across the XRPL community: Consulta eventos globales alrededor de la comunidad XRPL +XRPL Events: Eventos XRPL +View All Events: Ver todos los eventos +Discover your next career opportunity in the XRPL community: Descrube tu próxima oportunidad de carrera en la comunidad XRPL +Review guidelines for using XRPL design assets: Revisa las guías para usar los activos de diseño XRPL +XRPL Assets: Activos XRPL +Download the PDF and Assets: Descargar el PDF y los activos +A community-driven resource for all things XRPL.org: XRPとXRP Un recurso para todas las cosas dirigido por la comunidad XRPL.org +Contribute to XRPL.org: Contribuye con XRPL.org +Read Contributor Guidelines: Leer la guía de contribución +Dev Tools: Herramientas de desarrollo +Explorers: Exploradores +API Access: Acceso a APIs +Other: Otro +Have an Idea For a Tool?: ¿Tienes una idea para una herramienta? +Open a pull Request: Abre un pull request +Full documentation index: Índice completo de la documentación +See Everything: Ver todo +XRP Ledger Developer Resources: Recursos para desarrolladores XRPL +Documentation: Documentación +rippled API Reference: API rippled de referencia +XRP Faucet: Grifo XRP +Getting Started with Python: Comienza con Python +Websocket API Tool: Herramienta API Websocket +XRP Ledger Explorer: Explorador XRP Ledger +Advanced Payment Features: Características de pago avanzadas +Governance and the Amendment Process: Gobierno y proceso de enmiendas +Federated Sidechains: Sidechains federadas +On-Chain Finance: Finanzas On-Chain +Trade on the decentralized exchange: Comercia en el exchange descentralizado +Make payments: Haz pagos +Use specialized payment types: Utiliza tipos de pago especializados +Tokens: Tokens +Non-fungible Tokens: Tokens No Fungibles +Issue a stablecoin: Emitir una stablecoin +Assign an authorized minter: Asignar un acuñador autorizado +Payments: Pagos +Peer to peer payments: Pagos Peer to peer +Cross-currency payments: Pagos entre divisas +Escrows: Escrows +Intro to XRP Ledger: Intro to XRP Ledger +Accounts: Cuentas +Decentralized Exchange: Exchange descentralizado +Tokenization: Tokenización +Faucets: Grifo XRP +Get credentials and test-XRP for XRP Ledger Testnet or Devnet.: Consigue credenciales y XRP de prueba para la Testnet o Devnet de XRP Ledger +WebSocket Tool: Herramienta Websocket +Send sample requests and get responses from the rippled API.: Envía peticiones de ejemplo y recibe respuestas desde la API rippled +Transaction Sender: Enviador de transacciones +Concepts: Conceptos +Read the Docs: Leer los documentos +Tutorials: Tutoriales +Get step-by-step guidance to perform common tasks with the XRP Ledger.: Consigue guías paso a paso para tareas comunes con el XRP Ledger +View Tutorials: Ver tutoriales +References: Referencias +View References: Ver referencias +Use Cases: Casos de uso +Getting Started: Empezar +Quickstart to XRP Ledger: Inicio rápido de XRP Ledger +An introduction to fundamental aspects of the XRP Ledger.: Una introducción a los aspectos fundamentales del XRP Ledger +Get Started: Empieza +Watch Full Series: Ver serie completa +Interact with the XRP Ledger in a language of your choice: Interactua con el XRP Ledger en un lenguaje de tu elección +Explore SDKs: Explora SDKs +Intermediate Learning Sources: Fuentes de aprendizaje intermedio +Explore, Test, Verify: Explora, prueba, verifica +Explore Dev Tools: Explora las herramientas de desarrollo +Browse By Recommended Pages: Explora entre las páginas recomendadas +Get Free Test XRP: Consigue XRP de prueba gratis +Generate Testnet Credentials: Genera credenciales de Testnet +See full documentation index: Consulta el índice de la documentación completa +Find the XRPL Community Around the World: Encuentra a la comunidad XRPL alrededor del mundo +Events: Eventos +The XRPL Developer Summit: El encuentro de desarrolladores XRPL +Save the Date: Guarda la fecha +Upcoming Events: Eventos próximos +Explore past community-hosted events: Explora eventos pasados organizados por la comunidad +Past Events: Eventos anteriores +Sorry, this page is not available in your language.: Lo siento, esta página no está disponible en tu idioma +XRPL Developer Funding Programs: Programas de financiación de desarrolladores XRPL +Project Resources: Recursos para proyectos +Explore funding opportunities for developers and teams: Explora oportunidades de financiación para desarrolladores y equipos +Funding Overview: Vistazo de financiaciones +XRPL Hackathons: Hackatones XRPL +Join an Event: Únete a un evento +See Upcoming Events: Consulta eventos próximos +Best for: Lo mejor para +Software developers and teams building directly on the XRP Ledger: Desarrolladores y equipos de software construyen directamente en el XRP Ledger +Required: Necesario +Some coding experience: Algo de experiencia +Level: Nivel +XRPL beginner to advanced developers: Desarrolladores de iniciados a avanzados +Funding Levels: Niveles de financiación +Prize money and awards: Dinero y premios +Fund Your Project: Financia tu proyecto +Past awardees include: Los premios pasados incluyen +Visit XRPL Grants: Visita las financiaciones de XRPL +XRPL intermediate to advanced developers: Desarrolladores de nivel intermedio a avanzados +$10,000 - $200,000: 10.000$ ~ 200.000$ +XRPL Accelerator: Acelerador XRPL +Advance your project: Avanza tu proyecto +View XRPL Accelerator: Consulta el acelerador XRPL +$50,000 (grant) + pitch for venture funding: 50.000$(premio) más pitch para venture funding +Provide a Better Alternative to Bitcoin: Ofrece una mejor alternativa a Bitcoin +XRPL's Origin: Origen de XRPL +XRPL Launches its Native Currency, XRP: XRPL lanza su divisa nativa, XRP +OpenCoin Rebranded to Ripple Labs: OpenCoin renombrada como Ripple Labs +XRPL Foundation Launched: Se lanza XRPL Foundation +The Blockchain
Built for Business: La blockchain
construida para negocios +XRPL | XRP Ledger: +Start Building: Empieza a construir +Why developers choose the XRP Ledger: ¿Por qué los desarrolladores eligen el XRP Ledger? +Public and Decentralized: Público y descentralizado +Open source, open to anyone to build on, maintained by the community: Código abierto, abierto a cualquiera que quiera construir, mantenido por la comunidad +Streamlined Development: Desarrollo simplificado +Intentional innovations, tools and documentation reduce time to market: Las innovaciones, herramientas y documentación intencionales reducen el tiempo de comercialización +High Performance: Alto rendimiento +Thousands of transactions settled in seconds: Miles de transacciones realizadas en segundos +Low Cost: Bajo coste +Motivated Community: Comunidad motivada +Proven Reliability: Fiabilidad probada +Powerful Features: Funcionalidades potentes +Cross-Currency Payments: Pagos entre divisas +Payment
Channels: Canales de
Pago +Batched micropayments with unlimited speed, secured with XRP: Micropagos en lotes con velocidad ilimitada, segurados con XRP +Multi-Signing: Multi-firma +Flexible options for custody and security of on-ledger accounts: Opciones flexibles para la custodia y seguridad de cuentas en el ledger +Choose a path, and bring your project to life on the XRP Ledger: Elige un camino, y haz tu proyecto realidad en el XRP Ledger +Where to Start: Dónde empezar +Quickstart: Inicio rápido +Access everything you need to get started working with the XRPL: Accede a todo lo que necesitas para empezar a trabajar con XRPL +Guided Tutorials: Tutoriales guiados +Follow step-by-step guides for frequent tasks: Sigue las guías paso a paso para tareas frecuentes +XRPL Fundamentals: Fundamentos del XRPL +Read about the XRPL’s foundational concepts: Lee sobre los conceptos fundamentales del XRPL +Choose a Language: Elige un idioma +Get Inspired: Inspírate +See what your peers have built on the XRPL: Observa lo que otros compañeros han construido en el XRPL +Our Shared Vision for XRPL’s Future: Nuestra visión compartida del futuro del XRPL +Preview New Features: Previsualiza nuevas funcionalidades +In Development: En desarrollo +Smart Contracts: Smart Contracts +Enabled: Activado +Non-Fungible Tokens: Tokens no fungibles +Join the Community
at XRPL.org: Únete a la comunidad
en XRPL.org +Get Involved: Únete +Today’s Value, Tomorrow’s Vision: El valor de hoy, la visión del mañana +XRPL Today, XRPL Tomorrow: XRPL hoy, XRPL mañana +Building for the Future: Construyendo por el futuro +Consensus protocol is efficient and sustainable: El protocolo de consenso es eficiente y sostenible +A Sustainable Future: Un futuro sostenible +What makes the XRPL sustainable?: ¿Qué hace al XRPL sostenible? +Featured companies & projects running on the XRP Ledger.: Compañías y proyectos destacados en el XRP Ledger +Sustainable Projects: Proyectos sostenibles +See More: Ver más +How can businesses and developers connect and contribute?: ¿Cómo pueden los negocios y desarrolladores conectar y contribuir? +Join the Community: Únete a la comunidad +Blog: Blog +Code: Código +References and APIs: Referencia y APIs +Everything You Need to Know: Todo lo que necesitas saber +XRP Ledger address, transaction ID, or ledger index: Dirección XRP Ledger, ID de transacción, o índice del ledger +Try an account like rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn.: Prueba una cuenta como rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn +Get info: Consigue información +Result: Resultado +Permalink: Permalink +Explorer: Explorador +expand all: Ampliar todo +collapse all: Reducir todo +(last 20): (últimos 20) +expand tx: Ampliar tx +next 20: Siguientes 20 +prev 20: Previos 20 +Status: Estado +Not Connected: No conectado +Transaction History: Historial de transacciones +Initialize: Inicializar +Set up the necessary Testnet XRP addresses to send test payments.: Prepara lo necesario para direcciones XRP de Testnet y enviar pagos de prueba +Destination Address: Dirección de destino +Send transactions to this XRP Testnet address: Envía transacciones a esta dirección XRP Testnet +Send Transaction: Envía una transacción +(loading): (Cargando) +Send XRP Payment: Envía un pago XRP +drops of XRP: XRP drops +Send a simple XRP-to-XRP payment.: Envía un pago XRP-XRP sencillo. +(Getting ready to send partial payments): (Preparando para enviar pagos parciales) +Send Partial Payment: Envía pago parcial +Create Escrow: Crear un Escrow +seconds: segundos +Finish automatically: Finalizar automáticamente +(Waiting to release Escrow when it's ready): (Esperando a la liberación del Escrow cuando esté listo) +Create Payment Channel: Crear canal de pago +Send Issued Currency: Envia divisas emitidas +Trust for: Confianza para +Security: Seguridad +Release Notes: Notas de la versión +Custody: Custodia +Infrastructure: Infraestructura +Carbon Markets/Sustainability: Mercados de Carbono/Sostenibilidad +Developer Tooling: Herramientas de desarrollo +Gaming: Gaming +Wallet: Cartera +Ledger City is a crypto real estate game powered by the XRP Ledger.: Ledger City es un juego inmobiliario el XRP Ledger +Interoperability: Interoperabilidad +Ripple's CBDC Platform: CBDC Platform de Ripple +Ripple's On-Demand Liquidity: On-Demand Liquidity de Ripple +Exchanges: Exchanges +XRPL Rosetta explores fiat data on XRPL through visualization.: XRPL Rosetta explora datos de dinero fiat en el XRPL a través de la visualización +XRPL.org's Ledger Explorer is a block explorer of the XRP Ledger.: El explorador de ledgers de XRPL.org es el explorador de bloques para el XRP Ledger +Xumm Wallet is a non custodial wallet with superpower for the XRP Ledger.: Xumm Wallet es una cartera sin custodia con superpoderes para el XRP Ledger +Web Monetization: Monetización web +Sustainability: Sostenibilidad +CBDCs: CBDC +Cancel: Cancelar +Featured Categories: Categorías destacadas +Other Categories: Otras categorías +Proven Powerful for Innovation: Comprobadamente potente para la innovación +XRPL Use Cases: Casos de uso XRPL +Building businesses and creating new value: Construyendo negocios y nuevo valor +XRPL Ecosystem: Ecosistema XRPL diff --git a/@i18n/ja/about/faq.md b/@i18n/ja/about/faq.md index 10d4eb1d98..f3fd42fcc1 100644 --- a/@i18n/ja/about/faq.md +++ b/@i18n/ja/about/faq.md @@ -1,16 +1,10 @@ --- -html: faq.html -parent: xrp-ledger-overview.html seo: description: XRP Ledger、XRPLエコシステム、コミュニティに関するよくある質問にお答えします。 subtitle: XRPLについての質問にお答えします top_nav_grouping: 概要 labels: - ブロックチェーン -#template: page-faq2.html.jinja -filters: - - faq -name: よくある質問 --- # よくある質問 @@ -28,7 +22,7 @@ name: よくある質問 #### プルーフ・オブ・ワーク(PoW)が最善の検証メカニズムではないのですか? -プルーフ・オブ・ワークは、信頼できる第三者を必要とせずに二重支出の問題を解決する最初のコンセンサンス・メカニズムでした。[XRP Ledgerのコンセンサス。メカニズム](../docs/concepts/consensus-protocol/index.md)は、同じ問題をはるかに速く、安く、より良いエネルギー効率で解決します。 +プルーフ・オブ・ワークは、信頼できる第三者を必要とせずに二重支出の問題を解決する最初のコンセンサンス・メカニズムでした。[XRP Ledgerのコンセンサスメカニズム](../docs/concepts/consensus-protocol/index.md)は、同じ問題をはるかに速く、安く、より良いエネルギー効率で解決します。 #### どのようにして持続可能なブロックチェーンを実現するのでしょうか? @@ -43,7 +37,7 @@ name: よくある質問 #### XRPLは決済専用ではないのですか? -いいえ。当初は決済のユースケース向けに開発されましたが、台帳であるXRP Ledgerとそのネイティブ・デジタルアセットであるXRPの両方は、NFTなどのブロックチェーンの革新的ユースケースで更に人気を集めています。自動マーケットメーカー(AMM)、XRPL Labsのスマートコントラクト機能Hooks、相互運用サイドチェーンの開発などが現在進行中です。 +いいえ。当初は決済のユースケース向けに開発されましたが、台帳であるXRP Ledgerとそのネイティブ・デジタルアセットであるXRPの両方は、NFTなどのブロックチェーンの革新的ユースケースで更に人気を集めています。自動マーケットメーカー(AMM)、スマートコントラクト機能Hooks、相互運用サイドチェーンの開発などが現在進行中です。 ## バリデータ(検証者)とユニークノードリスト @@ -67,7 +61,7 @@ UNLとは、ある参加者が共謀しないと信じるバリデータのリ #### どのUNLを選択すればよいですか? -バリデータは誰でも実行できるため、信頼できるバリデータを選ぶ責任はネットワーク参加者にあります。現在、RippleとXRP Ledger財団が、過去の実績、証明された身元、責任あるITポリシーに基づき、高品質なバリデータの推奨デフォルトリストを公表していることが知られています。 しかし、すべてのネットワーク参加者は、自身が信頼できるバリデータを選択することができ、上記の2つの発行者のいずれかに従う必要はありません。 +バリデータは誰でも実行できるため、信頼できるバリデータを選ぶ責任はネットワーク参加者にあります。現在、RippleとXRP Ledger財団が、過去の実績、証明された身元、責任あるITポリシーに基づき、高品質なバリデータの推奨デフォルトリストを公表していることが知られています。しかし、すべてのネットワーク参加者は、自身が信頼できるバリデータを選択することができ、上記の2つの発行者のいずれかに従う必要はありません。 #### RippleがそのUNLの採用を推奨しているなら、それは中央集権的なシステムを形成することにならないのですか? @@ -77,7 +71,7 @@ UNLとは、ある参加者が共謀しないと信じるバリデータのリ #### バリデータにとってインセンティブとなるものは何ですか? -バリデータを運営する主なインセンティブは、ネットワークの安定的な運用と健全な進化を維持・保護することです。XR Ledgerの進化を決定するのはバリデータであり、XRP Ledgerを利用する、あるいはXRP Ledgerに依存するビジネスには、ネットワークの信頼性と安定性を確保するインセンティブが内在しています。バリデータはまた、このように貢献することでコミュニティからの評価と信頼を得ることができます。 +バリデータを運営する主なインセンティブは、ネットワークの安定的な運用と健全な進化を維持・保護することです。XRP Ledgerの進化を決定するのはバリデータであり、XRP Ledgerを利用する、あるいはXRP Ledgerに依存するビジネスには、ネットワークの信頼性と安定性を確保するインセンティブが内在しています。バリデータはまた、このように貢献することでコミュニティからの評価と信頼を得ることができます。 ネットワークに参加するためにXRP Ledgerのサーバを運営する場合やバリデータを運営するための追加コストや手間は最小限です。つまり、ビットコインにおけるマイニング報酬のような追加のインセンティブは必要ありません。Rippleはバリデータを運用するための報酬としてXRP支払うことはしないため、そのようなインセンティブがバリデータの行動を歪めることはありません。 @@ -99,6 +93,7 @@ UNLとは、ある参加者が共謀しないと信じるバリデータのリ XRP Ledgerのコンセンサスメカニズムが不利な状況でどのように動作するかについては、[攻撃と失敗モードに対するコンセンサスの保護](../docs/concepts/consensus-protocol/consensus-protections.md)をご覧ください。 + #### XRP Ledgerでは正式なバリデータのオンボーディングプロセスを使用していますか? いいえ。XRP Ledgerは、中央権限のないシステムであるため、正式なバリデータのオンボーディングプロセスのようなものは存在しません。 @@ -107,6 +102,7 @@ XRP Ledgerのコンセンサスメカニズムが不利な状況でどのよう 推奨事項やベストプラクティスについては、[バリデータとしての`rippled`の実行](../docs/infrastructure/configuration/server-modes/run-rippled-as-a-validator.md)をご覧ください。 + #### デフォルトUNL(dUNL)がネットワークに最も影響力を持つなら、XRPLは中央集権的ではないでしょうか? バリデータはdUNLや広く使われているUNLを使わないこともできます。誰でもいつでも自由にUNLを作ることができます。 @@ -138,17 +134,18 @@ Rippleは Ledgerネットワーク全体のAMLフラグを監視・報告し、 [XRP Forensics / xrplorer](https://xrplorer.com/)は、XRP Ledgerのマネーロンダリング、詐欺、詐欺、不正使用を追跡し、最小限に抑えるための勧告リストを維持しています。取引所やその他のサービス・プロバイダは、金融犯罪を防止し対応するためにこのサービスを利用することができます。 -## セキュリティー上の懸念 +## セキュリティ上の懸念 #### サードパーティにより提供されたコードは審査プロセスはどのようになっていますか? -コードへの貢献のプロセスは、開発者が [`rippled` リポジトリ](https://github.com/xrplf/rippled/) のようなソースコードリポジトリに [プルリクエスト](https://docs.github.com/ja/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) を行うことから始まります。 +コードへの貢献のプロセスは、開発者が[`rippled`リポジトリ](https://github.com/xrplf/rippled/)のようなソースコードリポジトリに[プルリクエスト](https://docs.github.com/ja/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)を行うことから始まります。 このプルリクエストは、自動化された単体テストと統合テスト、そしてプルリクエストが影響するコード領域で重要な専門知識を持つ複数の開発者によりコードレビューが行われます。 プルリクエストが自動テストに合格し、レビュアーの承認を受けると、信頼できる[リポジトリのメンテナ](https://opensource.guide/best-practices/)が次のベータ版に含めるための手続きを行います。 + #### RippleはXRP LedgerまたはXRP Ledgerネットワークを所有または管理していますか? いいえ、RippleはXRP LedgerまたはXRP Ledgerネットワークを所有も管理もしていません。 @@ -158,6 +155,6 @@ Rippleは、コアとなるXRP Ledgerサーバ([`rippled`](https://github.com/ いくつかの団体が推奨バリデータリスト(UNL)を公開しています。2023年7月現在、RippleはデフォルトのUNLにある35のバリデータのうち1つのみを実行しています。 -#### Rippleは検証用のコードベースとユーザソフトウェア用のコードベースを区別していますか? +#### XRP Ledgerは検証用のコードベースとユーザソフトウェア用のコードベースを区別していますか? XRP Ledgerの[クライアントライブラリ](../docs/references/client-libraries.md)は、ソフトウェア開発者向けのものです。これらのライブラリは、ネットワークを支え、トランザクションを検証する[XRP Ledgerのコアサーバ](../docs/concepts/networks-and-servers/index.md)とは異なるコードベースとリポジトリを持っています。 diff --git a/@i18n/ja/docs/_snippets/tx-metadata-field-table.md b/@i18n/ja/docs/_snippets/tx-metadata-field-table.md index c64d10a91b..00aad69bd4 100644 --- a/@i18n/ja/docs/_snippets/tx-metadata-field-table.md +++ b/@i18n/ja/docs/_snippets/tx-metadata-field-table.md @@ -1,7 +1,7 @@ | フィールド | 値 | 説明 | |:--------------------------------------|:--------------------|:---------------| | `AffectedNodes` | 配列 | このトランザクションで作成、削除、または修正された[レジャーオブジェクト](../references/protocol/ledger-data/ledger-entry-types/index.md)のリストと、個々のオブジェクトに対する具体的な変更内容。 | -| `DeliveredAmount` | [通貨額][] | **廃止予定。**`delivered_amount`で置き換えられます。Partial Paymentsでない場合は省略されます。 | +| `DeliveredAmount` | [通貨額](../references/protocol/data-types/basic-data-types.md#通貨額の指定) | **廃止予定。**`delivered_amount`で置き換えられます。Partial Paymentsでない場合は省略されます。 | | `TransactionIndex` | 符号なし整数 | トランザクションが記録されているレジャーでのトランザクションの位置。この配列は0から始まります。(例えば、値が`2`の場合、そのレジャーの3番目のトランザクションであったことを意味します)。 | | `TransactionResult` | 文字列 | トランザクションが成功したか、どのような理由で失敗したかを示す[結果コード](../references/protocol/transactions/transaction-results/index.md)。 | -| [`delivered_amount`](../references/protocol/transactions/metadata.md#delivered_amount) | [通貨額][] | `Destination`アカウントが実際に受取った[通貨額][]。このフィールドは、トランザクションが[Partial Payments](../concepts/payment-types/partial-payments.md)であるかどうかにかかわらず、送金された金額を特定するために使用します。{% badge href="https://github.com/XRPLF/rippled/releases/tag/0.27.0" %}新規: rippled 0.27.0{% /badge %} | +| [`delivered_amount`](../references/protocol/transactions/metadata.md#delivered_amount) | [通貨額](../references/protocol/data-types/basic-data-types.md#通貨額の指定) | `Destination`アカウントが実際に受取った通貨額。このフィールドは、トランザクションが[Partial Payments](../concepts/payment-types/partial-payments.md)であるかどうかにかかわらず、送金された金額を特定するために使用します。 | diff --git a/@i18n/ja/docs/concepts/accounts/account-types.md b/@i18n/ja/docs/concepts/accounts/account-types.md index 416708834f..e6e757e16f 100644 --- a/@i18n/ja/docs/concepts/accounts/account-types.md +++ b/@i18n/ja/docs/concepts/accounts/account-types.md @@ -62,7 +62,7 @@ labels: 運用アドレスと同様に、待機アドレスは、顧客やパートナーではなく、発行アドレスとトラストラインを設定しなければなりません。運用アドレスに適用されるすべての注意事項は、待機アドレスにも適用されます。 -### スタンバイアドレスの漏えい +### 待機アドレスの漏えい 待機アドレスの秘密鍵が漏えいした場合、その影響は運用アドレスの場合と同じです。悪意のある第三者は、待機アドレスが保有するすべての残高を盗むことができ、金融機関は顧客やパートナーが何もしなくても、新しい待機アドレスに切り替えることができます。 diff --git a/@i18n/ja/docs/concepts/accounts/decentralized-identifiers.md b/@i18n/ja/docs/concepts/accounts/decentralized-identifiers.md index 6eefb07d90..88a8afb1a1 100644 --- a/@i18n/ja/docs/concepts/accounts/decentralized-identifiers.md +++ b/@i18n/ja/docs/concepts/accounts/decentralized-identifiers.md @@ -2,7 +2,7 @@ html: decentralized-identifiers.html parent: accounts.html seo: - description: Decentralized identifiers enable verifiable, decentralized digital identities. + description: 分散型IDは、検証可能な分散型デジタルIDを可能にします。 status: not_enabled labels: - DID @@ -15,9 +15,11 @@ _([DID Amendment][] {% not-enabled /%} が必要です。)_ DIDの主な基本原則は以下の通りです。 -- **分散型:** 中央の発行機関がDIDを管理することがないため、所有者はDIDを更新、解決、または無効化することができます。 +- **分散型:** 中央の発行機関がDIDを管理することがないため、所有者はDIDを更新、解決、または無効化することができます。また、DIDは通常ブロックチェーン上に保存され、常に確認が可能なため、あなたの本人確認も非常に利用しやすくなります。 -- **暗号的に検証可能:** DIDは暗号証明によって検証されるため、改ざんが不可能で安全です。 +- **検証可能な資格情報(Verifiable Credentials):** 誰でもDIDを作成し、その情報を偽造することができます。DIDの真正性を証明するために、ユーザは暗号的に安全で改ざんできない検証可能な資格情報(Verifiable Credentials/VC)を提供しなければなりません。 + + DIDエコシステムには3つの当事者がいます。_ユーザ_、_発行者_、_検証者_ です。ユーザはDIDを管理しますが、オフラインで情報を検証するには信頼できる _発行者_ が必要です。_発行者_ は検証可能な資格情報を提供し、ユーザはそれをユーザの身元を確認する必要がある _検証者_ に渡します。DIDエコシステムの詳細については、こちらをご覧ください。[エコシステムの概要](https://www.w3.org/TR/vc-data-model/#ecosystem-overview) - **相互運用性:** DIDは、W3CのDID規格を認識するあらゆるソリューションに対してオープンです。つまり、DIDは様々なデジタルトランザクションやインタラクションの認証や信頼の確立に使用することができます。 @@ -28,11 +30,8 @@ DIDの主な基本原則は以下の通りです。 1. XRPLアカウント保有者は、アカウントによって管理されるDIDを生成します。 2. DIDはW3C仕様で定義されたDIDドキュメントと関連付けられます。 -3. DIDは次のようなデジタルタスクに使用されます: - - デジタル文書への署名 - - 安全なオンライントランザクション。 - - Webサイトへのログイン -4. 検証者は、対象者の身元を確認するために、DIDからそのドキュメントへ解決します。 +3. ユーザは、デジタル上のタスクのために、自分のDIDとVCを検証者に提供します。 +4. 検証者はDIDをそのドキュメントに変換し、VCを使用してその真正性を検証します。 ## DIDドキュメント @@ -73,7 +72,7 @@ DIDドキュメントの主要なプロパティの詳細については[Decentr ## プライバシーとセキュリティの懸念 - XRPLアカウントの秘密鍵を管理する人は誰でも、DIDとそれが解決するDIDドキュメントへの参照を管理します。秘密鍵が漏洩しないように注意してください。 -- DIDドキュメントにはどのような内容でも含めることができますが、検証方法とサービスポイントに限定すべきです。XRPL上のDIDは誰でも解決できるので、個人情報を含めるべきではありません。 +- DIDドキュメントにはどのような内容でも含めることができますが、検証方法とサービスポイントに限定すべきです。XRPL上のDIDは公開情報であるので、個人情報を含めるべきではありません。 - IPFSは誰でも分散ネットワークのノードにコンテンツを保存できます。よくある誤解は、誰でもそのコンテンツを編集できるということです。しかし、IPFSのコンテンツアドレス指定可能性は、編集されたコンテンツがオリジナルとは異なるアドレスを持つことを意味します。どんなエンティティでもXRPLアカウントの`DIDDocument`または`URI`フィールドでアンカーされたDIDドキュメントをコピーすることはできますが、対応する`DID`オブジェクトを作成した秘密鍵をコントロールしない限り、ドキュメント自体を変更することはできません。 {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/ja/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md b/@i18n/ja/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md index ce670dfbe9..6afd1b738b 100644 --- a/@i18n/ja/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md +++ b/@i18n/ja/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md @@ -2,6 +2,7 @@ html: automated-market-makers.html parent: decentralized-exchange.html seo: + title: 自動マーケットメーカー(AMM)とは? description: 自動マーケットメーカー(AMM)は、資産ペア間の流動性を提供し、分散型取引所のオーダーブックを補完すると同時に、流動性提供者に利益を提供します。 labels: - XRP @@ -9,11 +10,12 @@ labels: - AMM --- # 自動マーケットメーカー + _([AMM amendment][])_ 自動マーケットメーカー(AMM)は、XRP Ledgerの分散型取引所において流動性を提供するスマートコントラクトです。個々のAMMは2つの資産のプールを保有し、数式で定められた取引レートでユーザがその2つの資産間でスワップを可能とします。 -任意の資産ペアに対して、最大1つのAMMが元帳に存在することができます。AMMはそのペアが存在しない場合、誰でも作成することができ、また既存のAMMに預けることもできます。AMMに資産を預ける人は、流動性供給者(LP/Liquidity Provider)と呼ばれ、AMMから「LPトークン」を受け取ります。LPトークンによって、流動性供給者は以下のことが可能になります。 +任意の資産ペアに対して、最大1つのAMMがレジャーに存在することができます。AMMはそのペアが存在しない場合、誰でも作成することができ、また既存のAMMに預けることもできます。AMMに資産を預ける人は、流動性供給者(LP/Liquidity Provider)と呼ばれ、AMMから「LPトークン」を受け取ります。LPトークンによって、流動性供給者は以下のことが可能になります。 - LPトークンを、AMMのプール内の資産の一部(手数料を含む)と交換する。 - AMMの手数料設定を変更するために投票する。票は、投票者が保有するLPトークンの数に基づいて重み付けされます。 @@ -27,6 +29,12 @@ AMMは2つの異なる資産を保有します。このうち最大でも片方 ユーザが分散型取引所で取引を行う場合、[オファー](offers.md)と[クロスカレンシー決済](../../payment-types/cross-currency-payments.md)は自動的にAMMを使用してトランザクションを成立させることが出来ます。トランザクションは低コストで取引を行えるように、オファー、AMM、またはその両方の組み合わせで実行されます。 +{% admonition type="info" name="注記" %} + +`Payment`または`OfferCreate`トランザクションがAMMとやり取りしたかどうかは、トランザクションメタデータにある[`RippleState`](../../../references/protocol/ledger-data/ledger-entry-types/ripplestate.md)レジャーエントリを確認することで判断できます。`Flags`値が`16777216`の場合、AMMの流動性が消費されたことを示します。 + +{% /admonition %} + AMMは、プール内の資産残高に基づき取引レートを設定します。AMMに対して取引を行うと、AMMが保有する資産残高の変動に応じて、取引レートが調整されます。一方の資産の量が減れば、その資産の価格が上がり、他方の資産の量が増えれば、その資産の価格が下がります。AMMは、プール内の残高が多いほど、一般的により良い取引レートを提供します。同一取引であればプール内の残高が大きい方がAMMの資産バランスに生じる変化は小さくなるからです。AMMの2つの資産のバランスが崩れれば崩れるほど、交換レートは極端に悪化します。 また、AMMは交換レートに加え、一定割合の取引手数料を徴収しています。 @@ -41,6 +49,7 @@ XRP Ledgerの実装は、重みパラメータを0.5とした _幾何平均_ AMM - 資産が、発行者が[認可トラストライン](../fungible-tokens/authorized-trust-lines.md)を使用しているトークンである場合、AMMの作成者はそれらのトークンを保有する権限がなければなりません。トラストラインが認可されているユーザだけが、そのトークンをAMMに預けたり引き出したりすることができます。 - [Clawback Amendment][] が有効な場合、Clawbackが有効なトークンでAMMを作成することはできません。 + ## LPトークン AMMの作成者は、最初の流動性供給者となり、AMMのプール内の資産の100%の所有権を表すLPトークンを受け取ります。LPトークンの一部または全部を交換して、現在のプール残高に比例した資産をAMMから引き出せます。(この比率は、人々がAMMに対して取引を行うにつれて変化します)AMMは、同時に両方の資産を引き出す際に手数料はかかりません。 @@ -68,9 +77,11 @@ LPトークンは、160ビットの16進法["非標準"フォーマット](../.. ### オークションスロット -これまでの自動マーケットメーカーとは異なり、XRP LedgerのAMMのデザインには、流動性供給者が24時間の取引手数料の割引を得るために入札することができる _オークションスロット_ 機能があります。入札はLPトークンで支払う必要があり、落札に使用したLPトークンはAMMに返還されます。一度に複数のアカウントがオークションスロットを保持することはできませんが、落札者は割引を得るために追加で最大4つのアカウントを指定することができます。最低落札価格は設定されていませんが、もしその枠が埋まっている場合は、現在の枠の所有者に競り勝たなければなりません。もし誰かがあなたの入札を退けた場合、残り時間に応じて、落札額の一部が返金されます。アクティブなオークションスロットを保持している限り、そのAMMに対しては通常の取引手数料の1/10の手数料で取引を行うことができます。 +従来の自動マーケットメーカーとは異なり、XRP LedgerのAMMには、流動性供給者が24時間の取引手数料の割引を得るために入札できる _オークションスロット_ があります。入札はLPトークンで支払われ、AMMに返却されます。他のブロックチェーンとは異なり、AMMの資産価格が外部市場で大きく変動すると、トレーダーはAMMから利益を得るために裁定取引を行うことができますが、これは流動性供給者に損失をもたらします。オークションメカニズムは、その価値の一部を流動性供給者に返し、AMMの価格をより迅速に外部市場とバランスを取ることを意図しています。 -どのようなAMMであっても、その資産の価格が外部市場で大きく変動すると、トレーダーは裁定取引によってAMMから利益を得ることができ、その結果、流動性供給者は損失を被ることになります。オークションの仕組みは、より多くの価値を流動性供給者に還元し、AMMの価格をより迅速に外部市場とのバランスに戻すことを意図しています。 +一度に複数のアカウントがオークションスロットを保持することはできませんが、入札者は割引を受けるために最大4つのアカウントを指定することができます。スロットが現在使用中の場合、現在のスロット保持者を追い出すために入札する必要があります。追い出された場合、残り時間に応じて一部の入札額が返却されます。アクティブなオークションスロットを保持している間は、そのAMMに対して取引を行う際に、通常の取引手数料の1/10(十分の一)の割引が適用されます。 + +オークションスロットの最小入札額は、空または期限切れの場合、現在のLPトークンの総数に取引手数料を掛けたものを25で割ったものです。(擬似コードで表すと、`MinBid = LPTokens * TradingFee / 25`です。) オークションスロットが占有されている場合、現在のスロット保持者が支払った金額の105%までの最小入札額を支払う必要があります。 ## 台帳上の表示 diff --git a/@i18n/ja/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md b/@i18n/ja/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md index d1aee6c587..bd59dbac2b 100644 --- a/@i18n/ja/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md +++ b/@i18n/ja/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md @@ -38,7 +38,7 @@ XRP Ledger上のステーブルコインと認可トラストラインの使用 ### RequireAuthの有効化 -以下は、ローカルでホストされている`rippled`の[submitメソッド][]を使って、`asfRequireAuth`フラグを使ってRequire Authを有効にする[AccountSetトランザクション][]を送信する例です。(このメソッドは、アドレスが発行アドレス、運用アドレス、スタンバイアドレスのいずれであっても同様に機能します。) +以下は、ローカルでホストされている`rippled`の[submitメソッド][]を使って、`asfRequireAuth`フラグを使ってRequire Authを有効にする[AccountSetトランザクション][]を送信する例です。(このメソッドは、アドレスが発行アドレス、運用アドレス、待機アドレスのいずれであっても同様に機能します。) リクエスト: diff --git a/@i18n/ja/docs/concepts/tokens/fungible-tokens/paths.md b/@i18n/ja/docs/concepts/tokens/fungible-tokens/paths.md index a28cc1d0cb..699e292be2 100644 --- a/@i18n/ja/docs/concepts/tokens/fungible-tokens/paths.md +++ b/@i18n/ja/docs/concepts/tokens/fungible-tokens/paths.md @@ -9,7 +9,7 @@ labels: --- # パス -XRP Ledgerでは、[トークン](../index.md)の支払いが送金元から受取人に届くまでにたどる中間ステップの道筋をパスによって定義します。パスは、XRP Ledgerの[分散型取引所](../decentralized-exchange/index.md)のオーダーを介して送金元と受取人を結び付けることで、[クロスカレンシー支払い](../../payment-types/cross-currency-payments.md)を可能にします。また、負債を相殺するような複雑な決済もパスにより可能になります。 +XRP Ledgerでは、[トークン](../index.md)の支払いが送金元から受取人に届くまでにたどる中間ステップの道筋をパスによって定義します。パスは、XRP Ledgerの[分散型取引所](../decentralized-exchange/index.md)の注文と[自動マーケットメーカー](../../../concepts/tokens/decentralized-exchange/automated-market-makers.md)を介して送金元と受取人を結び付けることで、[クロスカレンシー支払い](../../payment-types/cross-currency-payments.md)を可能にします。また、負債を相殺するような複雑な決済もパスにより可能になります。 XRP Ledgerでは1つのPaymentトランザクションは複数のパスを使用でき、複数のソースの流動性を組み合わせて必要な額を送金することができます。そのため、トランザクションには使用可能なパスをまとめた _パスセット_ が含まれます。パスセットの中のパスでは開始時と終了時には同一通貨が使用される必要があります。 @@ -20,13 +20,13 @@ XRPは任意のアドレスに直接送金できるため、[XRP間のトラン パスは、支払いの送金元と受取人を結ぶステップで構成されています。すべてのステップは次のいずれかを行います。 * 同一通貨の別のアドレスを通じたRippling -* オーダーブックでの通貨の取引 +* オーダーブックとAMMでの通貨の取引 別のアドレスを通じたRipplingは、負債を移動するプロセスです。一般的なケースでは、ある当事者に対するイシュアーの債務が削減され、別の当事者に対する債務が増加します。Ripplingは、トラストラインで結ばれているすべてのアドレスの間で発生させることができます。Ripplingのその他の例については、[NoRippleフラグについて](rippling.md)をご覧ください。 -通貨取引ステップの場合、パスステップにより変換先の通貨が指定されますが、オーダーブックにはオファーの状態は記録されません。レジャーが検証されるまではトランザクションの正規の順序は最終的ではないため、トランザクションの検証が完了するまでは、トランザクションがどのオファーをとるかは不明です。(各トランザクションは最終レジャーでの実行時に利用可能なオファーの中から最適なオファーをとるため、経験に基づいて推測することができます。) +[トークンとXRPの交換](../decentralized-exchange/index.md)は、オーダーブックまたはAMMを介して行われます。トランザクションは、送金元と受取人の間で最も良い交換レートを提供するオーダーブックまたはAMMを見つけるために、パスのステップを使用します。パスのステップは、通貨の変換先を指定しますが、オーダーブックのOfferの状態を記録しません。トランザクションの順序は、レジャーが検証されるまで確定しないため、トランザクションが取引するOfferやAMMを確定することはできません。(ただし、各トランザクションは最終的なレジャーで最良の利用可能な交換レートを取得します。) -いずれのタイプのステップでも、中間アドレスでは取得する価値と失う価値はほぼ同等です。トラストラインから同じ通貨の別のトラストラインへ残高がripplingするか、または以前に出されたオーダーに基づいて通貨が交換されます。場合によっては、[送金手数料](../transfer-fees.md)、トラストラインクオリティ、または数値の丸め方が原因で、取得する価値と失われる価値が厳密に同等ではないことがあります。 +いずれのタイプのステップでも、中間アドレスでは取得する価値と失う価値はほぼ同等です。トラストラインから同じ通貨の別のトラストラインへ残高がripplingするか、または以前に出されたオーダーに基づいて通貨が交換されます。場合によっては、[送金手数料](../transfer-fees.md)、AMM手数料、トラストライン残高の増減、または数値の丸め方が原因で、取得する価値と失われる価値が厳密に同等ではないことがあります。 [{% inline-svg file="/docs/img/paths-examples.ja.svg" /%}](/docs/img/paths-examples.ja.svg "3つのパスの例を示す図") @@ -65,7 +65,7 @@ XRPは任意のアドレスに直接送金できるため、[XRP間のトラン * トランザクションで(イシュアーに関係なく)1種類の通貨のみが使用される場合、デフォルトパスでは支払いが、関連するアドレスを通じてRipplingされると想定されます。このパスは、これらのアドレスがトラストラインで接続されている場合にのみ機能します。 * `SendMax`が省略されているか、または`SendMax`の`issuer`が送金元の場合、デフォルトパスが機能するためには送金元`Account`から宛先`Amount`の`issuer`へのトラストラインが必要です。 * `SendMax`と`Amount`に異なる`issuer`値が指定されており、そのいずれも送金元または受取人ではない場合、これらの2つのイシュアー間のトラストラインでRipplingが必要となるため、デフォルトパスは有用ではない可能性があります。一般にイシュアーが互いに直接信頼し合うことはお勧めしません。 -* クロスカレンシー支払いの場合、デフォルトパスは支払元通貨(`SendMax`フィールドで指定)と宛先通貨(`Amount`フィールドで指定)の間でオーダーブックを使用します。 +* クロスカレンシー支払いの場合、デフォルトパスは支払元通貨(`SendMax`フィールドで指定)と宛先通貨(`Amount`フィールドで指定)の間でオーダーブックやAMMを使用します。 有効なすべてのデフォルトパスを次の図に示します。 [{% inline-svg file="/docs/img/default-paths.ja.svg" /%}](/docs/img/default-paths.ja.svg "デフォルトパスの図") @@ -80,8 +80,8 @@ XRPは任意のアドレスに直接送金できるため、[XRP間のトラン | フィールド | 値 | 説明 | |:-----------|:-----------------------|:---------------------------------------| | `account` | 文字列 - アドレス | _(省略可)_ 指定されている場合、このパスステップは指定されたアドレスを通じたRipplingを表します。このステップに`currency`フィールドまたは`issuer`フィールドが指定されている場合は、このフィールドを指定しないでください。 | -| `currency` | 文字列 - 通貨コード | _(省略可)_ 指定されている場合、このパスステップはオーダーブックを通じた通貨の変換を表します。指定される通貨は新しい通貨を表します。このステップに`account`フィールドが指定されている場合は、このフィールドを指定しないでください。 | -| `issuer` | 文字列 - アドレス | _(省略可)_ 指定されている場合、このパスステップは通貨の変換を表し、このアドレスは新しい通貨のイシュアーを定義します。XRP以外の`currency`のステップでこのフィールドが省略されている場合、パスの直前のステップがイシュアーを定義します。`currency`が省略され、このフィールドが指定されている場合、イシュアーが異なる同名の通貨間でオーダーブックを使用するパスステップを示します。`currency`がXRPの場合は省略する必要があります。このステップに`account`フィールドが指定されている場合は、このフィールドを指定しないでください。 | +| `currency` | 文字列 - 通貨コード | _(省略可)_ 指定されている場合、このパスステップはオーダーブックやAMMを通じた通貨の変換を表します。指定される通貨は新しい通貨を表します。このステップに`account`フィールドが指定されている場合は、このフィールドを指定しないでください。 | +| `issuer` | 文字列 - アドレス | _(省略可)_ 指定されている場合、このパスステップは通貨の変換を表し、このアドレスは新しい通貨の発行者を定義します。XRP以外の`currency`のステップでこのフィールドが省略されている場合、パスの直前のステップが発行者を定義します。`currency`が省略され、このフィールドが指定されている場合、発行者が異なる同名の通貨間でオーダーブックやAMMを使用するパスステップを示します。`currency`がXRPの場合は省略する必要があります。このステップに`account`フィールドが指定されている場合は、このフィールドを指定しないでください。 | | `type` | 整数 | **廃止予定**_(省略可)_ 他にどのフィールドが指定されているかを示します。 | | `type_hex` | 文字列 | **廃止予定**: _(省略可)_`type`フィールドの16進数表現です。 | diff --git a/@i18n/ja/docs/concepts/tokens/index.md b/@i18n/ja/docs/concepts/tokens/index.md index f757c1cc35..dbd097db4c 100644 --- a/@i18n/ja/docs/concepts/tokens/index.md +++ b/@i18n/ja/docs/concepts/tokens/index.md @@ -8,7 +8,7 @@ labels: --- # トークン -XRP以外のすべての資産は、XRP Ledgerでは **トークン** として扱うことができます。通常のトークンは、アカウント間の[トラストライン](fungible-tokens/index.md) と呼ばれる関係で管理されます。すべてのアカウントは、トークンを保有することを許可する他のアカウントにあトークンを発行できますが、トークンを必要としないアカウントに一方的にトークンを配付することはできません。トークンは、台帳の外に存在する資産に裏付けられた「ステーブルコイン」、XRP Ledger上で独自に作成された純粋なデジタルトークン、コミュニティクレジットなど、様々な種類の価値を表すことが出来ます。 +XRP以外のすべての資産は、XRP Ledgerでは **トークン** として扱うことができます。通常のトークンは、アカウント間の[トラストライン](fungible-tokens/index.md) と呼ばれる関係で管理されます。すべてのアカウントは、トークンを保有することを許可する他のアカウントにはトークンを発行できますが、トークンを必要としないアカウントに一方的にトークンを配付することはできません。トークンは、台帳の外に存在する資産に裏付けられた「ステーブルコイン」、XRP Ledger上で独自に作成された純粋なデジタルトークン、コミュニティクレジットなど、様々な種類の価値を表すことが出来ます。 **注記:** XRP Ledger上のトークンは、過去に「IOUs」([I-owe-you](https://en.wikipedia.org/wiki/IOU)の略)および「発行済み通貨」とも呼ばれてきました。しかし、これらの呼称は、XRP Ledgerのトークンが表すことのできるデジタル資産の全範囲をカバーしていないため、望ましくないとされています。 diff --git a/@i18n/ja/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/download_shard.md b/@i18n/ja/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/download_shard.md index 95d0c42d8f..b2080d9214 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/download_shard.md +++ b/@i18n/ja/docs/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/download_shard.md @@ -110,7 +110,7 @@ _`download_shard`メソッドは、権限のないユーザは実行できない |:----------|:-------|:--------------------------------------------------------| | `message` | 文字列 | このリクエストに対応して実行されたアクションを説明するメッセージ。 | -**ヒント:** サーバで使用可能なシャードを確認するには、[crawl_shardsメソッド[]を使用します。または、シャードストアーとして設定されたロケーションのサブフォルダー(`rippled.cfg`の`[shard_db]`の`path`パラメーター)を調べます。フォルダーには、シャードの番号に対応する名前が付いています。これらのフォルダーの1つに、シャードが未完了であることを示す`control.txt`ファイルが含まれていることがあります。 +**ヒント:** サーバで使用可能なシャードを確認するには、[crawl_shardsメソッド][]を使用します。または、シャードストアーとして設定されたロケーションのサブフォルダー(`rippled.cfg`の`[shard_db]`の`path`パラメーター)を調べます。フォルダーには、シャードの番号に対応する名前が付いています。これらのフォルダーの1つに、シャードが未完了であることを示す`control.txt`ファイルが含まれていることがあります。 ### 考えられるエラー diff --git a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/ctid.md b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/ctid.md index 9de6c5d989..a4d51a7a74 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/ctid.md +++ b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/ctid.md @@ -12,7 +12,7 @@ CTID(トランザクション軽量識別子 / Compact Transaction Identifier CTIDとトランザクションの[識別ハッシュ](../../../concepts/transactions/index.md#identifying-transactions)の違いは以下の通りです: -- CTIDは、ネットワークID、レジャーインデックス、レジャー内の位置に基づいて検証されたトランザクションを識別します。トランザクションがどのネットワークで検証されたかを特定するため、サイドチェーンへの接続など、複数のネットワークとやりとりする状況で使用できます。CTIDは64ビットで、通常は`C`で始まる16進数の大文字で、例えば`C005523E000000`のように記述します。 +- CTIDは、ネットワークID、レジャーインデックス、レジャー内の位置に基づいて検証されたトランザクションを識別します。トランザクションがどのネットワークで検証されたかを特定するため、サイドチェーンへの接続など、複数のネットワークとやりとりする状況で使用できます。CTIDは64ビットで、通常は`C`で始まる16進数の大文字で、例えば`C005523E00000000`のように記述します。 - トランザクションの識別ハッシュは、そのトランザクションがどのチェーンで検証されたかに関係なく、その内容に基づいて署名されたトランザクションを識別します。これは暗号ハッシュであるため、トランザクションの内容が完全であることを証明するために使用することもできます。トランザクションハッシュは256ビットで、通常64文字の16進数で記述され、例えば`E08D6E9754025BA2534A78707605E0601F03ACE063687A0CA1BDDACFCD1698C7`となります。 **注意:** 未検証のトランザクションにCTIDを使わないでください。トランザクションが最初に適用されたときと、コンセンサスプロセスによって検証されたときとで、トランザクションの正規順序が変わる可能性があります。 diff --git a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/error-formatting.md b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/error-formatting.md index 74ad796cd2..05d62a9897 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/error-formatting.md +++ b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/error-formatting.md @@ -3,6 +3,8 @@ html: error-formatting.html parent: api-conventions.html seo: description: WebSocket、JSON-RPC、コマンドラインインターフェイスのエラーフォーマットと汎用エラーコードです。 +labels: + - 開発 --- # エラーのフォーマット @@ -16,7 +18,7 @@ seo: {% tabs %} {% tab label="WebSocket" %} -``` +```json { "id": 3, "status": "error", @@ -34,8 +36,9 @@ seo: {% /tab %} {% tab label="JSON-RPC" %} -``` +```json HTTP Status: 200 OK + { "result": { "error": "ledgerIndexMalformed", @@ -52,7 +55,7 @@ HTTP Status: 200 OK {% /tab %} {% tab label="コマンドライン" %} -``` +```json { "result": { "error": "ledgerIndexMalformed", @@ -73,18 +76,19 @@ HTTP Status: 200 OK ## WebSocketフォーマット -| `Field` | 型 | 説明 | -|:----------|:---------|:------------------------------------------------------| -| `id` | (場合により異なる) | このレスポンスのリクエスト元となったWeb Socketリクエストに指定されていたID | -| `status` | 文字列 | `"error"`: リクエストが原因でエラーが発生した場合 | -| `type` | 文字列 | 通常は`"response"`。これは、コマンドに対し正常にレスポンスしたことを示します。 | -| `error` | 文字列 | 発生したエラータイプの一意のコード。 | -| `request` | オブジェクト | このエラーが発生したリクエストのコピー(JSONフォーマット)。**注意:** リクエストにアカウントの機密情報が含まれている場合、ここにコピーされます。 | +| `Field` | 型 | 説明 | +|:--------------|:------|:------------------------------------------------------| +| `id` | (多様) | このレスポンスのリクエスト元となったWeb Socketリクエストに指定されていたID | +| `status` | 文字列 | `"error"`: リクエストが原因でエラーが発生した場合 | +| `type` | 文字列 | 通常は`"response"`。これは、コマンドに対し正常にレスポンスしたことを示します。 | +| `error` | 文字列 | 発生したエラータイプの一意のコード。 | +| `request` | オブジェクト | このエラーが発生したリクエストのコピー(JSONフォーマット)。**注意:** リクエストにアカウントの機密情報が含まれている場合、ここにコピーされます。 | +| `api_version` | 数値 | _(省略可)_ リクエストで`api_version`を指定していた場合は、その値。 | ## JSON-RPCフォーマット -一部のJSON-RPCリクエストは、HTTPレイヤーでエラーコードでレスポンスします。この場合、レスポンスはレスポンス本文にプレーンテキストで記述されます。たとえば`method`パラメーターでコマンドを指定し忘れた場合、レスポンスは次のようになります。 +一部のJSON-RPCリクエストは、HTTPレイヤーでエラーコードでレスポンスします。この場合、レスポンスはレスポンス本文にプレーンテキストで記述されます。たとえば`method`パラメータでコマンドを指定し忘れた場合、レスポンスは次のようになります。 ``` HTTP Status: 400 Bad Request @@ -105,14 +109,19 @@ HTTPステータスコード200 OKが返されるその他のエラーの場合 すべてのメソッドは、以下のいずれかの値の`error`コードを返す可能性があります。 -* `unknownCmd` - リクエストに、`rippled`サーバが認識する[コマンド](../index.md)が含まれていません。 -* `jsonInvalid` -(WebSocketのみ)リクエストは適切なJSONオブジェクトではありません。 - * この場合JSON-RPCは、代わりに400 Bad Request HTTPエラーを返します。 -* `missingCommand` -(WebSocketのみ)リクエストに`command`フィールドが指定されていませんでした。 - * この場合JSON-RPCは、代わりに400 Bad Request HTTPエラーを返します。 -* `tooBusy` - サーバの負荷が高すぎるため、現在このコマンドを実行できません。管理者として接続している場合は、通常このエラーが返されることはありません。 -* `noNetwork` - サーバとXRP Ledgerピアツーピアネットワークのその他の部分との接続で問題が発生しています(サーバがスタンドアロンモードで実行されていません)。 -* `noCurrent` - 高い負荷、ネットワークの問題、バリデータ障害、誤った構成、またはその他の問題が原因で、サーバが現行のレジャーを認識できません。 -* `noClosed` - サーバに決済済みレジャーがありません。通常、このエラーは起動が完了していないことが原因で発生します。 -* `wsTextRequired` -(WebSocketのみ)リクエストの[opcode](https://tools.ietf.org/html/rfc6455#section-5.2)がテキストではありません。 -* `amendmentBlocked` - サーバの状態が[Amendment blocked](../../../concepts/networks-and-servers/amendments.md#amendment-blocked)であるため、XRP Ledgerネットワークとの同期を維持するために最新バージョンに更新する必要があります。 +- `amendmentBlocked` - サーバの状態が[Amendmentブロック](../../../concepts/networks-and-servers/amendments.md#amendment-blocked)されたであるため、XRP Ledgerネットワークとの同期を維持するために最新バージョンに更新する必要があります。 +- `failedToForward` - ([レポートモード][]のサーバのみ)サーバはこのリクエストをP2Pモードサーバに転送しようとしましたが、接続に失敗しました。 +- `invalid_API_version` - サーバはリクエストの[APIバージョン番号](request-formatting.md#apiのバージョン管理)をサポートしていません。 +- `jsonInvalid` -(WebSocketのみ)リクエストは適切なJSONオブジェクトではありません。 + - この場合JSON-RPCは、代わりに400 Bad Request HTTPエラーを返します。 +- `missingCommand` -(WebSocketのみ)リクエストに`command`フィールドが指定されていませんでした。 + - この場合JSON-RPCは、代わりに400 Bad Request HTTPエラーを返します。 +- `noClosed` - サーバに閉鎖済みレジャーがありません。通常、このエラーは起動が完了していないことが原因で発生します。 +- `noCurrent` - 高い負荷、ネットワークの問題、バリデータ障害、誤った構成、またはその他の問題が原因で、サーバが現行のレジャーを認識できません。 +- `noNetwork` - サーバとXRP Ledgerピアツーピアネットワークのその他の部分との接続で問題が発生しています(サーバがスタンドアロンモードで実行されていません)。 +- `unknownCmd` - リクエストに、`rippled`サーバが認識する[コマンド](../index.md)が含まれていません。 +- `tooBusy` - サーバの負荷が高すぎるため、現在このコマンドを実行できません。管理者として接続している場合は、通常このエラーが返されることはありません。 +- `wsTextRequired` -(WebSocketのみ)リクエストの[opcode](https://tools.ietf.org/html/rfc6455#section-5.2)がテキストではありません。 + + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/request-formatting.md b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/request-formatting.md index 3bbe05f8f8..ee1581a7e7 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/request-formatting.md +++ b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/request-formatting.md @@ -6,71 +6,135 @@ seo: --- # リクエストのフォーマット -## WebSocketフォーマット - -`rippled`サーバへのWebSocketを開いた後、以下の属性を使用して、コマンドを[JSON](https://en.wikipedia.org/wiki/JSON)オブジェクトとして送信できます。 - -* コマンド名を最上位の`"command"`フィールドに指定します。 -* このコマンドのすべての関連パラメーターも最上位に指定します。 -* オプションで、任意の値を指定した`"id"`フィールドを指定します。このリクエストへのレスポンスでは、同一の`"id"`フィールドを使用します。そうすることで、レスポンスが順不同で到達した場合も、どのリクエストによってどのレスポンスを得られたのかがわかります。 - -レスポンスはJSONオブジェクトとして返されます。 - -## JSON-RPCフォーマット - -JSON-RPCリクエストを実行するには、`rippled`サーバがJSON-RPC接続をリッスンしているポートおよびIPで、HTTP **POST**リクエストをルートパス(`/`)に送信します。HTTP/1.0またはHTTP/1.1を使用できます。HTTPSを使用する場合は、TLS v1.2を使用してください。セキュリティ上の理由から、`rippled`ではSSL v3以前を _サポートしていません_ 。 - -常に`Content-Type`ヘッダー(値`application/json`)を指定してください。 - -複数のリクエストを実行する予定の場合は、リクエスト間で接続を閉じてから開く操作を行わずに済むように、[Keep-Alives](http://tools.ietf.org/html/rfc7230#section-6.3)を使用してください。 - -以下の属性を指定したリクエスト本文を[JSON](https://en.wikipedia.org/wiki/JSON)オブジェクトとして送信します。 - -* コマンドを最上位の`"method"` フィールドに指定します。 -* 最上位の`"params"`フィールドを指定します。このフィールドの内容は、コマンドのすべてのパラメーターが指定された1つの入れ子JSONオブジェクトのみを保持している**1要素配列**です。 - -レスポンスもJSONオブジェクトです。 - -## コマンドライン形式 - -コマンドラインでは、通常の(ダッシュが先頭に付いた)コマンドラインオプションの後にコマンドを指定し、その後に一連の限定的なパラメーターをスペースで区切って指定します。スペースやその他の特殊文字が含まれている可能性のあるパラメーター値は、一重引用符で囲みます。 - -### リクエストの例 +## リクエストの例 {% tabs %} {% tab label="WebSocket" %} -``` +```json { - "id": 2, - "command": "account_info", - "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "strict": true, - "ledger_index": "validated" + "id": 2, + "command": "account_info", + "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", + "strict": true, + "ledger_index": "validated", + "api_version": 1 } ``` {% /tab %} {% tab label="JSON-RPC" %} -``` +```json POST http://s1.ripple.com:51234/ +Content-Type: application/json + { - "method": "account_info", - "params": [ - { - "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "strict": true, - "ledger_index": "validated" - } - ] + "method": "account_info", + "params": [ + { + "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", + "strict": true, + "ledger_index": "validated", + "api_version": 1 + } + ] } ``` {% /tab %} {% tab label="コマンドライン" %} -``` -rippled account_info r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 validated true +```sh +rippled account_info r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 validated strict ``` {% /tab %} {% /tabs %} + + +## WebSocketフォーマット + +`rippled`サーバへのWebSocketを開いた後、以下のフィールドを使用して、コマンドを[JSON](https://ja.wikipedia.org/wiki/JSON)オブジェクトとして送信できます。 + +| フィールド | 型 | 説明 | +|:--------------------|:----------|:-------------------------------------------| +| `command` | 文字列 | [APIメソッド](../public-api-methods/index.md)の名前。 | +| `id` | (多種) | _(省略可)_ リクエストを識別するための一意な値。このリクエストに対するレスポンスも同じ `id` フィールドを使用します。これにより、レスポンスが順番通りに返ってこない場合でも、どのリクエストがどのレスポンスを返したのかを知ることができます。 | +| `api_version` | 数値 | _(省略可)_ 使用するAPIのバージョン。省略時はバージョン1を使用します。詳細については、[APIのバージョン管理](#api-versioning)をご覧ください。 | +| (メソッドのパラメータ) | (多種) | トップレベルのメソッドに任意のパラメータを指定します。 | + +サーバからのレスポンスについては[レスポンスのフォーマット](response-formatting.md)をご覧ください。 + +## JSON-RPCフォーマット + +JSON-RPCリクエストを実行するには、`rippled`サーバがJSON-RPC接続をリッスンしているポートおよびIPで、HTTP **POST**リクエストをルートパス(`/`)に送信します。HTTP/1.0またはHTTP/1.1を使用できます。HTTPSを使用する場合は、TLS v1.2を使用してください。セキュリティ上の理由から、`rippled`ではSSL v3以前を _サポートしていません_ 。 + +`Content-Type`ヘッダ(値`application/json`)を常に指定してください。 + +複数のリクエストを実行する場合は、リクエスト間で再接続を行わずに済むように、[Keep-Alives](http://tools.ietf.org/html/rfc7230#section-6.3)を使用してください。 + +以下のフィールドを指定したリクエストボディを[JSON](https://en.wikipedia.org/wiki/JSON)オブジェクトとして送信します。 + + +| フィールド | 型 | 説明 | +|:--------------------|:----------|:-------------------------------------------| +| `method` | 文字列 | [APIメソッド](../public-api-methods/index.md)の名前。 | +| `params` | 配列 | _(省略可)_ このメソッドのパラメータを持つネストされたJSONオブジェクトを含む**一要素の配列**。メソッドがパラメータを必要としない場合は、このフィールドを省略できます。 | + +`params`配列内のオブジェクトには以下のフィールドを含めることができます。 + +| フィールド | 型 | 説明 | +|:--------------------|:----------|:-------------------------------------------| +| `api_version` | 数値 | _(省略可)_ 使用するAPIのバージョン。省略時はバージョン1を使用します。詳細については、[APIのバージョン管理](#api-versioning)をご覧ください。 | +| (Method Parameters) | (多種) | メソッドで利用する任意のパラメータ。 | + +サーバからのレスポンスについては[レスポンスのフォーマット](response-formatting.md)をご覧ください。 + +## コマンドライン形式 + +APIのメソッド名は、通常の(ダッシュで始まる)コマンドラインオプションの後に、スペースで区切られた一部のパラメータを続けて指定します。スペースやその他の特殊文字を含む可能性のあるパラメータ値については、シングルクォートで囲んでください。すべてのメソッドがコマンドラインAPI構文を持っているわけではありません。詳しくは、[コマンドラインの使い方](../../../infrastructure/commandline-usage.md#client-mode-options)をご覧ください。 + +コマンドラインはJSON-RPCを呼び出すため、そのレスポンスは常にJSON-RPCの[レスポンスのフォーマット](response-formatting.md)と一致します。 + +コマンドラインは常に最新の[APIバージョン](#api-versioning)を使用します。 + +**注意:** コマンドラインインターフェイスは管理目的でのみ使用することを意図しており、_サポートされているAPIではありません_です。新しいバージョンの`rippled`では、警告なしにコマンドラインAPIに破壊的な変更が導入される可能性があります! + + +## APIのバージョン管理 + +`rippled`サーバは、使用するAPIバージョンを識別するために単一の整数を使用します。現在、`1`と`2`{% badge href="https://github.com/XRPLF/rippled/releases/tag/2.0.0" %}新規: rippled 2.0.0{% /badge %}の2つのAPIバージョンがあります。サーバは`version`APIメソッドでサポートされるAPIバージョンの範囲を報告します。 + +それぞれのAPIバージョンは、破壊的な変更が導入されるときに新しいAPIバージョン番号を導入します。プレリリースやベータ、開発バージョンでは、同じAPIバージョン番号で破壊的な変更を導入することがあり、`account_tx`リクエストを使用してAPIバージョン2を使用し、同じ接続でAPIバージョン1を使用して別の`account_tx`リクエストを行うことができます。 + +将来の`rippled`のバージョンで破壊的な変更が導入されると、新しいAPIバージョン3が導入されます。 + + +### 破壊的変更 + +次の種類の変更は**破壊的変更**です。 + +- リクエストやレスポンスのフィールドの削除や名前の変更 +- リクエストやレスポンスのフィールドの型の変更 +- リクエストやレスポンスのフィールドの意味の変更 +- リクエストやレスポンスのフィールドの位置の変更、または他のリクエストやレスポンスのフィールドの前への新しいフィールドの追加 +- APIメソッドの削除や名前の変更 +- 既存のクライアントから確認できるAPI関数の動作の変更 +- 次の種類の変更は、gRPC APIにのみ適用されます。 + - `proto`フィールド番号の変更 + - 列挙型または列挙型値の削除または名前の変更 + - `oneof`からのフィールドの追加または削除 + - `oneof`の分割または統合 + - メッセージフィールドが`optional`、`repeated`、または`required`であるかの変更 + - リクエストまたはレスポンスのストリーム値の変更 + - パッケージまたはサービスの削除または名前の変更 + +フルリリースで破壊的変更が加えられると、新しいAPIバージョン番号が導入されます。プレリリース版、ベータ版、開発版では、同じAPIバージョン番号に変更を加えることがあります。 + +### 非破壊的変更 + +次の種類の変更は**非破壊的変更**であり、APIバージョン番号の変更なしに発生する可能性があります。 + +- パラメータの位置の変更を含まない、新しいフィールドの追加 +- 新しいAPIメソッドの追加 + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/response-formatting.md b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/response-formatting.md index c7794afa80..90e3ef47ac 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/api-conventions/response-formatting.md +++ b/@i18n/ja/docs/references/http-websocket-apis/api-conventions/response-formatting.md @@ -6,17 +6,20 @@ seo: --- # レスポンスのフォーマット -`rippled` APIからのレスポンスのフォーマットは、メソッドが呼び出されたインターフェイス(WebSocket、JSON-RPC、コマンドライン)に応じて多少異なります。コマンドラインインターフェイスがJSON-RPCを呼び出すため、コマンドラインインターフェイスとJSON-RPCインターフェイスは同じフォーマットを使用します。 +`rippled`APIからのレスポンスのフォーマットは、メソッドが呼び出されたインターフェイス(WebSocket、JSON-RPC、コマンドライン)に応じて多少異なります。コマンドラインインターフェイスがJSON-RPCを呼び出すため、コマンドラインインターフェイスとJSON-RPCインターフェイスは同じフォーマットを使用します。 成功した場合のレスポンスに含まれるフィールドは、以下の通りです。 -| `Field` | 型 | 説明 | -|:----------------|:---------|:------------------------------------------------| -| `id` | (場合により異なる) | (WebSocketのみ)このレスポンスのリクエスト元となったリクエストで指定されているID。 | -| `status` | 文字列 | (WebSocketのみ)値が`success`である場合、リクエストがサーバによって正常に受信され、理解されたことを示します。 | -| `result.status` | 文字列 | (JSON-RPCおよびコマンドライン)値が`success`である場合、リクエストがサーバによって正常に受信され、理解されたことを示します。 | -| `type` | 文字列 | (WebSocketのみ)値が`response`の場合、コマンドに対する正常なレスポンスであることを示します。[非同期の通知](../public-api-methods/subscription-methods/subscribe.md)では、`ledgerClosed`や`transaction`など異なる値が使用されます。 | -| `result` | オブジェクト | クエリーの結果。内容はコマンドによって異なります。 | +| `Field` | 型 | 説明 | +|:----------------|:-----------|:------------------------------------------------| +| `id` | (場合により異なる) | (WebSocketのみ)このレスポンスのリクエスト元となったリクエストで指定されているID。 | +| `status` | 文字列 | (WebSocketのみ)値が`success`である場合、リクエストがサーバによって正常に受信され、理解されたことを示します。 | +| `result.status` | 文字列 | (JSON-RPCおよびコマンドライン)値が`success`である場合、リクエストがサーバによって正常に受信され、理解されたことを示します。 | +| `type` | 文字列 | (WebSocketのみ)値が`response`の場合、コマンドに対する正常なレスポンスであることを示します。[非同期の通知](../public-api-methods/subscription-methods/subscribe.md)では、`ledgerClosed`や`transaction`など異なる値が使用されます。 | +| `result` | オブジェクト | クエリーの結果。内容はコマンドによって異なります。 | +| `warning` | 文字列 | _(省略可)_ このフィールドが存在する場合、値は文字列`load`です。これはクライアントがサーバがこのクライアントを切断する[レートリミット](rate-limiting.md)の閾値に近づいていることを意味します。 | +| `warnings` | 配列 | _(省略可)_ このフィールドが存在する場合、重要な警告を含む1つ以上の**Warningsオブジェクト**が含まれます。詳細については、[API警告](#apiの警告)をご覧ください。 | +| `forwarded` | 真偽値 | _(省略可)_ `true`の場合、このリクエストとレスポンスは[レポートモード][]サーバからP2Pモードサーバに転送されます。デフォルトは`false`です。 | ## 成功した場合のレスポンスの例 @@ -24,32 +27,33 @@ seo: {% tabs %} {% tab label="WebSocket" %} -``` +```json { - "id": 2, - "status": "success", - "type": "response", - "result": { - "account_data": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Balance": "27389517749", - "Flags": 0, - "LedgerEntryType": "AccountRoot", - "OwnerCount": 18, - "PreviousTxnID": "B6B410172C0B65575D89E464AF5B99937CC568822929ABF87DA75CBD11911932", - "PreviousTxnLgrSeq": 6592159, - "Sequence": 1400, - "index": "4F83A2CF7E70F77F79A307E6A472BFC2585B806A70833CCD1C26105BAE0D6E05" - }, - "ledger_index": 6760970 - } + "id": 2, + "status": "success", + "type": "response", + "result": { + "account_data": { + "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", + "Balance": "27389517749", + "Flags": 0, + "LedgerEntryType": "AccountRoot", + "OwnerCount": 18, + "PreviousTxnID": "B6B410172C0B65575D89E464AF5B99937CC568822929ABF87DA75CBD11911932", + "PreviousTxnLgrSeq": 6592159, + "Sequence": 1400, + "index": "4F83A2CF7E70F77F79A307E6A472BFC2585B806A70833CCD1C26105BAE0D6E05" + }, + "ledger_index": 6760970 + } } ``` {% /tab %} {% tab label="JSON-RPC" %} -``` +```json HTTP Status: 200 OK + { "result": { "account_data": { @@ -71,7 +75,7 @@ HTTP Status: 200 OK {% /tab %} {% tab label="コマンドライン" %} -``` +```json { "result": { "account_data": { @@ -93,3 +97,102 @@ HTTP Status: 200 OK {% /tab %} {% /tabs %} + + +## APIの警告 + +レスポンスに`warnings`の配列が含まれる場合、その配列の各要素はサーバからの個別の警告を表します。このような**警告オブジェクト**はそれぞれ以下のフィールドを含みます: + +| フィールド | 型 | 説明 | +|:----------|:-----------|:--------------------------------------------------------| +| `id` | 数値 | この警告メッセージの一意の数値コード。 | +| `message` | 文字列 | このメッセージの原因を説明する人間が読める文字列。このメッセージの内容に依存するようなソフトウェアを書かないでください。代わりに`id`(および`details`(もしあれば))を使って警告を識別してください。 | +| `details` | オブジェクト | _(省略可)_ この警告に関する追加情報。内容は警告の種類によって異なります。 | + +以下の資料では、考えられるすべての警告について説明しています。 + +### 1001. Unsupported amendments have reached majority + +警告の例: + +```json +"warnings" : [ + { + "details" : { + "expected_date" : 864030, + "expected_date_UTC" : "2000-Jan-11 00:00:30.0000000 UTC" + }, + "id" : 1001, + "message" : "One or more unsupported amendments have reached majority. Upgrade to the latest version before they are activated to avoid being amendment blocked." + } +] +``` + +この警告は、XRP Ledgerプロトコルの1つ以上の[Amendment](../../../concepts/networks-and-servers/amendments.md)が有効になる予定であるが、現在のサーバにはそれらのAmendmentの実装がないことを示しています。これらのAmendmentが有効になると、現在のサーバは[Amendmentブロック](../../../concepts/networks-and-servers/amendments.md#amendment-blocked-servers)されるため、できるだけ早く[最新の`rippled`バージョンにアップグレード](../../../infrastructure/installation/index.md)する必要があります。 + +サーバは、この警告を送信するのは、クライアントが[管理者として接続している](../../../tutorials/http-websocket-apis/build-apps/get-started.md#admin-access)場合のみです。 + +この警告には、以下のフィールドを含む`details`フィールドが含まれます。 + +| フィールド | 型 | 説明 | +|:--------------------|:-------|:----------------------------------------------| +| `expected_date` | 数値 | サポートされていない最初のAmendmentが有効になると予想される時刻([リップルエポックからの秒数][])。| +| `expected_date_UTC` | 文字列 | サポートされていない最初のAmendmentが有効になると予想される時刻(UTCでのタイムスタンプ)。 | + +レジャーのクローズ時間の変動により、これらはおおよその時刻となります。また、指定された時刻までにAmendmentが80%以上のバリデータからサポートされ続けない場合、Amendmentが有効にならず、期待された時刻にAmendmentが有効にならない可能性があります。サポートされていないAmendmentが有効にならない限り、サーバはAmendmentブロックされません。 + + +### 1002. This server is amendment blocked + +警告の例: + +```json +"warnings" : [ + { + "id" : 1002, + "message" : "This server is amendment blocked, and must be updated to be able to stay in sync with the network." + } +] +``` + +この警告は、サーバが[Amendmentブロック](../../../concepts/networks-and-servers/amendments.md)され、同期を取ることができなくなったことを示しています。 + +サーバの管理者は、アクティブ化されたAmendmentをサポートするバージョンに[`rippled`をアップグレード](../../../infrastructure/installation/index.md)する必要があります。 + +### 1003. This is a reporting server + +警告の例: + +```json +"warnings" : [ + { + "id" : 1003, + "message" : "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" + } +] +``` + +この警告は、リクエストに応答するサーバが[レポートモード][]で実行されていることを示しています。レポートモードはピアツーピアネットワークに接続せず、まだ検証されていないレジャーデータを追跡しないため、一部のAPIメソッドが利用できないか、異なる動作をすることがあります。 + +一般的に、この警告は無視しても安全です。 + +**注意:** レポートモードで検証されていないデータをリクエストする場合、明示的に[レジャーバージョンを指定][レジャーの指定]しない限り、レポートモードはデフォルトで最新の検証済みレジャーを使用します。 + + +## 関連項目 + +- [リクエストのフォーマット](request-formatting.md) +- [エラーのフォーマット](error-formatting.md): APIレスポンスの失敗 +- **コンセプト:** + - [`rippled`サーバ](../../../concepts/networks-and-servers/index.md) + - [コンセンサス](../../../concepts/consensus-protocol/index.md) + - [Amendment](../../../concepts/networks-and-servers/amendments.md) + - [既知のAmendment](/resources/known-amendments.md) +- **チュートリアル:** + - [XRP LedgerのAPIを触ってみよう](../../../tutorials/http-websocket-apis/build-apps/get-started.md) + - [`rippled`のインストールと更新](../../../infrastructure/installation/index.md) +- **リファレンス:** + - [featureメソッド][] + - [server_infoメソッド][] + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md index ffcf950d0a..3a1a111054 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md @@ -14,16 +14,17 @@ labels: アカウントの`account_objects`レスポンスに含まれる可能性のあるオブジェクトのタイプには以下のものがあります。 -- [Offerエントリ](../../../protocol/ledger-data/ledger-entry-types/offer.md): 現在処理中であり、資金化されていない、または有効期限切れで削除されていない注文情報。(詳細は、[オファーのライフサイクル](../../../../concepts/tokens/decentralized-exchange/offers.md#オファーのライフサイクル)をご覧ください。) -- [RippleStateエントリ](../../../protocol/ledger-data/ledger-entry-types/ripplestate.md): このアカウント側がデフォルト状態にないトラストライン。 -- アカウントの[SignerList](../../../protocol/ledger-data/ledger-entry-types/signerlist.md): アカウントで[マルチシグ](../../../../concepts/accounts/multi-signing.md)が有効な場合。 -- [Escrowエントリ](../../../../concepts/payment-types/escrow.md): 実行されていないかまたはキャンセルされていない保留中の支払い。 -- [PayChannelエントリ](../../../protocol/ledger-data/ledger-entry-types/paychannel.md): 現在開いているペイメントチャネル。 +- [Bridgeエントリ](../../../protocol/ledger-data/ledger-entry-types/bridge.md): クロスチェーンブリッジ向けs. _([XChainBridge amendment][]が必要です {% not-enabled /%})_ - [Checkエントリ](../../../protocol/ledger-data/ledger-entry-types/check.md): 保留中のCheck。 - [DepositPreauthエントリ](../../../protocol/ledger-data/ledger-entry-types/depositpreauth.md): 入金の事前承認。 -- [Ticketエントリ](../../../../concepts/accounts/tickets.md): Ticket情報。 +- [Escrowエントリ](../../../../concepts/payment-types/escrow.md): 実行されていないかまたはキャンセルされていない保留中の支払い。 - [NFTokenOfferエントリ](../../../protocol/ledger-data/ledger-entry-types/nftokenoffer.md): NFTを購入・売却するためのオファー。 - [NFTokenPageエントリ](../../../protocol/ledger-data/ledger-entry-types/nftokenpage.md): NFTの集合。 {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.11.0" %}新規: rippled 1.11.0{% /badge %} +- [Offerエントリ](../../../protocol/ledger-data/ledger-entry-types/offer.md): 現在処理中であり、資金化されていない、または有効期限切れで削除されていない注文情報。(詳細は、[オファーのライフサイクル](../../../../concepts/tokens/decentralized-exchange/offers.md#オファーのライフサイクル)をご覧ください。) +- [PayChannelエントリ](../../../protocol/ledger-data/ledger-entry-types/paychannel.md): 現在開いているペイメントチャネル。 +- [RippleStateエントリ](../../../protocol/ledger-data/ledger-entry-types/ripplestate.md): このアカウント側がデフォルト状態にないトラストライン。 +- アカウントの[SignerList](../../../protocol/ledger-data/ledger-entry-types/signerlist.md): アカウントで[マルチシグ](../../../../concepts/accounts/multi-signing.md)が有効な場合。 +- [Ticketエントリ](../../../../concepts/accounts/tickets.md): Ticket情報。 ## リクエストのフォーマット @@ -81,7 +82,7 @@ rippled account_objects r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 validated | `ledger_index` | [レジャーインデックス][] | いいえ | 使用するレジャーの[レジャーインデックス][]、またはレジャーを自動的に選択するためのショートカット文字列。([レジャーの指定][]ををご覧ください) | | `limit` | 符号なし整数 | いいえ | 結果に含めることができるオブジェクトの最大数。非管理者接続では10以上400以下の範囲で値を指定する必要があります。デフォルトでは200です。 | | `marker` | [マーカー][] | いいえ | 以前にページネーションされたレスポンスの値。そのレスポンスを停止した箇所からデータの取得を再開します。 | -| `type` | 文字列 | いいえ | 指定されている場合、結果をフィルタリングしてこのタイプのレジャーオブジェクトのみが含まれるようにします。有効なタイプは`check`、`deposit_preauth`、`escrow`、`offer`、`payment_channel`、`signer_list`、`state`(トラストライン)そして`ticket`です。 | +| `type` | 文字列 | いいえ | 指定されている場合、結果をフィルタリングしてこのタイプのレジャーオブジェクトのみが含まれるようにします。有効なタイプは`bridge`, `check`、`deposit_preauth`、`escrow`、`nft_offer`, `nft_page`, `offer`、`payment_channel`、`signer_list`、`state`(トラストライン)そして`ticket`です。 | **注記:** `account_objects`コマンドのコマンドラインインタフェースは`type`フィールドを受け付けません。代わりにコマンドラインでJSON-RPC形式のリクエストを送信するには[jsonメソッド][]を使用してください。 diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_tx.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_tx.md index 861d399c57..1f2dc8c468 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_tx.md +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_tx.md @@ -4,8 +4,8 @@ parent: account-methods.html seo: description: 指定したアカウントに関連するトランザクションのリストを取得します。 labels: - - Accounts - - Payments + - アカウント + - 支払い --- # account_tx [[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/rpc/handlers/AccountTx.cpp "Source") @@ -23,7 +23,7 @@ labels: { "id": 2, "command": "account_tx", - "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", + "account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", "ledger_index_min": -1, "ledger_index_max": -1, "binary": false, @@ -39,7 +39,7 @@ labels: "method": "account_tx", "params": [ { - "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", + "account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", "binary": false, "forward": false, "ledger_index_max": -1, @@ -53,8 +53,9 @@ labels: {% tab label="コマンドライン" %} ```sh -#Syntax account_tx account ledger_index_min ledger_index_max [offset] [limit] [binary] [count] [forward] -rippled -- account_tx r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 -1 -1 2 5 1 0 1 +# Syntax: account_tx account [ledger_index_min [ledger_index_max]] [limit] [offset] [binary] [count] [descending] +# For binary/count/descending, use the parameter name for true and omit for false. +rippled -- account_tx rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w -1 -1 2 0 binary descending ``` {% /tab %} @@ -66,19 +67,20 @@ rippled -- account_tx r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 -1 -1 2 5 1 0 1 | `Field` | 型 | 説明 | |:-------------------|:-------------------------------------------|:-----------| -| `account` | 文字列 | アカウントの一意のIDであり、最も一般的にはアカウントのアドレスが使用されます。 | -| `ledger_index_min` | 整数 | _(省略可能)_ 含めるトランザクションのレジャーのうち最古のものを指定するのに使用します。`-1`の値は、使用可能な検証済みレジャーのうち最古のバージョンを使用するよう、サーバに指示します。 | -| `ledger_index_max` | 整数 | _(省略可能)_ 含めるトランザクションのレジャーのうち最新のものを指定するのに使用します。`-1`の値は、使用可能な検証済みレジャーのうち最新のバージョンを使用するよう、サーバに指示します。 | -| `ledger_hash` | 文字列 | _(省略可能)_ 単一のレジャーからのみトランザクションを検索するのに使用します。([レジャーの指定][]をご覧ください) | +| `account` | 文字列 | アカウントの一意のIDであり、最も一般的なアカウントのアドレスが使用されます。 | +| `tx_type` | 文字列 | _(省略可)_ **Clioのみ** "Clawback"、"AccountSet"、"AccountDelete "など、特定のタイプのトランザクションのみを返します。 See [Transaction Types](../../../../references//protocol/transactions/types/index.md#transaction-types). [新規: Clio v2.0](https://github.com/XRPLF/clio/releases/tag/2.0.0 "BADGE_BLUE") [AMMのサポート: Clio v2.1.0](https://github.com/XRPLF/clio/releases/tag/2.1.0 "BADGE_GREEN") | +| `ledger_index_min` | 整数 | [API v1][]: _(省略可能)_ 含めるトランザクションのレジャーのうち最古のものを指定するのに使用します。`-1`の値は、使用可能な検証済みレジャーのうち最古のバージョンを使用するよう、サーバに指示します。
[API v2][]: v1と同じですが、サーバが持つレジャーの範囲を超えて値を指定すると`lgrIdxMalformed`エラーを返します。 | +| `ledger_index_max` | 整数 | _(省略可能)_ 含めるトランザクションのレジャーのうち最新のものを指定するのに使用します。`-1`の値は、使用可能な検証済みレジャーのうち最新のバージョンを使用するよう、サーバに指示します。
[API v2][]: v1と同じですが、サーバが持つレジャーの範囲を超えて値を指定すると`lgrIdxMalformed`エラーを返します。 | +| `ledger_hash` | 文字列 | [API v1][]: _(省略可能)_ 単一のレジャーからのみトランザクションを検索するのに使用します。([レジャーの指定][]をご覧ください) | | `ledger_index` | 文字列または符号なし整数 | _(省略可能)_ 単一のレジャーからのみトランザクションを検索するのに使用します。([レジャーの指定][]をご覧ください) | -| `binary` | ブール値 | _(省略可能)_ デフォルトは`false`です。`true`に設定すると、JSONの代わりに16進文字列でトランザクションが返されます。 | -| `forward` | ブール値 | _(省略可能)_ デフォルトは`false`です。`true`に設定すると、最も古いレジャーを先頭としてインデックスが付けられた値が返されます。そうしない場合、最新のレジャーを先頭として結果にインデックスが付けられます。(結果を示した各ページの中身は順序よく整理されていない場合がありますが、ページ全体としては順序付けされています。) | +| `binary` | ブール値 | [API v1][]: _(省略可能)_ デフォルトは`false`です。`true`に設定すると、JSONの代わりに16進文字列でトランザクションが返されます。
[API v2][]: v1と同じですが、 真偽値以外の値を指定すると`invalidParams`エラーを返します。 | +| `forward` | ブール値 | [API v1][]: _(省略可能)_ デフォルトは`false`です。`true`に設定すると、最も古いレジャーを先頭としてインデックスが付けられた値が返されます。そうしない場合、最新のレジャーを先頭として結果にインデックスが付けられます。(結果を示した各ページの中身は順序よく整理されていない場合がありますが、ページ全体としては順序付けされています。)
[API v2][]: v1と同じですが、 真偽値以外の値を指定すると`invalidParams`エラーを返します。 | | `limit` | 整数 | _(省略可能)_ デフォルトは変化します。取得するトランザクションの数を制限します。サーバはこの値を受け入れる必要はありません。 | | `marker` | [マーカー][] | 以前にページネーションされたレスポンスの値。そのレスポンスを停止した箇所からデータの取得を再開します。サーバが使用できるレジャーの範囲に変更があっても、この値は変わりません。 | -次の各フィールドは省略可能とされていますが、リクエスト内で**1つ以上は使用する必要があります**: `ledger_index`、`ledger_hash`、`ledger_index_min`、または`ledger_index_max`。 +- リクエスト内で次の各フィールドのうち1つ以上を使用する必要があります: `ledger_index`、`ledger_hash`、`ledger_index_min`、または`ledger_index_max`。 +- [API v2]: `ledger_index` と `ledger_hash` のどちらかを指定した場合、`ledger_index_min` と `ledger_index_max` を含めると `invalidParams` エラーが返ります。 -次のフィールドは廃止されました: `offset`、`count`、`descending`、`ledger_max`、`ledger_min`。 {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.7.0" %}削除: rippled 1.7.0{% /badge %} ### 照会されたデータの繰り返し @@ -95,14 +97,167 @@ rippled -- account_tx r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 -1 -1 2 5 1 0 1 {% tab label="WebSocket" %} ```json { - "id": 2, - "status": "success", - "type": "response", + "id": 2, + "result": { + "account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "ledger_index_max": 57111999, + "ledger_index_min": 55886305, + "limit": 2, + "marker": { + "ledger": 57111981, + "seq": 16 + }, + "transactions": [ + { + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "Balance": "3732969177079", + "Flags": 131072, + "OwnerCount": 0, + "Sequence": 702817 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "140FA03FE8C39540CA8189BC7A7956795C712BC0A542C6409C041150703C8574", + "PreviousFields": { + "Balance": "3713891690008" + }, + "PreviousTxnID": "D58864C16344ADCC15995C7986CFC607CB693E88F84D2E019F0A35FB29749202", + "PreviousTxnLgrSeq": 57111994 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg", + "Balance": "40010160", + "Flags": 131072, + "OwnerCount": 0, + "Sequence": 466334 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "CC20FEBEA6D2AF969EC46F2BD92684D9FBABC3F238E841B5E056FE4EBF4379A9", + "PreviousFields": { + "Balance": "19117497271", + "Sequence": 466333 + }, + "PreviousTxnID": "F6B8274D3D419A95A59681E5F55578084C395FF9051924360CA3EA745F5581E8", + "PreviousTxnLgrSeq": 57111993 + } + } + ], + "TransactionIndex": 25, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "19077487071" + }, + "tx": { + "Account": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg", + "Amount": "19077487071", + "Destination": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "DestinationTag": 1, + "Fee": "40", + "Flags": 2147483648, + "LastLedgerSequence": 57112020, + "Sequence": 466333, + "SigningPubKey": "0381575032E254BF4D699C3D8D6EFDB63B3A71F97475C6F6885BC7DAEEE55D9A01", + "TransactionType": "Payment", + "TxnSignature": "3045022100CFC5FD057C7C685C690637AD1E639E2642BBC00EFD8E06E3F6C72FA924BC99D40220317D0708E814F69F874D641B6732E37A53B1220B493B2B8390D9EF51E8062515", + "date": 649200260, + "hash": "46BF0B576677B0DEA2D94591424A57A2DE8E3D89383631E16F40D09A513C656C", + "inLedger": 57111998, + "ledger_index": 57111998 + }, + "validated": true + }, + { + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "Balance": "3713891690008", + "Flags": 131072, + "OwnerCount": 0, + "Sequence": 702817 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "140FA03FE8C39540CA8189BC7A7956795C712BC0A542C6409C041150703C8574", + "PreviousFields": { + "Balance": "3714441690048", + "Sequence": 702816 + }, + "PreviousTxnID": "FDD5007913B39027BAF10B31144DBC1F7DC147528DF31FF048A06DC5D3108BD6", + "PreviousTxnLgrSeq": 57111981 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "r9dU6Z7P2i7MrDi1VUZ7uyq6J77eg86YtB", + "Balance": "2629998983", + "Flags": 0, + "OwnerCount": 0, + "Sequence": 10 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "27B96FE681B33825CC95DA197358B30D3A1721F2125F2D76022D46B2418ABA0A", + "PreviousFields": { + "Balance": "2079998983" + }, + "PreviousTxnID": "44A47AC04C0C7237C32BE9A532B578D07641705D3A59DB9B3C5B6225001E39B7", + "PreviousTxnLgrSeq": 56613857 + } + } + ], + "TransactionIndex": 16, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "550000000" + }, + "tx": { + "Account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "Amount": "550000000", + "Destination": "r9dU6Z7P2i7MrDi1VUZ7uyq6J77eg86YtB", + "Fee": "40", + "Flags": 2147483648, + "LastLedgerSequence": 57112016, + "Sequence": 702816, + "SigningPubKey": "020A46D8D02AC780C59853ACA309EAA92E7D8E02DD72A0B6AC315A7D18A6C3276A", + "TransactionType": "Payment", + "TxnSignature": "3045022100D589029EF63F9E528F6100C7A36D26AFFF84085EC9AC16DA8E30E11F390D4E87022011466E0FE4A90B89142EE47E535545EEA4A2D65E0BD234DFB447721218B59C9B", + "date": 649200241, + "hash": "D58864C16344ADCC15995C7986CFC607CB693E88F84D2E019F0A35FB29749202", + "inLedger": 57111994, + "ledger_index": 57111994 + }, + "validated": true + } + ], + "validated": true + }, + "status": "success", + "type": "response" +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +200 OK +{ "result": { - "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "ledger_index_max": 6542489, - "ledger_index_min": 32570, + "account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "ledger_index_max": 57112019, + "ledger_index_min": 56248229, "limit": 2, + "marker": { + "ledger": 57112007, + "seq": 13 + }, + "status": "success", "transactions": [ { "meta": { @@ -110,109 +265,61 @@ rippled -- account_tx r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 -1 -1 2 5 1 0 1 { "ModifiedNode": { "FinalFields": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Balance": "9999999980", - "Flags": 0, - "OwnerCount": 2, - "Sequence": 3 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "4F83A2CF7E70F77F79A307E6A472BFC2585B806A70833CCD1C26105BAE0D6E05", - "PreviousFields": { - "Balance": "9999999990", - "OwnerCount": 1, - "Sequence": 2 - }, - "PreviousTxnID": "389720F6FD8A144F171708F9ECB334D704CBCFEFBCDA152D931AC34FB5F9E32B", - "PreviousTxnLgrSeq": 95405 - } - }, - { - "CreatedNode": { - "LedgerEntryType": "RippleState", - "LedgerIndex": "718C6D58DD3BBAAAEBFE48B8FBE3C32C9F6F2EBC395233BA95D0057078EE07DB", - "NewFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "0" - }, + "Account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "Balance": "3732290013101", "Flags": 131072, - "HighLimit": { - "currency": "USD", - "issuer": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "value": "100" - }, - "LowLimit": { - "currency": "USD", - "issuer": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "value": "0" - } - } - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Flags": 0, - "Owner": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "RootIndex": "77F65EFF930ED7E93C6CC839C421E394D6B1B6A47CEA8A140D63EC9C712F46F5" - }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "77F65EFF930ED7E93C6CC839C421E394D6B1B6A47CEA8A140D63EC9C712F46F5" - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "Balance": "78991384535796", - "Flags": 0, - "OwnerCount": 3, - "Sequence": 188 + "OwnerCount": 0, + "Sequence": 702820 }, "LedgerEntryType": "AccountRoot", - "LedgerIndex": "B33FDD5CF3445E1A7F2BE9B06336BEBD73A5E3EE885D3EF93F7E3E2992E46F1A", - "PreviousTxnID": "E9E1988A0F061679E5D14DE77DB0163CE0BBDC00F29E396FFD1DA0366E7D8904", - "PreviousTxnLgrSeq": 195455 + "LedgerIndex": "140FA03FE8C39540CA8189BC7A7956795C712BC0A542C6409C041150703C8574", + "PreviousFields": { + "Balance": "3732745656171", + "Sequence": 702819 + }, + "PreviousTxnID": "7C031FD5B710E3C048EEF31254089BEEC505900BCC9A842257A0319453333998", + "PreviousTxnLgrSeq": 57112010 } }, { "ModifiedNode": { "FinalFields": { - "ExchangeRate": "4E11C37937E08000", + "Account": "raLPjTYeGezfdb6crXZzcC8RkLBEwbBHJ5", + "Balance": "4231510602153", "Flags": 0, - "RootIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93", - "TakerGetsCurrency": "0000000000000000000000000000000000000000", - "TakerGetsIssuer": "0000000000000000000000000000000000000000", - "TakerPaysCurrency": "0000000000000000000000004254430000000000", - "TakerPaysIssuer": "5E7B112523F68D2F5E879DB4EAC51C6698A69304" + "OwnerCount": 0, + "Sequence": 96486 }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93" + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "39DC5D448DECEFC3CD20818788E3DA891CA943935E8D7B12FCB5B5871FCB1638", + "PreviousFields": { + "Balance": "4231054959123" + }, + "PreviousTxnID": "33D2014C832610293730028CA37857AC183BFCE3E42B9979C491FB8B82B3E9DC", + "PreviousTxnLgrSeq": 57112004 } } ], - "TransactionIndex": 0, - "TransactionResult": "tesSUCCESS" + "TransactionIndex": 12, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "455643030" }, "tx": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Fee": "10", - "Flags": 0, - "LimitAmount": { - "currency": "USD", - "issuer": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "value": "100" - }, - "Sequence": 2, - "SigningPubKey": "02BC8C02199949B15C005B997E7C8594574E9B02BA2D0628902E0532989976CF9D", - "TransactionType": "TrustSet", - "TxnSignature": "304402200EF81EC32E0DFA9BE376B20AFCA11765ED9FEA04CA8B77C7178DAA699F7F5AFF02202DA484DBD66521AC317D84F7717EC4614E2F5DB743E313E8B48440499CC0DBA4", - "date": 413620090, - "hash": "002AA492496A1543DBD3680BF8CF21B6D6A078CE4A01D2C1A4B63778033792CE", - "inLedger": 195480, - "ledger_index": 195480 + "Account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "Amount": "455643030", + "Destination": "raLPjTYeGezfdb6crXZzcC8RkLBEwbBHJ5", + "DestinationTag": 18240312, + "Fee": "40", + "Flags": 2147483648, + "LastLedgerSequence": 57112037, + "Sequence": 702819, + "SigningPubKey": "020A46D8D02AC780C59853ACA309EAA92E7D8E02DD72A0B6AC315A7D18A6C3276A", + "TransactionType": "Payment", + "TxnSignature": "30450221008602B2E390C0C7B65182C6DBC86292052C1961B2BEFB79C2C8431722C0ADB911022024B74DCF910A4C8C95572CF662EB7F5FF67E1AC4D7B9B7BFE2A8EE851EC16576", + "date": 649200322, + "hash": "08EF5BDA2825D7A28099219621CDBECCDECB828FEA202DEB6C7ACD5222D36C2C", + "inLedger": 57112015, + "ledger_index": 57112015 }, "validated": true }, @@ -222,102 +329,61 @@ rippled -- account_tx r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 -1 -1 2 5 1 0 1 { "ModifiedNode": { "FinalFields": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Balance": "9999999970", - "Flags": 0, - "OwnerCount": 3, - "Sequence": 4 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "4F83A2CF7E70F77F79A307E6A472BFC2585B806A70833CCD1C26105BAE0D6E05", - "PreviousFields": { - "Balance": "9999999980", - "OwnerCount": 2, - "Sequence": 3 - }, - "PreviousTxnID": "002AA492496A1543DBD3680BF8CF21B6D6A078CE4A01D2C1A4B63778033792CE", - "PreviousTxnLgrSeq": 195480 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Flags": 0, - "Owner": "r3PDtZSa5LiYp1Ysn1vMuMzB59RzV3W9QH", - "RootIndex": "A39F044D860C5B5846AA7E0FAAD44DC8897F0A62B2F628AA073B21B3EC146010" - }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "A39F044D860C5B5846AA7E0FAAD44DC8897F0A62B2F628AA073B21B3EC146010" - } - }, - { - "ModifiedNode": { - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "E0D7BDE68B468FF0B8D948FD865576517DA987569833A05374ADB9A72E870A06", - "PreviousTxnID": "0222B59280D165D40C464EA75AAD08A4D152C46A38C0625DEECF6EE87FC5B9E1", - "PreviousTxnLgrSeq": 343555 - } - }, - { - "CreatedNode": { - "LedgerEntryType": "RippleState", - "LedgerIndex": "EA4BF03B4700123CDFFB6EB09DC1D6E28D5CEB7F680FB00FC24BC1C3BB2DB959", - "NewFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "0" - }, + "Account": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "Balance": "3732745656171", "Flags": 131072, - "HighLimit": { - "currency": "USD", - "issuer": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "value": "100" - }, - "LowLimit": { - "currency": "USD", - "issuer": "r3PDtZSa5LiYp1Ysn1vMuMzB59RzV3W9QH", - "value": "0" - } - } + "OwnerCount": 0, + "Sequence": 702819 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "140FA03FE8C39540CA8189BC7A7956795C712BC0A542C6409C041150703C8574", + "PreviousFields": { + "Balance": "3732246155784" + }, + "PreviousTxnID": "CCBCCB528F602007C937C496F0828C118E073DF180084CCD3646EC1E414844E4", + "PreviousTxnLgrSeq": 57112007 } }, { "ModifiedNode": { "FinalFields": { - "ExchangeRate": "4E11C37937E08000", - "Flags": 0, - "RootIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93", - "TakerGetsCurrency": "0000000000000000000000000000000000000000", - "TakerGetsIssuer": "0000000000000000000000000000000000000000", - "TakerPaysCurrency": "0000000000000000000000004254430000000000", - "TakerPaysIssuer": "5E7B112523F68D2F5E879DB4EAC51C6698A69304" + "Account": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg", + "Balance": "236476361", + "Flags": 131072, + "OwnerCount": 0, + "Sequence": 466335 }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93" + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "CC20FEBEA6D2AF969EC46F2BD92684D9FBABC3F238E841B5E056FE4EBF4379A9", + "PreviousFields": { + "Balance": "735976788", + "Sequence": 466334 + }, + "PreviousTxnID": "C528B32DD588EFAE2FE833E8AA92E6AE2DF2C8DB3DB8C6C4F334AD37B253D72A", + "PreviousTxnLgrSeq": 57112010 } } ], - "TransactionIndex": 0, - "TransactionResult": "tesSUCCESS" + "TransactionIndex": 33, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "499500387" }, "tx": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Fee": "10", - "Flags": 0, - "LimitAmount": { - "currency": "USD", - "issuer": "r3PDtZSa5LiYp1Ysn1vMuMzB59RzV3W9QH", - "value": "100" - }, - "Sequence": 3, - "SigningPubKey": "02BC8C02199949B15C005B997E7C8594574E9B02BA2D0628902E0532989976CF9D", - "TransactionType": "TrustSet", - "TxnSignature": "3044022058A89552068D1A274EE72BA71363E33E54E6608BC28A84DEC6EE530FC2B5C979022029F4D1EA1237A1F717C5F5EC526E6CFB6DF54C30BADD25EDDE7D2FDBC8F17E34", - "date": 416347560, - "hash": "53354D84BAE8FDFC3F4DA879D984D24B929E7FEB9100D2AD9EFCD2E126BCCDC8", - "inLedger": 343570, - "ledger_index": 343570 + "Account": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg", + "Amount": "499500387", + "Destination": "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "DestinationTag": 1, + "Fee": "40", + "Flags": 2147483648, + "LastLedgerSequence": 57112032, + "Sequence": 466334, + "SigningPubKey": "0381575032E254BF4D699C3D8D6EFDB63B3A71F97475C6F6885BC7DAEEE55D9A01", + "TransactionType": "Payment", + "TxnSignature": "3045022100C7EA1701FE48C75508EEBADBC9864CD3FFEDCEB48AB99AEA960BFA360AE163ED0220453C9577502924C9E1A9A450D4B950A44016813BC70E1F16A65A402528D730B7", + "date": 649200302, + "hash": "7C031FD5B710E3C048EEF31254089BEEC505900BCC9A842257A0319453333998", + "inLedger": 57112010, + "ledger_index": 57112010 }, "validated": true } @@ -328,237 +394,35 @@ rippled -- account_tx r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 -1 -1 2 5 1 0 1 ``` {% /tab %} -{% tab label="JSON-RPC" %} +{% tab label="コマンドライン" %} ```json -200 OK { - "result": { - "account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "ledger_index_max": 8696227, - "ledger_index_min": 32570, - "limit": 2, - "status": "success", - "transactions": [ - { - "meta": { - "AffectedNodes": [ - { - "ModifiedNode": { - "FinalFields": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Balance": "9999999980", - "Flags": 0, - "OwnerCount": 2, - "Sequence": 3 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "4F83A2CF7E70F77F79A307E6A472BFC2585B806A70833CCD1C26105BAE0D6E05", - "PreviousFields": { - "Balance": "9999999990", - "OwnerCount": 1, - "Sequence": 2 - }, - "PreviousTxnID": "389720F6FD8A144F171708F9ECB334D704CBCFEFBCDA152D931AC34FB5F9E32B", - "PreviousTxnLgrSeq": 95405 - } - }, - { - "CreatedNode": { - "LedgerEntryType": "RippleState", - "LedgerIndex": "718C6D58DD3BBAAAEBFE48B8FBE3C32C9F6F2EBC395233BA95D0057078EE07DB", - "NewFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "0" - }, - "Flags": 131072, - "HighLimit": { - "currency": "USD", - "issuer": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "value": "100" - }, - "LowLimit": { - "currency": "USD", - "issuer": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "value": "0" - } - } - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Flags": 0, - "Owner": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "RootIndex": "77F65EFF930ED7E93C6CC839C421E394D6B1B6A47CEA8A140D63EC9C712F46F5" - }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "77F65EFF930ED7E93C6CC839C421E394D6B1B6A47CEA8A140D63EC9C712F46F5" - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "Balance": "78991384535796", - "Flags": 0, - "OwnerCount": 3, - "Sequence": 188 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "B33FDD5CF3445E1A7F2BE9B06336BEBD73A5E3EE885D3EF93F7E3E2992E46F1A", - "PreviousTxnID": "E9E1988A0F061679E5D14DE77DB0163CE0BBDC00F29E396FFD1DA0366E7D8904", - "PreviousTxnLgrSeq": 195455 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "ExchangeRate": "4E11C37937E08000", - "Flags": 0, - "RootIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93", - "TakerGetsCurrency": "0000000000000000000000000000000000000000", - "TakerGetsIssuer": "0000000000000000000000000000000000000000", - "TakerPaysCurrency": "0000000000000000000000004254430000000000", - "TakerPaysIssuer": "5E7B112523F68D2F5E879DB4EAC51C6698A69304" - }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93" - } - } - ], - "TransactionIndex": 0, - "TransactionResult": "tesSUCCESS" - }, - "tx": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Fee": "10", - "Flags": 0, - "LimitAmount": { - "currency": "USD", - "issuer": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV", - "value": "100" - }, - "Sequence": 2, - "SigningPubKey": "02BC8C02199949B15C005B997E7C8594574E9B02BA2D0628902E0532989976CF9D", - "TransactionType": "TrustSet", - "TxnSignature": "304402200EF81EC32E0DFA9BE376B20AFCA11765ED9FEA04CA8B77C7178DAA699F7F5AFF02202DA484DBD66521AC317D84F7717EC4614E2F5DB743E313E8B48440499CC0DBA4", - "date": 413620090, - "hash": "002AA492496A1543DBD3680BF8CF21B6D6A078CE4A01D2C1A4B63778033792CE", - "inLedger": 195480, - "ledger_index": 195480 - }, - "validated": true - }, - { - "meta": { - "AffectedNodes": [ - { - "ModifiedNode": { - "FinalFields": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Balance": "9999999970", - "Flags": 0, - "OwnerCount": 3, - "Sequence": 4 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "4F83A2CF7E70F77F79A307E6A472BFC2585B806A70833CCD1C26105BAE0D6E05", - "PreviousFields": { - "Balance": "9999999980", - "OwnerCount": 2, - "Sequence": 3 - }, - "PreviousTxnID": "002AA492496A1543DBD3680BF8CF21B6D6A078CE4A01D2C1A4B63778033792CE", - "PreviousTxnLgrSeq": 195480 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Flags": 0, - "Owner": "r3PDtZSa5LiYp1Ysn1vMuMzB59RzV3W9QH", - "RootIndex": "A39F044D860C5B5846AA7E0FAAD44DC8897F0A62B2F628AA073B21B3EC146010" - }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "A39F044D860C5B5846AA7E0FAAD44DC8897F0A62B2F628AA073B21B3EC146010" - } - }, - { - "ModifiedNode": { - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "E0D7BDE68B468FF0B8D948FD865576517DA987569833A05374ADB9A72E870A06", - "PreviousTxnID": "0222B59280D165D40C464EA75AAD08A4D152C46A38C0625DEECF6EE87FC5B9E1", - "PreviousTxnLgrSeq": 343555 - } - }, - { - "CreatedNode": { - "LedgerEntryType": "RippleState", - "LedgerIndex": "EA4BF03B4700123CDFFB6EB09DC1D6E28D5CEB7F680FB00FC24BC1C3BB2DB959", - "NewFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "0" - }, - "Flags": 131072, - "HighLimit": { - "currency": "USD", - "issuer": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "value": "100" - }, - "LowLimit": { - "currency": "USD", - "issuer": "r3PDtZSa5LiYp1Ysn1vMuMzB59RzV3W9QH", - "value": "0" - } - } - } - }, - { - "ModifiedNode": { - "FinalFields": { - "ExchangeRate": "4E11C37937E08000", - "Flags": 0, - "RootIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93", - "TakerGetsCurrency": "0000000000000000000000000000000000000000", - "TakerGetsIssuer": "0000000000000000000000000000000000000000", - "TakerPaysCurrency": "0000000000000000000000004254430000000000", - "TakerPaysIssuer": "5E7B112523F68D2F5E879DB4EAC51C6698A69304" - }, - "LedgerEntryType": "DirectoryNode", - "LedgerIndex": "F60ADF645E78B69857D2E4AEC8B7742FEABC8431BD8611D099B428C3E816DF93" - } - } - ], - "TransactionIndex": 0, - "TransactionResult": "tesSUCCESS" - }, - "tx": { - "Account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59", - "Fee": "10", - "Flags": 0, - "LimitAmount": { - "currency": "USD", - "issuer": "r3PDtZSa5LiYp1Ysn1vMuMzB59RzV3W9QH", - "value": "100" - }, - "Sequence": 3, - "SigningPubKey": "02BC8C02199949B15C005B997E7C8594574E9B02BA2D0628902E0532989976CF9D", - "TransactionType": "TrustSet", - "TxnSignature": "3044022058A89552068D1A274EE72BA71363E33E54E6608BC28A84DEC6EE530FC2B5C979022029F4D1EA1237A1F717C5F5EC526E6CFB6DF54C30BADD25EDDE7D2FDBC8F17E34", - "date": 416347560, - "hash": "53354D84BAE8FDFC3F4DA879D984D24B929E7FEB9100D2AD9EFCD2E126BCCDC8", - "inLedger": 343570, - "ledger_index": 343570 - }, - "validated": true - } - ], - "validated": true - } + "result" : { + "account" : "rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w", + "ledger_index_max" : 57112094, + "ledger_index_min" : 57105464, + "limit" : 2, + "marker" : { + "ledger" : 57112074, + "seq" : 9 + }, + "status" : "success", + "transactions" : [ + { + "ledger_index" : 57112090, + "meta" : "201C0000002EF8E51100612503677617551E0297F38EF4FED7004E074D246B4EA3E550D9AE0F61BE40E08D3432091D52CE56140FA03FE8C39540CA8189BC7A7956795C712BC0A542C6409C041150703C8574E624000AB96E624000037771BFD270E1E7220002000024000AB96F2D0000000062400003776C784A418114D2E44C9FAF7BE9C536219800A6E698E4C7D2C911E1E1E311006156F7D315E0E992B1F1AC66B309C9D68961AA327FE770101B74D4C975F8C5DEC96AE8240367761A624000000005478807811403C95DC0C7CE402E8044A5F13304108013CE9963E1E1F1031000", + "tx_blob" : "120000228000000024000AB96E201B036776306140000000054788076840000000000000287321020A46D8D02AC780C59853ACA309EAA92E7D8E02DD72A0B6AC315A7D18A6C3276A74463044022054811EEF61ACCFA1B5FC6BB05D2FA49CF5174062740370328382E6EA557C0E6A0220480584D487638C333A87CA37100354BD36209E355E8DB9FE79791A56E24C1F268114D2E44C9FAF7BE9C536219800A6E698E4C7D2C911831403C95DC0C7CE402E8044A5F13304108013CE9963", + "validated" : true + }, + { + "ledger_index" : 57112087, + "meta" : "201C00000026F8E5110061250367760A556B80EE9A9AD3FC40F471F29DCB80C678375137CE36220718902EF1EDCD375E7156140FA03FE8C39540CA8189BC7A7956795C712BC0A542C6409C041150703C8574E66240000376DEB77118E1E7220002000024000AB96E2D00000000624000037771BFD2708114D2E44C9FAF7BE9C536219800A6E698E4C7D2C911E1E1E511006125036776155591DA498D40AFD90670555F3D719883B48D224B4E4E906C634DEFA21163E8197756CC20FEBEA6D2AF969EC46F2BD92684D9FBABC3F238E841B5E056FE4EBF4379A9E62400071DA26240000001C0D849F8E1E722000200002400071DA32D0000000062400000012DCFE87881146914CB622B8E41E150DE431F48DA244A69809366E1E1F1031000", + "tx_blob" : "12000022800000002400071DA22E00000001201B0367762D61400000009308615868400000000000002873210381575032E254BF4D699C3D8D6EFDB63B3A71F97475C6F6885BC7DAEEE55D9A0174473045022100E592BCCFD85CCE0B39075EFC66D6BCA594EBB451F12AD5AD9EE533A267F1381B02203635AB46AC110848FC44E797BD19D77A19E10A0F463AA5540B1C62E5D48C81F081146914CB622B8E41E150DE431F48DA244A698093668314D2E44C9FAF7BE9C536219800A6E698E4C7D2C911", + "validated" : true + } + ], + "validated" : true + } } ``` {% /tab %} diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md index 7c561473aa..5cc8064e3c 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md @@ -62,7 +62,7 @@ rippled ledger current | `Field` | 型 | 必須? | 説明 | |:---------------|:---------------------|:------|:-------------------------------| -| `ledger_hash` | [ハッシュ][] | いいえ | 使用するレジャーバージョンの20バイトの16進文字列。([レジャーの指定][]ご覧ください。) | +| `ledger_hash` | [ハッシュ][] | いいえ | 使用するレジャーバージョンの32バイトの16進文字列。([レジャーの指定][]ご覧ください。) | | `ledger_index` | [レジャーインデックス][] | いいえ | 使用するレジャーの[レジャーインデックス][]、またはレジャーを自動的に選択するためのショートカット文字列。([レジャーの指定][]をご覧ください) | | `transactions` | 真偽値 | いいえ | `true`の場合、指定されたレジャーバージョンのトランザクションに関する情報が返されます。デフォルトでは`false`です。レジャーバージョンを指定しない場合は無視されます。 | | `expand` | 真偽値 | いいえ | ハッシュのみではなく、トランザクション/アカウントの完全な情報がJSONフォーマットで提供されます。デフォルトでは`false`です。トランザクション、アカウント、またはその両方をリクエストしない場合は無視されます。 | diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md index 27069aa5d7..41bed6aebb 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md @@ -30,18 +30,24 @@ label: 上記の一般的なフィールドに加えて、オブジェクトを取得するタイプを示すために、以下のフィールドのうち *正確に1つ* を指定する必要があります。有効なフィールドは以下のとおりです。 -- [`index`](#idからレジャーオブジェクトを取得する) -- [`account_root`](#accountrootオブジェクトを取得する) -- [`directory`](#directorynodeオブジェクトを取得する) -- [`amm`](#ammオブジェクトを取得する) -- [`offer`](#offerオブジェクトを取得する) -- [`ripple_state`](#ripplestateオブジェクトを取得する) -- [`check`](#checkオブジェクトを取得する) -- [`escrow`](#escrowオブジェクトを取得する) -- [`payment_channel`](#paychannelオブジェクトを取得する) -- [`deposit_preauth`](#depositpreauthオブジェクトを取得する) -- [`ticket`](#ticketオブジェクトを取得する) -- [`nft_page`](#nft-pageを取得する) +- [ledger\_entry](#ledger_entry) + - [リクエストのフォーマット](#リクエストのフォーマット) + - [一般的なフィールド](#一般的なフィールド) + - [IDからレジャーオブジェクトを取得する](#idからレジャーオブジェクトを取得する) + - [AccountRootオブジェクトを取得する](#accountrootオブジェクトを取得する) + - [AMMオブジェクトを取得する](#ammオブジェクトを取得する) + - [Bridgeオブジェクトを取得する](#bridgeオブジェクトを取得する) + - [Directorynodeオブジェクトを取得する](#directorynodeオブジェクトを取得する) + - [Offerオブジェクトを取得する](#offerオブジェクトを取得する) + - [RippleStateオブジェクトを取得する](#ripplestateオブジェクトを取得する) + - [Checkオブジェクトを取得する](#checkオブジェクトを取得する) + - [Escrowオブジェクトを取得する](#escrowオブジェクトを取得する) + - [Paychannelオブジェクトを取得する](#paychannelオブジェクトを取得する) + - [DepositPreauthオブジェクトを取得する](#depositpreauthオブジェクトを取得する) + - [Ticketオブジェクトを取得する](#ticketオブジェクトを取得する) + - [Nft Pageを取得する](#nft-pageを取得する) + - [レスポンスのフォーマット](#レスポンスのフォーマット) + - [考えられるエラー](#考えられるエラー) **注意:** リクエストでこれらの型固有のフィールドを1つ以上指定した場合、サーバはそのうちの1つだけの結果を取得します。サーバがどれを選択するかは定義されていないため、こうした指定方法は避けるべきです。 @@ -95,7 +101,7 @@ rippled json ledger_entry '{ "index": "7DB0788C020F02780A673DC74757F23823FA3014C - [`Amendments`](../../../protocol/ledger-data/ledger-entry-types/amendments.md) - `7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4` - [`FeeSettings`](../../../protocol/ledger-data/ledger-entry-types/feesettings.md) - `4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651` -- [Recent History `LedgerHashes`](../../../protocol/ledger-data/ledger-entry-types/ledgerhashes.md) - `B4979A36CDC7F3D3D5C31A4EAE2AC7D7209DDA877588B9AFC66799692AB0D66B` +- [直近の`LedgerHashes`](../../../protocol/ledger-data/ledger-entry-types/ledgerhashes.md) - `B4979A36CDC7F3D3D5C31A4EAE2AC7D7209DDA877588B9AFC66799692AB0D66B` - [`NegativeUNL`](../../../protocol/ledger-data/ledger-entry-types/negativeunl.md) - `2E8A59AA9D3B5B186B0B9E0F62E6C02587CA74A4D778938E957B6357D364B244` {% /admonition %} @@ -175,7 +181,7 @@ _([AMM amendment][])_ "currency" : "TST", "issuer" : "rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd" } - } + }, "ledger_index": "validated" } ``` @@ -211,7 +217,77 @@ rippled json ledger_entry '{ "amm": { "asset": { "currency": "XRP" }, "asset2": {% /tabs %} -[試してみる >](/resources/dev-tools/websocket-api-tool?server=wss%3A%2F%2Famm.devnet.rippletest.net%3A51233%2F#ledger_entry-amm) +[試してみる >](/resources/dev-tools/websocket-api-tool?server=wss%3A%2F%2Fs.devnet.rippletest.net%3A51233%2F#ledger_entry-amm) + + +### Bridgeオブジェクトを取得する + +_([XChainBridge amendment][]が必要です {% not-enabled /%})_ + +XRP Ledgerを他のブロックチェーンに接続する1つのクロスチェーンブリッジを表す[Bridgeエントリ](../../../protocol/ledger-data/ledger-entry-types/bridge.md)を取得します。 + +| フィールド   | 型 | 説明 | +|:-----------------|:-----------|:----------------------| +| `bridge_account` | 文字列 | ブロックチェーン上で`XChainCreateBridge`トランザクションを送信したアカウント。 | +| `bridge` | オブジェクト | 取得する[ブリッジ](../../../protocol/ledger-data/ledger-entry-types/bridge.md)。ドアアカウントと発行・ロックチェーンの資産の情報を含みます。 | + + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "id": "example_get_bridge", + "command": "ledger_entry", + "bridge_account": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", + "bridge": { + "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "IssuingChainIssue": { + "currency": "XRP" + }, + "LockingChainDoor": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", + "LockingChainIssue": { + "currency": "XRP" + } + }, + "ledger_index": "validated" +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +{ + "method": "ledger_entry", + "params": [ + { + "bridge_account": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", + "bridge": { + "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "IssuingChainIssue": { + "currency": "XRP" + }, + "LockingChainDoor": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", + "LockingChainIssue": { + "currency": "XRP" + } + }, + "ledger_index": "validated" + } + ] +} +``` +{% /tab %} + +{% tab label="コマンドライン" %} +```sh +rippled json ledger_entry '{ "bridge_account": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", "bridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", "LockingChainIssue": { "currency": "XRP" } }, "ledger_index": "validated" }' +``` +{% /tab %} + +{% /tabs %} + +[試してみよう! >](/resources/dev-tools/websocket-api-tool?server=wss%3A%2F%2Fs.devnet.rippletest.net%3A51233%2F#ledger_entry-bridge) diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md index bd763af9de..d412f9acf7 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md @@ -63,12 +63,12 @@ _([AMM amendment][])_ リクエストには以下のパラメーターが含まれます。 -| `フィールド` | 型 | 必須? | 説明 | -|:--------------|:-----------------------|:------|:-----------------------------------| -| `account` | 文字列 - [アドレス][] | いいえ | この流動性プロバイダーが保有するLPトークンのみを表示します。 | -| `amm_account` | 文字列 - [アドレス][] | いいえ | AMMの特別なAccountRootのアドレス。(これはAMMのLPトークンの`issuer`です)。 | -| `asset` | オブジェクト または 文字列 | いいえ | [通貨額][Currency Amount]のように、`currency`と`issuer`フィールドを持つオブジェクトとして(XRPの場合は`issuer`を省略)、検索するAMMの資産の一つを指定します。XRPの場合は、オブジェクトではなく文字列`XRP`として指定することもできます。 | -| `asset2` | オブジェクト または 文字列 | いいえ | AMMの資産のもう一方を、`currency`と`issuer`フィールド(XRPの場合は`issuer`を省略)を持つオブジェクトとして、[通貨額][Currency Amount]のように指定することが可能です。 | +| `フィールド` | 型 | 必須? | 説明 | +|:--------------|:--------------------|:------|:-----------------------------------| +| `account` | 文字列 - [アドレス][] | いいえ | この流動性プロバイダーが保有するLPトークンのみを表示します。 | +| `amm_account` | 文字列 - [アドレス][] | いいえ | AMMの特別なAccountRootのアドレス。(これはAMMのLPトークンの`issuer`です)。 | +| `asset` | オブジェクト | いいえ | [通貨額][Currency Amount]のように、`currency`と`issuer`フィールドを持つオブジェクトとして(XRPの場合は`issuer`を省略)、検索するAMMの資産の一つを指定します。 | +| `asset2` | オブジェクト | いいえ | AMMの資産のもう一方を、`currency`と`issuer`フィールド(XRPの場合は`issuer`を省略)を持つオブジェクトとして、[通貨額][Currency Amount]のように指定することが可能です。 | `amm_account`、または`asset`と`asset2`の両方を指定する必要があります。 diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_definitions.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_definitions.md new file mode 100644 index 0000000000..11978cbfeb --- /dev/null +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_definitions.md @@ -0,0 +1,113 @@ +--- +html: server_definitions.html +parent: server-info-methods.html +seo: + description: 実行中の`rippled`インスタンスから生成されるSDK互換の`definitions.json`を取得します。 +labels: + - コアサーバ +--- +# server_definitions + +[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/rpc/handlers/ServerInfo.cpp#L43 "ソース") + +`server_definitions`コマンドは実行中の`rippled`インスタンスから生成されたSDK互換の`definitions.json`を返します。これを使用してネットワーク上のノードにアクセスし、そのバイナリデータをシリアライズ/デシリアライズするために必要な定義を受け取ることができます。 + + +## リクエストのフォーマット +リクエストのフォーマットの例: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "id": 2, + "command": "server_definitions" +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +{ + "method": "server_definitions" +} +``` +{% /tab %} + +{% /tabs %} + +[試してみよう! >](/resources/dev-tools/websocket-api-tool#server_definitions) + +リクエストにパラメータは含まれません。 + + +## レスポンスのフォーマット + +レスポンスのフォーマットの例: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "id": 1, + "result": { + "FIELDS": [ + [ + "Generic", + { + "isSerialized": false, + "isSigningField": false, + "isVLEncoded": false, + "nth": 0, + "type": "Unknown" + } + ], + [ + "Invalid", + { + "isSerialized": false, + "isSigningField": false, + "isVLEncoded": false, + "nth": -1, + "type": "Unknown" + } + ], + [ + "ObjectEndMarker", + { + "isSerialized": true, + "isSigningField": true, + "isVLEncoded": false, + "nth": 1, + "type": "STObject" + } + ], + [ + "ArrayEndMarker", + { + "isSerialized": true, + "isSigningField": true, + "isVLEncoded": false, + "nth": 1, + "type": "STArray" + } + ] + ... + ] + } +} +``` +{% /tab %} + +{% /tabs %} + +完全な`definitions.json`ファイルとトップレベルフィールドの説明を見るには、[定義ファイル](../../../protocol/binary-format.md#定義ファイル)をご覧ください。 + + +## 考えられるエラー + +いずれかの汎用エラータイプ。 + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_state.md b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_state.md index 01d441af3a..5a05783eb9 100644 --- a/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_state.md +++ b/@i18n/ja/docs/references/http-websocket-apis/public-api-methods/server-info-methods/server_state.md @@ -12,6 +12,8 @@ labels: `server_state`コマンドは、サーバに対し`rippled`サーバの現在の状態に関するさまざまな機械可読の情報を問い合わせます。レスポンスは[server_infoメソッド][]の場合とほぼ同じですが、読み取りやすい単位ではなく処理しやすい単位を使用します。(たとえば、XRP値は科学的記数法や10進数値の代わりに整数のdrop数で示され、時刻は秒単位ではなくミリ秒単位で示されます。) +The [Clio server](../../../../concepts/networks-and-servers/the-clio-server.md) does not support `server_state` directly, but you can ask for the `server_state` of the `rippled` server that Clio is connected to. Specify `"ledger_index": "current"` (WebSocket) or `"params": [{"ledger_index": "current"}]` (JSON-RPC). + ## リクエストのフォーマット リクエストのフォーマットの例: @@ -20,8 +22,9 @@ labels: {% tab label="WebSocket" %} ```json { - "id": 2, - "command": "server_state" + "id": 2, + "command": "server_state", + "ledger_index": "current" } ``` {% /tab %} @@ -29,10 +32,10 @@ labels: {% tab label="JSON-RPC" %} ```json { - "method": "server_state", - "params": [ - {} - ] + "method": "server_state", + "params": [ + {"ledger_index": "current"} + ] } ``` {% /tab %} @@ -313,6 +316,8 @@ Headers | `validation_quorum` | 数値 | 1つのレジャーバージョンの検証に最低限必要となる信頼できる検証の数。状況によっては、サーバがさらに検証をリクエストする場合があります。 | | `validator_list_expires` | 数値 | _(管理者専用)_ 現在のバリデータリストが期限切れになる時点([Rippleエポック以降の経過秒数][])。サーバが発行済みのバリデータリストをロードしていない場合は0。 | +[レポートモード]: ../../../../concepts/networks-and-servers/rippled-server-modes.md + {% partial file="/@i18n/ja/docs/_snippets/etl-source-object.md" /%} {% partial file="/@i18n/ja/docs/_snippets/port-descriptor-object.md" /%} diff --git a/@i18n/ja/docs/references/index.md b/@i18n/ja/docs/references/index.md new file mode 100644 index 0000000000..c3ccb68d86 --- /dev/null +++ b/@i18n/ja/docs/references/index.md @@ -0,0 +1,61 @@ +--- +seo: + description: XRP LedgerプロトコルやAPIメソッドなどのリファレンスドキュメント +--- +# リファレンス + +XRP LedgerリファレンスはXRP LedgerプロトコルやAPIメソッドなどのドキュメントです。 + +## クライアントライブラリ + +お使いのプログラミング言語からXRP Ledgerにアクセスするには、以下のライブラリをご利用ください。 + +{% card-grid %} + +{% xrpl-card title="JavaScript / TypeScript" body="xrpl.js - JavaScript/TypeScriptライブラリ" href="https://js.xrpl.org/" image="/img/logos/javascript.svg" imageAlt="Javascript logo" /%} + +{% xrpl-card title="Python" body="xrpl.py - Pythonライブラリ" href="https://xrpl-py.readthedocs.io/" image="/img/logos/python.svg" imageAlt="Python logo" /%} + +{% xrpl-card title="Java" body="xrpl4j - Javaライブラリ" href="https://javadoc.io/doc/org.xrpl/" image="/img/logos/java.svg" imageAlt="Java logo" /%} + +{% /card-grid %} + +[さらに見る...](/ja/docs/references/client-libraries/) + +## XRP Ledgerプロトコルリファレンス + +{% card-grid %} + +{% xrpl-card title="基本的なデータ" body="基本的なデータの形式と定義" href="/docs/references/protocol/data-types/basic-data-types/" /%} + +{% xrpl-card title="レジャーのデータ" body="XRP Ledgerの状態データを構成する個々のデータ" href="/docs/references/protocol/ledger-data/" /%} + +{% xrpl-card title="トランザクション" body="プロトコルのすべてのトランザクションタイプとその結果の定義" href="/docs/references/protocol/transactions/" /%} + +{% xrpl-card title="バイナリフォーマット" body="XRP Ledgerのトランザクションやその他のオブジェクトのJSON形式と標準バイナリデータとの変換" href="/docs/references/protocol/binary-format/" /%} + +{% /card-grid %} + +## HTTP / WebSocket API + +{% card-grid %} + +{% xrpl-card title="APIの規約" body="rippledサーバに実装されているHTTP API(JSON-RPCとWebSocket)のデータタイプとフォーマットの説明" href="/docs/references/http-websocket-apis/api-conventions/" /%} + +{% xrpl-card title="公開APIメソッド" body="サーバーに接続されたクライアントが使用する公開APIメソッド" href="/docs/references/http-websocket-apis/public-api-methods/" /%} + +{% xrpl-card title="管理者APIメソッド" body="rippledサーバを運用する信頼できる管理者のための管理者APIメソッド" href="/docs/references/http-websocket-apis/admin-api-methods/" /%} + +{% xrpl-card title="Peer Portメソッド" body="XRPL Peer Protocolポートで提供される、ネットワーク情報とステータス情報を共有するための特別なAPIメソッド" href="/docs/references/http-websocket-apis/peer-port-methods/" /%} + +{% /card-grid %} + +## xrp-ledger.tomlファイル + +xrp-ledger.tomlファイルは、他のXRP Ledgerユーザに、あなたのXRP Ledgerの使用状況に関する可読情報を提供します。 + +- [**ファイルの提供方法**](/ja/docs/references/xrp-ledger-toml/#ファイルの提供方法) +- [**内容**](/ja/docs/references/xrp-ledger-toml/#内容) +- [**CORSの設定**](/ja/docs/references/xrp-ledger-toml/#corsの設定) +- [**ドメイン検証**](/ja/docs/references/xrp-ledger-toml/#ドメイン検証) +- [**アカウント検証**](/ja/docs/references/xrp-ledger-toml/#アカウント検証) diff --git a/@i18n/ja/docs/references/protocol/data-types/nftoken.md b/@i18n/ja/docs/references/protocol/data-types/nftoken.md index e1141ad8da..998fb5772d 100644 --- a/@i18n/ja/docs/references/protocol/data-types/nftoken.md +++ b/@i18n/ja/docs/references/protocol/data-types/nftoken.md @@ -39,7 +39,7 @@ C) 160ビットの発行者のアカウント識別子 D) 32ビットの発行者が指定する[`NFTokenTaxon`](https://www.merriam-webster.com/dictionary/taxon) -E) 32ビットの(自動生成される)単調増加するのシーケンス番号 +E) 32ビットの(自動生成される)単調増加するシーケンス番号 ![トークンIDの内訳](/docs/img/nftoken1.png "トークンIDの内訳") diff --git a/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md b/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md index 9bd5dac562..13a97c4989 100644 --- a/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md +++ b/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md @@ -1,21 +1,20 @@ --- -html: directorynode.html -parent: ledger-entry-types.html seo: - description: 他のオブジェクトへのリンクを含みます。 + description: 他のオブジェクトへのリンクを保持します。 labels: - - 分散型取引所 - データ保持 + - 分散型取引所 --- # DirectoryNode [[ソース]](https://github.com/XRPLF/rippled/blob/5d2d88209f1732a0f8d592012094e345cbe3e675/src/ripple/protocol/impl/LedgerFormats.cpp#L44 "Source") `DirectoryNode`オブジェクトタイプは、レジャーの状態ツリー内の他オブジェクトへのリンクのリストを提供します。概念上の1つの _ディレクトリ_ は、1つ以上の各DirectoryNodeオブジェクトが含まれる二重リンクリストの形式になっています。各DirectoryNodeオブジェクトには、他オブジェクトの[ID](../common-fields.md)が最大32個まで含まれています。1番目のオブジェクトはディレクトリのルートと呼ばれ、ルートオブジェクト以外のオブジェクトはすべて必要に応じて自由に追加または削除できます。 -2種類のディレクトリがあります。 +ディレクトリには3種類があります。 -* **所有者ディレクトリ**は、アカウントが所有するその他のオブジェクト(`RippleState`オブジェクトや`Offer`オブジェクトなど)をリストします。 -* **オファーディレクトリ**は、分散型取引所で利用可能なオファーをリストします。1つのオファーディレクトリには、同一イシュアンスに同一為替レートが設定されているすべてのオファーが含まれます。 +* _所有者ディレクトリ_ は、[`RippleState`(トラストライン)](ripplestate.md)エントリや[`Offer`](offer.md)エントリなどアカウントが所有するその他のエントリの一覧です。 +* _オファーディレクトリ_ は、[分散型取引所(DEX)](../../../../concepts/tokens/decentralized-exchange/index.md)で利用可能なオファーの一覧です。1つのオファーディレクトリには、同一トークン(通貨コードと発行者)に同一の取引レートが設定されているすべてのオファーが含まれます。 +* _NFTオファーディレクトリ_ は、NFTの買いオファーと売りオファーの一覧です。各NFTには、買いオファー用と売りオファー用の2つのディレクトリがあります。 ## {% $frontmatter.seo.title %}のJSONの例 @@ -56,6 +55,29 @@ labels: ``` {% /tab %} +{% tab label="NFTオファーディレクトリ" %} +```json +{ + "result": { + "index": "CC45A27DAF06BFA45E8AFC92801AD06A06B7004DAD0F7022E439B3A2F6FA5B5A", + "ledger_current_index": 310, + "node": { + "Flags": 2, + "Indexes": [ + "83C81AC39F9771DDBCD66F6C225FC76EFC0971384EC6148BAFA5BD18019FC495" + ], + "LedgerEntryType": "DirectoryNode", + "NFTokenID": "000800009988C43C563A7BB35AF34D642990CDF089F11B445EB3DCCD00000132", + "RootIndex": "CC45A27DAF06BFA45E8AFC92801AD06A06B7004DAD0F7022E439B3A2F6FA5B5A", + "index": "CC45A27DAF06BFA45E8AFC92801AD06A06B7004DAD0F7022E439B3A2F6FA5B5A" + }, + "status": "success", + "validated": false + } +} +``` +{% /tab %} + {% /tabs %} ## {% $frontmatter.seo.title %}のフィールド @@ -68,6 +90,7 @@ labels: | `IndexNext` | 数値 | UInt64 | いいえ | (省略可)このディレクトリに複数のページが含まれている場合、このIDはチェーン内の次のオブジェクトにリンクし、末尾でラップアラウンドします。 | | `IndexPrevious` | 数値 | UInt64 | いいえ | (省略可)このディレクトリに複数のページが含まれている場合、このIDはチェーン内の前のオブジェクトにリンクし、先頭でラップアラウンドします。 | | `LedgerEntryType` | 文字列 | UInt16 | はい | 値が`0x0064`(文字列`DirectoryNode`にマッピング)の場合は、このオブジェクトがディレクトリの一部であることを示します。 | +| `NFTokenID` | 文字列 | Hash25 | No |(NFTオファーディレクトリのみ) 購入または売却オファーに紐づくNFTのID。. | | `Owner` | 文字列 | AccountID | いいえ | (所有者ディレクトリのみ)このディレクトリ内のオブジェクトを所有するアカウントのアドレス。 | | `RootIndex` | 文字列 | Hash256 | はい | このディレクトリのルートオブジェクトのID。 | | `TakerGetsCurrency` | 文字列 | Hash160 | いいえ | (オファーディレクトリのみ)このディレクトリのオファーのTakerGetsの額の通貨コード。 | @@ -90,11 +113,11 @@ labels: DirectoryNodeのIDを作成するときには、DirectoryNodeが以下のどのページを表しているかに応じて3種類の方式があります。 -* 所有者ディレクトリの1番目のページ(ルートとも呼ばれます) +* 所有者ディレクトリまたはNFTオファーディレクトリの1番目のページ(ルートとも呼ばれます) * オファーディレクトリの1番目のページ * いずれかのディレクトリの以降のページ -**所有者ディレクトリの1番目のページ**のIDは、以下の値がこの順序で連結されている[SHA-512ハーフ][]です。 +**所有者ディレクトリまたはNFTオファーディレクトリの1番目のページ**のIDは、以下の値がこの順序で連結されている[SHA-512ハーフ][]です。 * 所有者ディレクトリのスペースキー(`0x004F`) * `Owner`フィールドのAccountID。 @@ -109,7 +132,7 @@ DirectoryNodeのIDを作成するときには、DirectoryNodeが以下のどの オファーディレクトリのIDの下位64ビットは、そのディレクトリ内のオファーのTakerPaysの額をTakerGetsの額で割った結果を、XRP Ledgerの内部金額フォーマットの64ビット数値で表したものです。 -**DirectoryNodeがディレクトリの1番目のページではない場合**(所有者ディレクトリ、オファーディレクトリのいずれの場合でも)、DirectoryNodeのIDは、以下の値をこの順序で連結した[SHA-512ハーフ][]です。 +**DirectoryNodeがディレクトリの1番目のページではない場合**、DirectoryNodeのIDは、以下の値をこの順序で連結した[SHA-512ハーフ][]です。 * DirectoryNodeスペースキー(`0x0064`) * ルートDirectoryNodeのID diff --git a/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/nftokenpage.md b/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/nftokenpage.md index b8adda27ce..5f7f584c35 100644 --- a/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/nftokenpage.md +++ b/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/nftokenpage.md @@ -47,9 +47,9 @@ _([NonFungibleTokensV1_1 amendment][]により追加されました)_ | 名前 | JSONの型 | [内部の型][] | 必須? | 説明 | |:--------------------|:----------|:-----------|:----------|:------------| | `LedgerEntryType` | 文字列 | UInt16 | はい | レジャーオブジェクトのタイプを識別文字列です。予約されているレジャーの種類は、0x0050です。| -| `NextPageMin` | 文字列 | Hash256 | いいえ | 次のページの位置情報(もしあれば)。このフィールドの詳細および使用方法については、NFTokenPageID の構築についての説明以降に記載しています。| +| `NextPageMin` | 文字列 | Hash256 | いいえ | 次のページの位置情報(もしあれば)。このフィールドの使用方法は、NFTokenオブジェクトの追加の項に記載しています。| | `NFTokens` | オブジェクト | TOKEN | はい | このNFTokenPageオブジェクトに含まれる`NFToken`オブジェクトのコレクション。本仕様では、1ページあたり32のNFTokenオブジェクトを上限としています。オブジェクトは、`NFTokenID`をソートパラメータとして使用して、低いものから高いものへとソートされた順序で格納されています。| -| `PreviousPageMin` | 文字列 | Hash256 | いいえ | 前のページの位置情報(もしあれば)。このフィールドの詳細および使用方法については、NFTokenPageIDの構築についての説明以降に記載しています。| +| `PreviousPageMin` | 文字列 | Hash256 | いいえ | 前のページの位置情報(もしあれば)。このフィールドの使用方法は、NFTokenオブジェクトの追加の項に記載しています。| | `PreviousTxnID` | 文字列 | HASH256 | いいえ | このNFTokenPageオブジェクトを最も最近変更したトランザクションのトランザクションIDの情報を示します。| | `PreviousTxnLgrSeq` | 数値 | UInt32 | いいえ | このNFTokenPageオブジェクトを最も最近変更したトランザクションを含むレジャーのシーケンスを示します。| @@ -79,7 +79,7 @@ _([NonFungibleTokensV1_1 amendment][]により追加されました)_ ### `NFToken`オブジェクトの削除 -`NFToken`は同じ手法で削除することもできます。ページ内の`NFToken`の数がある閾値を下回ると、サーバはそのページを前後のページと統合して準備金を取り戻そうとします。 +`NFToken`の削除も追加と同じように動作します。ページ内の`NFToken`の数がある閾値を下回ると、サーバはそのページを前後のページと統合して準備金を取り戻そうとします。 ### {% $frontmatter.seo.title %}の準備金 diff --git a/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md b/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md index 3ca8ebe2ec..71c0401f6a 100644 --- a/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md +++ b/@i18n/ja/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md @@ -73,6 +73,7 @@ labels: | フラグ名 | 16進数値 | 10進数値 | 対応する[TrustSetフラグ](../../transactions/types/trustset.md#trustsetのフラグ) | 説明 | |-------------------|--------------|----------|-------------|------------------------| +| `lsfAMMNode` | `0x01000000` | 16777216 | (なし) | このトラストラインがAMMアカウントに紐づくことを表します。 | | `lsfLowReserve` | `0x00010000` | 65536 | (なし) | このRippleStateオブジェクトは[低位アカウント所有者の準備金に資金を供給します](#所有者の準備金への資金供給)。 | | `lsfHighReserve` | `0x00020000` | 131072 | (なし) | このRippleStateオブジェクトは[高位アカウント所有者の準備金に資金を供給します](#所有者の準備金への資金供給)。 | | `lsfLowAuth` | `0x00040000` | 262144 | `tfSetAuth` | 低位アカウントにより、高位アカウントが低位アカウントのイシュアンスを保有することが承認されています。 | diff --git a/@i18n/ja/docs/references/protocol/transactions/metadata.md b/@i18n/ja/docs/references/protocol/transactions/metadata.md index 283251e48a..168dbaf985 100644 --- a/@i18n/ja/docs/references/protocol/transactions/metadata.md +++ b/@i18n/ja/docs/references/protocol/transactions/metadata.md @@ -16,11 +16,184 @@ labels: {% partial file="/@i18n/ja/docs/_snippets/tx-metadata-field-table.md" /%} + ## メタデータの例 -次のJSONオブジェクトは、[複雑なクロスカレンシー支払い](https://livenet.xrpl.org/transactions/8C55AFC2A2AA42B5CE624AEECDB3ACFDD1E5379D4E5BF74A8460C5E97EF8706B)のメタデータを示しています。 +次のJSONオブジェクトは、[XRPからUSDへの交換](https://livenet.xrpl.org/transactions/424661CF1FD3675D11EC910CF161979553B6D135F9BD03E6F8D4611D88D27581)のメタデータを示しています。 + +```json +"meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rBTwLga3i2gz3doX6Gva3MgEV8ZCD8jjah", + "Balance": "27724423128", + "Flags": 0, + "OwnerCount": 14, + "Sequence": 129693478 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "1ED8DDFD80F275CB1CE7F18BB9D906655DE8029805D8B95FB9020B30425821EB", + "PreviousFields": { + "Balance": "27719423228", + "Sequence": 129693477 + }, + "PreviousTxnID": "3110F983CDC090750B45C9BFB74B8CE629CA80F57C35612402B2760153822BA5", + "PreviousTxnLgrSeq": 86724072 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rPx6Rbh8fStXeP3LwECBisownN2ZyMyzYS", + "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E1566CBCC208000", + "BookNode": "0", + "Flags": 0, + "OwnerNode": "0", + "PreviousTxnID": "DCB061EC44BBF73BBC20CE0432E9D8D7C4B8B28ABA8AE5A5BA687476E7A796EF", + "PreviousTxnLgrSeq": 86724050, + "Sequence": 86586865, + "TakerGets": "0", + "TakerPays": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "348AF66EBD872FBF2BD23085D3FB4A200E15509451475027C4A5EE8D8B77C623", + "PreviousFields": { + "TakerGets": "5000000", + "TakerPays": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "3.012" + } + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rPx6Rbh8fStXeP3LwECBisownN2ZyMyzYS", + "RootIndex": "4A68E363398C8DA470CF85237CA4A044476CD38BA7D5C9B8E8F19417A13B01C1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "4A68E363398C8DA470CF85237CA4A044476CD38BA7D5C9B8E8F19417A13B01C1" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-3.0120000001701" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "USD", + "issuer": "rPx6Rbh8fStXeP3LwECBisownN2ZyMyzYS", + "value": "0" + }, + "HighNode": "0", + "LowLimit": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "bd5" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "7345788A2C9121EB8168D2755950887CED3887CCDBC882015BC070A61C2AD1DA", + "PreviousFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.0000000001701" + } + }, + "PreviousTxnID": "B4726FC087FAB3DB3578A34095B96F9055075A86A16CE741B406D91202685998", + "PreviousTxnLgrSeq": 86722015 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-52157.74818800332" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "USD", + "issuer": "rBTwLga3i2gz3doX6Gva3MgEV8ZCD8jjah", + "value": "1000000000" + }, + "HighNode": "0", + "LowLimit": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "b29" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "8250CE37F6495903C1F7D16E072E8823ECE06FA73F011A0F8D79D5626BF581BB", + "PreviousFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-52160.76470600332" + } + }, + "PreviousTxnID": "B4726FC087FAB3DB3578A34095B96F9055075A86A16CE741B406D91202685998", + "PreviousTxnLgrSeq": 86722015 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rPx6Rbh8fStXeP3LwECBisownN2ZyMyzYS", + "Balance": "52479871", + "Flags": 0, + "OwnerCount": 2, + "Sequence": 86586866 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "9D398F1DEA77448C78196D6B01289A13D32DFCB4F9023A2A06338F893FA85521", + "PreviousFields": { + "Balance": "57479871", + "OwnerCount": 3 + }, + "PreviousTxnID": "DCB061EC44BBF73BBC20CE0432E9D8D7C4B8B28ABA8AE5A5BA687476E7A796EF", + "PreviousTxnLgrSeq": 86724050 + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4e1566cbcc208000", + "Flags": 0, + "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E1566CBCC208000", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000005553440000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E1566CBCC208000" + } + } + ], + "TransactionIndex": 5, + "TransactionResult": "tesSUCCESS" +} +``` -{% code-snippet file="/_api-examples/metadata/cross-currency-payment.json" language="json" /%} ## AffectedNodes @@ -32,6 +205,7 @@ labels: これらの各フィールドの値は、レジャーエントリに行われた変更を記述するJSONオブジェクトです。 + ### CreatedNodeのフィールド `CreatedNode`オブジェクトは次のフィールドを含みます。 @@ -40,7 +214,8 @@ labels: |:------------------|:--------------------|:-------------------------------------| | `LedgerEntryType` | 文字列 | 作成された[レジャーエントリの種類](../ledger-data/ledger-entry-types/index.md)。 | | `LedgerIndex` | 文字列 - [ハッシュ][] | レジャーの[状態ツリー](../../../concepts/ledgers/index.md)内のこの[レジャーエントリのID](../ledger-data/common-fields.md)。**注意:** 名前が非常に似ていますがこれは[レジャーインデックス](../data-types/basic-data-types.md#レジャーインデックス)とは**異なります**。 | -| `NewFields` | オブジェクト | 新しく作成されたレジャー エントリの内容を示すフィールド。どのフィールドが存在するかは、作成されたレジャーエントリの種類によって異なります。 | +| `NewFields` | オブジェクト | 新しく作成されたレジャーエントリの内容を示すフィールド。どのフィールドが存在するかは、作成されたレジャーエントリの種類によって異なります。 | + ### DeletedNodeのフィールド @@ -52,6 +227,7 @@ labels: | `LedgerIndex` | 文字列 - [ハッシュ][] | レジャーの[状態ツリー](../../../concepts/ledgers/index.md)内のこの[レジャーエントリのID](../ledger-data/common-fields.md)。**注意:** 名前が非常に似ていますがこれは[レジャーインデックス](../data-types/basic-data-types.md#レジャーインデックス)とは**異なります** | | `FinalFields` | オブジェクト | 削除されたレジャーエントリの最後の内容を示すフィールド。どのフィールドが存在するかは、削除されたレジャーエントリの種類によって異なります。 | + ### ModifiedNodeのフィールド `ModifiedNode`オブジェクトは次のフィールドを含みます。 @@ -65,11 +241,12 @@ labels: | `PreviousTxnID` | 文字列 - [ハッシュ][] | _(省略可能)_ このレジャーエントリを変更する前のトランザクションの[識別用ハッシュ][]。`PreviousTxnID`フィールドを持たないレジャーエントリの種類では省略されます。 | | `PreviousTxnLgrSeq` | 数値 - [レジャーインデックス][] | _(省略可能)_ このレジャーエントリを変更する前のトランザクションを含むレジャーバージョンの[レジャーインデックス][]。`PreviousTxnLgrSeq`フィールドを持たないレジャーエントリの種類では省略されます。 | -**注記:** 変更されたレジャーエントリに`PreviousTxnID`フィールドと`PreviousTxnLgrSeq`フィールドがある場合、トランザクションは常にトランザクションの識別ハッシュとトランザクションを含むレジャーバージョンのインデックスでそれらを更新しますが、これらのフィールドの新しい値は`ModifiedNode`オブジェクトの`FinalFields`にはリストされず、以前の値はネストされた`PreviousFields`オブジェクトではなく `ModifiedNode` オブジェクトのトップレベルにリストされます。 +**注記:** 変更されたレジャーエントリに`PreviousTxnID`フィールドと`PreviousTxnLgrSeq`フィールドがある場合、トランザクションは常にトランザクションの識別ハッシュとトランザクションを含むレジャーバージョンのインデックスでそれらを更新しますが、これらのフィールドの新しい値は`ModifiedNode`オブジェクトの`FinalFields`にはリストされず、以前の値はネストされた`PreviousFields`オブジェクトではなく`ModifiedNode`オブジェクトのトップレベルにリストされます。 + ## NFTのフィールド -NFTを含むトランザクション(`tx` と `account_tx`)はメタデータに以下のフィールドを含むことができます。これらの値はリクエスト時にサーバによって追加され、ハッシュ化されたバイナリメタデータには格納されません。 +NFTを含むトランザクション(`tx`と`account_tx`)はメタデータに以下のフィールドを含むことができます。これらの値はリクエスト時にサーバによって追加され、ハッシュ化されたバイナリメタデータには格納されません。 | フィールド | 値 | 説明 | |:--------------------|:--------------------------|:---------------------------| diff --git a/@i18n/ja/docs/references/protocol/transactions/types/payment.md b/@i18n/ja/docs/references/protocol/transactions/types/payment.md index e6583c253c..f868a378ab 100644 --- a/@i18n/ja/docs/references/protocol/transactions/types/payment.md +++ b/@i18n/ja/docs/references/protocol/transactions/types/payment.md @@ -42,13 +42,14 @@ Paymentは、[アカウントを作成](#アカウントの作成)する唯一 | フィールド | JSONの型 | [内部の型][] | 説明 | |:---------------|:--------------|:------------------|:-----------------| -| Amount | [通貨額][] | Amount | 送金する通貨額。XRP以外の金額の場合、入れ子フィールドの名前では、アルファベットの小文字のみ使用してください。[**tfPartialPayment**フラグ](#paymentのフラグ)が設定されている場合は、この金額を _上限_ とする金額を送金します。 | -| Destination | 文字列 | AccountID | 支払いを受取るアカウントの一意アドレス。 | -| DestinationTag | 数値 | UInt32 | _(省略可)_ 宛先(支払先となる、ホスティングされている受取人)への支払い理由を明確にするための任意のタグ。 | -| InvoiceID | 文字列 | Hash256 | _(省略可)_ この支払いの具体的な理由または識別子を表現する任意の256ビットハッシュ。 | -| Paths | パス配列の配列 | PathSet | (省略可。自動入力可能)このトランザクションに使用される[支払いパス](../../../../concepts/tokens/fungible-tokens/paths.md)の配列。XRP間のトランザクションでは省略する必要があります。 | -| SendMax | [通貨額][] | Amount | _(省略可)_ [送金手数料](../../../../concepts/tokens/transfer-fees.md)、為替レート、[スリッページ](http://en.wikipedia.org/wiki/Slippage_%28finance%29)を含め、このトランザクションに関して支払い元通貨での負担を許容する上限額。[トランザクションの送信コストとして消却されるXRP](../../../../concepts/transactions/transaction-cost.md)は含めないでください。XRP以外の金額の場合、入れ子フィールドの名前では、アルファベットの小文字のみ使用してください。クロスカレンシー支払いまたは複数のトークンを伴う支払いについては、このフィールドを入力する必要があります。XRP間の支払いでは省略する必要があります。 | -| DeliverMin | [通貨額][] | Amount | _(省略可)_ このトランザクションで送金する、宛先通貨での最少金額。[Partial Payments](../../../../concepts/payment-types/partial-payments.md)の場合のみ有効になります。XRP以外の金額の場合、入れ子フィールドの名前では、アルファベットの小文字のみ使用してください。 | +| `Amount` | [通貨額][] | Amount | 送金する通貨額。XRP以外の金額の場合、入れ子フィールドの名前では、アルファベットの小文字のみ使用してください。[**tfPartialPayment**フラグ](#paymentのフラグ)が設定されている場合は、この金額を _上限_ とする金額を送金します。 | +| `Destination` | 文字列 | AccountID | 支払いを受取るアカウントの一意アドレス。 | +| `DestinationTag` | 数値 | UInt32 | _(省略可)_ 宛先(支払先となる、ホスティングされている受取人)への支払い理由を明確にするための任意のタグ。 | +| `InvoiceID` | 文字列 | Hash256 | _(省略可)_ この支払いの具体的な理由または識別子を表現する任意の256ビットハッシュ。 | +| `Paths` | パス配列の配列 | PathSet | (省略可。自動入力可能)このトランザクションに使用される[支払いパス](../../../../concepts/tokens/fungible-tokens/paths.md)の配列。XRP間のトランザクションでは省略する必要があります。 | +| `SendMax` | [通貨額][] | Amount | _(省略可)_ [送金手数料](../../../../concepts/tokens/transfer-fees.md)、為替レート、[スリッページ](http://en.wikipedia.org/wiki/Slippage_%28finance%29)を含め、このトランザクションに関して支払い元通貨での負担を許容する上限額。[トランザクションの送信コストとして消却されるXRP](../../../../concepts/transactions/transaction-cost.md)は含めないでください。XRP以外の金額の場合、入れ子フィールドの名前では、アルファベットの小文字のみ使用してください。クロスカレンシー支払いまたは複数のトークンを伴う支払いについては、このフィールドを入力する必要があります。XRP間の支払いでは省略する必要があります。 | +| `DeliverMin` | [通貨額][] | Amount | _(省略可)_ このトランザクションで送金する、宛先通貨での最少金額。[Partial Payments](../../../../concepts/payment-types/partial-payments.md)の場合のみ有効になります。XRP以外の金額の場合、入れ子フィールドの名前では、アルファベットの小文字のみ使用してください。 | + ## Paymentの種類 @@ -86,7 +87,7 @@ Payment型のトランザクションでは、資金供給のないアドレス ## パス -`Paths`フィールドが存在する場合、Pathフィールドには、 _パスセット_ (パス配列の配列)が記述されていなければなりません。個々のパスは、さまざまな仲介アカウントやオーダーブックを経由して、送信者から受信者へと価値が1つの方向へ流れることを表します。単一のトランザクションで、複数のパスを使用する可能性もあります。例えば、トランザクションで複数のオーダーブックを使用して、最も有利なレートで通貨を交換する場合です。 +`Paths`フィールドが存在する場合、Pathフィールドには、 _パスセット_ (パス配列の配列)が記述されていなければなりません。個々のパスは、さまざまな仲介アカウントやオーダーブックを経由して、送信者から受信者へと価値が1つの方向へ流れることを表します。単一のトランザクションで、複数のパスを使用する可能性もあります。例えば、トランザクションで複数のオーダーブックやAMMを使用して、最も有利なレートで通貨を交換する場合です。 以下の場合を含め、直接の支払いでは`Paths`フィールドを省略する必要があります。 @@ -105,7 +106,7 @@ Payment型のトランザクションについては、[`Flags`フィールド]( | フラグの名前 | 16進値 | 10進値 | 説明 | |:-------------------|:-------------|:--------------|:-----------------------------| -| `tfNoDirectRipple` | `0x00010000` | 65536 | デフォルトパスを使用せず、`Paths`フィールドに含まれているパスのみ使用します。これによりトランザクションは強制的に裁定機会を活用することになります。ほとんどのクライアントでは、これは必要ありません。 | +| `tfNoRippleDirect` | `0x00010000` | 65536 | デフォルトパスを使用せず、`Paths`フィールドに含まれているパスのみ使用します。これによりトランザクションは強制的に裁定機会を活用することになります。ほとんどのクライアントでは、これは必要ありません。 | | `tfPartialPayment` | `0x00020000` | 131072 | `SendMax`を超えていないのに指定された`Amount`を送金できない場合、即座に失敗とするのではなく、受取られる額を減額します。詳細は、[Partial Payments](../../../../concepts/payment-types/partial-payments.md)をご覧ください。 | | `tfLimitQuality` | `0x00040000` | 262144 | すべての変換で、入力と出力との比率が`Amount`と`SendMax`との比率と同一であるか、さらに有利となるパスのみを採用します。詳細は、[クオリティの制限](#クオリティの制限)をご覧ください。 | diff --git a/@i18n/ja/docs/tutorials/how-tos/use-specialized-payment-types/index.md b/@i18n/ja/docs/tutorials/how-tos/use-specialized-payment-types/index.md index c39ade9463..629a7a89cc 100644 --- a/@i18n/ja/docs/tutorials/how-tos/use-specialized-payment-types/index.md +++ b/@i18n/ja/docs/tutorials/how-tos/use-specialized-payment-types/index.md @@ -4,7 +4,7 @@ parent: tasks.html metadata: indexPage: true --- -# 専門的な支払いタイプの使用 +# 高度な支払い機能の利用 EscrowやPayment Channelなどの高度な機能を使用して、XRP Ledgerでスマートアプリケーションを構築しましょう。 diff --git a/@i18n/ja/docs/tutorials/index.md b/@i18n/ja/docs/tutorials/index.md new file mode 100644 index 0000000000..2749f0156c --- /dev/null +++ b/@i18n/ja/docs/tutorials/index.md @@ -0,0 +1,41 @@ +--- +seo: + description: 開発者向けの暗号資産ウォレットやブロックチェーンのチュートリアルで、XRP Ledgerを使った開発方法を学びましょう。 +--- +# 暗号資産ウォレットやブロックチェーン開発のチュートリアル + +XRP Ledgerを学び、使い始め、そして高度なユースケースで使用するための手順を説明します。 + +## SDKを使って始める + +これらのチュートリアルでは、お好きなプログラミング言語を使って、XRP Ledgerに接続するアプリケーションを構築するための基礎について説明します。 + +{% card-grid %} + +{% xrpl-card title="Javascript" body="クライアントライブラリxrpl.jsを使用" href="/docs/tutorials/javascript/" image="/img/logos/javascript.svg" imageAlt="Javascript logo" /%} + +{% xrpl-card title="Python" body="Pythonライブラリxrpl.pyを使用" href="/docs/tutorials/python/" image="/img/logos/python.svg" imageAlt="Python logo" /%} + +
+ +{% xrpl-card title="Java" body="Javaライブラリを使用" href="/docs/tutorials/java/" image="/img/logos/java.svg" imageAlt="Java logo" /%} + +{% xrpl-card title="PHP" body="PHPライブラリXRPL_PHPを使用" href="/docs/tutorials/php/" image="/img/logos/php.svg" imageAlt="PHP logo" /%} + +{% xrpl-card title="HTTP & WebSocket API" body="コアサーバのAPIを通じてXRP Ledgerに直接アクセス" href="/docs/tutorials/http-websocket-apis/" image="/img/logos/globe.svg" imageAlt="globe icon" /%} + +{% /card-grid %} + +## 使い方 + +これらの例では、順を追って操作方法を説明しています。 + +{% card-grid %} + +{% xrpl-card title="アカウントの設定" body="XRP Ledgerアカウントを設定して、自由に支払いを行いましょう。" href="/docs/tutorials/how-tos/manage-account-settings/" /%} +{% xrpl-card title="高度な支払い機能" body="エスクローやペイメントチャネルなどの高度な支払い機能を使って、XRP Ledger上に新しいアプリケーションを構築しましょう。" href="/docs/tutorials/how-tos/use-specialized-payment-types/" /%} +{% xrpl-card title="トークンの利用" body="XRP Ledgerでトークン(代替可能またはそれ以外)を作成し、取引しましょう。" href="/docs/tutorials/how-tos/use-tokens/" /%} +{% xrpl-card title="XRPLサイドチェーンの利用" body="メインネットからXRPLサイドチェーンにXRPやトークンをブリッジしましょう。" href="/docs/tutorials/how-tos/use-xrpl-sidechains/" /%} + + +{% /card-grid %} diff --git a/@i18n/ja/docs/use-cases/defi/list-xrp-as-an-exchange.md b/@i18n/ja/docs/use-cases/defi/list-xrp-as-an-exchange.md index 143947ab08..1da169a0c3 100644 --- a/@i18n/ja/docs/use-cases/defi/list-xrp-as-an-exchange.md +++ b/@i18n/ja/docs/use-cases/defi/list-xrp-as-an-exchange.md @@ -90,7 +90,7 @@ Rippleが推奨するベストプラクティスに従い、Alpha Exchangeは、 * オプションとして、コールドウォレットとホットウォレットの間で追加のセキュリティ層を提供する、1つ以上のウォームウォレット。ホットウォレットとは異なり、ウォームウォレットのシークレットキーはオンラインである必要はありません。さらに、ウォームウォレットのシークレットキーを複数の人に分散し、[マルチシグ](../../concepts/accounts/multi-signing.md)を導入してセキュリティを強化することもできます。 - 不正使用されたウォームウォレットによって発生するおそれのある結果についての詳細は、[スタンバイアドレスの漏えい](../../concepts/accounts/account-types.md#スタンバイアドレスの漏えい)をご覧ください。 + 不正使用されたウォームウォレットによって発生するおそれのある結果についての詳細は、[待機アドレスの漏えい](../../concepts/accounts/account-types.md#待機アドレスの漏えい)をご覧ください。 関連項目: diff --git a/@i18n/ja/resources/contribute-code/index.md b/@i18n/ja/resources/contribute-code/index.md index 0c9a1fe7ff..6e6dc53275 100644 --- a/@i18n/ja/resources/contribute-code/index.md +++ b/@i18n/ja/resources/contribute-code/index.md @@ -86,7 +86,7 @@ XLSドラフトを作成した後、その変更にAmendmentが必要かどう ## コードのフローチャート -![コードのフローチャート](/docs/img/Contribute Code Flowchart.png) +![コードのフローチャート](/docs/img/contribute-code-flowchart.png) ## 関連項目 diff --git a/@i18n/ja/resources/contribute-documentation/index.md b/@i18n/ja/resources/contribute-documentation/index.md index d76ee85222..94cab056f8 100644 --- a/@i18n/ja/resources/contribute-documentation/index.md +++ b/@i18n/ja/resources/contribute-documentation/index.md @@ -19,117 +19,107 @@ XRPL Dev Portalでは、開発者が開発を開始するためのサンプル 本プロジェクトの公式リポジトリはとなっています。投稿の著作権はそれぞれの投稿者に帰属しますが、MIT[ライセンス](https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE)の下で提供されなければなりません。 - - ## リポジトリの構成 -***TODO: Update this translation*** +- `_api-examples/` - APIリクエストやレスポンスのサンプル(特にドキュメントで使用されているもの) +- `_code-samples/` - ドキュメントで使用されているサンプルコード(可能な限り完全に動作するスクリプト) +- `@i18n` - 英語以外の翻訳コンテンツ +- `@theme` - MarkdocのコンテンツやReactのカスタムページで使用されるコンポーネントのオーバーライドやカスタムコンポーネント +- `about/` - 概要セクションのソースファイル +- `blog/` - XRPL開発者ブログのソースファイル +- `community/` - コミュニティセクションのソースファイル +- `docs/` - ドキュメントをビルドするためのソースファイル(ほとんどがMarkdownファイル) + - `docs/_snippets/` - ドキュメント内で再利用可能なテキスト + - `docs/img/` - ドキュメント内で利用する図やその他の画像 + - `docs/img/_sources/` - ドキュメント内で利用する画像のソースファイル(存在する場合) +- `locale/` - **廃止** 以前利用されていた翻訳用のファイル +- `resources/` - リソースセクションのソースファイル +- `shared/` - CodeMirrorなどの依存関係の設定ファイル +- `static/` - Webサイトのテンプレートやテーマで使用される静的ファイル +- `styles/` - カスタムCSS用のSCSSのソースファイル +- `redirects.yaml` - 以前利用されていたパスから現在のコンテンツへのリダイレクトの定義 +- `redocly.yaml` - Webサイトにの主要な設定ファイル +- `sidebars.yaml` - ドキュメントおよびリソースセクションのサイドバーの定義 +- `top-nav.yaml` - ナビゲーションバーの定義 -- `_api-examples/` - Sample API requests and responses, especially ones used in the documentation. -- `_code-samples/` - Code samples used or referenced by the documentation. Where possible, these are fully functional / executable scripts. -- `@i18n` - Translations into languages other than English. Currently, only Japanese. -- `@theme` - Overrides and custom components used in Markdoc contents as well as custom React pages. -- `about/` - Source files for the About section's pages. -- `blog/` - Source files for the XRPL Dev Blog. -- `community/` - Source files for the Community section's pages. -- `docs/` - Source files used to build the documentation. Mostly in Markdown. - - `docs/_snippets/` - Reusable pieces of text used in the documentation. - - `docs/img/` - Diagrams and other images used in the documentation. - - `docs/img/_sources/` - Source files for images used in the documentation, where available. -- `locale/` - **DEPRECATED** Old localization files. -- `resources/` - Source files for the Resources section's pages. -- `shared/` - Configuration files for some dependencies like CodeMirror. -- `static/` - Static files used by the site's templates and theme. -- `styles/` - SCSS source files for custom CSS. -- `redirects.yaml` - Definitions of redirects from old site URLs to current paths. -- `redocly.yaml` - Main config file for the site. -- `sidebars.yaml` - Defines sidebars for the Documentation and Resources sections. -- `top-nav.yaml` - Defines the main top nav elements. ## プルリクエストが承認されるための条件 レビューやマージが承認される前に、それぞれのプルリクエストは以下の条件を満たしていなければなりません。 + - インテグレーションテストに合格すること。 - レビューの準備が整うまで、[Draft](https://github.blog/2019-02-14-introducing-draft-pull-requests/)としてください。 - このリポジトリの[コード規約](https://github.com/XRPLF/xrpl-dev-portal/blob/master/CODE-OF-CONDUCT.ja.md)を遵守してください。 -## Dactylのセットアップ +## Redoclyのセットアップ -ポータルは[Dactyl](https://github.com/ripple/dactyl)を使用して構築されています。 +このポータルはRecokly Realmを使用して構築されています。Realmは現在クローズドベータ版です。ローカル開発環境にインストールするには、Node.js(バージョン20が推奨)とNPMが必要です。 -Dactylには[Python 3](https://python.org/)が必要です。[pip](https://pip.pypa.io/en/stable/)を使ってインストールしてください: +次のコマンドを実行して、Realmとその他の必要な依存関係をインストールできます。 -``` -pip3 install dactyl +```sh +npm i ``` ## サイトの構築 -このリポジトリでは、[**Dactyl**](https://github.com/ripple/dactyl)を使用して、すべてのドキュメントのHTMLをビルドしています。[Dactylのセットアップ](#dactylのセットアップ)を行った後、プロジェクトのルートディレクトリからサイトをビルドすることができます。 +依存関係のインストール後、次のコマンドを実行してローカル開発サーバを起動できます。 -``` -dactyl_build +```sh +npm run start ``` -生成されたコンテンツは`out/`ディレクトリに出力されます。これらのコンテンツはウェブブラウザでファイルとして開いたり、ウェブサーバで静的コンテンツとして扱うことができます。 +ブラウザでhttp://localhost:4000/にアクセスしてプレビューを表示できます。 -ルートディレクトリからリンクチェックやスタイルチェックを実行することもできます。 - -リンクチェックは出力フォルダを空にしてからビルドしてください。 - -``` -dactyl_link_checker -``` - -スタイルチェックは実験的なものです。 - -``` -dactyl_style_checker -``` ## 設定ファイルのフォーマット -このリポジトリでは、`dactyl-config.yml`ファイルのメタデータとページの[frontmatter](https://dactyl.link/frontmatter.html)を使って、ヘッダー、フッター、サイドバー、パンくずリストなどのナビゲーション要素を生成します。 +Realmの設定ファイルは、サイト内のナビゲーション要素を生成するために使用されます。これには、ヘッダー、フッター、サイドバー、パンくずリストが含まれます。 -新しいページを追加する場合、`dactyl-config.yml`ファイルのpages配列の適切な位置に追加する必要があります。追加例は次のようになります。 +新しいページを追加する場合、そのページを`sidebars.yaml`ファイルに追加する必要があります。ドキュメントとブログ用のサイドバーのファイルがあります。以下は、ネストされた子ページがないページの項目の例です。 ```yaml - - md: concepts/the-rippled-server/the-rippled-server.md - targets: - - en - - ja # 翻訳コンテンツがない場合、全てのターゲットを対象とします。 +- page: concepts/consensus-protocol/index.md ``` -Markdownファイル自体は、以下のようなfrontmatterで始まる必要があります。 - -```yaml ---- -html: the-rippled-server.html -parent: concepts.html -metadata: - indexPage: true -seo: - description: rippled is the core peer-to-peer server that manages the XRP Ledger. This section covers concepts that help you learn the "what" and "why" behind fundamental aspects of the rippled server. ---- -``` - -少なくとも、ほとんどのページには `html`、`parent`、`blurb` フィールドが必要です(さらに、設定ファイルでは`md`フィールドと`targets`フィールドも必要です)。ここに、またはページの設定ファイルのエントリに任意のキーと値のペアを記述することができますが、以下のものが関係しています。 +Markdownファイルのページは、[frontmatterスタンザ](#frontmatterのフィールド)で始まる必要があります。 ### 規約 ページを作成する際には、以下の規約に従ってください。 -- HTMLのファイル名とMDのファイル名は、拡張子を除いて完全に一致していなければなりません。 -- ファイル名は"and"や"the"のような単語を含め、ページのタイトルと密接に一致する必要がありますが、スペースや句読点の代わりにハイフンを使用し、すべて小文字にする必要があります。例えば、`cash-a-check-for-an-exact-amount.md`のようにします。ページのタイトルを変更した場合は、ファイル名も変更する必要があります。(すでに別のURLで公開されている場合は、古いURLからのリダイレクトを残してください) +- HTMLのファイル名とMDのファイル名は、拡張子を除いて完全に一致していなければなりません。ファイル名は"and"や"the"のような単語を含め、ページのタイトルと密接に一致する必要がありますが、スペースや句読点の代わりにハイフンを使用し、すべて小文字にする必要があります。例えば、`cash-a-check-for-an-exact-amount.md`のようにします。ページのタイトルを変更した場合は、ファイル名も変更する必要があります。(すでに別のURLで公開されている場合は、古いURLからのリダイレクトを残してください) + - カテゴリ内のページは、そのカテゴリの名前のサブフォルダに配置されるべきですが、親ディレクトリにも同じ単語が含まれている場合は、より簡潔にすることができます。ファイル名は`index.md`で、タイトルはフォルダ名に似ている必要があります。例えば、"Protocol Reference"のインデックスページは`references/protocol/index.md`にあります。 - 常にh1ヘッダーでページを始めます。 - ページの一番上のh1アンカーにはリンクせず、アンカーなしでページ自体にリンクしてください。これは翻訳時のリンク切れを防ぐのに役立ちます。以降のヘッダーへのリンクは問題ありません。 -- ページのタイトルに書式( _italics_ や`code font`など)を使わないでください。 +- ページのタイトルに書式( _斜体_ や`コード`など)を使わないでください。 - Markdownファイルのテキストを折り返さないでください。 -- コードサンプルの場合、行は80文字以下になるようにしてください。 +- コードサンプルの場合、1行は80文字以下になるようにしてください。 - 迷ったら、[Ciro SantilliのMarkdownスタイルガイド (Writability Profile)](https://cirosantilli.com/markdown-style-guide/)に従ってください。 -- カテゴリ内のページはそのカテゴリの名前のサブフォルダにあるべきですが、(特にページのタイトルが親ディレクトリにもある単語を含んでいる場合は)あまり冗長でなく、ファイル名`index.md`とフォルダ名に似たタイトルを持つべきです。例えば、「プロトコルリファレンス」のインデックスページは`references/protocol/index.md`です。 - - Markdownやコードサンプルでは、インデントにタブ文字を使用しないでください。**JavaScript**のコードサンプルでは、1字下げにつき2個のスペースを使用してください。 +- テキストファイルは改行文字で終わるようにしてください。(一部のテキストエディタはこれを自動的に処理します。)ファイルはBOMなしのUTF-8でエンコードしてください。 + +### 新機能 + +新機能を文書化する場合、その機能が導入されたプログラムのバージョンを示すバッジを含めてください。バッジタグは以下の構造です。 + +`{badge href="myurl" date="<リリース日>"}新規: <プログラム> <バージョン番号>{% /badge%}` + +例えば次のようなバッジ定義になります。 + +`{% badge href="https://github.com/XRPLF/clio/releases/tag/2.0.0" date="February 18, 2024" %}新規: Clio v2.0.0{% /badge %}` + +次のように表示されます。 {% badge href="https://github.com/XRPLF/clio/releases/tag/2.0.0" date="February 18, 2024" %}新規: Clio v2.0.0{% /badge %} + +When updating a feature, replace _New in:_ with _Updated in:_. For example, the following badge definition: + +機能の更新の場合、_新規:_ を _更新:_ に置き換えてください。例えば、次のバッジ定義となります。 + +`{% badge href="https://github.com/XRPLF/clio/releases/tag/2.1.0" date="May 4, 2024" %} 更新: Clio v2.1.0{% /badge %}` + +次のように表示されます。 {% badge href="https://github.com/XRPLF/clio/releases/tag/2.1.0" date="May 4, 2024" %} 更新: Clio v2.1.0{% /badge %} + +2年以上前の新規/更新バッジは削除するのがベストプラクティスです。 ### 技術用語 @@ -156,29 +146,230 @@ seo: ## Frontmatterのフィールド -このリポジトリのMarkdownファイルのfronmatterは任意のキーと値のペアを含むことができます。以下のフィールドは特定の用途や意味を持ちます。 +***Note: Realmのfrontmatter仕様の詳細は完全には文書化されていません。Realmがクローズドベータを終了したら、リンクを更新する必要があります。*** -| フィールド | 型 | 内容 | -|:---------------------|:-----------------|:-----------------------------------| -| `html` | String | ページの出力ファイル名。`.html`で終わり、ターゲット内で一意でなければなりません。翻訳版のページでは、ファイル名は英語版のページと同じにしてください。 | -| `parent` | String | ページの「親」ページの`html`の値。このページがナビゲーションのどこに表示されるかを示します。 | -| `blurb` | String | ページの要約文(プレーンテキストのみ)。ランディングページやソーシャルメディア上でリンクを展開する際のメタデータなど、さまざまな場所に表示されます。 | -| `name` | String | ページ名(プレーンテキストのみ)。 Markdownコンテンツのあるファイルでは、Dactylがコンテンツの最初の行のヘッダーから自動的に検出できるため、これを省略する必要があります。これは通常、Markdownファイルを持たないランディングページやその他の特別なページでのみ提供されます。 | -| `template` | String | このページで使用するテンプレートファイルのファイル名(`template/`ディレクトリ内)。ほとんどのページはデフォルトのテンプレートを使用します。`pagetype-category.html.jinja`テンプレートは最後に子ページのリストを表示します。特別な、あるいは特にユニークなレイアウトを持つページには、個別のテンプレートが必要になることがあります(通常、`page-`で始まります)。 | -| `status` | String | XRP Ledgerメインネットでまだ有効になっていない修正に関連するページでは、`not_enabled`を使用します。これにより、ナビゲーションのページの横にツールチップ付きの"フラスコ"バッジが表示されます。 | -| `nav_omit` | Boolean | ナビゲーション要素にこのページを表示しないようにするには`true`を使用します。 | -| `top_nav_omit` | Boolean | ページトップのドロップダウンナビゲーションに表示しないようにするには、`true`を使用します。 | -| `top_nav_level` | Number | トップナビのドロップダウンでページのインデントレベルを調整します。レベル`2`は、ドロップダウン内でその上のページの子のように表示されるようにインデントされます。 | -| `sidebar` | String | U左右のサイドバーを非表示にするには、`disabled`を使用します(ページがベーステンプレートから派生したテンプレートを使用している場合)。 | -| `fb_card` | String | Facebookでこのページへのリンクを展開する際に使用する画像のファイル名(`assets/img/`内)。 | -| `twitter_card` | String | Twitterでこのページへのリンクを展開する際に使用する画像のファイル名(`assets/img/`内)。 | -| `redirect_url` | String | `template: pagetype-redirect.html.jinja`でのみ使用します。ユーザがこのページに移動したときに、指定されたURLに自動的にリダイレクトします。 | -| `cta_text` | String | このページにリンクする「call to action」ボタンに表示されるテキスト(特別なランディングページにて表示されます)。 | -| `curated_anchors` | Array of Objects | 子ページと同様に、ランディングページに表示するためのアンカーです。配列の各オブジェクトは、人間が読める`name`フィールド(`"Available Modes"`など) と、リンク先のHTML IDを持つ`anchor`フィールド(`"#available-modes"`など)を持つ必要があります。 | -| `skip_spell_checker` | Boolean | `true`を使用すると、Dactylのスタイルチェッカーがこのページのスペルチェックをスキップします。 | -| `filters` | Array of Strings | このページで使用する追加フィルタのリストです。[フィルタ](https://github.com/ripple/dactyl/blob/master/README.md#filters)はPythonスクリプトで、ページ内容の事前または事後の追加処理を行います。 | -| `canonical_url` | String | クエリパラメータを受け取るページの正規URLを提供します。検索エンジンやその他のツールは、ページにリンクする際にこれを使用する可能性があります。 | -| `embed_xrpl_js` | Boolean | 最新版の[xrpl.js](https://js.xrpl.org)をこのページで読み込むには`true`を使用してください。 | +MarkdownファイルのFrontmatterには、以下のような内容が含まれます。 + +```yaml +--- +metadata: + indexPage: true # 自動生成された子ページのリストを含めたい場合、追加してください。 +seo: + description: rippledはXRP Ledgerを管理するコアとなるピアツーピアサーバです。このセクションでは、rippledサーバの基本的な機能の背景にある「要素」と「その理由」を学ぶのに役立つ概念について説明します。 +--- +``` + +サイト内の一部のページには、以前の(Dactyl)ツールチェーンからのメタデータが残っている場合があります。これらのフィールドは効果がないため、新しいページから省略することができます。 + +### 次へと前へのボタン + +ドキュメントとブログページには、ページの下部に「次へ」ボタンと「前へ」ボタンがあります。 + +これらのボタンが不要な場合は、ページのfrontmatterを更新して無効にすることができます。 + +```yaml +--- +theme: + navigation: + nextButton: + hide: true +--- +``` + +## Markdocのコンポーネント + +これらのファイルは[Markdoc](https://markdoc.dev/)で処理されるため、`{% ... %}`構文で特別なタグを含めることができます。Redoclyの組み込みタグに加えて、このリポジトリには`/@theme/markdoc/`に定義されたいくつかのカスタムタグがあります。 + +### グラフィック + +`/docs/img`ディレクトリにグラフィックを保存します。グラフィックを埋め込むには、次の構文を使用します。 + +`![image_description](/docs/img/my_image.png)` + +例えば、`![XRPL財団のロゴ](/docs/img/xrplf-logo.png)`は次のように表示されます。 + +![XRPL財団のロゴ](/docs/img/xrplf-logo.png) + +### ビデオ + +ビデオはYouTubeに保存されます。アップロード後、埋め込み手順をコピーしてドキュメントに貼り付けることができます。 + +コンテンツにYouTubeビデオを埋め込むには、次の手順に従います。 + +1. YouTubeにビデオをアップロードします。 +2. ビデオページの**共有**ボタンをクリックします。 +3. **埋め込む**をクリックします。 +4. ポップアップ右下の**コピー**をクリックします。 +5. コンテンツに` +``` + + + +### テーブル + +Markdocは、テーブルを生成するための3つの異なる構文スタイルを提供します。 + +ほとんどの場合、列を区切るためにパイプ文字(|)を使用し、ハイフン3つ以上(---)を使用して列ヘッダを作成します。 + +``` +| | Head 1 | +| ------- | ------ | +| Label 1 | Val 1 | +``` + +次のように表示されます。 + +| | Head 1 | +| ------- | ------ | +| Label 1 | Val 1 | + +セルの幅は同じである必要はありません。自動的に列を整列し、必要に応じてテキストを折り返します。 + +``` +| Key | Value | +| --- | ----- | +| Name | H. G. Wells | +| Genre | Science Fiction | +| Hyperbole | The greatest story ever told! No one has ever written anything more important than this Victorian era classic. Oh, how swells the heart to ponder the heady philosophies introduced therein! | +``` + +| Key | Value | +| --- | ----- | +| Name | H. G. Wells | +| Genre | Science Fiction | +| Hyperbole | The greatest story ever told! No one has ever written anything more important than this Victorian era classic. Oh, how swells the heart to ponder the heady philosophies introduced therein! | + +ヘッダ行にコロンを使用して、列を左寄せ(:--)、中央寄せ(:-:)、または右寄せ(--:)に配置します。 + +``` +| Model | Color | Price | +| :-: | :-- | --: | +| Protexra | Electric Blue | 50,000 XRP | +| Joatic | Hot Pink | 165,000 XRP | +| Zhanu | Neon Green | 234,000 XRP | +``` + +| Model | Color | Price | +| :-: | :-- | --: | +| Protexra | Electric Blue | 50,000 XRP | +| Joatic | Hot Pink | 165,000 XRP | +| Zhanu | Impetuous Green | 1,728,000 XRP | + +左の列はデフォルトで太字になります。左の列に太字のラベルを表示したくない場合は、左の列を空にして、テーブルを1列目から始めてください。 + +``` +| | French | English | German | +| --- | --- | --- | --- | +| | Fromage | Cheese | Käse | +| | Maux d'estomac | Stomach ache | Magenschmerzen | +| | Cornichon | Pickle | Essiggurke | +``` + +| | French | English | German | +| --- | --- | --- | --- | +| | Fromage | Cheese | Käse | +| | Maux d'estomac | Stomach ache | Magenschmerzen | +| | Cornichon | Pickle | Essiggurke | + +可能な限り、これらの基本的なテーブルを使用してください。上記の例で提供されていない特別なフォーマットが本当に必要な場合は、HTML構文を使用してテーブルを作成できます。 + +### リンク + +リンクは`[<リンクテキスト>]()`の構文を使用します。 + +例えば、次のように書きます。 + +`[XRPL.org](http://xrpl.org)で世界のあらゆる問題の解決策をご覧ください。` + +次のように表示されます。 + +[XRPL.org](http://xrpl.org)で世界のあらゆる問題の解決策をご覧ください。 + +### 共通のリンク + +共通的に引用されるページへのリンクを作成するには、`{% raw-partial file="/docs/_snippets/common-links.md /%}`タグをMarkdownファイルに追加し、`[account_infoメソッド][]`や`[Paymentトランザクション][]`などの参照スタイルのリンクを使用できます。common-linksファイルの内容はアルファベット順になっています。(以前はスクリプトで生成されていましたが、現在は手動で管理されています。) + +### サンプルコード + +サンプルコードを挿入する場合は、バッククォート(`)文字でコードを囲みます。例えば: + +    私のお気に入りのメソッドは`nft_info`です。 + +次のように表示されます。 + +    私のお気に入りのメソッドは`nft_info`です。 + +長いコードブロックの場合は、言語名に続いて3つのバッククォート(```)を使用します。改行を入力し、サンプルコードを入力します。コードサンプルの最後に改行を入力し、3つのバッククォート(```)でブロックを閉じます。 + +例えば、 + +```javascript
+    const prepared = await client.autofill({
+      "TransactionType": "Payment",
+      "Account": standby_wallet.address,
+      "Amount": xrpl.xrpToDrops(sendAmount),
+      "Destination": standbyDestinationField.value
+  }) +``` + +次のように表示されます。 + +```javascript + const prepared = await client.autofill({ + "TransactionType": "Payment", + "Account": standby_wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": standbyDestinationField.value + }) +``` + +### 部分的なコンテンツ + +頻繁に使用するテキストや、ドキュメント内の複数の場所で定期的に更新が必要なテキストがある場合は、再利用のために_snippetファイルを作成できます。 + +`_snippet`ディレクトリにファイルを保存します。部分的なコンテンツを挿入するには、`{% partial file="" /%}`構文を使用します。 + +例えば、次のようなスニペット`/docs/_snippets/secret-key-warning.md`があります。 + +
+{% admonition type="warning" name="Caution" %}
+Never submit a secret key to a server you do not control. Do not send a secret key unencrypted over the network.
+{% /admonition %} +
+ +テキストを埋め込むには、`{% partial file="/docs/_snippets/secret-key-warning.md" /%}`タグを使用します。 + +例えば、 + +
+There I was, happy as a lark, skipping through the daisies, when I shyly handed my secret + key to my one true love. + +{% partial file="/docs/_snippets/secret-key-warning.md" /%} + +Alas, if only I had heeded that sage advice, I would not rue the day as I do today. +
+ +次のように表示されます。 + +
+There I was, happy as a lark, skipping through the daisies, when I shyly handed my secret key to my one true love. + +{% partial file="/docs/_snippets/secret-key-warning.md" /%} + +Alas, if only I had heeded that sage advice, I would not rue the day as I do today. +
{% child-pages /%} diff --git a/@i18n/ja/resources/known-amendments.md b/@i18n/ja/resources/known-amendments.md index f04b46f027..ddbdeb41b7 100644 --- a/@i18n/ja/resources/known-amendments.md +++ b/@i18n/ja/resources/known-amendments.md @@ -17,15 +17,15 @@ labels: | 名前 | 登場 | ステータス | |:----------------------------------|:-----------|:------------------------------------| -| [fixAMMOverflowOffer][] | v2.1.1 | [投票中: 2024-03-27](https://xrpl.org/blog/2024/rippled-2.1.1.html "BADGE_80d0e0") | -| [fixInnerObjTemplate][] | v2.1.0 | [投票中: 2024-02-20](https://xrpl.org/blog/2024/rippled-2.1.0.html "BADGE_80d0e0") | -| [fixNFTokenReserve][] | v2.1.0 | [投票中: 2024-02-20](https://xrpl.org/blog/2024/rippled-2.1.0.html "BADGE_80d0e0") | +| [fixAMMOverflowOffer][] | v2.1.1 | [有効: 2024-04-11](https://livenet.xrpl.org/transactions/64144409D991726D108B89D79F9305438D61928A322EF1CD14DC3A5F24CE64BC "BADGE_GREEN") | +| [fixInnerObjTemplate][] | v2.1.0 | [有効: 2024-04-08](https://livenet.xrpl.org/transactions/EC67D9DF8D06067A76E8F8F43BC036B5E0267568F8D92624A658AC01A8186235 "BADGE_GREEN") | +| [fixNFTokenReserve][] | v2.1.0 | [有効: 2024-04-12](https://livenet.xrpl.org/transactions/D708CF1799A27CB982F16FCE4762DD12738737A61E5850480BA51400280E06C4 "BADGE_GREEN") | | [DID][] | v2.0.0 | [投票中: 2024-01-09](https://xrpl.org/blog/2024/rippled-2.0.0.html "BADGE_80d0e0") | -| [fixDisallowIncomingV1][] | v2.0.0 | [投票中: 2024-01-09](https://xrpl.org/blog/2024/rippled-2.0.0.html "BADGE_80d0e0") | -| [fixFillOrKill][] | v2.0.0 | [投票中: 2024-01-09](https://xrpl.org/blog/2024/rippled-2.0.0.html "BADGE_80d0e0") | +| [fixDisallowIncomingV1][] | v2.0.0 | [有効: 2024-04-11](https://livenet.xrpl.org/transactions/50286B4B9C95331A48D3AD517E1FD3299308C6B696C85E096A73A445E9EB1BFB "BADGE_GREEN") | +| [fixFillOrKill][] | v2.0.0 | [有効: 2024-04-11](https://livenet.xrpl.org/transactions/3209D6B66D375C23EEBE7C3DD3058B361427148D80C570B8E791D4C76555FA7B "BADGE_GREEN") | | [XChainBridge][] | v2.0.0 | [投票中: 2024-01-09](https://xrpl.org/blog/2024/rippled-2.0.0.html "BADGE_80d0e0") | | [AMM][] | v1.12.0 | [有効: 2024-03-22](https://livenet.xrpl.org/transactions/75F52BB86416717288999523063D54E24290EFEA2E99DF78E80A12BD1C8FAC99 "BADGE_GREEN") | -| [XRPFees][] | v1.10.0 | [投票中: 2023-03-14](https://xrpl.org/blog/2023/rippled-1.10.0.html "BADGE_80d0e0") | +| [XRPFees][] | v1.10.0 | [有効: 2023-03-25](https://xrpl.org/blog/2023/rippled-1.10.0.html "BADGE_80d0e0") | | [Clawback][] | v1.12.0 | [有効: 2024-02-08](https://livenet.xrpl.org/transactions/C6BCCE60DFA4430A1F9097D774EA49E6FEFB1B535BA0EF9170DA0F2D08CDDB11 "BADGE_GREEN") | | [fixReducedOffersV1][] | v1.12.0 | [有効: 2023-11-24](https://livenet.xrpl.org/transactions/87723D9D01AFAD8E55C944D7D1598969A8FBD852FCACAE361A40CBF5D4CB3BB1 "BADGE_GREEN") | | [fixNFTokenRemint][] | v1.11.0 | [有効: 2023-11-27](https://livenet.xrpl.org/transactions/CA4562711E4679FE9317DD767871E90A404C7A8B84FAFD35EC2CF0231F1F6DAF "BADGE_GREEN") | @@ -112,110 +112,6 @@ labels: ## 既知のAmendmentsの詳細 -### fixAMMOverflowOffer - -[fixAMMOverflowOffer]: #fixammoverflowoffer - -| Amendment | fixAMMOverflowOffer | -|:-------------|:--------------| -| Amendment ID | 12523DF04B553A0B1AD74F42DDB741DE8DC06A03FC089A0EF197E2A87F1D8107 | -| ステータス | 投票中 | -| デフォルトの投票(最新の安定版) | はい | -| Amendment前の機能は廃止? | いいえ | - -このAmendmentにより、決済エンジンにおけるAMMの大規模な合成オファーの不適切な処理が修正されます。このAmendmentは重大な修正であるため、ソースコードのデフォルトの投票はYESに設定されています。 - -### fixInnerObjTemplate - -[fixInnerObjTemplate]: #fixinnerobjtemplate - -| Amendment | fixInnerObjTemplate | -|:-------------|:--------------| -| Amendment ID | C393B3AEEBF575E475F0C60D5E4241B2070CC4D0EB6C4846B1A07508FAEFC485 | -| ステータス | 投票中 | -| デフォルトの投票(最新の安定版) | いいえ | -| Amendment前の機能は廃止? | いいえ | - -このamendmentにより、AMMの`sfVoteEntry`と`sfAuctionSlot`の内部オブジェクトの`sfTradingFee`フィールドと`sfDiscountedFee`フィールドにアクセスする際の問題が修正されました。 - -現在、内部オブジェクトのテンプレートはオブジェクトの生成時に設定されません。オブジェクトに`soeDEFAULT`フィールドがあり、初期値にデフォルト値が設定されている場合、そのフィールドにアクセスすると、状況によっては`tefEXCEPTION`エラーが発生します。このamendmentにより、内部オブジェクトテンプレートを設定するための追加の真偽値引数を含む`STObject`コンストラクタのオーバーロードが追加されます。 - - -### fixNFTokenReserve - -[fixNFTokenReserve]: #fixnftokenreserve - -| Amendment | fixNFTokenReserve | -|:-------------|:--------------| -| Amendment ID | 03BDC0099C4E14163ADA272C1B6F6FABB448CC3E51F522F978041E4B57D9158C | -| ステータス | 投票中 | -| デフォルトの投票(最新の安定版) | いいえ | -| Amendment前の機能は廃止? | いいえ | - -このamendmentにより、`NFTokenAcceptOffer`トランザクタに`OwnerCount`が変更されたかどうかのチェックが追加されます。変更された場合、更新されたオブジェクト数に対して準備金要件が満たされているかどうかを追加でチェックします。 - - -### fixDisallowIncomingV1 -[fixDisallowIncomingV1]: #fixdisallowincomingv1 - -| Amendment | fixDisallowIncomingV1 | -|:-------------|:--------------| -| Amendment ID | 15D61F0C6DB6A2F86BCF96F1E2444FEC54E705923339EC175BD3E517C8B3FF91 | -| ステータス | 投票中 | -| デフォルトの投票(最新の安定版) | いいえ | -| Amendment前の機能は廃止? | いいえ | - -このamendmentにより、ユーザが自分のアカウントで`lsfDisallowIncomingTrustline`フラグを有効にした後にトラストラインを承認する際の問題が修正されます。 - -この問題を再現するには - -1. 発行者が自分のアカウントに`asfRequireAuth`を設定します。 -2. ユーザが自分のアカウントに`asfDisallowIncomingTrustline`を設定します。 -3. ユーザは`SetTrust`トランザクションを発行者に送信します。 - -4. 発行者はトラストラインを承認できません。 - -このamendmentにより、発行者はトラストラインを認可できるようになりました。 - -このamendmentは、[DisallowIncoming][] amendmentが有効でない場合、影響はありません。 - - -### fixFillOrKill -[fixFillOrKill]: #fixfillorkill -| Amendment | fixFillOrKill | -|:-------------|:--------------| -| Amendment ID | 3318EA0CF0755AF15DAC19F2B5C5BCBFF4B78BDD57609ACCAABE2C41309B051A | -| ステータス | 投票中 | -| デフォルトの投票(最新の安定版) | いいえ | -| Amendment前の機能は廃止? | いいえ | - -このamendmentは`FlowCross`amendmentで導入された問題を修正します。`tfFillOrKill`フラグが設定され、`tfSell`フラグが設定されていないオファーは、オファーの取引レートがオーダーブックのレートよりも良いが、完全に一致しない場合に失敗します。 - -このamendmentにより、決済エンジンはこのシナリオを適切に処理できるようになり、オファーの交差が可能になります。 - -このamendmentは、[FlowCross][] amendmentが有効でない場合、影響はありません。 - -### DID -[DID]: #did - -| Amendment | DID | -|:-------------|:----| -| Amendment ID | DB432C3A09D9D5DFC7859F39AE5FF767ABC59AED0A9FB441E83B814D8946C109 | -| ステータス | 投票中 | -| デフォルトの投票(最新の安定版) | いいえ | -| Amendment前の機能は廃止? | いいえ | - -[World Wide Web Consortium](https://www.w3.org/press-releases/2022/did-rec/)標準に準拠した分散アイデンティティ(DID)機能を追加します。DIDは、中央集権的な機関に依存せず、DID主体によって管理されるデジタルIDを提供します。 - -次の新しいトランザクションを追加します。 - -- DIDDelete - XRPLアカウントに関連付けられたDIDを削除します。 -- DIDSet - 新しいDIDを作成するか、既存のDIDを更新します。 - -新しい`DID`レジャーエントリタイプを追加します。 - -いくつかの新しいトランザクション結果コードを追加します。 - ### AMM [AMM]: #amm @@ -299,38 +195,6 @@ Clawbackはデフォルトでは無効になっています。Clawbackを使用 この修正の詳細については、[Clawback](../docs/concepts/tokens/fungible-tokens/clawing-back-tokens.md)をご覧ください。 -### XChainBridge -[XChainBridge]: #xchainbridge - -| Amendment | XChainBridge | -|:-------------|:-----------------| -| Amendment ID | C98D98EE9616ACD36E81FDEB8D41D349BF5F1B41DD64A0ABC1FE9AA5EA267E9C | -| Status | 投票中 | -| デフォルトの投票(最新の安定版) | いいえ | -| Amendment前の機能は廃止? | いいえ | - -クロスチェーンブリッジを追加し、メインネットとサイドチェーンなどのネットワーク間でのデジタル資産の移動を可能にします。 - -次の新しいトランザクションを追加します - -- XChainAccountCreateCommit - 発行チェーン上でトランザクションを提出するために、Witnessサーバ用の新しいアカウントを作成します。 -- XChainAddAccountCreateAttestation - Witnessサーバが使用するアカウントが作成されたことを証明します。 -- XChainAddClaimAttestation - ロックチェーンで資産がロックされた証明書を提出します。 -- XChainClaim - 送信先チェーンで資産を請求します。 -- XChainCommit - ロックチェーン上の資産をロックします。 -- XChainCreateBridge - Bridgeレジャーオブジェクトを作成します。 -- XChainCreateClaimID - クロスチェーン送金に使用される新しいクロスチェーン請求IDを作成します。 -- XChainModifyBridge - ブリッジのパラメータを変更します。 - -次の新しいレジャーエントリタイプを追加します - -- Bridge - XRP Ledgerを別のブロックチェーンと接続する単一のクロスチェーンブリッジ。 -- XChainOwnedClaimID - 送信元チェーン上の資金をロックまたはバーンする送信元チェーン上のアカウントの情報を含むクロスチェーン送金の値(ID)。 -- XChainOwnedCreateAccountClaimID - クロスチェーン送金でアカウントを作成する際の証明書。 - -いくつかの新しいトランザクション結果コードを追加します。 - - ### CryptoConditions [CryptoConditions]: #cryptoconditions @@ -344,6 +208,28 @@ Clawbackはデフォルトでは無効になっています。Clawbackを使用 この修正は有効ですが、[SusPay](#suspay) Amendmentも有効でない限り、何の影響も及ぼしません。SusPayの修正は、[Escrow](#escrow)の修正に置き換えられたため、CryptoConditionsの修正は効力を持ちません。 +### DID +[DID]: #did + +| Amendment | DID | +|:-------------|:----| +| Amendment ID | DB432C3A09D9D5DFC7859F39AE5FF767ABC59AED0A9FB441E83B814D8946C109 | +| ステータス | 投票中 | +| デフォルトの投票(最新の安定版) | いいえ | +| Amendment前の機能は廃止? | いいえ | + +[World Wide Web Consortium](https://www.w3.org/press-releases/2022/did-rec/)標準に準拠した分散アイデンティティ(DID)機能を追加します。DIDは、中央集権的な機関に依存せず、DID主体によって管理されるデジタルIDを提供します。 + +次の新しいトランザクションを追加します。 + +- DIDDelete - XRPLアカウントに関連付けられたDIDを削除します。 +- DIDSet - 新しいDIDを作成するか、既存のDIDを更新します。 + +新しい`DID`レジャーエントリタイプを追加します。 + +いくつかの新しいトランザクション結果コードを追加します。 + + ## CryptoConditionsSuite [CryptoConditionsSuite]: #cryptoconditionssuite @@ -724,6 +610,20 @@ fix1623 Amendmentは、固定金額の[CheckCashトランザクション][](`A この修正が適用された場合、これらの支払いは、代わりに[結果コード`temBAD_PATH_LOOP`](../docs/references/protocol/transactions/transaction-results/tem-codes.md)で失敗します。 +### fixAMMOverflowOffer + +[fixAMMOverflowOffer]: #fixammoverflowoffer + +| Amendment | fixAMMOverflowOffer | +|:-------------|:--------------| +| Amendment ID | 12523DF04B553A0B1AD74F42DDB741DE8DC06A03FC089A0EF197E2A87F1D8107 | +| ステータス | 有効 | +| デフォルトの投票(最新の安定版) | はい | +| Amendment前の機能は廃止? | いいえ | + +このAmendmentにより、決済エンジンにおけるAMMの大規模な合成オファーの不適切な処理が修正されます。このAmendmentは重大な修正であるため、ソースコードのデフォルトの投票はYESに設定されています。 + + ### fixAmendmentMajorityCalc [fixAmendmentMajorityCalc]: #fixamendmentmajoritycalc @@ -754,6 +654,63 @@ Checksトランザクションがアカウントのメタデータに影響を この修正を適用しない場合、Checksトランザクション([CheckCreate][]、[CheckCash][]、および[CheckCancel][])は送信者のアカウント履歴のみを更新します。この修正を適用した場合、これらのトランザクションは、送信アカウントにも受信アカウントにも影響します。この修正は、[Checks Amendment](#checks)も有効でないかぎり効果がありません。 +### fixDisallowIncomingV1 +[fixDisallowIncomingV1]: #fixdisallowincomingv1 + +| Amendment | fixDisallowIncomingV1 | +|:-------------|:--------------| +| Amendment ID | 15D61F0C6DB6A2F86BCF96F1E2444FEC54E705923339EC175BD3E517C8B3FF91 | +| ステータス | 有効 | +| デフォルトの投票(最新の安定版) | いいえ | +| Amendment前の機能は廃止? | いいえ | + +このamendmentにより、ユーザが自分のアカウントで`lsfDisallowIncomingTrustline`フラグを有効にした後にトラストラインを承認する際の問題が修正されます。 + +この問題を再現するには + +1. 発行者が自分のアカウントに`asfRequireAuth`を設定します。 +2. ユーザが自分のアカウントに`asfDisallowIncomingTrustline`を設定します。 +3. ユーザは`SetTrust`トランザクションを発行者に送信します。 + +4. 発行者はトラストラインを承認できません。 + +このamendmentにより、発行者はトラストラインを認可できるようになりました。 + +このamendmentは、[DisallowIncoming][] amendmentが有効でない場合、影響はありません。 + + +### fixFillOrKill +[fixFillOrKill]: #fixfillorkill +| Amendment | fixFillOrKill | +|:-------------|:--------------| +| Amendment ID | 3318EA0CF0755AF15DAC19F2B5C5BCBFF4B78BDD57609ACCAABE2C41309B051A | +| ステータス | 有効 | +| デフォルトの投票(最新の安定版) | いいえ | +| Amendment前の機能は廃止? | いいえ | + +このamendmentは`FlowCross`amendmentで導入された問題を修正します。`tfFillOrKill`フラグが設定され、`tfSell`フラグが設定されていないオファーは、オファーの取引レートがオーダーブックのレートよりも良いが、完全に一致しない場合に失敗します。 + +このamendmentにより、決済エンジンはこのシナリオを適切に処理できるようになり、オファーの交差が可能になります。 + +このamendmentは、[FlowCross][] amendmentが有効でない場合、影響はありません。 + + +### fixInnerObjTemplate + +[fixInnerObjTemplate]: #fixinnerobjtemplate + +| Amendment | fixInnerObjTemplate | +|:-------------|:--------------| +| Amendment ID | C393B3AEEBF575E475F0C60D5E4241B2070CC4D0EB6C4846B1A07508FAEFC485 | +| ステータス | 有効 | +| デフォルトの投票(最新の安定版) | いいえ | +| Amendment前の機能は廃止? | いいえ | + +このamendmentにより、AMMの`sfVoteEntry`と`sfAuctionSlot`の内部オブジェクトの`sfTradingFee`フィールドと`sfDiscountedFee`フィールドにアクセスする際の問題が修正されました。 + +現在、内部オブジェクトのテンプレートはオブジェクトの生成時に設定されません。オブジェクトに`soeDEFAULT`フィールドがあり、初期値にデフォルト値が設定されている場合、そのフィールドにアクセスすると、状況によっては`tefEXCEPTION`エラーが発生します。このamendmentにより、内部オブジェクトテンプレートを設定するための追加の真偽値引数を含む`STObject`コンストラクタのオーバーロードが追加されます。 + + ### fixMasterKeyAsRegularKey [fixMasterKeyAsRegularKey]: #fixmasterkeyasregularkey @@ -819,6 +776,22 @@ Checksトランザクションがアカウントのメタデータに影響を このamendmentにより、アカウント削除の制限も導入されます。アカウントは、`FirstNFTSequence` + `MintedNFTokens` + 256が現在のレジャーシーケンスより小さい場合にのみ削除できます(256はアカウント削除のヒューリスティックな制限として選択されたもので、アカウント削除制約にすでに存在します)。この制約がなければ、特定の条件下で同一のNFTが再ミントされる可能性があります。 +**注意:** これは、トークンをミントするためにローカルでNFTokenIDを計算しているプロジェクトやツールにとっては **破壊的な変更** です。NFTokenIDを計算するコードがある場合は、新しい計算式に合わせて更新する必要があります。後方互換性を保ちながらこれを行う方法の例については、こちらをご覧ください。[JavaScriptでのよく知られたリファレンス実装](https://gist.github.com/N3TC4T/a20fb528931ed009ebdd708be4938748?permalink_comment_id=4738760#gistcomment-4738760). + + +### fixNFTokenReserve + +[fixNFTokenReserve]: #fixnftokenreserve + +| Amendment | fixNFTokenReserve | +|:-------------|:--------------| +| Amendment ID | 03BDC0099C4E14163ADA272C1B6F6FABB448CC3E51F522F978041E4B57D9158C | +| ステータス | 有効 | +| デフォルトの投票(最新の安定版) | いいえ | +| Amendment前の機能は廃止? | いいえ | + +このamendmentにより、`NFTokenAcceptOffer`トランザクタに`OwnerCount`が変更されたかどうかのチェックが追加されます。変更された場合、更新されたオブジェクト数に対して準備金要件が満たされているかどうかを追加でチェックします。 + ### fixNonFungibleTokensV1_2 [fixNonFungibleTokensV1_2]: #fixnonfungibletokensv1_2 @@ -1372,6 +1345,38 @@ XRP Ledgerプロトコルの署名要件を変更し、いかなる場合にも この修正が適用されれば、[`tfSetfAuth`を有効にした](../docs/references/protocol/transactions/types/trustset.md#trustsetのフラグ)`TrustSet`トランザクションにおいて、`RippleState`ノードの他のすべての値をデフォルト状態にしたままでも、新しい[`RippleState`レジャーオブジェクト](../docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md)を作成できます。新しい`RippleState`ノードでは、トランザクションの送信者が低いノードと見なされるか高いノードと見なされるかに応じて、[`lsfLowAuth`フラグまたは`lsfHighAuth`フラグ](../docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md#ripplestateのフラグ)が有効になります。トランザクションの送信者は、[asfRequireAuthフラグを有効](../docs/references/protocol/transactions/types/accountset.md#accountsetのフラグ)にして[AccountSetトランザクション](../docs/references/protocol/transactions/types/accountset.md)を送信することで、事前に[`lsfRequireAuth`](../docs/references/protocol/ledger-data/ledger-entry-types/accountroot.md#accountrootのフラグ)を有効にしておく必要があります。 +### XChainBridge +[XChainBridge]: #xchainbridge + +| Amendment | XChainBridge | +|:-------------|:-----------------| +| Amendment ID | C98D98EE9616ACD36E81FDEB8D41D349BF5F1B41DD64A0ABC1FE9AA5EA267E9C | +| Status | 投票中 | +| デフォルトの投票(最新の安定版) | いいえ | +| Amendment前の機能は廃止? | いいえ | + +クロスチェーンブリッジを追加し、メインネットとサイドチェーンなどのネットワーク間でのデジタル資産の移動を可能にします。 + +次の新しいトランザクションを追加します + +- XChainAccountCreateCommit - 発行チェーン上でトランザクションを提出するために、Witnessサーバ用の新しいアカウントを作成します。 +- XChainAddAccountCreateAttestation - Witnessサーバが使用するアカウントが作成されたことを証明します。 +- XChainAddClaimAttestation - ロックチェーンで資産がロックされた証明書を提出します。 +- XChainClaim - 送信先チェーンで資産を請求します。 +- XChainCommit - ロックチェーン上の資産をロックします。 +- XChainCreateBridge - Bridgeレジャーオブジェクトを作成します。 +- XChainCreateClaimID - クロスチェーン送金に使用される新しいクロスチェーン請求IDを作成します。 +- XChainModifyBridge - ブリッジのパラメータを変更します。 + +次の新しいレジャーエントリタイプを追加します + +- Bridge - XRP Ledgerを別のブロックチェーンと接続する単一のクロスチェーンブリッジ。 +- XChainOwnedClaimID - 送信元チェーン上の資金をロックまたはバーンする送信元チェーン上のアカウントの情報を含むクロスチェーン送金の値(ID)。 +- XChainOwnedCreateAccountClaimID - クロスチェーン送金でアカウントを作成する際の証明書。 + +いくつかの新しいトランザクション結果コードを追加します。 + + ### XChainBridge [XChainBridge]: #xchainbridge diff --git a/@i18n/ja/translations.yaml b/@i18n/ja/translations.yaml index 61118079d1..c43c7cfebb 100644 --- a/@i18n/ja/translations.yaml +++ b/@i18n/ja/translations.yaml @@ -1,3 +1,17 @@ +theme.page.previousButton: "前のページ" +theme.page.nextButton: "次のページ" +theme.page.lastUpdated.timeago: "最終更新: " +theme.markdown.editPage.text: 編集 +theme.toc.header: 目次 +theme.search.label: ドキュメントの検索 +theme.search.navbar.label: 検索 +theme.search.recent: 直近の検索 +theme.search.keys.navigate: 選択 +theme.search.keys.select: 決定 +theme.search.keys.exit: 閉じる +theme.feedback.settings.label: 参考になりましたか? +theme.footer.copyrightText: © 2024 XRP Ledger. オープンソース. + theme.navbar.about: 概要 theme.navbar.docs: ドキュメント theme.navbar.resources: リソース @@ -11,190 +25,93 @@ sidebar.docs.tutorials: チュートリアル sidebar.docs.references: リファレンス sidebars.resources: リソース sidebar.resources.codesamples: コードサンプル +topnav.about.xrp-ledger: XRP Ledger +topnav.about.xrpl-overview: XRPLの概要 +topnav.about.use-cases-featured-projects: ユースケースと注目プロジェクト +topnav.about.history: 歴史 +topnav.about.xrp: XRP +topnav.about.xrp-overview: XRPの概要 +topnav.about.sustainability: 持続可能性 +topnav.about.impact: 環境への影響 +topnav.about.about: 概要 +topnav.about.xrpl-foundation: XRPL財団 +topnav.about.faq: よくある質問 +topnav.about.privacy-policy: プライバシーポリシー topnav.docs.title: ドキュメント -topnav.docs.description: XRPL技術に掘り下げて組み込めましょう。 +topnav.docs.description: XRP Ledgerの世界に飛び込み、開発を始めましょう。 +topnav.docs.article-types: コンテンツの種類 +topnav.docs.concepts: 基本概念 +topnav.docs.tutorials: チュートリアル +topnav.docs.references: リファレンス +topnav.docs.infrastructure: インフラ +topnav.docs.use-cases: ユースケース +topnav.docs.payments: 支払い +topnav.docs.tokenization: トークン化 +topnav.docs.defi: DeFi(分散型金融) +topnav.docs.get-started: はじめよう +topnav.resources.development: 開発 +topnav.resources.code-samples: サンプルコード +topnav.resources.dev-tools: 開発者ツール +topnav.resources.xrpl-learning-portal: XRPL学習ポータル +topnav.resources.xrpl-brand-kit: XRPLブランドキット topnav.resources.current-status: 現在のステータス +topnav.resources.join-in: 参加しよう topnav.resources.explorer: エクスプローラ +topnav.resources.known-amendments: 既知のAmendment +topnav.resources.contribute-code: コードへの貢献 +topnav.resources.contribute-documentation: ドキュメントへの貢献 topnav.community.title: コミュニティ topnav.community.description: 話題に加わろう。 -Open Source.: オープンソース -Jump to top of page: ページの先頭へ -Edit page: ページを編集 -Search: 検索 -Search site...: サイトを検索 -Search for articles, training, and code samples...: 記事、トレーニング、コードサンプルを検索... -Become an XRP Ledger Campus Ambassador: XRP Ledgerキャンパスアンバサダーになる -Join the Student Cohort: 学生コミュニティに参加 -XRPL Campus Ambassadors: XRPLキャンパスアンバサダー -Current Students: 現役学生 -Why become an XRPL Campus Ambassador?: XRPLキャンパスアンバサダーになる理由 -Benefits: メリット -Join a global cohort of students empowering others to build on the XRPL.: XRPLをベースに他の人に力を与える、世界的な学生グループに参加しましょう。 -Exclusive Opportunities: 特別な機会 -Education: 学習 -Tutorials and workshops from leading XRPL and blockchain developers: トップクラスのXRPLおよびブロックチェーン開発者によるチュートリアルとワークショップ -Swag: グッズ -New XRPL swag for Ambassadors and swag to share with other students: アンバサダー用の特別なXRPLグッズと他の学生と共有できるグッズ -Mentorship: メンター -Career Acceleration: キャリア促進 -Stipend: 奨学金 -Should You Apply?: 応募すべき? -Eligibility for XRPL Campus Ambassadors: XRPLキャンパスアンバサダーの参加資格 -A Leader: リーダー -Active: アクティブ -Curious: 好奇心旺盛 -Eager to learn more about technical blockchain topics and the XRPL: 技術的なブロックチェーンのトピックやXRPLについてより深く学びたい -Passionate: 情熱的 -Creative: クリエイティブ -Ability to think outside the box to grow the XRPL student community: 既成概念にとらわれず、XRPLの学生コミュニティを成長させる思考力 -Process to become a Campus Ambassador: キャンパスアンバサダー就任までの流れ -How it Works: 主な仕組み -Apply now to become an XRPL Campus Ambassador.: XRPLキャンパスアンバサダーになりたい方は今すぐ応募しましょう。 -Apply: 応募 -Submit an application to be considered for the Campus Ambassador program.: キャンパスアンバサダープログラムの選考を受けるには、応募書類を提出してください。 -Interview: 面接 -Join: 参加 -Learn: 学習 -Apply for Fall 2023: 2023年秋の申し込み -Join a global cohort of Student Ambassadors: 学生アンバサダーのグローバルなコミュニティに参加する -Global Community: グローバルコミュニティ -Stay connected to the XRPL Campus Ambassadors: XRPL キャンパスアンバサダーとの繋がりを持つ -Connect: 繋がる -MeetUp: ミートアップ -Attend an XRPL Meetup in your local area: 地域のXRPLミートアップに参加しましょう。 -Dev.to Blog: Dev.to ブログ -Read more about the activity of the XRPL Ambassadors: XRPLアンバサダーの活動についてもっと知る。 -Join the conversation on the XRPL Developer Discord: XRPL開発者Discordで意見交換しましょう。 -Start Building with Example Code: コードサンプルから開発を始める -Code Samples: コードサンプル -Browse sample code for building common use cases on the XRP Ledger: XRP Ledger上で一般的なユースケースを構築するためのコードサンプルを見ることができます -Contribute Code Samples: コードサンプルへの貢献 -Help the XRPL community by submitting your
own code samples: コードサンプルを投稿して、XRPLコミュニティに貢献しましょう -The XRPL Community: XRPL コミュニティ -Find the community on the platforms below: 以下のプラットフォームでコミュニティにアクセスできます。 -Join the Conversation: 参加する -Run an XRP Ledger network node: XRP Ledgerのネットワークノードを実行する -Contribute to Consensus: コンセンサスへの貢献 -Apply for funding to build your XRPL project: 将来のXRPLプロジェクトのための資金調達に応募する -Awarded in a single grant: 1回のGrantでの助成金 -Distributed to grant recipients: 助成対象者への配布 -Open-source projects funded : オープンソースプロジェクトへの資金提供 -Learn More: もっと知る -Showcase your XRPL project, application or product: XRPLプロジェクト、アプリケーション、製品の紹介 -XRPL Community Spotlight: XRPL コミュニティの紹介 -Submit Your Projects: プロジェクトを登録する -Read the Blog: ブログを読む -Check out global events across the XRPL community: XRPLコミュニティで開催されるグローバルなイベントをチェック -XRPL Events: XRPLイベント -View All Events: 全てのイベントを見る -Discover your next career opportunity in the XRPL community: XRPLコミュニティであなたの次のキャリアを見つけましょう -Review guidelines for using XRPL design assets: XRPLのデザインアセットを使用するためのガイドラインを確認 -XRPL Assets: XRPLのアセット -Download the PDF and Assets: PDFとアセットをダウンロード -A community-driven resource for all things XRPL.org: XRPとXRP Ledgerのあらゆるものを提供する、コミュニティ主体のリソース -Contribute to XRPL.org: XRPL.orgに貢献する -Read Contributor Guidelines: コントリビュータガイドラインを読む -Dev Tools: 開発者ツール -Explorers: エクスプローラ -API Access: APIアクセス -Other: その他 -Have an Idea For a Tool?: ツールのアイデアをお持ちですか? -Open a pull Request: プルリクエストを作成する -Full documentation index: 全ドキュメントの目次 -See Everything: 全てを見る -XRP Ledger Developer Resources: XRP Ledger 開発者向けリソース -Documentation: XRP Ledger ドキュメント -rippled API Reference: rippled APIリファレンス -XRP Faucet: XRP Faucet -Getting Started with Python: Pythonを使ってみよう -Websocket API Tool: Websocket APIツール -XRP Ledger Explorer: XRP Ledgerエクスプローラ -Advanced Payment Features: 高度な支払い機能 -Governance and the Amendment Process: ガバナンスとAmendmentプロセス -Federated Sidechains: 連合サイドチェーン -On-Chain Finance: オンチェーン金融 -Trade on the decentralized exchange: 分散型取引所でトレード -Make payments: 支払いを実行 -Use specialized payment types: 専門的な種類の支払いを行う -Tokens: トークン -Non-fungible Tokens: 非代替性トークン -Issue a stablecoin: ステーブルコインを発行 -Assign an authorized minter: 認可Minterの割り当て -Payments: ペイメント -Peer to peer payments: 直接支払い -Cross-currency payments: クロスカレンシー決済 -Escrows: エスクロー -Intro to XRP Ledger: XRP Ledger クイックスタート -Accounts: アカウント -Decentralized Exchange: 分散型取引所 -Tokenization: Tokenization -Faucets: XRP Faucet -Get credentials and test-XRP for XRP Ledger Testnet or Devnet.: XRP Ledger TestnetまたはDevnetでアカウントとテスト用XRPを取得しましょう -WebSocket Tool: Websocketツール -Send sample requests and get responses from the rippled API.: サンプルリクエストを送信し、rippled APIからレスポンスを取得します。 -Transaction Sender: トランザクション送信ツール -Concepts: コンセプト -Read the Docs: ドキュメントを読む -Tutorials: チュートリアル -Get step-by-step guidance to perform common tasks with the XRP Ledger.: XRP Ledgerで一般的な作業の手順をご覧ください。 -View Tutorials: チュートリアルを見る -References: リファレンス -View References: リファレンスを見る -Use Cases: ユースケース -Getting Started: 始めましょう -Quickstart to XRP Ledger: XRP Ledger クイックスタート -An introduction to fundamental aspects of the XRP Ledger.: XRP Ledgerの基本的な機能の紹介 -Get Started: 始めましょう -Watch Full Series: 全てのシリーズを見る -Interact with the XRP Ledger in a language of your choice: お好みの言語でXRP Ledgerへアクセスできます -Explore SDKs: SDKを探す -Intermediate Learning Sources: 次の学習教材 -Explore, Test, Verify: 探索、テスト、検証 -Explore Dev Tools: 開発者ツールを探索 -Browse By Recommended Pages: おすすめのページを見る -Get Free Test XRP: テスト用XRPを入手 -Generate Testnet Credentials: テストネットのアカウントを作成 -See full documentation index: 全ドキュメントの目次 -Find the XRPL Community Around the World: 世界中のXRPLコミュニティを見つけよう -Events: イベント -The XRPL Developer Summit: XRPL開発者サミット -Save the Date: 日程を確認 -Upcoming Events: 今後のイベント情報 -Explore past community-hosted events: 過去のコミュニティ主催のイベントを見る -Past Events: 過去のイベント -Sorry, this page is not available in your language.: 申し訳ありませんが、このページはお使いの言語では提供されていません。 -XRPL Developer Funding Programs: XRPL開発者向け資金提供プログラム -Project Resources: プロジェクト資金 -Explore funding opportunities for developers and teams: 開発者やチームのための資金調達の方法を見つけましょう -Funding Overview: 資金調達の概要 -XRPL Hackathons: XRPLハッカソン -Join an Event: イベントに参加 -See Upcoming Events: 今後のイベントを見る -Best for: こんな方に最適 -Software developers and teams building directly on the XRP Ledger: XRP Ledger上のソフトウェア開発者やXRP Ledger上で直接開発を行うチーム -Required: 必須要件 -Some coding experience: コーディング経験 -Level: レベル -XRPL beginner to advanced developers: XRPLの初級開発者から上級開発者まで -Funding Levels: 資金調達の規模 -Prize money and awards: 賞金および賞品 -Fund Your Project: プロジェクトの資金調達 -Past awardees include: 過去の受賞者は次の通り -Visit XRPL Grants: XRPL Grantsを見る -XRPL intermediate to advanced developers: XRPLの中級開発者から上級開発者 -$10,000 - $200,000: $10,000 ~ $200,000 -XRPL Accelerator: XRPLアクセラレータ -Advance your project: プロジェクトの推進 -View XRPL Accelerator: XRPLアクセラレータを見る -$50,000 (grant) + pitch for venture funding: $50,000(助成金)+ベンチャー資金へのピッチ -Provide a Better Alternative to Bitcoin: Bitcoinに代わる選択肢 -XRPL's Origin: XRPLの原点 -XRPL Launches its Native Currency, XRP: XRPL、ネイティブ通貨「XRP」がローンチ -OpenCoin Rebranded to Ripple Labs: 2013年、OpenCoinからRipple Labsにブランド変更 -XRPL Foundation Launched: XRPL財団の創設 -The Blockchain
Built for Business: ビジネスのための
ブロックチェーン -XRPL | XRP Ledger: -Start Building: 始める + +topnav.community.get-involved: 参加する +topnav.community.events: イベント +topnav.community.ambassadors: アンバサダー +topnav.community.developer-funding: 開発者向け資金提供 +topnav.community.xrpl-jobs: XRPLの仕事 +topnav.community.dev-blog: 開発者ブログ +topnav.community.xrpl-grants: XRPL Grants +topnav.community.github: GitHub +topnav.community.report-a-scam: 詐欺の報告 +footer.about.xrpl-overview: XRPLの概要 +footer.about.use-cases-projects: ユースケースとプロジェクト +footer.about.history: 歴史 +footer.about.impact: 環境への影響 +footer.about.xrpl-foundation: XRPL財団 +footer.about.faq: よくある質問 +footer.about.privacy-policy: プライバシーポリシー +footer.docs.xrpl-documentation: XRPLドキュメント +footer.docs.introduction: はじめに +footer.docs.use-cases: ユースケース +footer.docs.concepts: 基本概念 +footer.docs.tutorials: チュートリアル +footer.docs.references: リファレンス +footer.docs.infrastructure: インフラ +footer.resources.code-samples: サンプルコード +footer.resources.dev-tools: 開発者ツール +footer.resources.xrpl-learning-portal: XRPL学習ポータル +footer.resources.xrpl-brand-kit: XRPLブランドキット +footer.resources.explorer: エクスプローラ +footer.resources.known-amendments: 既知のAmendment +footer.resources.contribute-code: コードへの貢献 +footer.resources.contribute-documentation: ドキュメントへの貢献 +footer.community.community: コミュニティ +footer.community.events: イベント +footer.community.ambassadors: アンバサダー +footer.community.developer-funding: 開発者向け資金提供 +footer.community.xrpl-jobs: XRPLの仕事 +footer.community.dev-blog: 開発者ブログ +footer.community.xrpl-grants: XRPL Grants +footer.community.github: GitHub +footer.community.report-a-scam: 詐欺の報告 + +# index.page.tsx +home.hero.h1part1: ビジネスのための +home.hero.h1part2: ブロックチェーン +XRPL | XRP Ledger: XRPL | XRP Ledger +Start Building: 始めよう +'The XRP Ledger: The Blockchain Built for Business': 'XRP Ledger: ビジネスに最適なブロックチェーン' +The XRP Ledger (XRPL) is a decentralized, public blockchain led by a global community of businesses and developers looking to solve problems and create value.: XRP Ledger(XRPL)は課題の解決と価値の創造を目指す企業と開発者のグローバルコミュニティが主導する、分散型のパブリックブロックチェーンです。 +Proven reliable over more than a decade of error-free functioning, the XRPL offers streamlined development, low transaction costs, high performance, and sustainability. So you can build with confidence–and move your most critical projects forward.: 10年以上にわたって稼働し、高い信頼性が実証されているXRPLは、合理化された開発、低い取引コスト、高いパフォーマンス、そして持続可能性を提供します。これにより、我々は安心して開発し、プロジェクトに専念することができます。 Why developers choose the XRP Ledger: 開発者がXRP Ledgerを選択する理由 Public and Decentralized: パブリック&分散型 Open source, open to anyone to build on, maintained by the community: オープンソースで、誰でも構築でき、コミュニティによって維持されています @@ -204,45 +121,477 @@ High Performance: 高パフォーマンス Thousands of transactions settled in seconds: 数千件のトランザクションを数秒で決済することが可能です Low Cost: 低コスト Motivated Community: 活発なコミュニティ +Companies, developers, validators, and users work together to make the XRP Ledger better every day: 開発者、バリデータ、ユーザ、そして企業によって、XRP Ledgerは日々進化しています Proven Reliability: 確かな信頼性 +10+ years of error-free, uninterrupted performance over more than 63 million ledgers: 10年以上、6,300万件以上のレジャーで安定したパフォーマンスを実現しています Powerful Features: パワフルな機能 +Activate the proven potential of the XRP Ledger and find a trusted foundation for your next innovation: XRP Ledgerを活用し、次のイノベーションのための信頼できるプラットフォームを見つけましょう。 +A high-performance decentralized peer-to-peer multi-currency exchange built directly into the blockchain: ブロックチェーンに直接組み込まれた高性能な分散型P2P多通貨取引所 Cross-Currency Payments: クロスカレンシー決済 -Payment
Channels: ペイメント
チャネル -Batched micropayments with unlimited speed, secured with XRP: XRPを利用した無制限のスピードでの小額決済が可能です +Atomically settle multi-hop payments that cross currency or national boundaries with ease: 通貨や国境を越えたマルチホップ決済をアトミックに簡単に実現 +Payment Channels: ペイメントチャネル +Batched micropayments with unlimited speed, secured with XRP: XRPによる安全かつ無制限のスピードでのバッチ式マイクロペイメント Multi-Signing: マルチシグ -Flexible options for custody and security of on-ledger accounts: オンレジャーのアカウントの保護とセキュリティのための柔軟なオプションがあります -Choose a path, and bring your project to life on the XRP Ledger: あなたのプロジェクトをXRP Ledger上でスタートさせましょう。 -Where to Start: 始めましょう -Quickstart: クイックスタート +Flexible options for custody and security of on-ledger accounts: オンレジャーアカウントの保護とセキュリティのための柔軟なオプション +All currencies other than XRP can be represented in the XRP Ledger as tokens: XRP以外のすべての通貨は、XRP Ledger内でトークンとして表現されます +Choose a path, and bring your project to life on the XRP Ledger: XRP Ledger上でプロジェクトをスタートしましょう。 +Where to Start: 最初の一歩 +Documentation: ドキュメント Access everything you need to get started working with the XRPL: XRPLを使うためのあらゆる情報にアクセスできます -Guided Tutorials: ガイド付きチュートリアル +Guided Tutorials: チュートリアルガイド Follow step-by-step guides for frequent tasks: ステップバイステップのガイドを使って頻出の作業をサポートします XRPL Fundamentals: XRPLの基礎知識 Read about the XRPL’s foundational concepts: XRPLの基本概念について学びましょう Choose a Language: 開発言語の選択 -Get Inspired: インスピレーションを得る +Find tools, documentation, and sample code in Python, Java, Javascript, or use HTTP APIs: Python、Java、Javascriptのツール、ドキュメント、サンプルコードを検索したり、HTTP APIを使用することができます +Get Inspired: インスピレーション See what your peers have built on the XRPL: 他のユーザがXRPLで構築したものを見てみましょう Our Shared Vision for XRPL’s Future: XRPLの未来に対する私たちの共有のビジョン +Together, we're building the greenest infrastructure to drive blockchain innovation that doesn't sacrifice utility or performance, to bring the developer community's vision to life.: 私たちは、開発者コミュニティのビジョンを実現するために、実用性や性能を犠牲にすることなく、ブロックチェーンのイノベーションを推進する最も環境に配慮したインフラストラクチャを共に構築しています Preview New Features: 新機能のプレビュー +Explore what the community is building to enable new features and use cases on XRPL: コミュニティがどのような新機能やユースケースを構築しているのかを見てみましょう In Development: 開発中 Smart Contracts: スマートコントラクト +Open for Voting: 投票中 +Automated Market Makers: 自動マーケットメイカー +Smart contracts to provide liquidity and earn passive income from facilitating currency exchange, complementary with the order-book DEX already built into the XRPL.: XRPLに組み込み済みのオーダーブックDEXと相互に補完する、流動性を提供し、通貨交換を促進することで受動的な収入を得るためのスマートコントラクト。 Enabled: 利用可能 Non-Fungible Tokens: 非代替性トークン -Join the Community
at XRPL.org: XRPL.orgの
コミュニティに参加 +# Join the Community: XRPL.orgの +# at XRPL.org: コミュニティに参加 +'Connect at XRPL.org, a community by and for the developers ': XRPL.orgは、XRPLを利用する開発者と +' and entrepeneurs who rely on the XRPL.': 起業家のためのコミュニティです。 Get Involved: 参加する -Today’s Value, Tomorrow’s Vision: 現在の価値、将来のビジョン + +# about/index.page.tsx +about.index.h1part1: ビジネスに衝撃を +about.index.h1part2: ' ' XRPL Today, XRPL Tomorrow: 現在のXRPL、未来のXRPL +How the XRP Ledger works: XRP Ledgerの仕組み +XRP Ledger Basics: XRP Ledgerの基本 +The XRP Ledger is a decentralized public blockchain built for business.: XRP Ledgerは、エンタープライズレベルの分散型パブリックブロックチェーンです。 +The peer-to-peer network that manages the ledger is open to everyone. The XRP Ledger is maintained by software engineers, server operators, users, and businesses–a global community working to solve problems and create real-world value.: レジャーを管理するピアツーピアネットワークは誰でも利用できます。XRP Ledgerは、ソフトウェアエンジニア、サーバー運用者、ユーザ、そして企業によって維持されており、課題の解決と実世界での価値創造に取り組むグローバルなコミュニティです。 +Read Technical Docs: 技術ドキュメントを読む +Watch Explainer Videos: 解説ビデオを見る +How the Consensus Protocol works: コンセンサスプロトコルの仕組み +Consensus: コンセンサス +about.index.consensus.h5part1: パフォーマンスを維持するために、XRPLはコンセンサスプロトコルを使用しています。誰でも運用な特定の種類のサーバは +about.index.consensus.h5part2: バリデータ +about.index.consensus.h5part3: と呼ばれ3〜5秒ごとにトランザクションの順序と結果について合意します。 +All servers in the network process each transaction according to the same rules, and any transaction that follows the protocol is confirmed right away. All transactions are public, and strong cryptography guarantees the integrity of the system.: ネットワーク内のすべてのサーバは、同じルールに従って各トランザクションを処理し、プロトコルに従うすべてのトランザクションは即座に確認されます。すべてのトランザクションは公開され、強力な暗号化技術によってシステムの整合性が保証されます。 +about.index.consensus.ppart1: 現在120以上の +about.index.consensus.ppart2: バリデータ +about.index.consensus.ppart3: がXRP Ledgerのコンセンサスプロセスに参加しており、大学や取引所、企業、個人などにより運用されています。より多様な主体がバリデータを運用していくにつれて、コンセンサスプロトコルはブロックチェーンを長期的に分散化します。 +A Sustainable Blockchain: 持続可能なブロックチェーン +Unlike most other blockchains, the XRP Ledger requires no mining and uses negligible energy, key to long-term growth and stability.: 他のいくつかのブロックチェーンとは異なり、XRP Ledgerはマイニングを必要とせず、長期的な成長と安定性の鍵となるエネルギー消費もごくわずかです。 +'Building with confidence on ': 実績と信頼性がある技術 +proven technology: ' ' +XRPL Today: XRPLの今 +With 10+ years of error-free functioning and enterprise companies as champions, XRPL has established reliability.: 10年以上にわたる安定した運用とエンタープライズ企業からの支持により、XRPLは信頼性を確立しています。 +With the XRPL, these developers are building innovative blockchain projects and applications across use cases including tokenization of assets, online gaming, asset custody, NFTs, and DeFi.: XRPLを使うことで、開発者は資産のトークン化やオンラインゲーム、カストディ、NFT、DeFiなどのユースケースにわたって革新的なブロックチェーンプロジェクトやアプリケーションを構築しています。 +Explore More: もっと知る +Creating new value for long-term growth: 長期的な成長のための新たな価値を創造する +XRPL Tomorrow: XRPLの未来 +As a community-led blockchain built for business, XRPL attracts companies and developers driven to solve real problems and generate real value–now and into the future.: ビジネスの発展のために構築されたコミュニティ主導のブロックチェーンであるXRPLは、現在そして将来にわたって真の問題を解決し、真の価値を生み出そうとする企業や開発者を惹きつけています。 +Significant investment in development, along with low transaction costs and energy usage, is fueling growth and opening up a wide variety of use cases at scale.: 低い取引コストとエネルギー使用量に加え、開発への多額の投資が成長を促し、大規模で多様なユースケースを開拓しています。 +Watch the explainer video series to learn more about the XRP Ledger: XRP Ledgerの詳細については、説明用のビデオシリーズをご覧ください。 +Tune In: 視聴する +The Consensus Mechanism: コンセンサスの仕組み +Nodes and Validators: ノードとバリデータ +Sustainability of the XRP Ledger: XRP Ledgerの持続可能性 +Watch Full Series on YouTube: YouTubeで全シリーズを見る +Tomorrow’s Blockchain Starts With You: 未来のブロックチェーンは、あなたから始まる +about.index.tomorrow.ppart1: XRP Ledgerのイノベーションは、皆さんのような開発者によるコミュニティの経験を大切にしています。もしあなたが次の大きな +about.index.tomorrow.ppart2: プロジェクト +about.index.tomorrow.ppart3: を始める準備ができているなら、今すぐXRPLを試し、XRPL開発者向け資金提供プログラムへの応募を検討しましょう。 +Explore XRPL Developer Funding: XRPL開発者向け資金提供プログラムを見る +Is XRPL a private blockchain, owned by Ripple?: XRPLはRipple社が所有するプライベートブロックチェーンですか? +No, the XRP Ledger is a decentralized, public blockchain. Any changes that would impact transaction processing or consensus need to be approved by at least 80%% of the network. Ripple is a contributor to the network, but its rights are the same as those of other contributors. In terms of validation, there are 150+ validators on the network with 35+ on the Unique Node List (see “What are Unique Node Lists (UNLs)?” in the Full FAQ) — Ripple runs 1 of these nodes.: いいえ、XRP Ledgerは分散型のパブリックブロックチェーンです。取引処理やコンセンサスに影響を与えるような変更は、ネットワークの少なくとも80%の承認が必要です。Ripple社はネットワークへの貢献者ですが、その権利は他の貢献者と同じです。バリデーションの面では、ネットワーク上に150人以上のバリデータが存在し、35人以上がユニークノードリスト(FAQ全文の「ユニークノードリスト(UNL)とは何ですか」参照)に登録されており、Ripple社はこれらのノードのうち1つのみを管理しています。" +Isn’t Proof of Work the best validation mechanism?: Proof of Workが最良のコンセンサスメカニズムではないでしょうか? +Proof of Work (PoW) was the first mechanism to solve the double spend problem without requiring a trusted 3rd party. However the XRP Ledger’s consensus mechanism solves the same problem in a far faster, cheaper and more energy efficient way.: Proof of Work(PoW)は、信頼できる第三者を必要とせずに二重消費問題を解決する最初の仕組みでした。しかし、XRP Ledgerのコンセンサスメカニズムは、同じ問題をはるかに速く、安く、エネルギー効率の良い方法で解決しています。 +How can a blockchain be sustainable?: ブロックチェーンはどうして持続可能なのでしょうか? +It’s been widely reported that Bitcoin’s energy consumption, as of 2021, is equivalent to that used by Argentina, with much of the electricity Bitcoin miners use coming from polluting sources. The XRP Ledger confirms transactions through a “consensus” mechanism - which does not waste energy like proof of work does - and leverages carbon offsets to be one of the first truly carbon neutral blockchains.: ビットコインのエネルギー消費量は、2021年時点で、アルゼンチンが使用するエネルギーと同等であり、ビットコインの採掘者が使用する電力の多くは環境破壊につながる資源から供給されていると広く報告されています。XRP Ledgerは、Proof of Workのようにエネルギーを浪費しない「コンセンサス」メカニズムを通じてトランザクションを検証し、カーボンオフセットを活用して、最初の真のカーボンニュートラルなブロックチェーンの1つとなっています。 +View Full FAQ: 全てのFAQを見る + +# about/uses.page.tsx +Powering Innovative Use Cases and Projects: 革新的なプロジェクトとユースケースを生み出す +XRPL Ecosystem: XRPLエコシステム +Explore Featured Projects: 注目プロジェクトを見る +The XRPL has a rich ecosystem with many contributors globally. Explore the community of developers, validators, and partners.: XRPLには、世界中の多くの貢献者がいる豊かなエコシステムがあります。開発者、バリデータ、パートナーのコミュニティを見てみましょう。 +Introducing the XRPL Ecosystem: XRPLエコシステムの紹介 +about.uses.apps-build-1: XRPL上の +about.uses.apps-build-2: アプリ, +about.uses.apps-build-3: 取引所など +Infrastructure: インフラ +Build and operate components or systems that help the functionality of the XRP Ledger, such as Nodes, dev tools, storage, security and more.: ノード、開発ツール、ストレージ、セキュリティなど、XRP Ledgerの機能を助けるコンポーネントやシステムを構築・運用します。 +Developer Tooling: 開発者ツール +Developers can leverage open-source libraries, SDKs and more to help build their project and access essential XRP Ledger functionality.: 開発者は、オープンソースライブラリやSDKなどを活用して、プロジェクトの構築や、XRP Ledgerの必須機能全般をサポートすることができます。 +Interoperability: 相互運用性 +Developers and node operators can build and run custom sidechains while leveraging the XRPL’s lean and efficient feature set.: 開発者やノード運用者は、XRPLの軽量で効率的な機能セットを活用しながら、カスタムサイドチェーンを構築・運用することができます。 +Wallet: ウォレット +Build digital wallets to store passwords and interact with various blockchains to send and receive digital assets, including XRP.: パスワードを保存するデジタルウォレットを構築し、様々なブロックチェーンとやり取りして、XRPを含むデジタル資産を送受信します。 +NFTs: NFT +XRPL supports the issuance of IOUs that represent a currency of any value, as well as non-fungible tokens (NFTs).: XRPLは、あらゆる価値の通貨を表すIOUのほか、非代替性トークン(NFT)にも対応しています +Exchanges: 取引所 +Build sophisticated exchanges where users can invest and trade crypto and assets such as stocks, ETFs, and commodities.: ユーザが暗号資産や株式、ETF、コモディティなどの資産を投資・取引できる高度な取引所を構築します。 +Gaming: ゲーム +The XRPL supports gaming at high speed given its reliable throughput, low fees, and sidechain interoperability.: 信頼性の高いスループット、低い手数料、サイドチェーンの相互運用性からXRPLは高速なゲームに最適です。 +Security: セキュリティ +Build services and tools that help prevent and combat fraudulent activity with the XRPL.: XRPLを使った不正行為の防止や対策に役立つサービスやツールを構築します。 +Payments: ペイメント +Leverage the efficiency and speed of the XRP Ledger to move value all over the globe.: 高効率かつ高速なXRP Ledgerを活用して、世界中で価値を移動させます。 +CBDC: CBDC +A private version of the XRP Ledger provides Central Banks a secure, controlled, and flexible solution to issue and manage Central Bank Issued Digital Currencies (CBDCs).: XRP Ledgerのプライベートバージョンは、中央銀行が中央銀行発行デジタル通貨(CBDC)を発行・管理するための、安全で統制のとれた柔軟なソリューションを提供します。 +Sustainability: 持続可能性 +Use the XRP Ledger to tokenize carbon offsets as non-fungible tokens (NFTs).: XRP Ledgerを使用して、カーボンオフセットをNFT(Non-Fungible Token)としてトークン化します。 +Custody: カストディ +Use the XRP Ledger to build crypto custody and securely hold, store and use your assets.: XRP Ledgerを使用して暗号資産カストディを構築し、資産を安全に保持、保管、使用することができます。 +Join the XRPL Ecosystem and showcase your XRPL project, application, or product. Get featured on the Developer Reflections blog or Ecosystem page.: XRPLエコシステムに参加して、あなたのXRPLプロジェクト、アプリケーション、製品を紹介しましょう。開発者向けブログやエコシステムのページで紹介されます。 +Submit Your Project: プロジェクトを登録 +about.uses.businesses.h3part1: XRP Ledgerを活用する +about.uses.businesses.h3part2: プロジェクトと開発者 +Solving Real-World Problems: 実世界の問題の解決 +With intentional innovations, tools and documentation that accelerate development and minimize time to market, XRP Ledger is used to create solutions across an expansive range of industries and use cases.: XRP Ledgerは、開発を加速させ、市場投入までの時間を最短にするイノベーション、ツール、ドキュメントによって、幅広い業界やユースケースにおけるソリューションの構築に利用されています。 +Filter by Categories: カテゴリで絞り込む +Featured Categories: 注目のカテゴリ +Other Categories: 他のカテゴリ +# TODO: Add projects' details + +# about/history.page.tsx +Provide a Better Alternative to Bitcoin: Bitcoinに代わる選択肢 +XRPL's Origin: XRPLの原点 +In 2011, three engineers—David Schwartz, Jed McCaleb, and Arthur Britto—began developing the XRP Ledger (XRPL). Fascinated by Bitcoin, they set out to create a better version that improved upon its limitations—with the goal of creating a digital asset that was more sustainable and built specifically for payments.: 2011年、David Schwartz、Jed McCaleb、Arthur Brittoの3人のエンジニアがXRP Ledger(XRPL)の開発を開始しました。Bitcoinに魅了されていた3人は、Bitcoinが持つ制約を改善したより優れたバージョンを作ることを目指し、さらに持続可能で決済に特化したデジタルアセットを構築するという目標を掲げました。 +The XRP Ledger first launched in June 2012. Shortly thereafter, they were joined by Chris Larsen, and the group started the Company NewCoin in September 2012 (quickly renamed OpenCoin and now named Ripple).: XRP Ledgerが初めてローンチされたのは2012年6月のことです。開発チームにはその後すぐにChris Larsenが加わり、2012年9月にOpenCoinという会社を創設しました(その後社名はOpenCoinに変わり、現在はRippleという名前になっています)。 +The XRPL founders gifted 80 billion XRP, the platform’s native currency, to the company. Ripple has since put the majority in escrow.: XRPLの創設者達は、このプラットフォームのネイティブ通貨である800億XRPを同社に贈与しました。その後、Ripple社はその大半をエスクローに預けています。 +XRP Ledger Development: XRP Ledgerの開発 +about.history.2011.part1: 2011年初頭、David Schwartz、Jed McCaleb、Arthur Brittの3人の開発者は、Bitcoinに魅了されながらも、Bitcoinに潜む問題を考えていました。彼らは、より持続可能な価値の送信システムを作ろうとしました。(このアイデアは、 +about.history.2011.part2: 2011年5月のフォーラムへの投稿「Bitcoin without mining」 +about.history.2011.part3: で概説されています)。 +Read More: 詳細を読む +Their initial observations about the high energy consumption and scalability issues that would plague Bitcoin proved prescient. In 2019, estimates suggest Bitcoin mining used more energy than the entire country of Portugal. Moreover, their initial read indicated that significant problems could arise if any miner obtained (or miners colluded to obtain) greater than 50% of the mining power. That risk persists with Bitcoin (and Ethereum) today as mining power has consolidated in China.: 莫大なエネルギー消費量とスケーラビリティの問題が将来的にBitcoinを悩ませるだろうという最初の気付きには先見の明があったことが実証されました。(2019年には、Bitcoinのマイニングに使用されたエネルギー量はポルトガルの国全体のエネルギー消費量を上回ったと推定されています)。また、3人は当初から、もしいずれかのマイナー(または共謀したマイナー集団)がマイニングパワーの51%以上を獲得した場合、深刻な問題が発生するであろうと考えていました。Bitcoin(とEthereum)のマイニングパワーは中国に集中しているため、現在もなおそのリスクを抱えています。 +XRPL Launches its Native Currency, XRP: XRPL、ネイティブ通貨「XRP」がローンチ +The trio of developers continued the work to build a distributed ledger that improved upon these fundamental limitations of Bitcoin, originally naming the code Ripple. The ledger included a digital asset that would originally be called “ripples” (XRP as the currency code) to follow the same naming convention as Bitcoin (BTC). At the time, the name Ripple stood for the open-source project, the unique consensus ledger (Ripple Consensus Ledger), transaction protocol (Ripple Transaction Protocol or RTXP), the network (Ripple network), and the digital asset (known as “ripples”).: 3人の開発者は、このようなBitcoinの基本的な限界を改善した分散型台帳を構築する作業を続け、当初そのコードを「Ripple」と命名しました。この台帳には、Bitcoin(BTC)と同じ命名規則に従って、当初は「ripples」(通貨コードとしてはXRP)と呼ばれるデジタル資産が含まれていました。当時、Rippleはオープンソースプロジェクト、独自のコンセンサスレジャー(Ripple Consensus Ledger)、トランザクションプロトコル(Ripple Transaction ProtocolまたはRTXP)、ネットワーク(Ripple network)、デジタルアセット(「ripples」と呼称)を表す名称でした。 +In practice, this approach led to many broad uses of “Ripple.” For clarity, the community simply started calling the digital asset by its currency code, “XRP.”: このアプローチでは「Ripple」という言葉が幅広い意味でよく使われるため、コミュニティでは明確にするためにデジタルアセットを「XRP」と呼び始めました。 +By June 2012, Schwartz, McCaleb, and Britto finished code development, and the Ledger was complete.: 2012年6月には、Schwartz、McCaleb、Brittoがコードの開発を完了し、XRP Ledgerが完全に機能するようになっていました。 +Once the XRP Ledger was live, 80% of the XRP was gifted to a new company that set out to build use cases for the digital asset—initially called NewCoin and renamed quickly to OpenCoin.: XRP Ledgerが完全に機能するようになると、XRPの80%が彼らによって設立された会社に贈与されました。当初その会社の名称はNewCoinでしたが、すぐにOpenCoinという名前に変更されました。 +Chris Larsen was the CEO of OpenCoin, and at the company's founding, Jed was co-founder and CTO, David Schwartz was the Chief Cryptography Officer, and Arthur Britto an advisor.: Chris LarsenがOpenCoinのCEOになり、創業時点では、Jed McCalebが共同創業者兼CTO、David Schwartzが最高暗号技術責任者、Arthur Brittoが相談役でした。 +OpenCoin Rebranded to Ripple Labs: OpenCoinからRipple Labsにブランド変更 +Since the early days, OpenCoin set out to revolutionize the global financial system. Despite the revolutionary ideals of many of Bitcoin’s early believers, Larsen never thought blockchain technology should be used to overthrow the existing financial system. He believed that history’s most transformative innovations have always relied on the great ideas that came before them—not displacing them.: OpenCoinはその初期から、世界の金融システムに革命を起こすことを目標としていました。Bitcoinの初期の賛同者の多くが革命的な理想を抱いていたにもかかわらず、Larsenはブロックチェーン技術が既存の金融システムを転覆させるために使用さわれるべきではないと考えていました。彼は、歴史上最も革新的なイノベーションは、常にその前に現れた偉大なアイデアに依存しており、それらを置き換えるものではないと信じていました。 +In early conversations with potential customers, the team was asked about the differences between the Ripple project and OpenCoin company. With the community starting to refer to the digital asset as XRP, company leaders decided to rebrand the company to Ripple Labs, which has been shortened over time to “Ripple.”: 創立して間もないころ、見込み顧客との商談のなかで、Rippleプロジェクトと会社であるOpenCoinとの違いについて尋ねられました。コミュニティではデジタルアセットを通貨コードである「XRP」と広く呼ぶようになっていたことから、経営陣は会社をRipple Labsというブランドに変更することを決めました。それが次第に短縮して「Ripple」と呼ばれるようになりました。 +Today, Ripple has created a use case leveraging the XRP Ledger and XRP for liquidity management in its cross-border payments business. Ripple also remains a stakeholder and contributor to the broader XRPL community.: 現在、この会社は自社の国際送金事業でXRPとXRP Ledgerを流動性管理に使用しています。Ripple社は今でも、広範なXRPLコミュニティのステークホルダーでありコントリビューターです。 +XRPL Foundation Launched: XRPL財団の創設 +about.history.xrplf.part1: 2020年9月24日に +about.history.xrplf.part2: 設立 +about.history.xrplf.part3: されたXRPL財団は、分散化されたXRP Ledgerの開発と採用を加速させることをミッションとする独立した非営利団体です。財団は、XRP Ledgerを構築する開発者やその他の +about.history.xrplf.part4: グローバルなコミュニティメンバー +about.history.xrplf.part5: の増加に対応するための財団の活動資金として、Coil、Ripple、Gatehubから650万ドルを超える初期寄付金の提供を受けています。 + +# about/impact.page.tsx +Today’s Value, Tomorrow’s Vision: 現在の価値、将来のビジョン Building for the Future: 未来を見据えた開発 Consensus protocol is efficient and sustainable: 効率的で持続可能なコンセンサスプロトコル +For more than 272 million migrants worldwide, sending and receiving money across borders is expensive, unreliable and complex.: 世界で2億7,200万人を超える移民にとって、国境を越えた送金は高額で不確実かつ複雑です。 +about.impact.feature.ppart1: オープンで分散型のブロックチェーンと暗号資産は、リテールや機関投資家からCBDC、NFT、クロスボーダー決済などの +about.impact.feature.ppart2: 商業ユースケース +about.impact.feature.ppart3: まで、金融サービス業界全体で導入が進んでいます。 A Sustainable Future: 持続可能な未来 What makes the XRPL sustainable?: XRPLが持続可能な理由は? +XRPL’s unique consensus mechanism is eco-friendly—it does not require mining to settle transactions. This results in efficiency without sacrificing security, decentralization, or scalability.: XRPLの独自のコンセンサスメカニズムは環境に優しく、トランザクションを処理するためにマイニングを必要としません。このため、セキュリティ、分散性、スケーラビリティを犠牲にすることなく、効率化を実現することができます。 +The trivial amount of energy it does consume is then neutralized with carbon credits through EW Zero, an open-source blockchain decarbonization tool.: そして、消費するわずかなエネルギーは、オープンソースのブロックチェーンによる脱炭素ツール「EW Zero」を通じて、カーボンクレジットで相殺されます。 Featured companies & projects running on the XRP Ledger.: XRP Ledgerで活動する注目の企業とプロジェクト Sustainable Projects: 持続可能なプロジェクト +Learn more about companies and developers who are using the XRP Ledger to solve interesting problems efficiently and sustainably.: XRP Ledgerを利用して興味深い問題を効率的かつ持続的に解決している企業や開発者について、詳しくご紹介します。 See More: 利用例を見る How can businesses and developers connect and contribute?: 開発者はどのように繋がり、貢献できるのでしょうか? +"If you want to advance business with sustainable solutions to real-world problems, you’re invited to join the global, growing XRPL community. Here are some ways to get involved:": 現実世界の問題に対する持続可能なソリューションでビジネスを発展させたいと考える方は、グローバルに成長するXRPLコミュニティに参加しましょう。 Join the Community: コミュニティに参加 Blog: ブログ +about.impact.blog.ppart1: " " +about.impact.blog.ppart2: XRPL開発者ブログ +about.impact.blog.ppart3: をチェックして、XRPLコミュニティのイノベーションと開発について最新情報を入手しましょう。 +Events: イベント +about.impact.events.ppart1: " " +about.impact.events.ppart2: ミートアップ、ハッカソン、カンファレンス +about.impact.events.ppart3: に参加して、コミュニティの他のメンバーと交流しましょう。 Code: コード +about.impact.code.ppart1: " " +about.impact.code.ppart2: Githubリポジトリ +about.impact.code.ppart3: からブロックチェーンプロジェクトを見つけ、どのように貢献できるか見てみましょう。 +Connect: 繋がる +about.impact.connect.ppart1: SNSで#XRPLCommunityを使って話題に加わりましょう。 + +# docs/index.page.tsx +XRP Ledger Developer Resources: XRP Ledger 開発者向けリソース +Concepts: コンセプト +'Learn the "what" and the "why" behind fundamental aspects of the XRP Ledger.': XRP Ledgerの基本的な機能の背景を学びましょう。 +Read the Docs: ドキュメントを読む +Tutorials: チュートリアル +Get step-by-step guidance to perform common tasks with the XRP Ledger.: XRP Ledgerで頻出するタスクのガイドラインをご覧ください。 +View Tutorials: チュートリアルを見る +References: リファレンス +Look up reference documentation for the XRP Ledger protocol, API methods, and more.: XRP LedgerプロトコルやAPIメソッドなどのリファレンスドキュメントをご覧ください。 +View References: リファレンスを見る +Use Cases: ユースケース +On-Chain Finance: オンチェーン金融 +Algorithmic Trading: アルゴリズム取引 +List XRP as an Exchange: 取引所へのXRPのリスト +Payment Types: 多様なPayment +Tokens: トークン +Stablecoin Issuer: ステーブルコインの発行者 +NFT Marketplace: NFTマーケットプレイス +Digital Artist: デジタルアーティスト +Peer-to-Peer Payments: 個人間の直接決済 +Cross-currency payments: クロスカレンシー決済 +Getting Started: 始めましょう +Introduction to the XRP Ledger: XRP Ledgerのご紹介 +An introduction to fundamental aspects of the XRP Ledger.: XRP Ledgerの基本的な機能の紹介 +Introduction: XRP Ledgerの基本 +Intro to XRP Ledger: XRP Ledger クイックスタート +Accounts: アカウント +Decentralized Exchange: 分散型取引所 +Tokenization: トークン化 +Watch Full Series: 全てのシリーズを見る +Interact with the XRP Ledger in a language of your choice: お好みの言語でXRP Ledgerへアクセスできます +Explore SDKs: SDKを探す +Intermediate Learning Sources: 次の学習教材 +Advanced Payment Features: 高度な支払い機能 +Governance and the Amendment Process: ガバナンスとAmendmentプロセス +Federated Sidechains: 連合サイドチェーン +Explore, Test, Verify: 探索、テスト、検証 +Explore Dev Tools: 開発者ツールを探す +Use these web-based tools to assist during all stages of development, from getting your first payment to testing your implementation for best practices.: 次のWebベースのツールを使用して、最初の支払いからベストプラクティスのための実装テストまで、開発のすべてのステージにわたりサポートします。 +Faucets: XRP Faucet +Get credentials and test-XRP for XRP Ledger Testnet or Devnet.: XRP Ledger TestnetまたはDevnetでアカウントとテスト用XRPを取得しましょう。 +WebSocket Tool: Websocketツール +Send sample requests and get responses from the rippled API.: サンプルリクエストを送信し、rippled APIからレスポンスを取得しましょう。 +XRP Ledger Explorer: XRP Ledgerエクスプローラ +View validations of new ledger versions in real-time, chart the location of servers in the XRP Ledger.: 新しいレジャーバージョンの検証結果をリアルタイムで表示したり、XRP Ledgerサーバの位置をチャートで表示します。 +Transaction Sender: トランザクション送信ツール +Test how your code handles various XRP Ledger transactions by sending them over the Testnet to the address.: コードが様々なXRP Ledgerのトランザクションをどのように処理するか、テストネットを通じてテストしましょう。 +View All tools: 全てのツールを見る +Browse By Recommended Pages: おすすめのページを見る +Public API Methods: 公開APIメソッド +Run a Validator: バリデータを運用 +Reserves: 準備金 +Transaction Types: トランザクションの種類 +Get Free Test XRP: テスト用XRPを入手 +Generate Testnet Credentials: テストネットのアカウントを作成 +Connect to the XRP Ledger Testnet network to develop and test your apps built on the XRP Ledger, without risking real money or impacting production XRP Ledger users.: XRP Ledger Testnetに接続することで、現実の資産やMainnetユーザに影響を与えることなくXRP Ledger上に構築するアプリを開発・テストすることができます。 + +# community/index.page.tsx +XRPL Community: XRPLコミュニティ +community.index.h1part1: 開発者とイノベーターによる +community.index.h1part2: グローバルな +community.index.h1part3: " " +community.index.h1part4: ブロックチェーンコミュニティ +Join the Conversation: 参加する +Hot Topics Happening Now: 今話題のトピック +community.index.event.h4part1: XRPLコミュニティ主催の +community.index.event.h4part2: グローバルイベントをチェック +Meet the XRPL community at meetups, hackathons, blockchain conferences, and more across global regions.: グローバルな地域で開催されるミートアップ、ハッカソン、ブロックチェーンカンファレンスなどで、XRPLコミュニティと出会いましょう。 +View All Events: 全てのイベントを見る +UPCOMING EVENT: 次のイベント +days: 日後 +# TODO: translate "XRPL Events Carousel Section" +Get Funding: 資金を獲得 +funding been awarded: 受賞総額 +teams awarded globally: 受賞チーム数 +countries represented: 参加国数 +XRPL Developer Funding: XRPL開発者向けの資金提供 +Funding Opportunities for Blockchain Businesses: ブロックチェーンビジネスのための資金獲得の機会 +If you're a software developer or team looking to build your next blockchain business on the XRP Ledger (XRPL), numerous funding opportunities like grants and hackathons await your innovation.: あなたがXRP Ledger(XRPL)上で次のブロックチェーンビジネスを構築しようとしているソフトウェア開発者やチームであれば、助成金やハッカソンなど数多くの資金調達の機会があなたをお待ちしています。 +XRPL Community Spotlight: XRPLコミュニティの紹介 +Showcase your blockchain project, application, or product: あなたのブロックチェーンプロジェクト、アプリケーション、製品を紹介しましょう +Get featured on the Developer Reflections blog or Ecosystem page, and amplify your innovation within the blockchain community.: 開発者向けブログやエコシステムのページで紹介され、ブロックチェーンコミュニティ内でのイノベーションを広めましょう。 +Submit Your Projects: プロジェクトを登録 +# TODO: translate project-cards +View Projects: プロジェクトを見る +Contribute to Consensus: コンセンサスへの貢献 +Run an XRP Ledger network node: XRP Ledgerのノードを実行する +Thank you for your interest in contributing to XRP Ledger.: XRP Ledgerへの貢献に興味がありますか? +Networks and Servers: ネットワークとサーバ +Join UNL: UNLに参加 +Install & Configure: インストールと設定 +Troubleshooting: トラブルシューティング +XRPL Careers: XRPLキャリア +Discover your next career opportunity in the XRPL community: XRPLコミュニティで次のキャリアを見つけましょう +Teams across the XRPL community are looking for talented individuals to help build their next innovation.: XRPLコミュニティ全体が、次のイノベーションを構築するために才能ある人物を探しています。 +View Open Roles: 募集中の職種を見る +Contribute to XRPL.org: XRPL.orgに貢献する +A Community-Driven Resource for All Things XRP Ledger: XRP Ledgerに関する情報を提供するコミュニティ主導のリソース +Contribute to XRPL.org, the go-to resource for XRP Ledger. This open-source portal welcomes contributions from anyone for suggested changes.: XRP LedgerのためのリソースであるXRPL.orgに貢献しましょう。このオープンソースポータルでは、皆様からの変更や提案を歓迎します。 +Read Contributor Guidelines: ガイドラインを読む + +# community/events.page.tsx +Find the XRPL Community Around the World: 世界中のXRPLコミュニティを見つけよう +# TODO: translate event details +Register Now: いますぐ登録 +Check out meetups, hackathons, and other events hosted by the XRPL Community: XRPLコミュニティが主催するミートアップ、ハッカソン、その他のイベントをチェックしましょう +"Filter By:": "絞り込み:" +Conference: カンファレンス +Meetups: ミートアップ +Hackathons: ハッカソン +AMAs: AMA +Community Calls: コミュニティコール +XRPL Zone: XRPL Zone +Info Session: セッション +# TODO: translate feature events +Explore past community-hosted events: 過去のコミュニティ主催のイベントを見る +Past Events: 過去のイベント +# TODO: translate past events + +# community/ambassadors.page.tsx +Become an XRP Ledger Campus Ambassador: XRP Ledgerキャンパスアンバサダーになる +Join the Student Cohort: 学生コミュニティに参加 +The XRPL Campus Ambassador program engages, supports, connects, and recognizes a group of student champions of the XRPL and empowers them to further advance engagement on the ledger.: XRPLキャンパスアンバサダープログラムは、XRPLの学生による代表者を参加させ、支援し、繋いで、表彰し、彼らがコミュニティ/エコシステムへの関与をさらに進めるように支援するものです。 +# Apply for Fall 2023: 2023年秋の申し込み #old +XRPL Campus Ambassadors: XRPLキャンパスアンバサダー +Current Students: 現役学生 +The XRPL Campus Ambassador program aims to elevate the impact of college students who are passionate about blockchain technology. In their role, Campus Ambassadors help educate other students about crypto and how to start building on the XRPL.: XRPLキャンパスアンバサダープログラムは、ブロックチェーン技術に情熱を持つ大学生の影響力を高めることを目指しています。彼らの役割として、キャンパスアンバサダーは他の学生に暗号通貨について教育し、XRPL上での開発を始める方法を教えます。 +Why become an XRPL Campus Ambassador?: XRPLキャンパスアンバサダーになる理由 +Benefits: メリット +Join a global cohort of students empowering others to build on the XRPL.: XRPLをベースに他の人に力を与える、世界的な学生グループに参加しましょう +Exclusive Opportunities: 特別な機会 +Get access and invitations to Ambassador-only events, conferences, and opportunities: アンバサダー限定のイベント、カンファレンス、チャンスの情報を入手できます +Education: 学習 +Tutorials and workshops from leading XRPL and blockchain developers: トップクラスのXRPLおよびブロックチェーン開発者によるチュートリアルとワークショップを提供します +Swag: グッズ +New XRPL swag for Ambassadors and swag to share with other students: アンバサダー用の特別なXRPLグッズと他の学生と共有できるグッズを提供します +Mentorship: メンター +Serve as an advocate and receive support from notable members of the community: アドボケートの役割を果たし、コミュニティの主要メンバーからのサポートが提供されます +Career Acceleration: キャリア促進 +Gain hands-on experience building communities and grow your professional network in the blockchain industry: ブロックチェーン業界におけるコミュニティ構築の経験を積み、プロフェッショナルなネットワークを広げることができます +Stipend: 奨学金 +Receive a stipend to fund your ideas and initiatives that fuel XRPL growth on your campus: キャンパスでのXRPLの成長を促進するアイデアやイニシアチブの資金となる奨学金を受け取ることができます +Should You Apply?: 応募すべきでしょうか? +Eligibility for XRPL Campus Ambassadors: XRPLキャンパスアンバサダーの応募資格 +Students currently enrolled in an undergraduate or postgraduate program at an accredited college or university are eligible to apply.: 現在、認定された大学の学部または大学院に在籍している学生が応募可能です。 +A Leader: リーダー +Interested in leading meetups and workshops for your local campus community: 学内のコミュニティでミートアップやワークショップを開催することに関心を持っている +Active: アクティブ +An active participant in the XRPL community or interested in blockchain and crypto technologies: XRPLコミュニティに積極的に参加している、またはブロックチェーンや暗号技術に興味を持っている +Curious: 好奇心旺盛 +Eager to learn more about technical blockchain topics and the XRPL: ブロックチェーン技術やXRPLについてより深く学ぶ意欲がある +Passionate: 情熱的 +Passionate about increasing XRPL education and awareness through events, content, and classroom engagement: イベント、コンテンツ、授業への参加を通じて、XRPLの教育と認知度を高めることに情熱を持っている +Creative: クリエイティブ +Ability to think outside the box to grow the XRPL student community: 既成概念にとらわれず、XRPLの学生コミュニティを成長させる思考力がある +Process to become a Campus Ambassador: キャンパスアンバサダー就任までの流れ +How it Works: 手続き +Apply now to become an XRPL Campus Ambassador.: XRPLキャンパスアンバサダーになりたい方は今すぐ応募しましょう。 +Apply: 応募 +Submit an application to be considered for the Campus Ambassador program.: キャンパスアンバサダープログラムの選考を受けるには、応募書類を提出してください。 +Interview: 面接 +Tell the XRPL community-led panel more about yourself and your interest in the program during an interview.: XRPLコミュニティが中心となって運営する委員との面接で、あなた自身、またプログラムへの関心について詳しく話してください。 +Join: 参加 +Congrats on your new role! Join the global cohort of Ambassadors and meet with community participants during onboarding.: 就任おめでとうございます!グローバルなアンバサダーグループに参加し、新しいコミュニティメンバーとお会いしましょう。 +Learn: 学習 +Participate in personalized learning and training sessions for Ambassadors on the XRPL and blockchain technology.: XRPLおよびブロックチェーン技術に関するアンバサダー向けの個別学習およびトレーニングセッションへ参加しましょう。 +Join a global cohort of Student Ambassadors: 学生アンバサダーのグローバルなコミュニティに参加する +Global Community: グローバルコミュニティ +Stay connected to the XRPL Campus Ambassadors: XRPLキャンパスアンバサダーとの繋がりを持つ +"To stay up-to-date on the latest activity, meetups, and events of the XRPL Campus Ambassadors be sure to follow these channels:": XRPL キャンパスアンバサダーの最新の活動、ミートアップ、イベントに関する最新情報を得るには、次のチャンネルをフォローしましょう。 +MeetUp: ミートアップ +Attend an XRPL Meetup in your local area: 近隣のXRPLミートアップに参加しましょう +Dev.to Blog: Dev.to ブログ +Read more about the activity of the XRPL Ambassadors: XRPLアンバサダーの活動についてもっと知る +Join the conversation on the XRPL Developer Discord: XRPL開発者Discordで意見交換しましょう + +# community/developer-funding.tsx +XRPL Developer Funding Programs: XRPL開発者向け資金提供プログラム +Project Resources: プロジェクト資金 +Explore funding opportunities for developers and teams: 開発者やチームのための資金調達の方法を見つけましょう +Funding Overview: 資金調達の概要 +"If you’re a software developer or team looking to build your next project or venture on the XRP Ledger (XRPL), there are a number of opportunities to fund your next innovation.": "XRP Ledger(XRPL)上に次のプロジェクトやベンチャーを構築しようとしているソフトウェア開発者やチーム向けの資金を提供されるチャンスは数多く存在します。" +XRPL Hackathons: XRPLハッカソン +Join an Event: イベントに参加 +Hackathons are open to all developers to explore and invent a project on the XRP Ledger. Visit the events page for updates on upcoming hackathons.: XRP Ledgerのハッカソンはプロジェクトを調査・考案するために、すべての開発者に開放されています。今後のハッカソンに関する最新情報は、イベントページでご確認ください。 +See Upcoming Events: 今後のイベントを見る +Best for: こんな方に最適 +Software developers and teams building directly on the XRP Ledger: XRP Ledger上のソフトウェア開発者やXRP Ledger上で直接開発を行うチーム +Required: 必須要件 +Some coding experience: コーディング経験 +Level: レベル +XRPL beginner to advanced developers: XRPLの初級開発者から上級開発者まで +Funding Levels: 資金調達の規模 +Prize money and awards: 賞金および賞品 +XRPL Grants: XRPL Grants +Fund Your Project: プロジェクトの資金調達 +Developer grants for projects that contribute to the growing XRP Ledger community.: 成長するXRP Ledgerコミュニティに貢献するプロジェクトに開発者向けの助成金を提供します。 +"Past awardees include:": "過去の受賞者:" +Visit XRPL Grants: XRPL Grantsを見る +Software developers, teams, and start-ups building directly on the XRP Ledger: XRP Ledger上で直接開発を行うソフトウェア開発者やチーム、スタートアップ企業 +Coding experience: コーディング経験 +Github repository: Githubリポジトリ +Project narrative/description: プロジェクトの説明 +At least one developer on the core team: 少なくとも1人のコアチーム開発者 +Budget and milestones: 予算とマイルストーン +XRPL intermediate to advanced developers: XRPLの中級開発者から上級開発者 +$10,000 - $200,000: $10,000 ~ $200,000 +XRPL Accelerator: XRPLアクセラレータ +Advance your project: プロジェクトの推進 +12-week program for entrepreneurs building on the XRP Ledger to scale their projects into thriving businesses.: XRP Ledgerをベースとする起業家向けの12週間のプログラムで、プロジェクトを繁栄するビジネスへとスケールアップさせることができます。 +Start-ups building scalable products on XRPL that can capture a large market opportunity: XRPL上でスケーラブルなプロダクトを構築し、大きな市場機会を獲得できるスタートアップ企業 +Strong founding team: 強力な創業チーム +Bold, ambitious vision: 大胆で野心的なビジョン +Ideally an MVP and monetization strategy: 理想的にはMVPと収益化戦略 +XRPL advanced developers: XRPLの上級開発者 +Business acumen: ビジネス知識 +View XRPL Accelerator: XRPLアクセラレータを見る +$50,000 (grant) + pitch for venture funding: $50,000(助成金)+ベンチャー資金へのピッチ + +Open Source.: オープンソース +Jump to top of page: ページの先頭へ +Edit page: ページを編集 +Search: 検索 +Search site...: サイトを検索 +Search for articles, training, and code samples...: 記事、トレーニング、コードサンプルを検索... +Start Building with Example Code: コードサンプルから開発を始める +Code Samples: コードサンプル +Browse sample code for building common use cases on the XRP Ledger: XRP Ledger上で一般的なユースケースを構築するためのコードサンプルを見ることができます +Contribute Code Samples: コードサンプルへの貢献 +Help the XRPL community by submitting your
own code samples: コードサンプルを投稿して、XRPLコミュニティに貢献しましょう +The XRPL Community: XRPL コミュニティ +Find the community on the platforms below: 以下のプラットフォームでコミュニティにアクセスできます。 +Apply for funding to build your XRPL project: 将来のXRPLプロジェクトのための資金調達に応募する +Awarded in a single grant: 1回のGrantでの助成金 +Distributed to grant recipients: 助成対象者への配布 +Open-source projects funded : オープンソースプロジェクトへの資金提供 +Learn More: もっと知る +Showcase your XRPL project, application or product: XRPLプロジェクト、アプリケーション、製品の紹介 +Read the Blog: ブログを読む +Check out global events across the XRPL community: XRPLコミュニティで開催されるグローバルなイベントをチェック +XRPL Events: XRPLイベント +Review guidelines for using XRPL design assets: XRPLのデザインアセットを使用するためのガイドラインを確認 +XRPL Assets: XRPLのアセット +Download the PDF and Assets: PDFとアセットをダウンロード +A community-driven resource for all things XRPL.org: XRPとXRP Ledgerのあらゆるものを提供する、コミュニティ主体のリソース +Dev Tools: 開発者ツール +Explorers: エクスプローラ +API Access: APIアクセス +Other: その他 +Have an Idea For a Tool?: ツールのアイデアをお持ちですか? +Open a pull Request: プルリクエストを作成する +Full documentation index: 全ドキュメントの目次 +See Everything: 全てを見る +rippled API Reference: rippled APIリファレンス +XRP Faucet: XRP Faucet +Getting Started with Python: Pythonを使ってみよう +Websocket API Tool: Websocket APIツール +Trade on the decentralized exchange: 分散型取引所でトレード +Make payments: 支払いを実行 +Use specialized payment types: 高度な支払い機能 +Non-fungible Tokens: 非代替性トークン +Issue a stablecoin: ステーブルコインを発行 +Assign an authorized minter: 認可Minterの割り当て +Peer to peer payments: 直接支払い +Escrows: エスクロー +Get Started: 始めましょう +See full documentation index: 全ドキュメントの目次 +The XRPL Developer Summit: XRPL開発者サミット +Save the Date: 日程を確認 +Upcoming Events: 今後のイベント情報 +Sorry, this page is not available in your language.: 申し訳ありませんが、このページはお使いの言語では提供されていません。 References and APIs: リファレンスとAPI Everything You Need to Know: 全てはここに XRP Ledger address, transaction ID, or ledger index: XRP Ledgerアドレス、トランザクションID、またはレジャーインデックス @@ -278,29 +627,17 @@ Finish automatically: 自動的に終了 Create Payment Channel: Payment Channelを作成 Send Issued Currency: トークンを送信 Trust for: トラストラインの設定 -Security: セキュリティ Release Notes: リリースノート -Custody: カストディ -Infrastructure: インフラストラクチャ Carbon Markets/Sustainability: 持続可能性 -Developer Tooling: 開発者ツール -Gaming: ゲーム -Wallet: ウォレット Ledger City is a crypto real estate game powered by the XRP Ledger.: Ledger Cityは、XRP Ledgerを利用した暗号不動産ゲームです。 -Interoperability: 相互運用性 Ripple's CBDC Platform: Ripple社のCBDC Platform\ Ripple's On-Demand Liquidity: Ripple社のOn-Demand Liquidity -Exchanges: 取引所 XRPL Rosetta explores fiat data on XRPL through visualization.: XRPL Rosettaは、XRPL上のフィアットデータを可視化することで素晴らしさを追求します。 XRPL.org's Ledger Explorer is a block explorer of the XRP Ledger.: XRPL.orgのLedger Explorerは、XRP Ledgerのブロックエクスプローラーです。 Xumm Wallet is a non custodial wallet with superpower for the XRP Ledger.: Xumm Walletは、XRP Ledgerのための最高能力を備えた非カストディアルウォレットです。 Web Monetization: ウェブ収益化 -Sustainability: 持続可能性 CBDCs: CBDC Cancel: キャンセル -Featured Categories: 注目のカテゴリ -Other Categories: 他のカテゴリ Proven Powerful for Innovation: イノベーションのための確かな実績 XRPL Use Cases: XRPLのユースケース Building businesses and creating new value: ビジネスの構築と新たな価値の創造 -XRPL Ecosystem: XRPLエコシステム diff --git a/@theme/components/LanguagePicker/LanguagePicker.tsx b/@theme/components/LanguagePicker/LanguagePicker.tsx new file mode 100644 index 0000000000..307c5a8f8c --- /dev/null +++ b/@theme/components/LanguagePicker/LanguagePicker.tsx @@ -0,0 +1,97 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { DropdownMenu } from '@redocly/theme/components/Dropdown/DropdownMenu'; +import { breakpoints } from '@redocly/theme/core/utils'; +import { useLanguagePicker, useThemeHooks } from '@redocly/theme/core/hooks'; +import { GlobalOutlinedIcon } from '@redocly/theme/icons/GlobalOutlinedIcon/GlobalOutlinedIcon'; +import { Button } from '@redocly/theme/components/Button/Button'; +import { Dropdown } from '@redocly/theme/components/Dropdown/Dropdown'; +import { CheckmarkIcon } from '@redocly/theme/icons/CheckmarkIcon/CheckmarkIcon'; + +export type LanguagePickerProps = { + onChangeLanguage: (newLang: string) => void; + onlyIcon?: boolean; + placement?: 'top' | 'bottom'; + alignment?: 'start' | 'end'; +}; + +export function LanguagePicker(props: LanguagePickerProps): JSX.Element | null { + const { currentLocale, locales, setLocale } = useLanguagePicker(); + const { useTelemetry } = useThemeHooks(); + const telemetry = useTelemetry(); + + if (locales.length < 2 || !currentLocale) { + return null; + } + + const languagePickerButton = ( + + {/* Current Students */} @@ -41,7 +42,7 @@ export default function Ambassadors() {

{translate("The XRPL Campus Ambassador program aims to elevate the impact of college students who are passionate about blockchain technology. In their role, Campus Ambassadors help educate other students about crypto and how to start building on the XRPL.")}

- +
@@ -50,7 +51,7 @@ export default function Ambassadors() {
- +
@@ -73,7 +74,7 @@ export default function Ambassadors() { Smiley face
{translate("Exclusive Opportunities")}
-

{translate(" Get access and invitations to Ambassador-only events, conferences, and opportunities")}

+

{translate("Get access and invitations to Ambassador-only events, conferences, and opportunities")}

{/* Hide on large */} @@ -278,7 +279,7 @@ export default function Ambassadors() {

{translate("Apply now to become an XRPL Campus Ambassador.")}

- +
@@ -377,7 +378,7 @@ export default function Ambassadors() {

{translate("To stay up-to-date on the latest activity, meetups, and events of the XRPL Campus Ambassadors be sure to follow these channels:")}

- +
@@ -410,7 +411,7 @@ export default function Ambassadors() {
- +
diff --git a/community/developer-funding.page.tsx b/community/developer-funding.page.tsx index 1569ae261d..5e386f0785 100644 --- a/community/developer-funding.page.tsx +++ b/community/developer-funding.page.tsx @@ -1,5 +1,6 @@ import * as React from "react"; -import { useTranslate } from "@portal/hooks"; +import { useThemeHooks } from '@redocly/theme/core/hooks'; +import { Link } from '@redocly/theme/components/Link/Link'; export const frontmatter = { seo: { @@ -13,6 +14,7 @@ false; const target = { prefix: "" }; // TODO: fixme export default function Funding() { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); return ( @@ -71,9 +73,9 @@ export default function Funding() { )}

- + {translate("See Upcoming Events")} - +
@@ -139,9 +141,9 @@ export default function Funding() {
- + {translate("See Upcoming Events")} - +
@@ -198,15 +200,20 @@ export default function Funding() {
{translate("Required")}

- {translate("Coding experience")} - - {translate(" Github repository ")} - - {translate(" Project narrative/description ")} - - {translate(" At least one developer on the core team ")} - - {translate(" Budget and milestones")} + {" "} + {translate("Coding experience")} +
+ {" "} + {translate("Github repository")} +
+ {" "} + {translate("Project narrative/description")} +
+ {" "} + {translate("At least one developer on the core team")} +
+ {" "} + {translate("Budget and milestones")}

@@ -237,16 +244,19 @@ export default function Funding() {
{translate("Required")}

- {translate("Coding experience")}{" "} - - {translate("Github repository")}{" "} - - {translate("Project narrative/description")}{" "} - - {translate( - "At least one developer on the core team" - )}{" "} - + {" "} + {translate("Coding experience")} +
+ {" "} + {translate("Github repository")} +
+ {" "} + {translate("Project narrative/description")} +
+ {" "} + {translate("At least one developer on the core team")} +
+ {" "} {translate("Budget and milestones")}

diff --git a/community/events.page.tsx b/community/events.page.tsx index 77a4fd10d8..ab3ad870ca 100644 --- a/community/events.page.tsx +++ b/community/events.page.tsx @@ -1,6 +1,5 @@ -import { useState, useMemo } from "react"; -import * as React from "react"; -import { useTranslate } from "@portal/hooks"; +import React, { useState, useMemo } from "react"; +import { useThemeHooks } from '@redocly/theme/core/hooks'; const moment = require("moment"); const amaImage = require("../static/img/events/AMAs.png") const hackathon = require("../static/img/events/Hackathons.png") @@ -416,7 +415,7 @@ const events = [ { name: "XRPL Toronto Meetup", description: - "Prepare for an evening of XRPL Toronto Meetup – a celebration of discovery and connection. Join enthusiasts, innovators, and developers for inspiring talks, conversations, and learning. All are welcome, from seasoned developers to curious newcomers.", + "Prepare for an evening of XRPL Toronto Meetup - a celebration of discovery and connection. Join enthusiasts, innovators, and developers for inspiring talks, conversations, and learning. All are welcome, from seasoned developers to curious newcomers.", type: "meetup", link: "https://www.meetup.com/xrpl-toronto-community-meetup/events/294766059", location: "Downtown Toronto", @@ -591,19 +590,6 @@ const events = [ image: require("../static/img/events/paris.png"), end_date: "January 26, 2024", }, - - { - name: "XRPL Toronto Meetup Community - Celebrate with Us!", - description: - "To connect the blockchain community, showcase campus ambassador projects, and celebrate the new year.", - type: "meetup", - link: "https://www.meetup.com/xrpl-toronto-community-meetup/events/294766059", - location: "Downtown, Toronto", - date: "TBD", - image: require("../static/img/events/event-meetup-toronto@2x.jpg"), - end_date: "January 31, 2025", // putting a far future date so it remains in upcoming events until a date is confirmed - }, - { name: "XRP Ledger Zone ETHDenver", description: @@ -674,9 +660,65 @@ const events = [ image: amaImage, end_date: "March 13, 2024", }, + { + name: "EasyA Ripple Hackathon", + description: + "Join the XRPL community at the Ripple x EasyA Hackathon in Amsterdam, where startups can compete for a $20,000 prize and a chance to present at the prestigious APEX Conference alongside industry leaders. Secure your spot now! ", + type: "hackathon", + link: "https://www.eventbrite.co.uk/e/easya-x-ripple-apex-hackathon-win-20000-tickets-882724261027?aff=oddtdtcreator", + location: "Amsterdam", + date: "June 8 - 9, 2024", + image: hackathon, + end_date: "June 9, 2024", + }, + { + name: "Building on the XRP Ledger", + description: + "This 2-day intensive hands-on training is designed for developers who are curious to learn about XRP Ledger. Meet your peers, share insights, and join a community of builders.", + type: "meetup", + link: "https://www.eventbrite.fr/e/building-on-the-xrp-ledger-tickets-912086745007", + location: "Paris, France", + date: "June 24 - 25, 2024", + image: require("../static/img/events/LedgerEvent.png"), + end_date: "June 25, 2024", + }, + { + name: "Aquarium Residency Demo Day #3", + description: + "The Aquarium Residency is a 12-week program for entrepreneurs & developers building on the XRP Ledger blockchain. Join us at our Paris HQ to connect with our 10 residents, discover their projects focused on DiD (Decentralized Identity), and engage with the XRPL community.", + type: "meetup", + link: "https://www.eventbrite.fr/e/aquarium-residency-demo-day-3-tickets-916183147457", + location: "Paris, France", + date: "June 26, 2024", + image: require("../static/img/events/DemoDay.png"), + end_date: "June 26, 2024", + }, + { + name: "SwissHacks", + description: + "Transform Fintech with XRPL at SwissHacks 2024! Prototype and collaborate with fellow builders to reinvent finance for a brighter future", + type: "hackathon", + link: "https://airtable.com/app61tk91vkuwKhGx/pagCN29Br8RdxTvp7/form", + location: "Zurich", + date: "June 28 - 30, 2024", + image: hackathon, + end_date: "June 30, 2024", + }, + { + name: "XRPL Meetup in Luxembourg", + description: + "Calling all Luxembourg blockchain enthusiasts! Join XRPL Meetups to share knowledge, build real-life connections, and foster communities centered around blockchain and XRP Ledger. We're establishing local “XRPL Hubs” across Europe, and we want you to be a part of it!", + type: "meetup", + link: "https://lxm-xrpl-meetup.eventbrite.fr/", + location: "Luxembourg", + date: "July 2, 2024", + image: require("../static/img/events/Luxemberg.png"), + end_date: "July 2, 2024", + }, ]; export default function Events() { + const { useTranslate} = useThemeHooks(); const { translate } = useTranslate(); const { past, upcoming } = useMemo(() => categorizeDates(events), []); @@ -777,9 +819,9 @@ export default function Events() { - {translate("Learn More")} + {translate("Register Now")} @@ -796,7 +838,7 @@ export default function Events() {
{translate("Upcoming Events")}
-
Filter By:
+
{translate("Filter By:")}
- +
- +
- +
- +
- +
- +
- +
@@ -900,10 +942,10 @@ export default function Events() { background: `url(${event.image}) no-repeat`, }} > -
{event.name}
+
{translate(event.name)}
-

{event.description}

+

{translate(event.description)}

@@ -924,7 +966,7 @@ export default function Events() {
{translate("Past Events")}
-
Filter By:
+
{translate("Filter By:")}
- +
- +
- +
- +
- +
- +
- +
@@ -1026,10 +1068,10 @@ export default function Events() { background: `url(${event.image}) no-repeat`, }} > -
{event.name}
+
{translate(event.name)}
-

{event.description}

+

{translate(event.description)}

diff --git a/community/index.page.tsx b/community/index.page.tsx index 4943825031..1a00c2a2a1 100644 --- a/community/index.page.tsx +++ b/community/index.page.tsx @@ -1,6 +1,7 @@ -import React, { useEffect, useState } from "react"; -import { useTranslate } from "@portal/hooks"; +import React, { useState } from "react"; +import { useThemeHooks } from "@redocly/theme/core/hooks"; import moment from "moment"; +import { Link } from "@redocly/theme/components/Link/Link"; export const frontmatter = { seo: { @@ -9,10 +10,10 @@ export const frontmatter = { "The XRP Ledger (XRPL) is a community-driven public blockchain. Here’s how you can get involved.", }, }; -const amaImage = require("../static/img/events/AMAs.png") -const hackathon = require("../static/img/events/Hackathons.png") -const conference = require("../static/img/events/Conference.png") -const zone = require("../static/img/events/XRPLZone.png") +const amaImage = require("../static/img/events/AMAs.png"); +const hackathon = require("../static/img/events/Hackathons.png"); +const conference = require("../static/img/events/Conference.png"); +const zone = require("../static/img/events/XRPLZone.png"); const findNearestUpcomingEvent = (events) => { let nearestEvent = null; let nearestDateDiff = Infinity; @@ -56,18 +57,6 @@ const events = [ end_date: "November 28, 2023", start_date: "November 28, 2023", }, - // { - // name: "XRPL Toronto Meetup Community - Celebrate with Us!", - // description: - // "To connect the blockchain community, showcase campus ambassador projects, and celebrate the year's progress with a holiday theme.", - // type: "meetup", - // link: "https://www.meetup.com/xrpl-toronto-community-meetup/events/294766059", - // location: "Downtown, Toronto", - // date: "December 7th, 6pm - 9pm", - // image: require("../static/img/events/event-meetup-toronto@2x.jpg"), - // end_date: "December 7, 2023", - // start_date: "December 7, 2023", - // }, { name: "XRPL Grants Info Session: Decentralized Exchange (DEX) Focused", description: @@ -80,18 +69,6 @@ const events = [ end_date: "September 06, 2023", start_date: "September 06, 2023", }, - { - name: "APEX 2024: The XRPL Developer Summit", - description: - "Apex XRPL Developer Summit is the annual event where developers, contributors, and thought leaders come together to learn, build, share, network, and celebrate all things XRP Ledger.", - type: "conference", - link: "http://apexdevsummit.com", - location: "Amsterdam", - date: "June 11 - 13, 2024", - image: conference, - end_date: "June 13, 2024", - start_date: "June 11, 2024", - }, { name: "XRPL Developers Reddit AMA: Real World Assets", description: @@ -104,30 +81,6 @@ const events = [ end_date: "October 17, 2023", start_date: "October 17, 2023", }, - { - name: "Paris Blockchain Week", - description: - "Paris Blockchain Week is Europe's biggest blockchain & digital assets event that covers all aspects of blockchain technology.", - type: "conference", - link: "https://www.parisblockchainweek.com/", - location: "Paris, France", - date: "April 9 - 12, 2024", - image: conference, - end_date: "April 12, 2024", - start_date: "April 12, 2024", - }, - { - name: "Consensus", - description: - "Join us at Consensus! This event is the world's largest, longest-running and most influential gathering that brings together all sides of the cryptocurrency, blockchain and Web3 community.", - type: "conference", - link: "https://consensus.coindesk.com/?utm_campaign=&utm_content=c24&utm_medium=sponsored&utm_source=XRPLEventsPage%20&utm_term=organic", - location: "Austin, Texas", - date: "May 29 - June 1, 2024", - image: conference, - end_date: "June 1, 2024", - start_date: "June 1, 2024", - }, { name: "XRP Ledger Zone ETHDenver", description: @@ -152,11 +105,72 @@ const events = [ start_date: "March 13, 2024", end_date: "March 13, 2024", }, + { + name: "Paris Blockchain Week", + description: + "Paris Blockchain Week is Europe's biggest blockchain & digital assets event that covers all aspects of blockchain technology.", + type: "conference", + link: "https://www.parisblockchainweek.com/", + location: "Paris, France", + date: "April 9 - 12, 2024", + image: conference, + end_date: "April 12, 2024", + start_date: "April 9, 2024", + }, + { + name: "Consensus", + description: + "Join us at Consensus! This event is the world's largest, longest-running and most influential gathering that brings together all sides of the cryptocurrency, blockchain and Web3 community.", + type: "conference", + link: "https://consensus.coindesk.com/?utm_campaign=&utm_content=c24&utm_medium=sponsored&utm_source=XRPLEventsPage%20&utm_term=organic", + location: "Austin, Texas", + date: "May 29 - June 1, 2024", + image: conference, + end_date: "June 1, 2024", + start_date: "May 29, 2024", + }, + { + name: "EasyA Ripple Hackathon", + description: + "Join the XRPL community at the Ripple x EasyA Hackathon in Amsterdam, where startups can compete for a $20,000 prize and a chance to present at the prestigious APEX Conference alongside industry leaders. Secure your spot now! ", + type: "hackathon", + link: "https://www.eventbrite.co.uk/e/easya-x-ripple-apex-hackathon-win-20000-tickets-882724261027?aff=oddtdtcreator", + location: "Amsterdam", + date: "June 8 - 9, 2024", + image: hackathon, + start_date: "June 8, 2024", + end_date: "June 9, 2024", + }, + { + name: "APEX 2024: The XRPL Developer Summit", + description: + "Apex XRPL Developer Summit is the annual event where developers, contributors, and thought leaders come together to learn, build, share, network, and celebrate all things XRP Ledger.", + type: "conference", + link: "http://apexdevsummit.com", + location: "Amsterdam", + date: "June 11 - 13, 2024", + image: conference, + end_date: "June 13, 2024", + start_date: "June 11, 2024", + }, + { + name: "SwissHacks", + description: + "Transform Fintech with XRPL at SwissHacks 2024! Prototype and collaborate with fellow builders to reinvent finance for a brighter future", + type: "hackathon", + link: "https://airtable.com/app61tk91vkuwKhGx/pagCN29Br8RdxTvp7/form", + location: "Zurich", + date: "June 28 - 30, 2024", + image: hackathon, + start_date: "June 28, 2024", + end_date: "June 30, 2024", + }, ]; const { nearestDateDiff, nearestEvent } = findNearestUpcomingEvent(events); const XrplEventsAndCarouselSection = ({ events }) => { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); - const [currentIndex, setCurrentIndex] = useState(1); + const [currentIndex, setCurrentIndex] = useState(7); const updateCarousel = () => { const prevEvent = events[currentIndex - 1] || null; @@ -183,7 +197,6 @@ const XrplEventsAndCarouselSection = ({ events }) => { }; const { prevEvent, currentEvent, nextEvent } = updateCarousel(); - return ( <>
@@ -191,9 +204,15 @@ const XrplEventsAndCarouselSection = ({ events }) => {
{translate("XRPL Events")}

- {translate("Check out global events hosted")}{" "} + {translate( + "community.index.event.h4part1", + "Check out global events hosted " + )}
- {translate("by the XRPL community")} + {translate( + "community.index.event.h4part2", + "by the XRPL community" + )}

@@ -201,40 +220,42 @@ const XrplEventsAndCarouselSection = ({ events }) => { "Meet the XRPL community at meetups, hackathons, blockchain conferences, and more across global regions." )}

- {translate("View All Events")} - +
-
-

{translate("UPCOMING EVENT")}

-
- {nearestDateDiff} + {!!nearestEvent && ( +
+

{translate("UPCOMING EVENT")}

+
+ {nearestDateDiff} +
+
{translate("days")}
+
+
+ {translate(nearestEvent?.name)} +
+

+ + {nearestEvent?.date} +

+

+ + {nearestEvent?.location} +

-
{translate("days")}
-
-
- {translate(nearestEvent.name)} -
-

- - {nearestEvent.date} -

-

- - {nearestEvent.location} -

-
- {translate("View All Events")} - +
@@ -290,6 +311,7 @@ const XrplEventsAndCarouselSection = ({ events }) => { }; const CommunityPage: React.FC = () => { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); return (
@@ -339,12 +361,14 @@ const CommunityPage: React.FC = () => { alt="Down Arrow" />

- {translate("A Global Blockchain")} + {translate("community.index.h1part1", "A Global Blockchain")}
- {translate("Community of ")} - Builders + {translate("community.index.h1part2", "Community of ")} + + {translate("community.index.h1part3", "Builders")} +
- {translate("and Innovators")} + {translate("community.index.h1part4", "and Innovators")}

{translate("XRPL Community")}
@@ -439,13 +463,13 @@ const CommunityPage: React.FC = () => { {/* Community Funding Section */}
- {translate("Get Funding")} - +
@@ -491,13 +515,13 @@ const CommunityPage: React.FC = () => { "If you're a software developer or team looking to build your next blockchain business on the XRP Ledger (XRPL), numerous funding opportunities like grants and hackathons await your innovation." )}

- {translate("Get Funding")} - +
{/* Community Spotlight Wrapper */} @@ -592,38 +616,38 @@ const CommunityPage: React.FC = () => {

{translate( - "Thank you for your interest in contributing to XRPL.org." + "Thank you for your interest in contributing to XRP Ledger." )}

@@ -659,7 +683,9 @@ const CommunityPage: React.FC = () => { {translate("Contribute to XRPL.org")}
- {translate("A Community-Driven Resource for All Things XRPL.org")} + {translate( + "A Community-Driven Resource for All Things XRP Ledger" + )}

{translate( @@ -667,13 +693,13 @@ const CommunityPage: React.FC = () => { )}

- {translate("Read Contributor Guidelines")} - +
diff --git a/docs/_snippets/tx-metadata-field-table.md b/docs/_snippets/tx-metadata-field-table.md index c9e99deee5..0fdcbff89b 100644 --- a/docs/_snippets/tx-metadata-field-table.md +++ b/docs/_snippets/tx-metadata-field-table.md @@ -1,7 +1,7 @@ | Field | Value | Description | |:----------------------------------------|:--------------------|:-------------| | `AffectedNodes` | Array | List of [ledger entries](../references/protocol/ledger-data/ledger-entry-types/index.md) that were created, deleted, or modified by this transaction, and specific changes to each. | -| `DeliveredAmount` | [Currency Amount][] | _(May be omitted)_ For a [partial payment](../concepts/payment-types/partial-payments.md), this field records the amount of currency actually delivered to the destination. To avoid errors when reading transactions, instead use the `delivered_amount` field, which is provided for all Payment transactions, partial or not. | +| `DeliveredAmount` | [Currency Amount](../references/protocol/data-types/basic-data-types.md#specifying-currency-amounts) | _(May be omitted)_ For a [partial payment](../concepts/payment-types/partial-payments.md), this field records the amount of currency actually delivered to the destination. To avoid errors when reading transactions, instead use the `delivered_amount` field, which is provided for all Payment transactions, partial or not. | | `TransactionIndex` | Unsigned Integer | The transaction's position within the ledger that included it. This is zero-indexed. (For example, the value `2` means it was the 3rd transaction in that ledger.) | | `TransactionResult` | String | A [result code](../references/protocol/transactions/transaction-results/index.md) indicating whether the transaction succeeded or how it failed. | -| [`delivered_amount`](../references/protocol/transactions/metadata.md#delivered_amount) | [Currency Amount][] | _(Omitted for non-Payment transactions)_ The [Currency Amount][] actually received by the `Destination` account. Use this field to determine how much was delivered, regardless of whether the transaction is a [partial payment](../concepts/payment-types/partial-payments.md). See [this description](../references/protocol/transactions/metadata.md#delivered_amount) for details. | +| [`delivered_amount`](../references/protocol/transactions/metadata.md#delivered_amount) | [Currency Amount](../references/protocol/data-types/basic-data-types.md#specifying-currency-amounts) | _(Omitted for non-Payment transactions)_ The amount of currency actually received by the `Destination` account. Use this field to determine how much was delivered, regardless of whether the transaction is a [partial payment](../concepts/payment-types/partial-payments.md). See [this description](../references/protocol/transactions/metadata.md#delivered_amount) for details. | diff --git a/docs/concepts/accounts/decentralized-identifiers.md b/docs/concepts/accounts/decentralized-identifiers.md index 95c48a49a2..881ab31091 100644 --- a/docs/concepts/accounts/decentralized-identifiers.md +++ b/docs/concepts/accounts/decentralized-identifiers.md @@ -15,9 +15,11 @@ A Decentralized Identifier (DID) is a new type of identifier defined by the Worl The key principles of a DID are: -- **Decentralization:** No central issuing agency controls the DID, enabling the owner to update, resolve, or deactivate it. +- **Decentralization:** No central issuing agency controls the DID, enabling the owner to update, resolve, or deactivate it. This also makes your identity highly-available, since DIDs are usually stored on a blockchain and always available for verification. -- **Cryptographically Verifiable:** DIDs are verified through cryptographic proofs, making them tamper-evident and secure. +- **Verifiable Credentials:** Anyone can create a DID and falsify the information on it. To prove the authenticity of a DID, a user must provide a verifiable credential (VC) that is cryptographically secure and tamper-evident. + + In the DID ecosystem, there are three parties: _user_, _issuer_, and _verifier_. The _user_ controls the DID, but needs a trusted _issuer_ to verify the information offline. The issuer provides a verfiable credential, which the user gives to _verifiers_ that need to confirm the user's identity. To learn more about the DID ecosystem, see: [Ecosystem Overview](https://www.w3.org/TR/vc-data-model/#ecosystem-overview). - **Interoperability:** DIDs are open to any solution that recognizes the W3C DID standard. This means a DID can be used to authenticate and establish trust in various digital transactions and interactions. @@ -28,11 +30,8 @@ The key principles of a DID are: 1. An XRPL account holder generates a DID that is controlled by the account. 2. The DID is associated with a DID document as defined by W3C specifications. -3. The DID is used for digital tasks such as: - - Signing digital documents. - - Making secure online transactions. - - Logging into websites. -4. The verifier resolves the DID to its document to verify the subject's identity. +3. A user provides their DID and VC to a verifier for a digital task. +4. The verifier resolves the DID to its document and uses the VC to verify its authenticity. ## DID Documents @@ -73,7 +72,20 @@ To learn more about the core properties of a DID document, see: [Decentralized I ## Privacy and Security Concerns - Whoever controls the private keys of an XRPL account, controls the DID and reference to the DID document it resolves to. Take care to ensure your private keys aren't compromised. -- You can include any content in a DID document, but should limit it to verification methods and service points. Since DIDs on XRPL can be resolved by anyone, you shouldn't include any personal information. +- You can include any content in a DID document, but should limit it to verification methods and service points. Since DIDs on XRPL are publicly available, you shouldn't include any personal information. - IPFS allows anyone to store content on the nodes in a distributed network. A common misconception is that anyone can edit that content; however, the content-addressability of IPFS means any edited content will have a different address from the original. While any entity can copy a DID document anchored with an XRPL account's `DIDDocument` or `URI` fields, they can't change the document itself unless they control the private key that created the corresponding `DID` object. + +## Use Cases + +DIDs enable many use cases, such as: + +- Meeting Know Your Client (KYC) and Anti-money Laundering (AML) standards. +- User identity management across the XRP Ledger. +- Differentiated access to DeFi apps. +- Signing digital documents. +- Making secure online transactions. +- Logging into websites. + + {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/concepts/accounts/reserves.md b/docs/concepts/accounts/reserves.md index 1d917cbd6d..f967f1170a 100644 --- a/docs/concepts/accounts/reserves.md +++ b/docs/concepts/accounts/reserves.md @@ -14,6 +14,8 @@ The XRP Ledger applies _reserve requirements_, in XRP, to protect the shared glo To have an account, an address must hold a minimum amount of XRP in the shared global ledger. To fund a new address, you must receive enough XRP at that address to meet the reserve requirement. You cannot send the reserved XRP to others, but you can recover some of the XRP by [deleting the account](deleting-accounts.md). +The XRP reserve is not dormant, however. You can use your reserves to pay transaction fees. Another way to look at your reserves is that you are pre-funding your account to handle your transaction fees. + The reserve requirement changes from time to time due to the [Fee Voting](../consensus-protocol/fee-voting.md) process, where validators can agree to new reserve settings. ## Base Reserve and Owner Reserve @@ -30,6 +32,8 @@ The current reserve requirements on Mainnet are: Reserves on other networks may vary. +An exception to the owner reserve is that you can create your first two trust lines on the XRPL without the required reserves of 2 XRP per trust line. Create your new account with the 10 XRP base reserve, then create your 2 trust lines and the reserves are not required. If you fund your account with more than 10 XRP, your account will be charged the normal reserve fees for your first two trust lines. + ## Owner Reserves Many objects in the ledger (ledger entries) are owned by a particular account. Usually, the owner is the account that created the object. Each object increases the owner's total reserve requirement by the owner reserve. When objects are removed from the ledger, they no longer count against the reserve requirement. diff --git a/docs/concepts/consensus-protocol/negative-unl.md b/docs/concepts/consensus-protocol/negative-unl.md index f109846e7a..4884591e5c 100644 --- a/docs/concepts/consensus-protocol/negative-unl.md +++ b/docs/concepts/consensus-protocol/negative-unl.md @@ -16,11 +16,11 @@ The Negative UNL has no impact on how the network processes transactions or what ## Background -Each server in the XRP Ledger protocol has its own UNL (Unique Node List), a list of validators it trusts not to collude, and each server independently decides when a ledger version is validated based on the consensus when enough of its trusted validators agree on a new ledger version. (The default configuration uses a recommended UNL, signed by Ripple, consisting of validators Ripple considers to be sufficiently unique, reliable, and independent.) The standard quorum requirement is at least 80% of trusted validators must agree. +Each server in the XRP Ledger protocol independently decides a ledger version is validated when a quorum of its trusted validators agree. A server's trusted validators are defined by that server's UNL (Unique Node List), a list of validators it trusts not to collude. By default, servers are configured to trust any validator on at least one of two lists, one UNL published by the XRP Ledger Foundation and one UNL published by Ripple. -If more than 20% of trusted validators go offline or become unable to communicate with the rest of the network, the network stops validating new ledgers because it cannot reach a quorum. This is a design choice to ensure that no transactions' outcomes can be changed after they are declared final. During such a situation, the remaining servers would still be online and could provide past and tentative transaction data, but could not confirm the final, immutable outcome of new transactions. +The standard quorum requirement is 80% of trusted validators. If more than 20% of trusted validators go offline or become unable to communicate with the rest of the network, servers stop validating new ledgers because they cannot reach a quorum. This is a design choice to ensure that no transactions' outcomes can be changed after they are declared final. During such a situation, the remaining servers would still be online and could provide past and tentative transaction data, but could not confirm the final, immutable outcome of new transactions. -However, this means that the network could stop making forward progress if a few widely-trusted validators went offline. As of 2020-10-06, there are 34 validators in Ripple's recommended UNL, so the network would stop making forward progress if 7 or more of them were offline. Furthermore, if one or two validators are out for an extended period of time, the network has less room for disagreement between the remaining validators, which can make it take longer to achieve a consensus. +However, this means that the network could stop making forward progress if a few widely trusted validators went offline. As of 2024-06-25, there are a total of 35 validators on the default UNLs, so the network would stop making forward progress if 8 or more of them were offline. Furthermore, if one or two validators are out for an extended period of time, the network has less room for disagreement between the remaining validators, which can make it take longer to achieve a consensus. ## Summary @@ -62,7 +62,7 @@ If a validator's reliability is **less than 50%**, it is a candidate to be added Each server, including validators, independently calculates reliability scores for all of its trusted validators. Different servers may reach different conclusions about a validator's reliability, either because that validator's votes reached one server and not the other, or because they happened to disagree about specific ledgers more or less often. To add or remove a validator from the Negative UNL, a consensus of trusted validators must agree that a particular validator is above or below the reliability threshold. -**Tip:** Validators track their own reliability, but do not propose adding themselves to the Negative UNL. A validator's measure of its own reliability cannot take into account how successfully its validation votes propagate through the network, so it is less dependable than measurements from outside servers. +{% admonition type="success" name="Tip" %}Validators track their own reliability, but do not propose adding themselves to the Negative UNL. A validator's measure of its own reliability cannot take into account how successfully its validation votes propagate through the network, so it is less dependable than measurements from outside servers.{% /admonition %} @@ -74,7 +74,7 @@ Each flag ledger, all of the following changes apply: 1. Changes to the Negative UNL that were scheduled in the previous flag ledger go into effect for the following ledger version. The consensus process for validating this flag ledger itself does not use the scheduled change. - **Note:** This is one of the only times a ledger's state data is modified without a [transaction](../transactions/index.md) or [pseudo-transaction](../../references/protocol/transactions/pseudo-transaction-types/pseudo-transaction-types.md). + {% admonition type="info" name="Note" %} This is one of the only times a ledger's state data is modified without a [transaction](../transactions/index.md) or [pseudo-transaction](../../references/protocol/transactions/pseudo-transaction-types/pseudo-transaction-types.md).{% /admonition %} 2. If the Negative UNL is not full, each server proposes adding **up to 1** validator to the Negative UNL from among its trusted validators with less than 50% reliability. 3. If the Negative UNL is not empty, each server proposes removing **up to 1** validator from the Negative UNL. A server can propose removing a validator from the Negative UNL for two reasons: diff --git a/docs/concepts/tokens/decentralized-exchange/autobridging.md b/docs/concepts/tokens/decentralized-exchange/autobridging.md index 84f1c9a97f..c914ab6565 100644 --- a/docs/concepts/tokens/decentralized-exchange/autobridging.md +++ b/docs/concepts/tokens/decentralized-exchange/autobridging.md @@ -11,10 +11,13 @@ labels: Any [Offer](offers.md) in the XRP Ledger's [decentralized exchange](index.md) that would exchange two tokens could potentially use XRP as an intermediary currency in a synthetic order book. This is because of _auto-bridging_, which serves to improve liquidity across all asset pairs by using XRP when doing so is cheaper than trading directly. This works because of XRP's nature as a native cryptocurrency to the XRP Ledger. Offer execution can use a combination of direct and auto-bridged offers to achieve the best total exchange rate. -Example: _Anita places an offer to sell GBP and buy BRL. She might find that this uncommon market has few offers. There is one offer with a good rate, but it has insufficient quantity to satisfy Anita's trade. However, both GBP and BRL have active, competitive markets to XRP. The XRP Ledger's auto-bridging system finds a way to complete Anita's offer by purchasing XRP with GBP from one trader, then selling the XRP to another trader to buy BRL. Anita automatically gets the best rate possible by combining the small offer in the direct GBP:BRL market with the better composite rates created by pairing GBP:XRP and XRP:BRL offers._ +Example: _Anita places an offer to sell GBP and buy BRL. She might find that this uncommon market has few offers. There is one offer with a good rate, but it has insufficient quantity to satisfy Anita's trade. However, both GBP and BRL have active, competitive markets to XRP. The XRP Ledger's auto-bridging system finds a way to complete Anita's offer by purchasing XRP with GBP from one trader, then selling the XRP to another trader to buy BRL. Anita automatically gets the best rate possible by combining the small offer in the direct GBP:BRL market with the better composite rates created by pairing GBP:XRP and XRP:BRL offers._ Auto-bridging happens automatically on any [OfferCreate transaction][]. [Payment transactions](../../../references/protocol/transactions/types/payment.md) _do not_ use auto-bridging by default, but path-finding can find [paths](../fungible-tokens/paths.md) that have the same effect. +[![Diagram showing direct and synthetic orderbook combination through autobridging](/docs/img/autobridging.png)](/docs/img/autobridging.png) + + ## See Also - [Dev Blog: Introducing Autobridging](https://xrpl.org/blog/2014/introducing-offer-autobridging.html) diff --git a/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md b/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md index 20fb8d553f..98ea926b05 100644 --- a/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md +++ b/docs/concepts/tokens/decentralized-exchange/automated-market-makers.md @@ -1,80 +1,106 @@ --- -html: automated-market-makers.html -parent: decentralized-exchange.html seo: - title: What Is an Automated Market Maker (AMM)? description: Automated Market Makers (AMMs) are an essential part of cryptocurrency, providing liquidity between asset pairs. Learn more about AMMs and the XRP Ledger. labels: - XRP - Decentralized Exchange - AMM --- -# What Is an Automated Market Maker (AMM)? +# Automated Market Makers _(Requires the XLS-30 [AMM amendment][])_ -Automated Market Makers (AMMs) are smart contracts that provide liquidity in the XRP Ledger's decentralized exchange. Each AMM holds a pool of two assets and enables users to swap between them at an exchange rate set by a formula. +Automated Market Makers (AMMs) provide liquidity in the XRP Ledger's decentralized exchange. Each AMM holds a pool of two assets. You can swap between the two assets at an exchange rate set by a formula. -For any given pair of assets, there can be up to one AMM in the ledger. Anyone can create the AMM for an asset pair if it doesn't exist yet, or deposit to an existing AMM. Those who deposit assets into an AMM are called _liquidity providers_ (LPs) and receive "LP Tokens" from the AMM. LP Tokens enable liquidity providers to: +![Automated Market Maker](/docs/img/cpt-amm.png) -- Redeem their LP Tokens for a share of the assets in the AMM's pool, including fees collected. -- Vote to change the AMM's fee settings. The votes are weighted based on how many LP Tokens the voters hold. -- Bid some of their LP Tokens to receive a temporary discount on the AMM's trading fees. +Those who deposit assets into an AMM are called _liquidity providers_. In return, liquidity providers receive _LP tokens_ from the AMM. -When the flow of funds between the two assets in a pool is relatively active and balanced, the fees provide a source of passive income for liquidity providers. However, when the relative price between the assets shifts, the liquidity providers can take a loss on the [currency risk](https://www.investopedia.com/terms/c/currencyrisk.asp). +![LP receiving LP Tokens](/docs/img/cpt-amm-lp-receiving-lpts.png) + +LP tokens enable liquidity providers to: + +- Redeem their LP tokens for a share of the assets in the AMM pool, including fees collected. +- Vote to change the AMM fee settings, each vote weighted by how many LP tokens the voter holds. +- Bid some of their LP tokens to receive a temporary discount on the AMM trading fees. ## How the AMM Works -An AMM holds two different assets: at most one of these can be XRP, and one or both of them can be [tokens](../index.md). Tokens with different issuers are considered different assets for this purpose. This means that there can be an AMM for two tokens with the same currency code but different issuers ("FOO issued by WayGate" is different than "FOO issued by StableFoo"), or the same issuer but different currency codes. The order does not matter; the AMM for FOO.WayGate to XRP is the same as for XRP to FOO.WayGate. +An AMM holds two different assets: at most one of these can be XRP, and one or both of them can be [tokens](../index.md). +For any given pair of assets, there can be up to one AMM in the ledger. Anyone can create the AMM for an asset pair if it doesn't exist, or deposit to an AMM if it already exists. -When users want to trade in the decentralized exchange, their [Offers](offers.md) and [Cross-Currency Payments](../../payment-types/cross-currency-payments.md) can automatically use AMMs to complete the trade. A single transaction might execute by matching Offers, AMMs, or a mix of both, depending on what's cheaper. +When you want to trade in the decentralized exchange, your [Offers](offers.md) and [Cross-Currency Payments](../../payment-types/cross-currency-payments.md) can automatically use AMMs to complete the trade. A single transaction might execute by matching Offers, AMMs, or a mix of both, depending on what's cheaper. -An AMM sets its exchange rate based on the balance of assets in the pool. When you trade against an AMM, the exchange rate adjusts based on how much your trade shifts the balance of assets the AMM holds. As its supply of one asset goes down, the price of that asset goes up; as its supply of an asset goes up, the price of that asset goes down. An AMM gives generally better exchange rates when it has larger overall amounts in its pool. This is because any given trade causes a smaller shift in the balance of the AMM's assets. The more a trade unbalances the AMM's supply of the two assets, the more extreme the exchange rate becomes. +![1 Transaction using offers, AMMs, or both.](/docs/img/cpt-amm-or-offer.png) + +{% admonition type="info" name="Note" %} + +You can determine if a `Payment` or `OfferCreate` transaction interacted with an AMM by checking for a [`RippleState`](../../../references/protocol/ledger-data/ledger-entry-types/ripplestate.md) ledger entry in the transaction metadata. A `Flags` value of `16777216` indicates AMM liquidity was consumed. + +{% /admonition %} + +An AMM sets its exchange rate based on the balance of assets in the pool. When you trade against an AMM, the exchange rate adjusts based on how much your trade shifts the balance of assets the AMM holds. As its supply of one asset goes down, the price of that asset goes up; as its supply of an asset goes up, the price of that asset goes down. + +![As supply increases, prices drop, and vice-versa.](/docs/img/cpt-amm-balance.png) + +An AMM gives generally better exchange rates when it has larger overall amounts in its pool. This is because any given trade causes a smaller shift in the balance of the AMM's assets. The more a trade unbalances the AMM's supply of the two assets, the more extreme the exchange rate becomes. The AMM also charges a percentage trading fee on top of the exchange rate. -The XRP Ledger's implements a _geometric mean_ AMM with a weight parameter of 0.5, so it functions like a _constant product_ market maker. For a detailed explanation of the _constant product_ AMM formula and the economics of AMMs in general, see [Kris Machowski's Introduction to Automated Market Makers](https://www.machow.ski/posts/an_introduction_to_automated_market_makers/). +The XRP Ledger implements a _geometric mean_ AMM with a weight parameter of 0.5, so it functions like a _constant product_ market maker. For a detailed explanation of the _constant product_ AMM formula and the economics of AMMs in general, see [Kris Machowski's Introduction to Automated Market Makers](https://www.machow.ski/posts/an_introduction_to_automated_market_makers/). + +### Token Issuers + +Tokens with different issuers are considered different assets. This means that there can be an AMM for two tokens with the same currency code but different issuers. For example, _FOO_ issued by WayGate is different than _FOO_ issued by StableFoo. Similarly, the tokens can have the same issuer but different currency codes. The trade direction doesn't matter; the AMM for FOO.WayGate to XRP is the same as the AMM for XRP to FOO.WayGate. + +### Currency Risk + +When the flow of funds between the two assets in a pool is relatively active and balanced, the fees provide a source of passive income for liquidity providers. However, when the relative price between the assets shifts, liquidity providers can take a loss on the [currency risk](https://www.investopedia.com/terms/c/currencyrisk.asp). ### Restrictions on Assets To prevent misuse, some restrictions apply to the assets used in an AMM. If you try to create an AMM with an asset that does not meet these restrictions, the transaction fails. The rules are as follows: -- The asset must not be an LP Token from another AMM. -- If the asset is a token whose issuer uses [Authorized Trust Lines](../fungible-tokens/authorized-trust-lines.md), the creator of the AMM must be authorized to hold those tokens. Only users whose trust lines are authorized can deposit that token into the AMM or withdraw it; however, users can still deposit or withdraw the other asset. +- The asset must not be an LP token from another AMM. +- If the asset is a token whose issuer uses [Authorized Trust Lines](../fungible-tokens/authorized-trust-lines.md), the creator of the AMM must be authorized to hold those tokens. Only your authorized trust lines can deposit that token into the AMM or withdraw it; however, you can still deposit or withdraw the other asset. - If the [Clawback amendment][] is enabled, the issuer of the token must not have enabled the ability to claw back their tokens. - ## LP Tokens - -Whoever creates the AMM becomes the first liquidity provider, and receives LP Tokens that represent 100% ownership of assets in the AMM's pool. They can redeem some or all of those LP Tokens to withdraw assets from the AMM in proportion to the amounts currently there. (The proportions shift over time as people trade against the AMM.) The AMM does not charge a fee when withdrawing both assets. -For example, if you created an AMM with 5 ETH and 5 USD, and then someone exchanged 1.26 USD for 1 ETH, the pool now has 4 ETH and 6.26 USD in it. You can spend half your LP Tokens to withdraw 2 ETH and 3.13 USD. +Whoever creates the AMM becomes the first liquidity provider, and receives LP tokens that represent 100% ownership of assets in the AMM's pool. They can redeem some or all of those LP tokens to withdraw assets from the AMM in proportion to the amounts currently there. (The proportions shift over time as people trade against the AMM.) The AMM does not charge a fee when withdrawing both assets. -Anyone can deposit assets to an existing AMM. When they do, they receive new LP Tokens based on how much they deposited. The amount that a liquidity provider can withdraw from an AMM is based on the proportion of the AMM's LP Tokens they hold compared to the total number of LP Tokens outstanding. +For example, if you created an AMM with 5 ETH and 5 USD, and then someone exchanged 1.26 USD for 1 ETH, the pool now has 4 ETH and 6.26 USD in it. You can spend half your LP tokens to withdraw 2 ETH and 3.13 USD. -LP Tokens are like other tokens in the XRP Ledger, so you can use them in many [types of payments](../../payment-types/index.md) or trade them in the decentralized exchange. (To receive LP Tokens as payment, you must set up a [trust line](../fungible-tokens/index.md) with a non-zero limit with the AMM Account as the issuer.) However, you can _only_ send LP Tokens directly to the AMM (redeeming them) using the [AMMWithdraw][] transaction type, not through other types of payments. Similarly, you can only send assets to the AMM's pool through the [AMMDeposit][] transaction type. +![Example AMM exchange and LP Token withdrawal](/docs/img/cpt-amm-lp-tokens.png) -The AMM is designed so that an AMM's asset pool is empty if and only if the AMM has no outstanding LP Tokens. This situation can only occur as the result of an [AMMWithdraw][] transaction; when it does, the AMM is automatically deleted. +Anyone can deposit assets to an existing AMM. When they do, they receive new LP tokens based on how much they deposited. The amount that a liquidity provider can withdraw from an AMM is based on the proportion of the AMM's LP tokens they hold compared to the total number of LP tokens outstanding. + +LP tokens are like other tokens in the XRP Ledger. You can use them in many types of payment, or trade them in the decentralized exchange. (To receive LP tokens as payment, you must set up a [trust line](../fungible-tokens/index.md) with a non-zero limit with the AMM Account as the issuer.) However, you can _only_ send LP tokens directly to the AMM (redeeming them) using the [AMMWithdraw][] transaction type, not through other types of payments. Similarly, you can only send assets to the AMM's pool through the [AMMDeposit][] transaction type. + +The AMM is designed so that an AMM's asset pool is empty if and only if the AMM has no outstanding LP tokens. This situation can only occur as the result of an [AMMWithdraw][] transaction; when it does, the AMM is automatically deleted. ### LP Token Currency Codes -LP Tokens use a special type of currency code in the 160-bit hexadecimal ["non-standard" format](../../../references/protocol/data-types/currency-formats.md#nonstandard-currency-codes). These codes have the first 8 bits `0x03`. The remainder of the code is a SHA-512 hash, truncated to the first 152 bits, of the two assets' currency codes and their issuers. (The assets are placed in a "canonical order" with the numerically lower currency+issuer pair first.) As a result, the LP Tokens for a given asset pair's AMM have a predictable, consistent currency code. +LP tokens use a special type of currency code in the 160-bit hexadecimal ["non-standard" format](../../../references/protocol/data-types/currency-formats.md#nonstandard-currency-codes). These codes have the first 8 bits `0x03`. The remainder of the code is a SHA-512 hash, truncated to the first 152 bits, of the two assets' currency codes and their issuers. (The assets are placed in a "canonical order" with the numerically lower currency+issuer pair first.) As a result, the LP tokens for a given asset pair's AMM have a predictable, consistent currency code. ## Trading Fees -Trading fees are a source of passive income for liquidity providers, and they offset the currency risk of letting others trade against the pool's assets. Trading fees are paid to the AMM, not directly to liquidity providers, but liquidity providers benefit because their LP Tokens can be redeemed for a percentage of the AMM's pool. +Trading fees are a source of passive income for liquidity providers. They offset the currency risk of letting others trade against the pool's assets. Trading fees are paid to the AMM, not directly to liquidity providers. Liquidity providers benefit because they can redeem their LP tokens for a percentage of the AMM pool. -Liquidity providers can vote to set the fee from 0% to 1%, in increments of 0.001%. Liquidity providers have an incentive to set trading fees at an appropriate rate: if fees are too high, trades will use order books to get a better rate instead; if fees are too low, liquidity providers don't get any benefit for contributing to the pool. Each AMM gives its liquidity providers the power to vote on its fees, in proportion to the amount of LP Tokens those liquidity providers hold. +Liquidity providers can vote to set the fee from 0% to 1%, in increments of 0.001%. Liquidity providers have an incentive to set trading fees at an appropriate rate: if fees are too high, trades will use order books to get a better rate instead; if fees are too low, liquidity providers don't get any benefit for contributing to the pool. -To vote, a liquidity provider sends an [AMMVote transaction][]. Whenever anyone places a new vote, the AMM recalculates its fee to be an average of the latest votes weighted by how many LP Tokens those voters hold. Up to 8 liquidity providers' votes can be counted this way; if more liquidity providers try to vote then only the top 8 votes (by most LP Tokens held) are counted. Even though liquidity providers' share of LP Tokens can shift rapidly for many reasons (such as trading those tokens using [Offers](offers.md)), the trading fees are only recalculated whenever someone places a new vote (even if that vote is not one of the top 8). +Each AMM gives its liquidity providers the power to vote on its fees, in proportion to the number of LP tokens they hold. To vote, a liquidity provider sends an [AMMVote][] transaction. Whenever anyone places a new vote, the AMM recalculates its fee to be an average of the latest votes, weighted by how many LP tokens those voters hold. Up to 8 liquidity providers' votes can be counted this way; if more liquidity providers try to vote, then only the top 8 votes (by most LP tokens held) are counted. Even though liquidity providers' share of LP tokens can shift rapidly for many reasons (such as trading those tokens using [Offers](offers.md)), the trading fees are only recalculated whenever someone places a new vote (even if that vote is not one of the top 8). ### Auction Slot -Unlike any previous Automated Market Makers, the XRP Ledger's AMM design has an _auction slot_ that a liquidity provider can bid on to get a discount on the trading fee for a 24-hour period. The bid must be paid in LP Tokens, which are returned to the AMM. No more than one account can hold the auction slot at a time, but the bidder can name up to 4 more accounts to also receive the discount. There is no minimum bid, but if the slot is currently occupied then you must outbid the current slot holder to displace them. If someone displaces you, you get part of your bid back depending on how much time remains. As long as you hold an active auction slot, you pay a discounted trading fee equal to 1/10 (one tenth) of the normal trading fee when making trades against that AMM. +The XRP Ledger's AMM design includes an _auction slot_. A liquidity provider can bid LP Tokens to claim the auction slot to receive a discount on the trading fee for a 24-hour period. The LP tokens that were bid are returned to the AMM. -With any AMM, when the price of its assets shifts significantly in external markets, traders can use arbitrage to profit off the AMM, which results in a loss for liquidity providers. The auction mechanism is intended to return more of that value to liquidity providers and more quickly bring the AMM's prices back into balance with external markets. +With any AMM, when the price of its assets shifts significantly in external markets, traders can use arbitrage to profit off the AMM. That can result in a loss for liquidity providers. The auction mechanism is intended to return more of that value to liquidity providers, and more quickly bring the AMM's prices back into balance with external markets. +No more than one account can hold the auction slot at a time, but as the successful bidder you can name up to 4 additional accounts to receive the discount. If the slot is currently occupied, you must outbid the current slot holder to displace them. If someone displaces you, you get a percentage of your bid back, based on how much time remains. As long as you hold an active auction slot, you pay a discounted trading fee equal to 1/10 (one tenth) of the normal trading fee when making trades against that AMM. + +The minimum bid to win the auction slot, if it is empty or expired, is equal to the current total number of LP Tokens outstanding multiplied by the trading fee, divided by 25. (In pseudocode, `MinBid = LPTokens * TradingFee / 25`.) If the auction slot is occupied, you must bid at least the minimum plus up to 105% of what the current slot holder paid, discounted by how much time they have remaining. ## Representation in the Ledger @@ -82,7 +108,7 @@ In the ledger's state data, an AMM consists of multiple [ledger entries](../../. - An [AMM entry][] describing the automated market maker itself. -- A special [AccountRoot entry][] that issues the AMM's LP Tokens, and holds the AMM's XRP (if it has any). +- A special [AccountRoot entry][] that issues the AMM's LP tokens, and holds the AMM's XRP (if it has any). The address of this AccountRoot is chosen somewhat randomly when the AMM is created, and it is different if the AMM is deleted and re-created. This is to prevent people from funding the AMM account with excess XRP in advance. @@ -93,16 +119,16 @@ These ledger entries are not owned by any account, so the [reserve requirement]( ## Deletion -An AMM is deleted when an [AMMWithdraw transaction][] withdraws all assets from its pool. This only happens by redeeming all of the AMM's outstanding LP Tokens. Deleting the AMM includes removes all the ledger entries associated with it, such as: +An AMM is deleted when an [AMMWithdraw transaction][] withdraws all assets from its pool. This only happens by redeeming all of the AMM's outstanding LP tokens. Deleting the AMM removes all the ledger entries associated with it, such as: - AMM - AccountRoot -- Trust lines for the AMM's LP Tokens. Those trust lines would have a balance of 0 but may have other details, such as the limit, set to a non-default value. -- Trust lines for the tokens that were in the AMM's pool. +- Trust lines for the AMM's LP tokens. Those trust lines would have a balance of 0 but may have other details, such as the limit, set to a non-default value. +- Trust lines for the tokens that were in the AMM pool. If there are more than 512 trust lines attached to the AMM account when it would be deleted, the withdraw succeeds and deletes as many trust lines as it can, but leaves the AMM in the ledger with no assets in its pool. -While an AMM has no assets in its pool, anyone can delete it by sending an [AMMDelete transaction][]; if the remaining number of trust lines is still greater than the limit, multiple AMMDelete transactions may be necessary to fully delete the AMM. Alternatively, anyone can perform a [special deposit](../../../references/protocol/transactions/types/ammdeposit.md#empty-amm-special-case) to fund the AMM as if it were new. No other operations are valid on an AMM with an empty asset pool. +While an AMM has no assets in its pool, anyone can delete it by sending an [AMMDelete transaction][]; if the remaining number of trust lines is still greater than the limit, multiple AMMDelete transactions might be necessary to fully delete the AMM. Alternatively, anyone can perform a [special deposit](../../../references/protocol/transactions/types/ammdeposit.md#empty-amm-special-case) to fund the AMM as if it were new. No other operations are valid on an AMM with an empty asset pool. There is no refund or incentive for deleting an empty AMM. diff --git a/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md b/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md index dd53738b67..53dc34e49e 100644 --- a/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md +++ b/docs/concepts/tokens/fungible-tokens/authorized-trust-lines.md @@ -19,6 +19,10 @@ The transaction to authorize a trust line must be signed by the issuing address, **Caution:** You can only enable Require Auth if your account has no trust lines and no Offers in the XRP Ledger, so you must decide whether or not to use it _before_ you start issuing tokens. +## Reserves + +Trust lines are ledger objects that require a reserve of 2 XRP each. To help new users get started, the reserve amounts are waived for the first 2 trust lines you create for a new account. Fund your new account with 10 XRP and create your new trust lines. If you have more than 10 XRP in your account, up to 4 XRP are reserved for your first 2 trust lines. If you remove the trust line later, the reserves are freed up for future use. + ## With Stablecoin Issuing With a stablecoin on the XRP Ledger and use Authorized Trust Lines, the process of onboarding a new customer might look something like the following: @@ -36,11 +40,10 @@ Even if you don't intend to use Authorized Trust Lines, you can enable the Requi ## Technical Details - ### Enabling Require Auth -The following is an example of using a locally-hosted `rippled`'s [submit method][] to send an [AccountSet transaction][] that enables Require Auth using the `asfRequireAuth` flag. (This method works the same way regardless of whether the address is an issuing address, operational address, or standby address.) +The following is an example of using a locally hosted `rippled`'s [submit method][] to send an [AccountSet transaction][] that enables Require Auth using the `asfRequireAuth` flag. (This method works the same way regardless of whether the address is an issuing address, operational address, or standby address.) Request: @@ -78,7 +81,7 @@ If you are using the Authorized Trust Lines feature, others cannot hold balances To authorize a trust line, submit a [TrustSet transaction][] from your issuing address, with the user to trust as the `issuer` of the `LimitAmount`. Leave the `value` (the amount to trust them for) as **0**, and enable the [`tfSetfAuth`](../../../references/protocol/transactions/types/trustset.md#trustset-flags) flag for the transaction. -The following is an example of using a locally-hosted `rippled`'s [submit method][] to send a TrustSet transaction authorizing the customer address `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn` to hold USD issued by the address `rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW`: +The following is an example of using a locally hosted `rippled`'s [submit method][] to send a TrustSet transaction authorizing the customer address `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn` to hold USD issued by the address `rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW`: Request: diff --git a/docs/concepts/tokens/fungible-tokens/paths.md b/docs/concepts/tokens/fungible-tokens/paths.md index 3c28ff6792..33a0c7846f 100644 --- a/docs/concepts/tokens/fungible-tokens/paths.md +++ b/docs/concepts/tokens/fungible-tokens/paths.md @@ -9,7 +9,7 @@ labels: --- # Paths -In the XRP Ledger, paths define a way for [tokens](../index.md) to flow through intermediary steps as part of a payment. Paths enable [cross-currency payments](../../payment-types/cross-currency-payments.md) by connecting sender and receiver through orders in the XRP Ledger's [decentralized exchange](../decentralized-exchange/index.md). Paths also enable complex settlement of offsetting debts. +In the XRP Ledger, paths define a way for [tokens](../index.md) to flow through intermediary steps as part of a payment. Paths enable [cross-currency payments](../../payment-types/cross-currency-payments.md) by connecting sender and receiver through orders and [automated market makers (AMM)](../../../concepts/tokens/decentralized-exchange/automated-market-makers.md) in the XRP Ledger's [decentralized exchange](../decentralized-exchange/index.md). Paths also enable complex settlement of offsetting debts. A single Payment transaction in the XRP Ledger can use multiple paths, combining liquidity from different sources to deliver the desired amount. Thus, a transaction includes a _path set_, which is a collection of possible paths to take. All paths in a path set must start with the same currency, and must also end with the same currency as each other. @@ -19,14 +19,14 @@ Since XRP can be sent directly to any address, an [XRP-to-XRP transaction](../.. A path is made of steps that connect the sender to the receiver of the payment. Every step is either: -* Rippling through another address with the same currency -* Trading tokens or XRP using an order book +* Rippling through another address with the same currency. +* Trading tokens or XRP using an order book or AMM. [Rippling](rippling.md) is the process of exchanging equivalent tokens using the same currency code. In the typical case, rippling through an issuer involves reducing the tokens issued to one party and increasing the tokens issued to another party by an equal amount. The path step specifies which account to ripple through. -[Trading tokens and possibly XRP](../decentralized-exchange/index.md) involves going to an order book and finding the best exchange rate between the assets involved for the amount being sent. The path step specifies which currency to change to, but does not record the state of the Offers in the order book. The canonical order of transactions is not final until a ledger is validated, so you cannot know for certain which Offers a transaction will take, until after the transaction has been validated. (You can make an educated guess, since each transaction takes the best available Offers at the time it executes in the final ledger.) +[Trading tokens and possibly XRP](../decentralized-exchange/index.md) involves going to an order book or AMM and finding the best exchange rate between the assets involved for the amount being sent. The path step specifies which currency to change to, but does not record the state of the Offers in the order book. The canonical order of transactions is not final until a ledger is validated, so you cannot know for certain which Offers or AMMs a transaction will take, until after the transaction has been validated. (You can make an educated guess, since each transaction takes the best available exchange rates at the time it executes in the final ledger.) -In both types of steps, each intermediate address gains and loses approximately equal value: either a balance ripples from a trust line to another trust line in the same currency, or they exchange currencies according to a previously-placed order. In some cases, the amounts gained and lost may not be exactly equivalent, due to [transfer fees](../transfer-fees.md), trust line quality settings, or rounding. +In both types of steps, each intermediate address gains and loses approximately equal value: either a balance ripples from a trust line to another trust line in the same currency, or they exchange currencies according to a previously-placed order. In some cases, the amounts gained and lost may not be exactly equivalent, due to [transfer fees](../transfer-fees.md), AMM fees, trust line quality settings, or rounding. [{% inline-svg file="/docs/img/paths-examples.svg" /%}](/docs/img/paths-examples.svg "Diagram of three example paths") @@ -65,7 +65,7 @@ The default path could be any of the following: * If the transaction uses only one token (regardless of issuer), then the default path assumes the payment should ripple through the addresses involved. This path only works if those addresses are connected by trust lines. * If `SendMax` is omitted, or the `issuer` of the `SendMax` is the sender, the default path needs a trust line from the sending `Account` to the `issuer` of the destination `Amount` to work. * If the `SendMax` and `Amount` have different `issuer` values, and neither are the sender or receiver, the default path is probably not useful because it would need to ripple across a trust line between the two issuers. Ripple (the company) typically discourages issuers from trusting one another directly. -* For cross-currency transactions, the default path uses the order book between the source currency (as specified in the `SendMax` field) and the destination currency (as specified in the `Amount` field). +* For cross-currency transactions, the default path uses the order book or AMM between the source currency (as specified in the `SendMax` field) and the destination currency (as specified in the `Amount` field). The following diagram enumerates all possible default paths: @@ -81,8 +81,8 @@ A path set is an array. Each member of the path set is another array that repres | Field | Value | Description | |:-----------|:-----------------------|:---------------------------------------| | `account` | String - Address | _(Optional)_ If present, this path step represents rippling through the specified address. MUST NOT be provided if this step specifies the `currency` or `issuer` fields. | -| `currency` | String - Currency Code | _(Optional)_ If present, this path step represents changing currencies through an order book. The currency specified indicates the new currency. MUST NOT be provided if this step specifies the `account` field. | -| `issuer` | String - Address | _(Optional)_ If present, this path step represents changing currencies and this address defines the issuer of the new currency. If omitted in a step with a non-XRP `currency`, a previous step of the path defines the issuer. If present when `currency` is omitted, indicates a path step that uses an order book between same-named currencies with different issuers. MUST be omitted if the `currency` is XRP. MUST NOT be provided if this step specifies the `account` field. | +| `currency` | String - Currency Code | _(Optional)_ If present, this path step represents changing currencies through an order book or AMM. The currency specified indicates the new currency. MUST NOT be provided if this step specifies the `account` field. | +| `issuer` | String - Address | _(Optional)_ If present, this path step represents changing currencies and this address defines the issuer of the new currency. If omitted in a step with a non-XRP `currency`, a previous step of the path defines the issuer. If present when `currency` is omitted, indicates a path step that uses an order book or AMM between same-named currencies with different issuers. MUST be omitted if the `currency` is XRP. MUST NOT be provided if this step specifies the `account` field. | | `type` | Integer | **DEPRECATED** _(Optional)_ An indicator of which other fields are present. | | `type_hex` | String | **DEPRECATED**: _(Optional)_ A hexadecimal representation of the `type` field. | diff --git a/docs/concepts/tokens/fungible-tokens/rippling.md b/docs/concepts/tokens/fungible-tokens/rippling.md index 6bf10af8c3..7a2f21f269 100644 --- a/docs/concepts/tokens/fungible-tokens/rippling.md +++ b/docs/concepts/tokens/fungible-tokens/rippling.md @@ -9,7 +9,7 @@ labels: --- # Rippling -In the XRP Ledger, "rippling" describes a process of atomic net settlement between multiple connected parties who have [trust lines](index.md) for the same token. Rippling is essential, because it allows users who hold tokens to send those to each other with the issuer as a passive intermediary. In a sense, rippling is like a passive, two-way [exchange order](../decentralized-exchange/offers.md) with no limit and a 1:1 exchange rate for two tokens with the same currency code but different issuers. +In the XRP Ledger, "rippling" describes a process of atomic net settlement between multiple connected parties who have [trust lines](index.md) for the same token. Rippling is essential, because it enables token holders to transfer funds directly to each other, without any issuer involvement in the debiting and crediting process. In a sense, rippling is like a passive, two-way [exchange order](../decentralized-exchange/offers.md) with no limit and a 1:1 exchange rate for two tokens with the same currency code but different issuers. Rippling only occurs along the [paths](paths.md) of a payment. [Direct XRP-to-XRP payments](../../payment-types/direct-xrp-payments.md) do not involve rippling. diff --git a/docs/concepts/tokens/nfts/non-transferable-tokens.md b/docs/concepts/tokens/nfts/non-transferable-tokens.md new file mode 100644 index 0000000000..60f04051b1 --- /dev/null +++ b/docs/concepts/tokens/nfts/non-transferable-tokens.md @@ -0,0 +1,15 @@ +--- +seo: + description: Create NFTs that can't be traded among users. +labels: + - Non-fungible Tokens, NFTs +--- +# Non-Transferable Tokens + +The XRP Ledger supports non-transferable tokens (NTTs), sometimes called soulbound tokens, as a specific class of [non-fungible tokens](./index.md). Non-transferable tokens may be used for certifications and identity tokens, achievements in games, or other cases where the purpose of the token is limited to one person specifically. + +Any NFT in the XRP Ledger that has the **Transferable** flag disabled is a non-transferable token. This flag is set when the NFT is minted using the `tfTransferable` flag of the [NFTokenMint transaction][]. After the NFT is created, the transferable status is recorded as the `lsfTransferable` flag of the [NFToken object](/docs/references/protocol/data-types/nftoken/). + +Non-transferable tokens can still be transferred _to_ or _from_ the issuer of the token directly, but users cannot transfer the token among themselves. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/concepts/xrpl-sidechains/index.md b/docs/concepts/xrpl-sidechains/index.md index a203d240b7..e2072a64ef 100644 --- a/docs/concepts/xrpl-sidechains/index.md +++ b/docs/concepts/xrpl-sidechains/index.md @@ -26,46 +26,4 @@ Sidechains can customize the XRP Ledger protocol to the needs of a specific use - Sidechains use their own validators and require a separate UNL from the mainchain `rippled` UNL. - Nodes on the mainchain and sidechain have no knowledge of each other. - -## Legal FAQs - -### What is a Sidechain? - -A sidechain is a separate blockchain that links the XRPL Mainnet chain (the “Mainchain”) to a sidechain (each a “Sidechain”), allowing for cross-chain exchanges of assets and information. - - -### What are Witness Servers? - -“Witness Servers” validate transfers between “door wallets” that connect the Mainchain to each Sidechain. A series of decentralized entities and individuals will operate Witness Servers. - - -### Are there risks associated with operating a Witness Server? - -There are certain risks associated with operating a Witness Server for a Sidechain, including the following: - -_Regulatory Considerations_: Operating a Witness Server carries some regulatory risk. A few risks are identified below, some of which pertain to regulatory regimes that only apply to projects that serve those located in the U.S. U.S. regimes are identified here because they are commonly considered some of the strictest regulatory regimes in the world. - -The regulatory regime in the U.S. concerning the operation of a “money transmitting business” requiring federal registration as a money service business (“MSB”) and state money transmitter licenses (“MTLs”) is unclear as it pertains to operating Witness Servers. The Witness Servers are intended to be operated by a series of decentralized entities and persons. Despite this intention, if a regulator determined that there was “centralized” control of the Witness Servers by a particular entity or coordinated group, it may deem such activity to be money transmission. The U.S. Treasury Department recently issued a report identifying a series of factors it would consider when determining whether a particular project is “decentralized.” See [2023 DeFi Illicit Finance Risk Assessment](https://home.treasury.gov/news/press-releases/jy1391). This recent regulatory guidance is important because it indicates that the U.S. Treasury recognizes that certain projects may be “decentralized” and if the operation of the Witness Servers is “decentralized” it may not be considered a “money transmitting business.” - -While U.S. crypto regulations have consistently remained among the most stringent and aggressively enforced, other jurisdictions also have regulation and laws relating to the transfer of “money” and other value. For example, in March of 2022, U.K. regulatory authorities published a series of documentary guidance regarding crypto and decentralized finance. See [Financial Stability in Focus: Cryptoassets and Decentralized Finance](https://www.bankofengland.co.uk/financial-stability-in-focus/2022/march-2022). More recently, in June of 2023, the E.U. formally adopted a regulatory framework which in part imposes codified rules and regulations pertaining to decentralized crypto platforms. See [Markets in Crypto-Assets Regulation](https://www.esma.europa.eu/esmas-activities/digital-finance-and-innovation/markets-crypto-assets-regulation-mica). For those considering operating a Witness Server, it is critical to stay informed and compliant with the specific requirements of each jurisdiction involved to effectively manage associated risks. - -_Technology and Network Security_: Those intending to run a Witness Server should be familiar with the technical and security aspects of doing so. Before agreeing to run a Witness Server, one should fully understand the functionality, potential vulnerabilities, and necessary technological and security measures involved. - -_Civil Liability_: Operating a Witness Server, like participating in any blockchain project, carries an unspecified level of civil liability risk. There has been an influx of plaintiffs’ lawsuits in the U.S. and other jurisdictions, and it is difficult to evaluate what theories a particular plaintiffs’ attorney may implement in a civil lawsuit. Regardless of any real or perceived civil liability risk, it should be noted that even a frivolous lawsuit could take time and money to respond. - - -### Should I seek independent advice before agreeing to operate a Witness Server? - -Yes. Any party considering running a Witness Server should seek independent legal and tax advice from experienced professionals. Please note, that as the Witness Servers must mutually attest to confirm cross-chain transfers, they may be understood to operate as a common enterprise - as it is defined by US regulators. In a common enterprise, joint and several liability may apply, meaning that each Witness Server could be held individually responsible for all liability or damages incurred. Given the evolving regulatory landscape, it’s critical to consult with a legal professional who can help navigate the complex and changing global regulatory landscape associated with the expectations and obligations of running a Witness Server. As with any blockchain project, please do your own research. These FAQs are just general guidance and are not legal or tax advice. - - -### Who should not run a Witness Server? - -You should not run a Witness Server if you are not experienced (or do not have access to experienced support) in blockchain, MSB and MTL regulations, and other applicable regulations and laws. You should also not operate a Witness Server if you are not an experienced person or entity with technical and compliance expertise. Few individuals are qualified and experienced enough to operate Witness Servers on their own. You should also not operate a Witness Server if you have not sought and obtained independent legal and tax advice. - - -### Are these FAQs comprehensive and conclusive advice? - -No. These FAQs are intended to provide general guidance and do not constitute technical, financial, or legal advice. These FAQs should not be used as a substitute for professional advice tailored to one’s specific circumstances. The blockchain and digital asset landscape is complex and constantly changing, which necessitates staying updated and seeking expert advice. It is recommended that those engaging with a Sidechain regularly check official resources such as governmental and regulatory body websites. Nonetheless, consulting with legal professionals who specialize in blockchain, and cryptocurrency is the most reliable way to get accurate and personalized advice. - {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/concepts/xrpl-sidechains/witness-servers.md b/docs/concepts/xrpl-sidechains/witness-servers.md index d995fd042f..8963858051 100644 --- a/docs/concepts/xrpl-sidechains/witness-servers.md +++ b/docs/concepts/xrpl-sidechains/witness-servers.md @@ -146,4 +146,36 @@ The witness server takes a JSON configuration file, specified using the `--conf` | `LockingChainDoor` | String | Account | Yes | The door account on the locking chain. | | `LockingChainIssue` | Issue | Issue | Yes | The asset that is locked and unlocked on the locking chain. | + +## Witness Server FAQs + +### Are there risks associated with operating a Witness Server? + +There are certain risks associated with operating a Witness Server for a Sidechain, including the following: + +_Regulatory Considerations_: Operating a Witness Server carries some regulatory risk. A few risks are identified below, some of which pertain to regulatory regimes that only apply to projects that serve those located in the U.S. U.S. regimes are identified here because they are commonly considered some of the strictest regulatory regimes in the world. + +The regulatory regime in the U.S. concerning the operation of a “money transmitting business” requiring federal registration as a money service business (“MSB”) and state money transmitter licenses (“MTLs”) is unclear as it pertains to operating Witness Servers. The Witness Servers are intended to be operated by a series of decentralized entities and persons. Despite this intention, if a regulator determined that there was “centralized” control of the Witness Servers by a particular entity or coordinated group, it may deem such activity to be money transmission. The U.S. Treasury Department recently issued a report identifying a series of factors it would consider when determining whether a particular project is “decentralized.” See [2023 DeFi Illicit Finance Risk Assessment](https://home.treasury.gov/news/press-releases/jy1391). This recent regulatory guidance is important because it indicates that the U.S. Treasury recognizes that certain projects may be “decentralized” and if the operation of the Witness Servers is “decentralized” it may not be considered a “money transmitting business.” + +While U.S. crypto regulations have consistently remained among the most stringent and aggressively enforced, other jurisdictions also have regulation and laws relating to the transfer of “money” and other value. For example, in March of 2022, U.K. regulatory authorities published a series of documentary guidance regarding crypto and decentralized finance. See [Financial Stability in Focus: Cryptoassets and Decentralized Finance](https://www.bankofengland.co.uk/financial-stability-in-focus/2022/march-2022). More recently, in June of 2023, the E.U. formally adopted a regulatory framework which in part imposes codified rules and regulations pertaining to decentralized crypto platforms. See [Markets in Crypto-Assets Regulation](https://www.esma.europa.eu/esmas-activities/digital-finance-and-innovation/markets-crypto-assets-regulation-mica). For those considering operating a Witness Server, it is critical to stay informed and compliant with the specific requirements of each jurisdiction involved to effectively manage associated risks. + +_Technology and Network Security_: Those intending to run a Witness Server should be familiar with the technical and security aspects of doing so. Before agreeing to run a Witness Server, one should fully understand the functionality, potential vulnerabilities, and necessary technological and security measures involved. + +_Civil Liability_: Operating a Witness Server, like participating in any blockchain project, carries an unspecified level of civil liability risk. There has been an influx of plaintiffs’ lawsuits in the U.S. and other jurisdictions, and it is difficult to evaluate what theories a particular plaintiffs’ attorney may implement in a civil lawsuit. Regardless of any real or perceived civil liability risk, it should be noted that even a frivolous lawsuit could take time and money to respond. + + +### Should I seek independent advice before agreeing to operate a Witness Server? + +Yes. Any party considering running a Witness Server should seek independent legal and tax advice from experienced professionals. Please note, that as the Witness Servers must mutually attest to confirm cross-chain transfers, they may be understood to operate as a common enterprise - as it is defined by US regulators. In a common enterprise, joint and several liability may apply, meaning that each Witness Server could be held individually responsible for all liability or damages incurred. Given the evolving regulatory landscape, it’s critical to consult with a legal professional who can help navigate the complex and changing global regulatory landscape associated with the expectations and obligations of running a Witness Server. As with any blockchain project, please do your own research. These FAQs are just general guidance and are not legal or tax advice. + + +### Who should not run a Witness Server? + +You should not run a Witness Server if you are not experienced (or do not have access to experienced support) in blockchain, MSB and MTL regulations, and other applicable regulations and laws. You should also not operate a Witness Server if you are not an experienced person or entity with technical and compliance expertise. Few individuals are qualified and experienced enough to operate Witness Servers on their own. You should also not operate a Witness Server if you have not sought and obtained independent legal and tax advice. + + +### Are these FAQs comprehensive and conclusive advice? + +No. These FAQs are intended to provide general guidance and do not constitute technical, financial, or legal advice. These FAQs should not be used as a substitute for professional advice tailored to one’s specific circumstances. The blockchain and digital asset landscape is complex and constantly changing, which necessitates staying updated and seeking expert advice. It is recommended that those engaging with a Sidechain regularly check official resources such as governmental and regulatory body websites. Nonetheless, consulting with legal professionals who specialize in blockchain, and cryptocurrency is the most reliable way to get accurate and personalized advice. + {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/img/autobridging.png b/docs/img/autobridging.png new file mode 100644 index 0000000000..a32858579b Binary files /dev/null and b/docs/img/autobridging.png differ diff --git a/docs/img/cpt-amm-balance.png b/docs/img/cpt-amm-balance.png new file mode 100644 index 0000000000..db1088fe01 Binary files /dev/null and b/docs/img/cpt-amm-balance.png differ diff --git a/docs/img/cpt-amm-lp-receiving-lpts.png b/docs/img/cpt-amm-lp-receiving-lpts.png new file mode 100644 index 0000000000..fb19c7d512 Binary files /dev/null and b/docs/img/cpt-amm-lp-receiving-lpts.png differ diff --git a/docs/img/cpt-amm-lp-tokens.png b/docs/img/cpt-amm-lp-tokens.png new file mode 100644 index 0000000000..6c148a7c4b Binary files /dev/null and b/docs/img/cpt-amm-lp-tokens.png differ diff --git a/docs/img/cpt-amm-or-offer.png b/docs/img/cpt-amm-or-offer.png new file mode 100644 index 0000000000..4f8360d5fe Binary files /dev/null and b/docs/img/cpt-amm-or-offer.png differ diff --git a/docs/img/cpt-amm.png b/docs/img/cpt-amm.png new file mode 100644 index 0000000000..46a6fa8549 Binary files /dev/null and b/docs/img/cpt-amm.png differ diff --git a/docs/index.page.tsx b/docs/index.page.tsx index 4385f80cd9..43e4d9c1ae 100644 --- a/docs/index.page.tsx +++ b/docs/index.page.tsx @@ -1,5 +1,7 @@ import * as React from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; +import { NavList } from "shared/components/nav-list"; +import { Link } from "@redocly/theme/components/Link/Link"; export const frontmatter = { seo: { @@ -160,19 +162,13 @@ function UseCasesCard(props: { }; }) { const { useCase } = props; + const { useTranslate } = useThemeHooks(); + const { translate } = useTranslate(); return (
{useCase.title} -
{useCase.title}
- +
{translate(useCase.title)}
+
); } @@ -180,7 +176,7 @@ function UseCasesCard(props: { function FlatCard(props: { href: string; title: string; description: string; linkText: string; imgClass }) { const { title, description, linkText, href, imgClass } = props; return ( - + {title}
{title}
@@ -191,7 +187,7 @@ function FlatCard(props: { href: string; title: string; description: string; lin {linkText} -
+ ); } @@ -208,26 +204,26 @@ function VideoCard(props: { url: string; title: string; src: string }) { } function DevToolCard(props: { link: string; title: string; description: string }) { - const { translate } = useTranslate(); const { link, title, description } = props; return ( - -
{translate(title)}
-

{translate(description)}

-
+ +
{title}
+

{description}

+ ); } function PrimaryButton(props: { href: string; text: string; isArrowUp: boolean }) { const { href, text, isArrowUp } = props; return ( - + {text} - + ); } export default function Docs() { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); return ( @@ -287,14 +283,14 @@ export default function Docs() {

{translate('Getting Started')}

@@ -321,22 +317,22 @@ export default function Docs() { @@ -386,15 +382,7 @@ export default function Docs() {
@@ -407,9 +395,9 @@ export default function Docs() { 'Connect to the XRP Ledger Testnet network to develop and test your apps built on the XRP Ledger, without risking real money or impacting production XRP Ledger users.' )}

- + {translate('Generate Testnet Credentials')} - +
diff --git a/docs/references/http-websocket-apis/api-conventions/rate-limiting.md b/docs/references/http-websocket-apis/api-conventions/rate-limiting.md index ee4c525aae..c7389619f6 100644 --- a/docs/references/http-websocket-apis/api-conventions/rate-limiting.md +++ b/docs/references/http-websocket-apis/api-conventions/rate-limiting.md @@ -14,7 +14,7 @@ The `rippled` server limits the rate at which API clients can make requests on p When a client is approaching the rate limit, the server adds the field `"warning": "load"` at the top level of an [API response](response-formatting.md). This warning is not added to every response, but the server may send several such warnings before it disconnects a client. -If a client goes past the rate limit, the server disconnects that client and does not serve further requests from the client's API address for a while. The WebSocket and JSON-RPC APIs use different disconnect messages. +If a client exceeds the rate limit, the server disconnects that client and does not serve further requests from the client's IP address for a while. The WebSocket and JSON-RPC APIs use different disconnect messages. ## WebSocket API Disconnect Message diff --git a/docs/references/http-websocket-apis/api-conventions/response-formatting.md b/docs/references/http-websocket-apis/api-conventions/response-formatting.md index f0d49f033d..847ae6b1f9 100644 --- a/docs/references/http-websocket-apis/api-conventions/response-formatting.md +++ b/docs/references/http-websocket-apis/api-conventions/response-formatting.md @@ -103,7 +103,7 @@ HTTP Status: 200 OK When the response contains a `warnings` array, each member of the array represents a separate warning from the server. Each such **Warning Object** contains the following fields: -| `Field` | Type | Description | +| Field | Type | Description | |:----------|:-------|:--------------------------------------------------------| | `id` | Number | A unique numeric code for this warning message. | | `message` | String | A human-readable string describing the cause of this message. Do not write software that relies the contents of this message; use the `id` (and `details`, if applicable) to identify the warning instead. | @@ -134,7 +134,7 @@ The server only sends this warning if the client is [connected as an admin](../. This warning includes a `details` field with the following fields: -| Field | Value | Description | +| Field | Type | Description | |:--------------------|:-------|:----------------------------------------------| | `expected_date` | Number | The time that the first unsupported amendment is expected to become enabled, in [seconds since the Ripple Epoch][]. | | `expected_date_UTC` | String | The timestamp, in UTC, when the first unsupported amendment is expected to become enabled. | @@ -161,7 +161,6 @@ The server administrator must [upgrade `rippled`](../../../infrastructure/instal ### 1003. This is a reporting server - Example warning: ```json diff --git a/docs/references/http-websocket-apis/peer-port-methods/peer-crawler.md b/docs/references/http-websocket-apis/peer-port-methods/peer-crawler.md index 8d3e8ffe04..5e3972c8fa 100644 --- a/docs/references/http-websocket-apis/peer-port-methods/peer-crawler.md +++ b/docs/references/http-websocket-apis/peer-port-methods/peer-crawler.md @@ -46,7 +46,7 @@ Each member of the `overlay.active` array is an object with the following fields | `complete_ledgers` | String | The range of [ledger versions](../../../concepts/networks-and-servers/ledger-history.md) this peer has available. | | `complete_shards` | String | _(May be omitted)_ The range of [ledger history shards](../../../infrastructure/configuration/data-retention/history-sharding.md) this peer has available. | | `ip` | String (IPv4 Address) | _(May be omitted)_ The IP address of this connected peer. Omitted if the peer is configured as a validator or a [private peer](../../../concepts/networks-and-servers/peer-protocol.md#private-peers). {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.2.1" %}Updated in: rippled 1.2.1{% /badge %} | -| `port` | String (Number) | _(May be omitted)_ The port number on the peer server that serves RTXP. Typically `51235`. Omitted if the peer is configured as a validator or a [private peer](../../../concepts/networks-and-servers/peer-protocol.md#private-peers). {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.2.1" %}Updated in: rippled 1.2.1{% /badge %} | +| `port` | String or Number | _(May be omitted)_ The port number on the peer server that serves RTXP. This will be a string if outbound and a number otherwise. Typically `51235`. Omitted if the peer is configured as a validator or a [private peer](../../../concepts/networks-and-servers/peer-protocol.md#private-peers). {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.2.1" %}Updated in: rippled 1.2.1{% /badge %} | | `public_key` | String (Base-64 Encoded) | The public key of the ECDSA key pair used by this peer to sign RTXP messages. (This is the same data as the `pubkey_node` reported by the peer server's [server_info method][].) | | `type` | String | The value `in` or `out`, indicating whether the TCP connection to the peer is incoming or outgoing. | | `uptime` | Number | The number of seconds the server has been connected to this peer. | diff --git a/docs/references/http-websocket-apis/public-api-methods/clio-methods/nfts_by_issuer.md b/docs/references/http-websocket-apis/public-api-methods/clio-methods/nfts_by_issuer.md index 1533eedd51..517723447e 100644 --- a/docs/references/http-websocket-apis/public-api-methods/clio-methods/nfts_by_issuer.md +++ b/docs/references/http-websocket-apis/public-api-methods/clio-methods/nfts_by_issuer.md @@ -10,7 +10,7 @@ labels: [[Source]](https://github.com/XRPLF/clio/blob/develop/src/rpc/handlers/NFTsByIssuer.cpp "Source") -`nfts_by_issuer` returns a list of NFTokens that are issued by the specified account. It can optionally filter by taxon. {% badge href="https://github.com/XRPLF/clio/releases/tag/1.1.0" %}New in: Clio v2.1.0{% /badge %} +`nfts_by_issuer` returns a list of NFTokens that are issued by the specified account. It can optionally filter by taxon. {% badge href="https://github.com/XRPLF/clio/releases/tag/2.1.0" %}New in: Clio v2.1.0{% /badge %} ## Request Format An example of the request format: diff --git a/docs/references/http-websocket-apis/public-api-methods/clio-methods/version.md b/docs/references/http-websocket-apis/public-api-methods/clio-methods/version.md new file mode 100644 index 0000000000..e1d20d75a1 --- /dev/null +++ b/docs/references/http-websocket-apis/public-api-methods/clio-methods/version.md @@ -0,0 +1,111 @@ +--- +seo: + description: Retrieve API version information. +labels: + - Core Server +--- +# version +[[Source]](https://github.com/XRPLF/clio/blob/develop/src/rpc/handlers/VersionHandler.hpp "Source") + +The `version` command retrieves the API version information of the [Clio server](../../../../concepts/networks-and-servers/the-clio-server.md). For `rippled` servers, see [`version` (`rippled`)](../server-info-methods/version.md) instead. {% badge href="https://github.com/XRPLF/clio/releases/tag/1.0.0" %}New in: Clio v2.0.0{% /badge %} + + +## Request Format +An example of the request format: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "command": "version" +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +{ + "method": "version", + "params": [ + {} + ] +} +``` +{% /tab %} + +{% /tabs %} + + + +The request does not take any parameters. + +## Response Format + +An example of a successful response: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "result": { + "version": { + "first": 1, + "last": 2, + "good": 1 + } + }, + "status": "success", + "type": "response", + "warnings": [ + { + "id": 2001, + "message": "This is a clio server. clio only serves validated data. If you want to talk to rippled, include 'ledger_index':'current' in your request" + } + ] +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +200 OK + +{ + "result": { + "version": { + "first": 1, + "last": 2, + "good": 1 + } + }, + "status": "success", + "type": "response", + "warnings": [ + { + "id":2001, + "message":"This is a clio server. clio only serves validated data. If you want to talk to rippled, include 'ledger_index':'current' in your request" + } + ] +} +``` +{% /tab %} + +{% /tabs %} + +The response follows the [standard format][], with a successful result containing an `info` object as its only field. + +The `version` object returns some arrangement of the following fields: + +| `Field` | Type | Description | +|:---------|:--------|:------------------------------| +| `first` | Integer | Lowest supported API release | +| `last` | Integer | Highest supported API release | +| `good` | Integer | Default API if none specified | + +## Possible Errors + +* Any of the [universal error types][]. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md b/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md index 0bcbbb0af1..a2b5591df1 100644 --- a/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md +++ b/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/amm_info.md @@ -13,7 +13,7 @@ labels: The {% code-page-name /%} method gets information about an Automated Market Maker (AMM) instance. -_(Requires the [AMM amendment][])_ +_(Added by the [AMM amendment][])_ ### Request Format diff --git a/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/book_changes.md b/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/book_changes.md new file mode 100644 index 0000000000..c81b4c3ea5 --- /dev/null +++ b/docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/book_changes.md @@ -0,0 +1,125 @@ +--- +seo: + description: Get information on +labels: + - Decentralized Exchange + - Cross-Currency +--- +# book_changes +[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/rpc/BookChanges.h "Source") + +The {% code-page-name /%} method reports information about changes to the order books in the [decentralized exchange (DEX)](../../../../concepts/tokens/decentralized-exchange/index.md) compared with the previous ledger version. This may be useful for building "candlestick" charts. + +### Request Format + +An example of the request format: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "id": "example_book_changes", + "command": "book_changes", + "ledger_index": 88530953 +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +{ + "method": "{% $frontmatter.seo.title %}", + "params": [{ + "ledger_index": 88530953 + }] +} +``` +{% /tab %} + +{% tab label="Commandline" %} +```sh +#Syntax: book_changes [] +rippled book_changes 88530953 +``` +{% /tab %} + +{% /tabs %} + +[Try it! >](/resources/dev-tools/websocket-api-tool#book_changes) + +The request includes the following parameters: + +| Field | Type | Required? | Description | +|:---------------|:-----------------|:----------|-------------| +| `ledger_hash` | [Hash][] | No | A 32-byte hex string for the ledger version to use. (See [Specifying Ledgers][]) | +| `ledger_index` | [Ledger Index][] | No | The [ledger index][] of the ledger to use, or a shortcut string to choose a ledger automatically. (See [Specifying Ledgers][]) | + +{% admonition type="warning" name="Known Issues" %} +There are several known issue with this method in `rippled`. + +- You must specify the `ledger_index` or `ledger_hash` explicitly instead of using a default or a shortcut string. ([Issue #5034](https://github.com/XRPLF/rippled/issues/5034)) +- JSON-RPC API responses may be missing the `validated` field even when querying validated ledgers. ([#5035](https://github.com/XRPLF/rippled/issues/5035)) +- When querying a recently-closed ledger, a successful response may sometimes return a Ledger Request Object instead of the intended data. ([#5033](https://github.com/XRPLF/rippled/issues/5033)) +- When querying data from older ledgers, the server may take a long time (over 30 seconds) to respond. ([#5036](https://github.com/XRPLF/rippled/issues/5036)) + +These bugs do not apply to Clio servers. +{% /admonition %} + +## Response Format + +An example of a successful response: + +{% tabs %} + +{% tab label="WebSocket" %} +{% code-snippet file="/_api-examples/book_changes/ws-response.json" language="json" /%} +{% /tab %} + +{% tab label="JSON-RPC" %} +{% code-snippet file="/_api-examples/book_changes/jsonrpc-response.json" language="json" prefix="200 OK\n\n" /%} +{% /tab %} + +{% tab label="Commandline" %} +{% code-snippet file="/_api-examples/book_changes/jsonrpc-response.json" language="json" prefix="Loading: \"/etc/opt/ripple/rippled.cfg\"\n2024-Jun-07 18:41:45.257772761 UTC HTTPClient:NFO Connecting to 127.0.0.1:5005\n\n" /%} +{% /tab %} + +{% /tabs %} + +The response follows the [standard format][], with a successful result containing the following fields: + +| Field | Type | Description | +|:---------------|:-----------------|:------------------------| +| `changes` | Array | List of [Book Update Objects](#book-update-objects), containing one entry for each order book that was updated in this ledger version. The array is empty if no order books were updated. | +| `ledger_hash` | [Hash][] | The identifying hash of the ledger version that was used when retrieving this data. | +| `ledger_index` | [Ledger Index][] | The ledger index of the ledger version that was used when retrieving this data. | +| `ledger_time` | Number | The official close time of the ledger that was used when retrieving this data, in [seconds since the Ripple Epoch][]. | +| `type` | String | The string `bookChanges`, which indicates that this is an order book update message. | +| `validated` | Boolean | _(May be omitted)_ If `true`, the information comes from a validated ledger version. | + +### Book Update Objects + +A Book Update Object represents the changes to a single order book in a single ledger version, and contains the following fields: + +| Field | Type | Description | +|:---------------|:-----------------|:------------------------| +| `currency_a` | String | An identifier for the first of the two currencies in the order book. For XRP, this is the string `XRP_drops`. For [tokens](../../../../concepts/tokens/index.md), this is formatted as the address of the issuer in [base58][], followed by a forward-slash (`/`), followed by the [Currency Code][] for the token, which can be a 3-character standard code or a 20-character hexadecimal code. | +| `currency_b` | String | An identifier for the second of two currencies in the order book. This is in the same format as `currency_a`, except `currency_b` can never be XRP. +| `volume_a` | String - Number | The total amount, or _volume_, of the first currency (that is, `currency_a`) that moved as a result of trades through this order book in this ledger. | +| `volume_b` | String - Number | The volume of the second currency (that is, `currency_b`) that moved as a result of trades through this order book in this ledger. | +| `high` | String - Number | The highest exchange rate among all offers matched in this ledger, as a ratio of the first currency to the second currency. (In other words, `currency_a : currency_b`.) | +| `low` | String - Number | The lowest exchange rate among all offers matched in this ledger, as a ratio of the first currency to the second currency. | +| `open` | String - Number | The exchange rate at the top of this order book before processing the transactions in this ledger, as a ratio of the first currency to the second currency. | +| `close` | String - Number | The exchange rate at the top of this order book after processing the transactions in this ledger, as a ratio of the first currency to the second currency. | + +For XRP-token order books, XRP is always `currency_a`. For token-token order books, the currencies are sorted alphabetically by the issuer and then currency code. + +Exchange rates involving XRP are always calculated using [drops of XRP][]. For example, if the rate from XRP to FOO is 1.0 XRP to 1 FOO, the rate reported by the API is `1000000` (1 million drops of XRP per 1 FOO). + +## Possible Errors + +* Any of the [universal error types][]. +* `lgrNotFound` - The ledger specified by the `ledger_hash` or `ledger_index` does not exist, or it does exist but the server does not have it. +* `invalidParams` - One or more fields are specified incorrectly, or one or more required fields are missing. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/references/http-websocket-apis/public-api-methods/server-info-methods/version.md b/docs/references/http-websocket-apis/public-api-methods/server-info-methods/version.md new file mode 100644 index 0000000000..2ced20f5ef --- /dev/null +++ b/docs/references/http-websocket-apis/public-api-methods/server-info-methods/version.md @@ -0,0 +1,125 @@ +--- +seo: + description: Retrieve API version information. +labels: + - Core Server +--- +# version + +[[Source]](https://github.com/XRPLF/rippled/blob/develop/src/ripple/beast/core/SemanticVersion.cpp "Source") + +The `version` command retrieves the API version information for the rippled server. For `Clio` servers, see [`version` (`clio`)](../clio-methods/version.md) instead. + + +## Request Format +An example of the request format: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "command": "version" +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +{ + "method": "version", + "params": [ + {} + ] +} +``` +{% /tab %} + +{% tab label="Commandline" %} +```sh +#Syntax: version +rippled version +``` +{% /tab %} + +{% /tabs %} + +[Try it! >](/resources/dev-tools/websocket-api-tool#version) + +The request does not takes any parameters. + +## Response Format + +An example of a successful response: + +{% tabs %} + +{% tab label="WebSocket" %} +```json +{ + "result": { + "version": { + "first": "1.0.0", + "good": "1.0.0", + "last": "1.0.0" + } + }, + "status": "success", + "type": "response" +} +``` +{% /tab %} + +{% tab label="JSON-RPC" %} +```json +200 OK + +Headers + +{ + "result": { + "version": { + "first": "1.0.0", + "good": "1.0.0", + "last": "1.0.0" + } + }, + "status": "success", + "type": "response" +} +``` +{% /tab %} + +{% tab label="Commandline" %} +```json +{ + "result": { + "version": { + "first": "1.0.0", + "good": "1.0.0", + "last": "1.0.0" + } + }, + "status": "success", + "type": "response" +} +``` +{% /tab %} + +{% /tabs %} + +The response follows the [standard format][], with a successful result containing a `version` object as its only field. + +The `version` object returns some arrangement of the following fields: + +| `Field` | Type | Description | +|:---------|:-------|:------------------------------| +| `first` | String | Lowest supported API release | +| `last` | String | Highest supported API release | +| `good` | String | Default API if none specified | + +## Possible Errors + +* Any of the [universal error types][]. + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe.md b/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe.md index 4984c19d30..646cbcf24c 100644 --- a/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe.md +++ b/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe.md @@ -80,6 +80,7 @@ The following parameters are deprecated and may be removed without further notic The `streams` parameter provides access to the following default streams of information: +- `book_changes` - Sends a message with order book changes whenever the consensus process declares a new validated ledger. - `consensus` - Sends a message whenever the server changes phase in the consensus cycle. - `ledger` - Sends a message whenever the consensus process declares a new validated ledger. - `manifests` - Sends a message whenever the server receives an update to a validator's ephemeral signing key. @@ -547,14 +548,150 @@ Example order book stream message: The format of an order book stream message is the same as that of [transaction stream messages](#transaction-streams), except that `OfferCreate` transactions also contain the following field: -| `Field` | Value | Description | +| Field | Value | Description | |:--------------------------|:-------|:----------------------------------------| | `transaction.owner_funds` | String | Numeric amount of the `TakerGets` currency that the `Account` sending this OfferCreate transaction has after executing this transaction. This does not check whether the currency amount is [frozen](../../../../concepts/tokens/fungible-tokens/freezes.md). | -## Consensus Stream +## Book Changes Stream -{% badge href="https://github.com/XRPLF/rippled/releases/tag/1.4.0" %}New in: rippled 1.4.0{% /badge %} +The `book_changes` stream sends `bookChanges` messages whenever a new ledger is validated. This message contains a summary of all changes to order books in the decentralized exchange that occurred in that ledger. + +Example `bookChanges` message: + +```json +{ + "type": "bookChanges", + "ledger_index": 88530525, + "ledger_hash": "E2F24290E1714C842D34A1057E6D6B7327C7DDD310263AFBC67CA8EFED7A331B", + "ledger_time": 771099232, + "changes": [ + { + "currency_a": "XRP_drops", + "currency_b": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y/USD", + "volume_a": "23020993", + "volume_b": "11.51049687275246", + "high": "1999999.935232603", + "low": "1999999.935232603", + "open": "1999999.935232603", + "close": "1999999.935232603" + }, + { + "currency_a": "XRP_drops", + "currency_b": "rRbiKwcueo6MchUpMFDce9XpDwHhRLPFo/43525950544F0000000000000000000000000000", + "volume_a": "28062", + "volume_b": "0.000643919229004", + "high": "43580000.00000882", + "low": "43580000.00000882", + "open": "43580000.00000882", + "close": "43580000.00000882" + }, + { + "currency_a": "XRP_drops", + "currency_b": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu/5553444300000000000000000000000000000000", + "volume_a": "147797392", + "volume_b": "70.41143840513008", + "high": "2099053.724049922", + "low": "2099053.724049922", + "open": "2099053.724049922", + "close": "2099053.724049922" + }, + { + "currency_a": "XRP_drops", + "currency_b": "rcRzGWq6Ng3jeYhqnmM4zcWcUh69hrQ8V/LTC", + "volume_a": "350547165", + "volume_b": "2.165759976556748", + "high": "162573356.3100158", + "low": "160134763.7403094", + "open": "162573356.3100158", + "close": "160134763.7403094" + }, + { + "currency_a": "XRP_drops", + "currency_b": "rchGBxcD1A1C2tdxF6papQYZ8kjRKMYcL/BTC", + "volume_a": "352373535", + "volume_b": "0.00249291478138912", + "high": "1413500174054660e-4", + "low": "1413499999999996e-4", + "open": "1413500174054660e-4", + "close": "1413499999999996e-4" + }, + { + "currency_a": "XRP_drops", + "currency_b": "rcvxE9PS9YBwxtGg1qNeewV6ZB3wGubZq/5553445400000000000000000000000000000000", + "volume_a": "8768045", + "volume_b": "4.193604075536", + "high": "2090813.734932601", + "low": "2090813.734932601", + "open": "2090813.734932601", + "close": "2090813.734932601" + }, + { + "currency_a": "XRP_drops", + "currency_b": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq/USD", + "volume_a": "28113", + "volume_b": "0.013405652999", + "high": "2097100.380123005", + "low": "2097100.380123005", + "open": "2097100.380123005", + "close": "2097100.380123005" + }, + { + "currency_a": "r3dVizzUAS3U29WKaaSALqkieytA2LCoRe/58434F5245000000000000000000000000000000", + "currency_b": "rcoreNywaoz2ZCQ8Lg2EbSLnGuRBmun6D/434F524500000000000000000000000000000000", + "volume_a": "75.626516003375", + "volume_b": "63.022096669479", + "high": "1.200000000000003", + "low": "1.200000000000003", + "open": "1.200000000000003", + "close": "1.200000000000003" + }, + { + "currency_a": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y/CNY", + "currency_b": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y/USD", + "volume_a": "83.9115222024", + "volume_b": "11.51049687275", + "high": "7.290000000004561", + "low": "7.290000000004561", + "open": "7.290000000004561", + "close": "7.290000000004561" + }, + { + "currency_a": "rcRzGWq6Ng3jeYhqnmM4zcWcUh69hrQ8V/LTC", + "currency_b": "rchGBxcD1A1C2tdxF6papQYZ8kjRKMYcL/BTC", + "volume_a": "0.64167647147626", + "volume_b": "0.00073047551165797", + "high": "878.4366638381051", + "low": "878.4366638381051", + "open": "878.4366638381051", + "close": "878.4366638381051" + }, + { + "currency_a": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq/USD", + "currency_b": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B/USD", + "volume_a": "0.013432464305", + "volume_b": "0.013566788948", + "high": "0.9900990099046391", + "low": "0.9900990099046391", + "open": "0.9900990099046391", + "close": "0.9900990099046391" + } + ] +} +``` + +The fields from a Book Changes stream message are as follows: + +| Field | Value | Description | +|:---------------|:-----------------|:----------------------------------------| +| `type` | String | The value `bookChanges` indicates this is from the Book Changes stream. | +| `ledger_index` | [Ledger Index][] | The ledger index of the ledger with these changes. | +| `ledger_hash` | [Hash][] | The identifying hash of the ledger with these changes. | +| `ledger_time` | Number | The official close time of the ledger with these changes, in [seconds since the Ripple Epoch][]. | +| `changes` | Array | List of [Book Update Objects](../path-and-order-book-methods/book_changes.md#book-update-objects), containing one entry for each order book that was updated in this ledger version. The array is empty if no order books were updated. | + + +## Consensus Stream The `consensus` stream sends `consensusPhase` messages when [the consensus process](../../../../concepts/consensus-protocol/index.md) changes phase. The message contains the new phase of consensus the server is in. @@ -567,9 +704,9 @@ The `consensus` stream sends `consensusPhase` messages when [the consensus proce The fields from a consensus stream message are as follows: -| `Field` | Type | Description | -|:--------------------|:--------------------------|:---------------------------| -| `type` | String | `consensusPhase` indicates this is from the consensus stream | -| `consensus` | String | The new consensus phase the server is in. Possible values are `open`, `establish`, and `accepted`. | +| Field | Type | Description | +|:------------|:-------|:---------------------------| +| `type` | String | The value `consensusPhase` indicates this is from the consensus stream | +| `consensus` | String | The new consensus phase the server is in. Possible values are `open`, `establish`, and `accepted`. | {% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md b/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md index a12eb01f16..e127364e9b 100644 --- a/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md +++ b/docs/references/protocol/ledger-data/ledger-entry-types/directorynode.md @@ -1,6 +1,4 @@ --- -html: directorynode.html -parent: ledger-entry-types.html seo: description: Contains links to other objects. labels: @@ -12,10 +10,11 @@ labels: The `DirectoryNode` ledger entry type provides a list of links to other entries in the ledger's state data. A single conceptual _Directory_ takes the form of a doubly linked list, with one or more DirectoryNode entries each containing up to 32 [IDs of other entries](../common-fields.md). The first DirectoryNode entry is called the root of the directory, and all entries other than the root can be added or deleted as necessary. -There are two kinds of Directories: +There are three kinds of directory: -* **Owner directories** list other entries owned by an account, such as [`RippleState` (trust line)](ripplestate.md) or [`Offer`](offer.md) entries. -* **Offer directories** list the offers available in the [decentralized exchange](../../../../concepts/tokens/decentralized-exchange/index.md). A single Offer directory contains all the offers that have the same exchange rate for the same token (currency code and issuer). +* _Owner directories_ list other entries owned by an account, such as [`RippleState` (trust line)](ripplestate.md) or [`Offer`](offer.md) entries. +* _Offer directories_ list the offers available in the [decentralized exchange](../../../../concepts/tokens/decentralized-exchange/index.md). A single Offer directory contains all the offers that have the same exchange rate for the same token (currency code and issuer). +* _NFT Offer directories_ list buy and sell offers for NFTs. Each NFT has up to two directories, one for buy offers, the other for sell offers. ## Example {% $frontmatter.seo.title %} JSON @@ -56,24 +55,48 @@ There are two kinds of Directories: ``` {% /tab %} +{% tab label="NFT Offer Directory" %} +```json +{ + "result": { + "index": "CC45A27DAF06BFA45E8AFC92801AD06A06B7004DAD0F7022E439B3A2F6FA5B5A", + "ledger_current_index": 310, + "node": { + "Flags": 2, + "Indexes": [ + "83C81AC39F9771DDBCD66F6C225FC76EFC0971384EC6148BAFA5BD18019FC495" + ], + "LedgerEntryType": "DirectoryNode", + "NFTokenID": "000800009988C43C563A7BB35AF34D642990CDF089F11B445EB3DCCD00000132", + "RootIndex": "CC45A27DAF06BFA45E8AFC92801AD06A06B7004DAD0F7022E439B3A2F6FA5B5A", + "index": "CC45A27DAF06BFA45E8AFC92801AD06A06B7004DAD0F7022E439B3A2F6FA5B5A" + }, + "status": "success", + "validated": false + } +} +``` +{% /tab %} + {% /tabs %} ## {% $frontmatter.seo.title %} Fields | Name | JSON Type | [Internal Type][] | Required? | Description | |:--------------------|:----------|:------------------|:----------|:------------| -| `ExchangeRate` | String | UInt64 | No | (Offer Directories only) **DEPRECATED**. Do not use. | +| `ExchangeRate` | String | UInt64 | No | (Offer directories only) **DEPRECATED**. Do not use. | | `Flags` | Number | UInt32 | Yes | A bit-map of boolean flags enabled for this object. Currently, the protocol defines no flags for `DirectoryNode` objects. The value is always `0`. | -| `Indexes` | Array | Vector256 | Yes | The contents of this Directory: an array of IDs of other objects. | -| `IndexNext` | Number | UInt64 | No | If this Directory consists of multiple pages, this ID links to the next object in the chain, wrapping around at the end. | -| `IndexPrevious` | Number | UInt64 | No | If this Directory consists of multiple pages, this ID links to the previous object in the chain, wrapping around at the beginning. | -| `LedgerEntryType` | String | UInt16 | Yes | The value `0x0064`, mapped to the string `DirectoryNode`, indicates that this object is part of a Directory. | -| `Owner` | String | AccountID | No | (Owner Directories only) The address of the account that owns the objects in this directory. | +| `Indexes` | Array | Vector256 | Yes | The contents of this directory: an array of IDs of other objects. | +| `IndexNext` | Number | UInt64 | No | If this directory consists of multiple pages, this ID links to the next object in the chain, wrapping around at the end. | +| `IndexPrevious` | Number | UInt64 | No | If this directory consists of multiple pages, this ID links to the previous object in the chain, wrapping around at the beginning. | +| `LedgerEntryType` | String | UInt16 | Yes | The value `0x0064`, mapped to the string `DirectoryNode`, indicates that this object is part of a directory. | +| `NFTokenID` | String | Hash25 | No |(NFT offer directories only) ID of the NFT in a buy or sell offer. | +| `Owner` | String | AccountID | No | (Owner directories only) The address of the account that owns the objects in this directory. | | `RootIndex` | String | Hash256 | Yes | The ID of root object for this directory. | -| `TakerGetsCurrency` | String | Hash160 | No | (Offer Directories only) The currency code of the `TakerGets` amount from the offers in this directory. | -| `TakerGetsIssuer` | String | Hash160 | No | (Offer Directories only) The issuer of the `TakerGets` amount from the offers in this directory. | -| `TakerPaysCurrency` | String | Hash160 | No |(Offer Directories only) The currency code of the `TakerPays` amount from the offers in this directory. | -| `TakerPaysIssuer` | String | Hash160 | No | (Offer Directories only) The issuer of the `TakerPays` amount from the offers in this directory. | +| `TakerGetsCurrency` | String | Hash160 | No | (Offer directories only) The currency code of the `TakerGets` amount from the offers in this directory. | +| `TakerGetsIssuer` | String | Hash160 | No | (Offer directories only) The issuer of the `TakerGets` amount from the offers in this directory. | +| `TakerPaysCurrency` | String | Hash160 | No |(Offer directories only) The currency code of the `TakerPays` amount from the offers in this directory. | +| `TakerPaysIssuer` | String | Hash160 | No | (Offer directories only) The issuer of the `TakerPays` amount from the offers in this directory. | ## {% $frontmatter.seo.title %} Flags @@ -90,26 +113,26 @@ There are no flags defined for {% code-page-name /%} entries. There are three different formulas for creating the ID of a DirectoryNode, depending on which of the following the DirectoryNode represents: -* The first page (also called the root) of an Owner Directory -* The first page of an Offer Directory +* The first page (also called the root) of an Owner or NFT Offer directory +* The first page of an Offer directory * Later pages of either type -**The first page of an Owner Directory** has an ID that is the [SHA-512Half][] of the following values, concatenated in order: +The first page of an Owner directory or NFT Offer directory has an ID that is the [SHA-512Half][] of the following values, concatenated in order: -* The Owner Directory space key (`0x004F`) +* The Owner directory space key (`0x004F`) * The AccountID from the `Owner` field. -**The first page of an Offer Directory** has a special ID: the higher 192 bits define the order book, and the remaining 64 bits define the exchange rate of the offers in that directory. (The ID is big-endian, so the book is in the more significant bits, which come first, and the quality is in the less significant bits which come last.) This provides a way to iterate through an order book from best offers to worst. Specifically: the first 192 bits are the first 192 bits of the [SHA-512Half][] of the following values, concatenated in order: +The first page of an Offer directory has a special ID: the higher 192 bits define the order book, and the remaining 64 bits define the exchange rate of the offers in that directory. (The ID is big-endian, so the book is in the more significant bits, which come first, and the quality is in the less significant bits which come last.) This provides a way to iterate through an order book from best offers to worst. Specifically: the first 192 bits are the first 192 bits of the [SHA-512Half][] of the following values, concatenated in order: -* The Book Directory space key (`0x0042`) +* The Book directory space key (`0x0042`) * The 160-bit currency code from the `TakerPaysCurrency` * The 160-bit currency code from the `TakerGetsCurrency` * The AccountID from the `TakerPaysIssuer` * The AccountID from the `TakerGetsIssuer` -The lower 64 bits of an Offer Directory's ID represent the `TakerPays` amount divided by `TakerGets` amount from the offer(s) in that directory as a 64-bit number in the XRP Ledger's internal amount format. +The lower 64 bits of an Offer directory's ID represent the `TakerPays` amount divided by `TakerGets` amount from the offer(s) in that directory as a 64-bit number in the XRP Ledger's internal amount format. -**If the DirectoryNode is not the first page in the Directory** (regardless of whether it is an Owner Directory or an Offer Directory), then it has an ID that is the [SHA-512Half][] of the following values, concatenated in order: +If the DirectoryNode is not the first page in the directory, it has an ID that is the [SHA-512Half][] of the following values, concatenated in order: * The DirectoryNode space key (`0x0064`) * The ID of the root DirectoryNode diff --git a/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md b/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md index 1777b6660d..fe2d798ded 100644 --- a/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md +++ b/docs/references/protocol/ledger-data/ledger-entry-types/ripplestate.md @@ -73,6 +73,7 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e | Flag Name | Hex Value | Decimal Value | Corresponding [TrustSet Flag](../../transactions/types/trustset.md#trustset-flags) | Description | |-------------------|--------------|---------------|-----------------|---------| +| `lsfAMMNode` | `0x01000000` | 16777216 | (None) | This entry consumed AMM liquidity to complete a [`Payment`](../../transactions/types/payment.md) transaction. | | `lsfLowReserve` | `0x00010000` | 65536 | (None) | This entry [contributes to the low account's owner reserve](#ripplestate-reserve). | | `lsfHighReserve` | `0x00020000` | 131072 | (None) | This entry [contributes to the high account's owner reserve](#ripplestate-reserve). | | `lsfLowAuth` | `0x00040000` | 262144 | `tfSetAuth` | The low account has authorized the high account to hold tokens issued by the low account. | diff --git a/docs/references/protocol/transactions/metadata.md b/docs/references/protocol/transactions/metadata.md index 3e28a85b48..fde29835b5 100644 --- a/docs/references/protocol/transactions/metadata.md +++ b/docs/references/protocol/transactions/metadata.md @@ -226,6 +226,7 @@ A `DeletedNode` object contains the following fields: | `LedgerEntryType` | String | The [type of ledger entry](../ledger-data/ledger-entry-types/index.md) that was deleted. | | `LedgerIndex` | String - [Hash][] | The [ID of this ledger entry](../ledger-data/common-fields.md) in the ledger's [state tree](../../../concepts/ledgers/index.md). **Note:** This is **not the same** as a [ledger index](../data-types/basic-data-types.md#ledger-index), even though the field name is very similar. | | `FinalFields` | Object | The content fields of the ledger entry immediately before it was deleted. Which fields are present depends on what type of ledger entry was created. | +| `PreviousFields` | Object | _(May be omitted)_ Selected fields of the ledger entry before it was deleted. Which fields are present depends on what type of ledger entry was created. | ### ModifiedNode Fields diff --git a/docs/references/protocol/transactions/types/ammbid.md b/docs/references/protocol/transactions/types/ammbid.md index 8ea80d5fc3..d2a5c7b4b1 100644 --- a/docs/references/protocol/transactions/types/ammbid.md +++ b/docs/references/protocol/transactions/types/ammbid.md @@ -9,9 +9,9 @@ labels: # AMMBid [[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/AMMBid.cpp "Source") -_(Requires the [AMM amendment][])_ +_(Added by the [AMM amendment][])_ -Bid on an [Automated Market Maker](../../../../concepts/tokens/decentralized-exchange/automated-market-makers.md)'s (AMM's) auction slot. If you win, you can trade against the AMM at a discounted fee until you are outbid or 24 hours have passed. If you are outbid before 24 hours have passed, you are refunded part of the cost of your bid based on how much time remains. +Bid on an [Automated Market Maker](../../../../concepts/tokens/decentralized-exchange/automated-market-makers.md)'s (AMM's) auction slot. If you win, you can trade against the AMM at a discounted fee until you are outbid or 24 hours have passed. If you are outbid before 24 hours have passed, you are refunded part of the cost of your bid based on how much time remains. If the AMM's trading fee is zero, you can still bid, but the auction slot provides no benefit unless the trading fee changes. You bid using the AMM's LP Tokens; the amount of a winning bid is returned to the AMM, decreasing the outstanding balance of LP Tokens. @@ -62,8 +62,6 @@ You bid using the AMM's LP Tokens; the amount of a winning bid is returned to th | `BidMax` | [Currency Amount][] | Amount | No | Pay at most this amount for the slot. If the cost to win the bid is higher than this amount, the transaction fails. If omitted, pay as much as necessary to win the bid. | | `AuthAccounts` | Array | STArray | No | A list of up to 4 additional accounts that you allow to trade at the discounted fee. This cannot include the address of the transaction sender. Each of these objects should be an [Auth Account object](#auth-account-objects). | -You cannot specify both `BidMin` and `BidMax`. - ### Auth Account Objects Each member of the `AuthAccounts` array must be an object with the following field: @@ -76,16 +74,22 @@ Like other "inner objects" that can appear in arrays, the JSON representation of ## Auction Slot Price -If successful, the transaction automatically outbids the previous slot owner and debits the bid price from the sender's LP Tokens. The price to win the auction decreases over time, divided into 20 intervals of 72 minutes each. If the sender does not have enough LP Tokens to win the bid, or the price of the bid is higher than the transaction's `BidMax` value, the transaction fails with a `tecAMM_FAILED_BID` result. +If successful, the transaction automatically outbids the previous slot owner and debits the bid price from the sender's LP Tokens. The price to win the auction decreases over time, divided into 20 intervals of 72 minutes each. If the sender does not have enough LP Tokens to win the bid, or the price of the bid is higher than the transaction's `BidMax` value, the transaction fails with a `tecAMM_INVALID_TOKENS` result. -- If the auction slot is currently empty, expired, or in its last interval, the **minimum bid** is **0.001% of the AMM's total LP Tokens balance**. +- If the auction slot is currently empty, expired, or in its last interval, the **minimum bid** is defined by the following formula: - **Caution:** This minimum value is a placeholder and may change before the AMM feature becomes finalized. + ```text + M = L * F / 25 + ``` + + - `M` is the minimum bid. + - `L` is the total number of LP Tokens currently issued by the AMM + - `F` is the trading fee, as a decimal - Otherwise, the price to outbid the current holder is calculated using the following formula: - ``` - P = B × 1.05 × (1 - t⁶⁰) + M + ```text + P = B * 1.05 * (1 - t^60) + M ``` - `P` is the price to outbid, in LP Tokens. @@ -95,24 +99,24 @@ If successful, the transaction automatically outbids the previous slot owner and There are two special cases for the cost to outbid someone. In the **first interval** after someone wins the bid, the price to outbid them is the minimum bid plus 5% more than the existing bid: - ``` - P = B × 1.05 + M + ```text + P = B * 1.05 + M ``` In the **last interval** of someone's slot, the cost to outbid someone is only the minimum bid: - ``` + ```text P = M ``` -**Note:** To make sure all servers in the network reach the same results when building a ledger, time measurements are based on the [official close time](../../../../concepts/ledgers/ledger-close-times.md) of the previous ledger, which is approximate. +{% admonition type="info" name="Note"%}To make sure all servers in the network reach the same results when building a ledger, time measurements are based on the [official close time](../../../../concepts/ledgers/ledger-close-times.md) of the previous ledger, which is approximate.{% /admonition %} ## Bid Refunds When you outbid an active auction slot, the AMM refunds the previous holder part of the price, using this formula: ```text -R = B × (1 - t) +R = B * (1 - t) ``` - `R` is the amount to refund, in LP Tokens. @@ -121,7 +125,7 @@ R = B × (1 - t) As a special case, during the final (20th) interval of the auction slot, the refunded amount is zero. -**Note:** As with all XRP Ledger times, transaction processing uses the [official close time](../../../../concepts/ledgers/ledger-close-times.md) of the _previous_ ledger, which can result in a difference of up to about 10 seconds from real time. +{% admonition type="info" name="Note"%}As with all XRP Ledger times, transaction processing uses the [official close time](../../../../concepts/ledgers/ledger-close-times.md) of the _previous_ ledger, which can result in a difference of up to about 10 seconds from real time.{% /admonition %} ## Error Cases diff --git a/docs/references/protocol/transactions/types/ammcreate.md b/docs/references/protocol/transactions/types/ammcreate.md index b8c62a1a66..a55d4cc9ea 100644 --- a/docs/references/protocol/transactions/types/ammcreate.md +++ b/docs/references/protocol/transactions/types/ammcreate.md @@ -9,7 +9,7 @@ labels: # AMMCreate [[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/AMMCreate.cpp "Source") -_(Requires the [AMM amendment][])_ +_(Added by the [AMM amendment][])_ Create a new [Automated Market Maker](../../../../concepts/tokens/decentralized-exchange/automated-market-makers.md) (AMM) instance for trading a pair of assets ([fungible tokens](../../../../concepts/tokens/index.md) or [XRP](../../../../introduction/what-is-xrp.md)). diff --git a/docs/references/protocol/transactions/types/ammdelete.md b/docs/references/protocol/transactions/types/ammdelete.md index 2f935773eb..ae427e4804 100644 --- a/docs/references/protocol/transactions/types/ammdelete.md +++ b/docs/references/protocol/transactions/types/ammdelete.md @@ -9,7 +9,7 @@ labels: # AMMDelete [[Source]](https://github.com/XRPLF/rippled/blob/develop/src/ripple/app/tx/impl/AMMDelete.cpp "Source") -_(Requires the [AMM amendment][])_ +_(Added by the [AMM amendment][])_ Delete an empty [Automated Market Maker](../../../../concepts/tokens/decentralized-exchange/automated-market-makers.md) (AMM) instance that could not be fully deleted automatically. diff --git a/docs/references/protocol/transactions/types/ammdeposit.md b/docs/references/protocol/transactions/types/ammdeposit.md index 612ab3ac99..448358e0eb 100644 --- a/docs/references/protocol/transactions/types/ammdeposit.md +++ b/docs/references/protocol/transactions/types/ammdeposit.md @@ -9,7 +9,7 @@ labels: # AMMDeposit [[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/AMMDeposit.cpp "Source") -_(Requires the [AMM amendment][])_ +_(Added by the [AMM amendment][])_ Deposit funds into an [Automated Market Maker](../../../../concepts/tokens/decentralized-exchange/automated-market-makers.md) (AMM) instance and receive the AMM's liquidity provider tokens (_LP Tokens_) in exchange. You can deposit one or both of the assets in the AMM's pool. diff --git a/docs/references/protocol/transactions/types/ammwithdraw.md b/docs/references/protocol/transactions/types/ammwithdraw.md index f70089b652..0d1f2d0d9a 100644 --- a/docs/references/protocol/transactions/types/ammwithdraw.md +++ b/docs/references/protocol/transactions/types/ammwithdraw.md @@ -9,7 +9,7 @@ labels: # AMMWithdraw [[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/AMMWithdraw.cpp "Source") -_(Requires the [AMM amendment][])_ +_(Added by the [AMM amendment][])_ Withdraw assets from an [Automated Market Maker](../../../../concepts/tokens/decentralized-exchange/automated-market-makers.md) (AMM) instance by returning the AMM's liquidity provider tokens (LP Tokens). diff --git a/docs/references/protocol/transactions/types/payment.md b/docs/references/protocol/transactions/types/payment.md index 007a3840bb..83e25e5771 100644 --- a/docs/references/protocol/transactions/types/payment.md +++ b/docs/references/protocol/transactions/types/payment.md @@ -88,7 +88,7 @@ For more information, see [Accounts](../../../../concepts/accounts/index.md#crea ## Paths -If present, the `Paths` field must contain a _path set_ - an array of path arrays. Each individual path represents one way value can flow from the sender to receiver through various intermediary accounts and order books. A single transaction can potentially use multiple paths, for example if the transaction exchanges currency using several different order books to achieve the best rate. +If present, the `Paths` field must contain a _path set_ - an array of path arrays. Each individual path represents one way value can flow from the sender to receiver through various intermediary accounts, order books, and automated market makers. A single transaction can potentially use multiple paths, for example if the transaction exchanges currency using several different order books to achieve the best rate. You must omit the `Paths` field for direct payments, including: diff --git a/docs/tutorials/javascript/trade-on-ledger/index.md b/docs/tutorials/javascript/trade-on-ledger/index.md new file mode 100644 index 0000000000..73dd4176c9 --- /dev/null +++ b/docs/tutorials/javascript/trade-on-ledger/index.md @@ -0,0 +1,9 @@ +--- +metadata: + indexPage: true +--- +# Trade On-Ledger + +Use the XRP Ledger's built-in Decentralized Exchange (DEX) to trade assets. + +{% child-pages /%} diff --git a/docs/tutorials/javascript/trade-on-ledger/use-amm-auction-slot-for-lower-fees.md b/docs/tutorials/javascript/trade-on-ledger/use-amm-auction-slot-for-lower-fees.md new file mode 100644 index 0000000000..4c86f8dc90 --- /dev/null +++ b/docs/tutorials/javascript/trade-on-ledger/use-amm-auction-slot-for-lower-fees.md @@ -0,0 +1,218 @@ +# Use the AMM Auction Slot for Lower Fees + +When trading on the XRP Ledger's decentralized exchange (DEX), you can sometimes save on trading fees by buying the auction slot built into an [Automated Market Maker (AMM)](../../../concepts/tokens/decentralized-exchange/automated-market-makers.md). This tutorial shows how to identify when the auction slot can save you money and what transactions to send to use it, with example code in JavaScript. + +For a simpler example of trading currencies in the XRP Ledger's DEX, see [Trade in the Decentralized Exchange](../../how-tos/use-tokens/trade-in-the-decentralized-exchange.md). + +{% admonition type="warning" name="Caution" %} +This tutorial does not exhaustively cover all possible market conditions and circumstances. Always exercise caution and trade at your own risk. +{% /admonition %} + +## Prerequisites + +- You need a connection to the XRP Ledger network. As shown in this tutorial, you can use public servers for testing. +- You should be familiar with basic usage of the [xrpl.js client library](https://github.com/XRPLF/xrpl.js/). See [Get Started Using JavaScript](../build-apps/get-started.md) for setup steps. +- The AMM for the asset pair you want to trade must already exist in the ledger. This tutorial uses an AMM instance that has been set up on the XRP Ledger Testnet in advance, connecting the following assets: + + | Currency Code | Issuer | Notes | + |---|---|---| + | XRP | N/A | Testnet XRP is functionally similar to XRP, but holds no real-world value. You can get it for free from a [faucet](/resources/dev-tools/xrp-faucets). + | TST | `rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd` | A test token pegged to XRP at a rate of approximately 10 XRP per 1 TST. The issuer has existing Offers on the XRP Ledger Testnet to buy and sell these tokens. This token has no [transfer fee](../../../concepts/tokens/transfer-fees.md) or [Tick Size](../../../concepts/tokens/decentralized-exchange/ticksize.md) set. | + + For instructions on creating an AMM for a different currency pair, see [Create an Automated Market Maker](../../how-tos/use-tokens/create-an-automated-market-maker.md). + +## Source Code + +See {% repo-link path="_code-samples/auction-slot/js/" %}Code Samples: Auction Slot{% /repo-link %} for the full source code for this tutorial. + + +## Steps + +At a high level, the steps involved in using an AMM auction slot to save money on trading are as follows: + +- **Step 1:** Connect to the ledger so can query the current state. +- **Steps 2-4:** Estimate how much your desired trade would cost in AMM trading fees. +- **Step 5:** Compare against the cost to win the current auction slot. +- **Steps 6-7:** If winning the auction slot is cheaper, use AMMDeposit to acquire some LPTokens and then use AMMBid to spend those tokens on winning the auction slot. +- **Step 8:** Make the intended trade using an OfferCreate transaction. + +For simplicity, this tutorial assumes that you have XRP, you want to acquire a fixed amount of TST in a single trade, and that the entire trade will execute using the AMM. Real-life situations are more complicated. For example, part of your trade may execute by consuming Offers rather than using the AMM, or you may want to do a series of trades over a period of time. If one or both of the assets you are trading has a transfer fee or tick size set, those details can also affect the calculations. + +### 1. Setup + +For this use case, you need a high-precision number library such as [Bignumber.js](https://mikemcl.github.io/bignumber.js/) for correctly performing calculations on currency amounts you may find in the ledger. + +The following `package.json` file lists the necessary dependencies: + +{% code-snippet file="/_code-samples/auction-slot/js/package.json" language="json" /%} + +After copying this file, run `npm install` from the same folder to download the appropriate dependencies. + +Start your JavaScript file with the following code to import dependencies: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" before="async function main()" /%} + +You should also create the `amm-formulas.js` file, which defines several AMM-related helper functions. See the [Appendix](#appendix-amm-formulas) for the implementations of these functions. + +After that, you should connect to the network and set up a `Wallet` instance in the usual way. For example: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="async function main()" before="// Look up AMM status" /%} + + +### 2. Look Up AMM Status + +To determine if your trade could benefit from the reduced fees of the AMM auction slot, you must first look up the current state of the AMM. To get the latest information, use the `amm_info` method and query the `current` (pending) ledger version. + +{% admonition type="warning" name="Caution" %}The `current` ledger incorporates recently-sent transactions that are likely to be confirmed; it is the most up-to-date picture of the ledger state, but the details may change when the ledger is validated. You can also use the `validated` ledger, which returns only the latest confirmed data.{% /admonition %} + +The following code snippet reads the `amm_info` result and saves some of the details for later use: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Look up AMM status" before="// Calculate price in XRP" /%} + + +### 3. Estimate the cost of AMM trading fees + +This tutorial shows how to estimate the cost, in XRP, to buy a fixed amount of TST using the AMM. The calculations are different for other types of trades, such as a "sell" trade that buys as much TST as possible with a fixed amount of XRP, or for assets with other complications such as transfer fees. + +First, define the target amount of TST and check that the AMM can even fulfill the trade: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Calculate price in XRP" before="// Use AMM's SwapOut formula" /%} + +Then, you use the AMM _SwapOut_ formula to calculate how much XRP you need to pay to receive the target amount of TST out. See [SwapOut in the Appendix](#swapout) for the implementation of this formula. + +To estimate the cost of trading fees, call SwapOut twice: once with the full fee, and once with the discounted fee of the auction slot. The difference between the two represents the maximum possible savings from the auction slot for this trade. The actual savings will be less because of the costs of winning the auction slot. + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Use AMM's SwapOut formula" before="// Calculate the cost of winning" /%} + +{% admonition type="info" name="Note" %}For illustrative purposes, this code assumes that the entire trade will execute using the AMM and not by consuming Offers. In reality, a trade can use both in combination to achieve a better rate.{% /admonition %} + + +### 4. Calculate the cost of winning the auction slot + +The cost to win the auction slot depends on how long the current holder has held it and how much they paid, but it's always denominated in LP tokens. If you currently only have XRP and you want to win the auction slot, you must first deposit some of your XRP to get LP Tokens. + +The price of winning the auction slot is defined in XLS-0030 section 4.1.1. However, the minimum bid scales with the number of LP Tokens issued. If you calculate the auction price and _then_ deposit exactly enough to pay for it, the auction price increases proportionally to the new LP Tokens you gained. + +This is similar to cases where you want to deliver exactly $100 after subtracting a 3% fee. If you calculate $100 + (0.03 * $100) = $103, only $99.91 will arrive because the extra $3 is also subject to the fee. Instead, you divide 100 ÷ 0.97 ≈ $103.10 (rounding up to make sure). + +The _AuctionDeposit_ formula represents the inverted form of the auction price formula so that you can calulate how much to deposit to match the auction price. See [Appendix: AuctionDeposit](#auctiondeposit) for the implementation. + +You use the function like this: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Calculate the cost of winning the auction slot" before="// Calculate how much XRP to deposit" /%} + + +### 5. Compare the costs and savings + +The previous step gives a cost for the auction slot in the form of LP Tokens. To compare against your potential savings, you need to convert this to the XRP cost of the deposit. If the XRP cost of making the deposit and winning the auction slot is greater than your savings, then you should not go through with it. + +You use the AMM _AssetIn_ formula to estimate how much XRP you have to deposit to receive the target amount of TST. See [Appendix: AssetIn](#assetin) for the implementation. + +The following code uses AssetIn to estimate the cost of the deposit: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Calculate how much XRP to deposit" before="// Optional. Allow for costs" /%} + +Since the XRP Ledger's decentralized exchange is always open to other traders using it too, new transactions can change the current state at the same time that you are doing these calculations and sending your own transactions. You should allow for some amount of _slippage_, the change in rates between when you checked them and when your transaction executes. The following example allows up to 1% slippage: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Optional. Allow for costs" before="// Compare price of deposit+bid" /%} + +Finally, you take the slippage-adjusted cost in XRP, add the transaction costs in XRP burned for sending two transactions, and compare that total to the potential savings calculated back in step 3. If the total cost is higher than the savings, you won't save money using the auction slot, so you stop here. + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Compare price of deposit+bid" before="// Do a single-asset deposit" /%} + +{% admonition type="success" name="Tip" %} You may still be able to save money if you plan to do additional trades for a larger total amount. Also, if the auction slot is currently occupied, the cost of outbidding the current slot holder decreases over 24 hours, so you can wait and try again later.{% /admonition %} + + +### 6. Send an AMMDeposit transaction to get LP Tokens + +Assuming you determined that you could make money, it's now time to send actual transactions to the XRP Ledger, starting with an [AMMDeposit transaction][] to get the LP Tokens that you'll bid on the auction slot. + +The "One Asset LP Token" deposit type is most convenient here since you can specify exactly how many LP Tokens you want to receive, and you only need to deposit XRP. The following code creates and sends the transaction: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Do a single-asset deposit" before="// Actually bid" /%} + +After the transaction is (or isn't) confirmed by the consensus process, the code displays the results to the console. + + +### 7. Send an AMMBid transaction to win the auction slot + +Assuming the previous transaction was successful, the next step is to use the LP Tokens to bid on the auction slot. To do this, you send an [AMMBid transaction][] with the slippage-adjusted bid amount you calculated earlier in the `BidMax` field, as in the following code: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Actually bid" before="// Trade using the discount" /%} + +{% admonition type="success" name="Tip" %}The amounts that LP Tokens get rounded can be surprising. If you don't plan on holding LP Tokens after bidding, you should set `BidMin` to the same as `BidMax` so that you aren't left with a trust line that contains a very tiny amount of LP Tokens that weren't spent on the auction price, and you don't have to meet the XRP reserve for that trust line.{% /admonition %} + + +### 8. Trade using the discount + +If your previous transaction was successful, you should now be the auction slot holder until you are outbid or 24 hours have passed, whichever comes first. You can immediately use this opportunity to make the XRP for TST trade that you wanted to make in the first place. There are several ways to make trades in the XRP Ledger, but sending an OfferCreate transaction is the most conventional, as in the following code: + +{% code-snippet file="/_code-samples/auction-slot/js/auction-slot.js" language="js" from="// Trade using the discount" before="// Done" /%} + +{% admonition type="success" name="Tip" %}If you are outbid before the auction slot expires, you'll get some of your LP Tokens refunded based on how much time you had left. You can use an [AMMWithdraw transaction][] to convert those to additional XRP, TST, or both as desired.{% /admonition %} + + +## Appendix: AMM Formulas + +The above sample code shows how to use various AMM-related formulas in a particular workflow. Your code must also have implementations of those formulas, which can be in the same file or imported from a separate one as you desire. + +The file {% repo-link path="_code-samples/auction-slot/js/amm-formulas.js" %}`amm-formulas.js`{% /repo-link %} contains the source code for all these formulas. + +### AssetIn + +The _AssetIn_ formula calculates how much of an asset must be deposited to receive a target amount of LP Tokens. + +The following function implements AssetIn in JavaScript: + +{% code-snippet file="/_code-samples/auction-slot/js/amm-formulas.js" language="js" from="/* Implement the AMM single-asset deposit" before="/* Calculate how much to deposit" /%} + +This function depends on the `feeMult`, `feeMultHalf`, and `solveQuadraticEq` helper functions. + +### AuctionDeposit + +The _AuctionDeposit_ function is an inverted form of the formula for the AMM's auction price, taking into account how the minimum bid value changes as LP Tokens are issued. AuctionDeposit calculates the total amount of LP Tokens you need to receive in a deposit if you want to match the auction price: + +{% code-snippet file="/_code-samples/auction-slot/js/amm-formulas.js" language="js" from="/* Calculate how much to deposit" before="/* Calculate the necessary bid" /%} + +### AuctionPrice + +The _AuctionPrice_ function calculates the cost of the auction slot for current LP Token holders. **It is not used in this tutorial,** which assumes the user does not hold LP Tokens, but is presented here for completeness: + +{% code-snippet file="/_code-samples/auction-slot/js/amm-formulas.js" language="js" from="/* Calculate the necessary bid" before="module.exports =" /%} + + +### SwapOut + +The _SwapOut_ formula, defined in the XRPL-0030 specification as formula 10, calculates how much of one asset you have to swap in to the AMM to receive a target amount of the other asset out from the AMM. + +The following function implements SwapOut in JavaScript: + +{% code-snippet file="/_code-samples/auction-slot/js/amm-formulas.js" language="js" from="/* Implement the AMM SwapOut formula" before="/* Compute the quadratic formula" /%} + +### feeDecimal, feeMult, and feeMultHalf + +These helper functions are used in other AMM formulas to convert from a trading fee value in the ledger (integer from 0 to 1000) to a decimal representation that can be multiplied by a total to apply the fee. + +The following functions implement `feeMult`, `feeMultHalf`, and `feeDecimal` in JavaScript: + +{% code-snippet file="/_code-samples/auction-slot/js/amm-formulas.js" language="js" from="/* Convert a trading fee to a value that" before="/* Implement the AMM SwapOut formula" /%} + +The AssetIn and SwapOut functions depend on these helper functions. + +### solveQuadraticEq + +This helper function implements the quadratic equation in JavaScript: + +{% code-snippet file="/_code-samples/auction-slot/js/amm-formulas.js" language="js" from="/* Compute the quadratic formula." before="/* Implement the AMM single-asset deposit" /%} + +The AssetIn formula depends on this. + + +## Conclusion + +Trading assets is never risk-free, and Automated Market Makers are no exception. However, the XRP Ledger's fast, low-cost transactions can be helpful in reducing the costs and fees associated with currency exchange. This tutorial demonstrates a minimal approach to using the auction slot to save money, but of course more creative uses are possible. + +The details depend on your specific circumstances and the types of trades you are doing, or expect to do in the future, as well as the state of the market, the XRP Ledger network, and the AMM instances in particular. See the [Code Samples](/resources/code-samples) for additional related use cases, and feel free to contribute your own samples as well to show the community what can be done on the XRP Ledger. + + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/tutorials/public-servers.md b/docs/tutorials/public-servers.md index 6c74dea592..6f302d19c7 100644 --- a/docs/tutorials/public-servers.md +++ b/docs/tutorials/public-servers.md @@ -10,22 +10,32 @@ labels: If you don't [run your own `rippled` server](../infrastructure/installation/index.md), you can use the following public servers to submit transactions or read data from the ledger. +## Mainnet + | Operator | [Network][] | JSON-RPC URL | WebSocket URL | Notes | |:----------|:------------|:-------------|:--------------|:---------------------| | XRP Ledger Foundation | **Mainnet** | `https://xrplcluster.com/`
`https://xrpl.ws/` [²][] | `wss://xrplcluster.com/`
`wss://xrpl.ws/` [²][] | Full history server cluster with CORS support. | | Ripple[¹][] | **Mainnet** | `https://s1.ripple.com:51234/` | `wss://s1.ripple.com/` | General purpose server cluster | | Ripple[¹][] | **Mainnet** | `https://s2.ripple.com:51234/` | `wss://s2.ripple.com/` | [Full-history server](../concepts/networks-and-servers/ledger-history.md#full-history) cluster | + +## Test Networks + +| Operator | [Network][] | JSON-RPC URL | WebSocket URL | Notes | +|:----------|:------------|:-------------|:--------------|:---------------------| | Ripple[¹][] | Testnet | `https://s.altnet.rippletest.net:51234/` | `wss://s.altnet.rippletest.net:51233/` | Testnet public server | | XRPL Labs | Testnet | `https://testnet.xrpl-labs.com/` | `wss://testnet.xrpl-labs.com/` | Testnet public server with CORS support | +| Ripple[¹][] | Testnet (Clio) | `https://clio.altnet.rippletest.net:51234/` | `wss://clio.altnet.rippletest.net:51233/` | Testnet public server with Clio | | Ripple[¹][] | Devnet | `https://s.devnet.rippletest.net:51234/` | `wss://s.devnet.rippletest.net:51233/` | Devnet public server | +| Ripple[¹][] | Devnet (Clio) | `https://clio.devnet.rippletest.net:51234/` | `wss://clio.devnet.rippletest.net:51233/` | Devnet public server with Clio | | Ripple[¹][] | Sidechain-Devnet | `https://sidechain-net2.devnet.rippletest.net:51234/` | `wss://sidechain-net2.devnet.rippletest.net:51233/` | Sidechain Devnet to test cross-chain bridge features. Devnet serves as the locking chain while this sidechain serves as the issuing chain. | | XRPL Labs | Xahau Testnet | `https://xahau-test.net/` | `wss://xahau-test.net/` | [Hooks-enabled](https://hooks.xrpl.org/) Xahau Testnet | + [Network]: ../concepts/networks-and-servers/parallel-networks.md [¹]: #footnote-1 [²]: #footnote-2 -¹ Ripple's public servers are not for sustained or business use, and they may become unavailable at any time. For regular use, you should run your own `rippled` server or contract someone you trust to do so. Ripple includes [Reporting Mode][] servers in its public clusters. +¹ Ripple's public servers are not for sustained or business use, and they may become unavailable at any time. For regular use, you should [run your own `rippled` server](../concepts/networks-and-servers/index.md) or contract someone you trust to do so. Ripple includes [Clio servers](../concepts/networks-and-servers/the-clio-server.md) (the successor to [Reporting Mode][]) in its public clusters. ² `xrpl.ws` is an alias for `xrplcluster.com`. However, the `.ws` top-level domain's reliability may be unsuitable for production uses. diff --git a/docs/tutorials/python/build-apps/build-a-desktop-wallet-in-python.md b/docs/tutorials/python/build-apps/build-a-desktop-wallet-in-python.md index e3d586e773..8f891c63df 100644 --- a/docs/tutorials/python/build-apps/build-a-desktop-wallet-in-python.md +++ b/docs/tutorials/python/build-apps/build-a-desktop-wallet-in-python.md @@ -443,7 +443,7 @@ You can now use your wallet to send XRP! You can even fund an entirely new accou **Full code for this step:** {% repo-link path="_code-samples/build-a-desktop-wallet/py/6_verification_and_polish.py" %}`6_verification_and_polish.py`{% /repo-link %} -One of the biggest shortcomings of the wallet app from the previous step is that it doesn't provide a lot of protections or feedback for users to save them from human error and scams. These sorts of protections are extra important when dealing with the cryptocurrency space, because decentralized systems like the XRP Ledger don't have an admin or support team you can ask to cancel or refund a payment if you made a mistake such as sending it to the wrong address. This step shows how to add some checks on destination addresses to warn the user before sending. +One of the biggest shortcomings of the wallet app from the previous step is that it doesn't provide a lot of protections or feedback for users to save them from human error and [DeFi scams](https://learn.xrpl.org/safeguarding-your-crypto-wallet-your-essential-checklist-against-defi-scams/). These sorts of protections are extra important when dealing with the cryptocurrency space, because decentralized systems like the XRP Ledger don't have an admin or support team you can ask to cancel or refund a payment if you made a mistake such as sending it to the wrong address. This step shows how to add some checks on destination addresses to warn the user before sending. One type of check you can make is to verify the domain name associated with an XRP Ledger address; this is called [account domain verification](../../../references/xrp-ledger-toml.md#account-verification). When an account's domain is verified, you could show it like this: diff --git a/docs/use-cases/tokenization/index.md b/docs/use-cases/tokenization/index.md deleted file mode 100644 index 9faf692f08..0000000000 --- a/docs/use-cases/tokenization/index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -html: tokenization.html -parent: use-cases.html -top_nav_grouping: Article Types -metadata: - indexPage: true -seo: - description: Work with a variety of tokens supported by the XRP Ledger. ---- -# Tokenization - -Work with a variety of tokens supported by the XRP Ledger. - - -{% child-pages /%} diff --git a/docs/use-cases/tokenization/index.page.tsx b/docs/use-cases/tokenization/index.page.tsx new file mode 100644 index 0000000000..1cd1ac1a01 --- /dev/null +++ b/docs/use-cases/tokenization/index.page.tsx @@ -0,0 +1,391 @@ +import React, { useRef, useState } from "react"; +import { useTranslate } from "@portal/hooks"; +import { NavList } from "shared/components/nav-list"; +import { Link } from '@portal/Link'; + +const { translate } = useTranslate(); + +export const frontmatter = { + seo: { + title: "Tokenization", + description: + "Explore the possibilities of tokenization on the XRP Ledger, revolutionizing ownership, transactions, and value exchange with unparalleled efficiency and security.", + }, +}; + +const useCases = [ + { + description: "Stablecoin Issuer", + link: "/docs/use-cases/tokenization/stablecoin-issuer/", + }, + { + description: "NFT Marketplace", + link: "/docs/use-cases/tokenization/nftoken-marketplace/", + }, + { + description: "Authorized Minter", + link: "/docs/use-cases/tokenization/authorized-minter/", + }, + { + description: "Digital Artist", + link: "/docs/use-cases/tokenization/digital-artist/", + }, +]; + +const securityAdvantages = [ + { + id: "trustlines", + title: "Trust Lines & Authorized Trust Lines", + description: ( + <> +
{translate("Trust Lines:")}
+
+ {translate("No spamming of wallets without permission.")} +
+
{translate("Authorized Trustlines:")}
+
+ {translate( + "Control who can hold your tokens with allowlisting." + )} +
+ + ), + }, + { + id: "freeze-clawbacks", + title: "Freeze & Clawbacks", + description: ( + <> +
{translate("Freeze:")}
+
+ {translate( + "If you see signs of suspicious activity, you can suspend trading of your token while investigating the issue." + )} +
+
{translate("Clawback:")}
+
+ {translate( + "Recover tokens distributed to accounts in error: for example, reclaim funds sent to an account sanctioned for illegal activity." + )} +
+ + ), + }, + { + id: "ntf-tokens", + title: "Non-transferable Tokens", + description: ( + <> +
{translate("Transferable flag:")}
+ {translate( + "Native support for nontransferable items such as identity tokens, airline credits, and consumer rewards, honored by all on-chain participants." + )} + + ), + }, + { + id: "royalties", + title: "Royalties", + subtitle: "Secures Creator Compensation:", + description: ( + <> +
{translate("NFT Transfer Fees:")}
+ {translate( + "Reliably collect your percentage of the sale price of your tokens." + )} + + ), + }, +]; + +const stats = [ + { + id: "nfts-minted", + stat: "20K", + description: "NFTs minted", + }, + { + id: "nft-trading-vol", + stat: "~1000", + description: "NFT trading volume", + }, + { + id: "network-speed", + stat: "4", + description: "Seconds to confirmation", + }, + { + id: "fee-per-tx", + stat: "$0.001", + description: "Avg fee per NFT tx", + }, +]; + +const projects = [ + { + id: "xrpcafe", + label: "XRP cafe", + url: "https://xrp.cafe", + }, + { + id: "onXRP", + label: "onXRP", + url: "https://nft.onxrp.com", + }, + { + id: "xaman", + label: "Xaman labs", + url: "https://github.com/XRPL-Labs/Xaman-App", + }, + { + id: "amy", + label: "amy.network", + url: "https://token.amy.network", + }, + { + id: "sologenic", + label: "Sologenic", + url: "https://sologenic.org/trade", + }, + { + id: "carbonland", + label: "Carbonland trust", + url: "https://www.carbonlandtrust.com", + }, + { + id: "nautilus", + label: "Nautilus wallet", + url: "https://github.com/nautls/nautilus-wallet", + }, + { + id: "evernode", + label: "Evernode", + url: "https://evernode.org", + }, + { + id: "raised-in-space", + label: "Raised in space", + url: "https://raisedinspace.com", + }, +]; + +const articles = [ + { + time: "NOV 2023", + title: "NFTs and the XRPL: A Marriage of Art and Technology", + url: "https://medium.com/@MariaSolorzano/title-nfts-and-the-xrpl-a-marriage-of-art-and-technology-cf76a0432693", + }, + // TODO: Add more articles that aren't focused on price speculation +]; + +const FeaturedProjects = () => { + const [currentIndex, setCurrentIndex] = useState(0); + + const handlePrev = () => { + if (currentIndex > 0) { + setCurrentIndex(currentIndex - 1); + } + }; + + const handleNext = () => { + if (currentIndex < projects.length - 3) { + setCurrentIndex(currentIndex + 1); + } + }; + + const ProjectCard = ({ project, index }) => ( + +
+ {project.label} +
+
{project.label}
+
+ ); + + return ( +
+
+ + + +
+
+ + +
+
+ ); +}; + +export default function Tokenization() { + const modalRef = useRef(null); + + return ( +
+
+
+
+
+
+ +
+
+
+ +

+ {translate( + "Work with a variety of tokens supported by the XRP Ledger." + )} +

+
+ {translate("Tokenization")} +
+
+

+ {translate( + "Explore the possibilities of tokenization on the XRP Ledger, revolutionizing ownership, transactions, and value exchange with unparalleled efficiency and security." + )} +

+ +
+
+
+
+

+ {translate( + "Check out the security features you can tap into right from the chain without the hassle of piecing together smart contracts." + )} +

+

{translate("Security advantages")}

+
+
+ {securityAdvantages.map((advantage) => ( +
+
+

{translate(advantage.title)}

+
{advantage.description}
+
+
+ ))} +
+
+ +
+
+

{translate("Stats")}

+
+
+ {stats.map((statElement) => ( +
+
{statElement.stat}
+
{translate(statElement.description)}
+
+ ))} +
+
+
+
+

+ {translate("Featured real world projects")} +

+
+
+ +
+
+ +
+
+

{translate("Related Articles")}

+
+
+ {articles.map((article, index) => ( + +
+
+

+ {translate("More related articles")} +

+
+ +
{translate("November 2023")}
+
+
+
+ ); +} diff --git a/index.page.tsx b/index.page.tsx index 9037f85ce6..744a65953f 100644 --- a/index.page.tsx +++ b/index.page.tsx @@ -1,4 +1,5 @@ -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; +import { Link } from '@redocly/theme/components/Link/Link'; export const frontmatter = { seo: { @@ -90,19 +91,20 @@ const features = [ title: 'Smart Contracts', description: <> - Hooks are small, efficient WebAssembly modules designed specifically for the XRPL. Check out the hooks amendment and public testnet that enable smart contract functionality., + Hooks are small, efficient WebAssembly modules designed specifically for the XRPL. Check out the hooks amendment and public testnet that enable smart contract functionality. , href: 'https://hooks-testnet.xrpl-labs.com/', }, { - chip: 'Open for Voting', + chip: 'Enabled', title: 'Automated Market Makers', description: "Smart contracts to provide liquidity and earn passive income from facilitating currency exchange, complementary with the order-book DEX already built into the XRPL.", - href: '/concepts/tokens/decentralized-exchange/automated-market-makers/', + href: '/docs/concepts/tokens/decentralized-exchange/automated-market-makers/', }, ]; export default function Index() { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); return ( @@ -110,20 +112,20 @@ export default function Index() {
- X + (stylized X graphic surrounded by a diverse mix of people)

- {translate('The Blockchain')} + {translate('home.hero.h1part1', 'The Blockchain')}
- {translate('Built for Business')} + {translate('home.hero.h1part2', 'Built for Business')}

{translate('XRPL | XRP Ledger')}
- + {translate('Start Building')} - +
@@ -154,8 +156,10 @@ export default function Index() { {cards.map(card => (
  • {card.title -

    {card.title}

    -

    {card.description}

    +

    {translate(card.title)}

    +

    + {typeof card.description === 'string' ? translate(card.description) : card.description} +

  • ))} @@ -171,13 +175,13 @@ export default function Index() {
    @@ -188,13 +192,13 @@ export default function Index() {
    @@ -209,9 +213,9 @@ export default function Index() { "Together, we're building the greenest infrastructure to drive blockchain innovation that doesn't sacrifice utility or performance, to bring the developer community's vision to life." )}

    - + {translate('Learn More')} - +
    @@ -225,11 +229,13 @@ export default function Index() {
      {features.map(feat => (
    • - - {feat.chip} - -

      {feat.title}

      -

      {feat.description}

      + + {translate(feat.chip)} + +

      {translate(feat.title)}

      +

      + {typeof feat.description === 'string' ? translate(feat.description) : feat.description} +

    • ))}
    @@ -250,9 +256,9 @@ export default function Index() {
    {translate(' and entrepeneurs who rely on the XRPL.')}

    - + {translate('Get Involved')} - +
    diff --git a/package-lock.json b/package-lock.json index 67fcf22c79..92333488b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,10 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@codemirror/state": "6.3.3", + "@codemirror/state": "6.4.1", "@codemirror/view": "^6.22.2", "@lezer/highlight": "^1.2.0", - "@redocly/realm": "^0.78.6", + "@redocly/realm": "0.86.0", "@uiw/codemirror-themes": "4.21.21", "@uiw/react-codemirror": "^4.21.21", "@xrplf/isomorphic": "^1.0.0-beta.1", @@ -117,11 +117,11 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -249,17 +249,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } @@ -496,18 +496,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.1.tgz", - "integrity": "sha512-T9ko/35G+Bkl+win48GduaPlhSlOjjE5s1TeiEcD+QpxlLQnoEfb/nO/T+TQqkm+ipFwORn+rB8w14iJ/uD0bg==", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -542,12 +530,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -575,9 +563,9 @@ } }, "node_modules/@codemirror/autocomplete": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.11.1.tgz", - "integrity": "sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.0.tgz", + "integrity": "sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -602,6 +590,48 @@ "@lezer/common": "^1.1.0" } }, + "node_modules/@codemirror/lang-css": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", + "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz", + "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", + "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, "node_modules/@codemirror/lang-json": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz", @@ -611,6 +641,19 @@ "@lezer/json": "^1.0.0" } }, + "node_modules/@codemirror/lang-xml": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/xml": "^1.0.0" + } + }, "node_modules/@codemirror/language": { "version": "6.9.3", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.9.3.tgz", @@ -625,9 +668,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.2.tgz", - "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.0.tgz", + "integrity": "sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -645,9 +688,9 @@ } }, "node_modules/@codemirror/state": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.3.3.tgz", - "integrity": "sha512-0wufKcTw2dEwEaADajjHf6hBy1sh3M6V0e+q4JKIhLuiMSe5td5HOWpUdvKth1fT1M9VYOboajoBHpkCd7PG7A==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" }, "node_modules/@codemirror/theme-one-dark": { "version": "6.1.2", @@ -661,11 +704,11 @@ } }, "node_modules/@codemirror/view": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.22.3.tgz", - "integrity": "sha512-rqnq+Zospwoi3x1vZ8BGV1MlRsaGljX+6qiGYmIpJ++M+LCC+wjfDaPklhwpWSgv7pr/qx29KiAKQBH5+DOn4w==", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.3.tgz", + "integrity": "sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==", "dependencies": { - "@codemirror/state": "^6.1.4", + "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } @@ -755,14 +798,14 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", + "@emotion/serialize": "^1.1.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", @@ -778,9 +821,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -843,26 +886,34 @@ "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" }, "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@hookstate/core": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@hookstate/core/-/core-4.0.1.tgz", + "integrity": "sha512-Uh2D8Z0z/pqOJ7t+SfC+2sj13JQcB4yFhtL+T1choCaBxTSlgOS/CKRBohgJ4cjTKoxOmTT8uSQysu3gUjX+Gw==", + "peerDependencies": { + "react": "^16.8.6 || ^17.0.0 || ^18.0.0" + } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -1682,6 +1733,16 @@ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" }, + "node_modules/@lezer/css": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.8.tgz", + "integrity": "sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, "node_modules/@lezer/highlight": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", @@ -1690,6 +1751,26 @@ "@lezer/common": "^1.0.0" } }, + "node_modules/@lezer/html": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", + "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.17.tgz", + "integrity": "sha512-bYW4ctpyGK+JMumDApeUzuIezX01H76R1foD6LcRX224FWfyYit/HYxiPGDjXXe/wQWASjCvVGoukTH68+0HIA==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, "node_modules/@lezer/json": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.2.tgz", @@ -1708,6 +1789,16 @@ "@lezer/common": "^1.0.0" } }, + "node_modules/@lezer/xml": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.5.tgz", + "integrity": "sha512-VFouqOzmUWfIg+tfmpcdV33ewtK+NSwd4ngSe1aG7HFb4BN0ExyY1b8msp+ndFrnlG4V4iC8yXacjFtrwERnaw==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, "node_modules/@markdoc/markdoc": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.4.0.tgz", @@ -1753,6 +1844,43 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.0.tgz", + "integrity": "sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@redocly/ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", @@ -1769,21 +1897,29 @@ } }, "node_modules/@redocly/config": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.1.4.tgz", - "integrity": "sha512-OEdCW1HRpFiZaZNrXQq8LoBxX3APijZaa/Xyoc6r44LnyAPWkjQqvPoBxE7IRqSvMihf8bl+ZRc1gtc1KuFLHw==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.0.tgz", + "integrity": "sha512-hNVN3eTxFj2nHYX0gGzZxxXwdE0DXWeWou1TIK3HYf0S9VKVxTxjO9EZbMB7iVUqaHkeqy4PSjlBQcEgD0Ftjg==" + }, + "node_modules/@redocly/fuse.js": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@redocly/fuse.js/-/fuse.js-7.0.1.tgz", + "integrity": "sha512-phBylt7PvZaAtlfokc37DXCA6Gq7H8/JuXeXWna9afY82wrsA/6l4zhVIE+cEiU7jpRchpDSOmv8eQxlumGPaQ==", + "engines": { + "node": ">=10" + } }, "node_modules/@redocly/graphql-docs": { - "version": "0.6.39", - "resolved": "https://registry.npmjs.org/@redocly/graphql-docs/-/graphql-docs-0.6.39.tgz", - "integrity": "sha512-7zTIbo9RAOJIJM9//yHUzVr1XyXSrCFAF5/Po91QyQ006FDaDpd3BrnUSXdz2Aaa8OXCt7GZDPrqp3VmaBh9Ug==", + "version": "0.6.41", + "resolved": "https://registry.npmjs.org/@redocly/graphql-docs/-/graphql-docs-0.6.41.tgz", + "integrity": "sha512-TG943amqMXyh6GvKcNytgvAEKfQiHN2Hex2VbsDoGvhk/82HaZ/bopJqi5MUYSiSSl4u8MRRM+FM6j2kJZAW/Q==", "dependencies": { "deepmerge": "^4.2.2", "history": "^4.10.1", "marked": "^4.0.15" }, "peerDependencies": { - "@redocly/theme": "^0.35.0", + "@redocly/theme": "^0.37.0", "graphql": "^15.6.1", "prismjs": "^1.25.0", "react": "^17.0.0 || ^18.0.0", @@ -1793,16 +1929,16 @@ } }, "node_modules/@redocly/mock-server": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@redocly/mock-server/-/mock-server-0.0.8.tgz", - "integrity": "sha512-tORb6E8TM4EFt7AEJMAmE5D+fpMy35dY9m7pMagR42ZWjhWd3xN7a3iKaoA1Akjzuaq4ClYdoeIK19dd7HU6gA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@redocly/mock-server/-/mock-server-0.1.0.tgz", + "integrity": "sha512-C0K8GpN+Zdi9i+P8zCBuO6AnRuVnT+76c3PQQSVYWsAdXhjyi3E4GhfiQgWcjdlreQYcPTE2drrjOhiCdRrSEg==", "dependencies": { "@redocly/ajv": "8.6.4", - "@redocly/openapi-core": "^1.0.0-rc.1", + "@redocly/openapi-core": "1.12.2", "ajv": "8.6.3", "ajv-formats": "^2.1.1", "js-yaml": "^4.1.0", - "openapi-sampler": "1.2.3", + "openapi-sampler": "1.5.1", "punycode": "2.3.0", "swagger2openapi": "^7.0.8", "ts-node": "^10.9.1", @@ -1824,22 +1960,18 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@redocly/mock-server/node_modules/openapi-sampler": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.2.3.tgz", - "integrity": "sha512-dH2QYXqakorV5dxkP/f1BV3Ku4yNn21YmBsqJunnyrHLw7mnCNZZldftgrEpv/66b1m5oaUAmiJoJN+FqBEkJg==", - "dependencies": { - "@types/json-schema": "^7.0.7", - "json-pointer": "0.6.2" - } + "node_modules/@redocly/mock-server/node_modules/@redocly/config": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.5.0.tgz", + "integrity": "sha512-oA1ezWPT2tSV9CLk0FtZlViaFKtp+id3iAVeKBme1DdP4xUCdxEdP8umB21iLKdc6leRd5uGa+T5Ox4nHBAXWg==" }, - "node_modules/@redocly/openapi-core": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.10.4.tgz", - "integrity": "sha512-GzvAuoVtHk75q/HqaRNqRUTZWYKpZ16HCOWIrx2txAvZrMoWCUNRVsELY91W/ilH/Cepj6t/Nh+bpJ7o/mcN/g==", + "node_modules/@redocly/mock-server/node_modules/@redocly/openapi-core": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.12.2.tgz", + "integrity": "sha512-dImBZaKws54a4/QdoAVsLDm4/gfVnzAVD68pSGFPMTLNM2AZINvevfUfOrbUNTXwHvG2UJkthUxDGQZLsp3Vaw==", "dependencies": { "@redocly/ajv": "^8.11.0", - "@redocly/config": "^0.1.1", + "@redocly/config": "^0.5.0", "colorette": "^1.2.0", "js-levenshtein": "^1.1.6", "js-yaml": "^4.1.0", @@ -1854,6 +1986,82 @@ "npm": ">=7.0.0" } }, + "node_modules/@redocly/mock-server/node_modules/@redocly/openapi-core/node_modules/@redocly/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/mock-server/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/@redocly/mock-server/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@redocly/mock-server/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@redocly/openapi-core": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.13.0.tgz", + "integrity": "sha512-lPvVE4+QjWMXCEIui994pYBZGqvEsodaCJPCJLkx6RK3OL/6Ss8wN17YTDmF49tzw3xgA8t4+x7TqelUSRcZUQ==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.5.0", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/@redocly/config": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.5.0.tgz", + "integrity": "sha512-oA1ezWPT2tSV9CLk0FtZlViaFKtp+id3iAVeKBme1DdP4xUCdxEdP8umB21iLKdc6leRd5uGa+T5Ox4nHBAXWg==" + }, "node_modules/@redocly/openapi-core/node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", @@ -1890,39 +2098,28 @@ } }, "node_modules/@redocly/openapi-docs": { - "version": "3.0.0-alpha.88", - "resolved": "https://registry.npmjs.org/@redocly/openapi-docs/-/openapi-docs-3.0.0-alpha.88.tgz", - "integrity": "sha512-hi5kZmvgB5WXvQJxc0dlBp8xDLzTIGeY7yuTqvRa2/rQ8MLILDo/1A5+0532jQM9NCr0H3Z3XuYovSwe0/VHfg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@redocly/openapi-docs/-/openapi-docs-3.0.4.tgz", + "integrity": "sha512-d55LkNztZa6vNeiV2HJjLo/vc8lLEcMe0mlYfM/KXVqEABk9UqygCtOHS9RiKjEMNfywGleIsQlHHlsDnVNYdw==", "dependencies": { - "@codemirror/lang-json": "^6.0.1", - "@codemirror/lint": "^6.4.2", - "@codemirror/state": "^6.4.1", - "@lezer/highlight": "^1.1.6", "@markdoc/markdoc": "0.4.0", - "@redocly/openapi-core": "1.10.4", - "@redocly/vscode-json-languageservice": "3.4.9", - "@uiw/codemirror-theme-material": "^4.21.20", - "@uiw/react-codemirror": "^4.21.24", + "@redocly/config": "0.6.0", + "@redocly/openapi-core": "1.12.2", + "@redocly/replay": "0.0.4", "deepmerge": "^4.2.2", "dompurify": "^2.0.12", "fast-deep-equal": "^3.1.3", - "hotkeys-js": "^3.7.6", "jotai": "^2.4.2", "json-pointer": "^0.6.2", "lunr": "^2.3.8", - "mark.js": "^8.11.1", - "openapi-sampler": "^1.3.0", + "openapi-sampler": "^1.5.1", "path-browserify": "^1.0.1", - "perfect-scrollbar": "^1.5.5", "prismjs": "^1.22.0", - "react-hook-form": "^7.47.0", "react-router-dom": "^6.21.1", - "react-tabs": "^6.0.2", "slugify": "^1.4.4", "stickyfill": "^1.1.1", "stringify-object": "^3.3.0", "styled-components": "^4.1.1 || ^5.3.11", - "swagger-client": "^3.13.3", "swagger2openapi": "^7.0.8", "tslib": "^2.2.0", "url": "~0.11.0", @@ -1944,37 +2141,168 @@ "styled-components": "^4.1.1 || ^5.3.11" } }, - "node_modules/@redocly/openapi-docs/node_modules/@codemirror/state": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" + "node_modules/@redocly/openapi-docs/node_modules/@redocly/openapi-core": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.12.2.tgz", + "integrity": "sha512-dImBZaKws54a4/QdoAVsLDm4/gfVnzAVD68pSGFPMTLNM2AZINvevfUfOrbUNTXwHvG2UJkthUxDGQZLsp3Vaw==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.5.0", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-docs/node_modules/@redocly/openapi-core/node_modules/@redocly/config": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.5.0.tgz", + "integrity": "sha512-oA1ezWPT2tSV9CLk0FtZlViaFKtp+id3iAVeKBme1DdP4xUCdxEdP8umB21iLKdc6leRd5uGa+T5Ox4nHBAXWg==" + }, + "node_modules/@redocly/openapi-docs/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/@redocly/openapi-docs/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@redocly/openapi-docs/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@redocly/portal-legacy-ui": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@redocly/portal-legacy-ui/-/portal-legacy-ui-0.1.0.tgz", + "integrity": "sha512-jDqFrMvTANH5FCe2fjpQKIoEl3Z0XM6WvZnYjEYtk3oXyw1J2Jk3om/1KHzqm7eVyLsgwNBew/wa0u9rWMUIPg==", + "peerDependencies": { + "highlight-words-core": "^1.2.2", + "react": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.21.1", + "styled-components": "^4.1.1 || ^5.3.11", + "styled-system": "^5.1.5" + } }, "node_modules/@redocly/portal-plugin-mock-server": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@redocly/portal-plugin-mock-server/-/portal-plugin-mock-server-0.1.9.tgz", - "integrity": "sha512-0zzZTKAJKZEVGfRL1a1uF32M/Kgz8ci3fZ9OM9zckReFrC7Wr8ioW7nwXCHyuRyE492YRYUYpKsJ9KVy6S3Nvg==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@redocly/portal-plugin-mock-server/-/portal-plugin-mock-server-0.2.4.tgz", + "integrity": "sha512-CjkPuTXlycpT+yWO+JZtk/KFTlT5/BkQaIovXj2azJ90B+QlLFMR6I2jb6vhD32nbnwvf8g8VXcPrzOQ35PfmA==", "dependencies": { - "@redocly/config": "0.1.4", - "@redocly/mock-server": "0.0.8", - "@redocly/openapi-core": "1.10.4", - "@redocly/openapi-docs": "3.0.0-alpha.88" + "@redocly/config": "0.6.0", + "@redocly/mock-server": "0.1.0", + "@redocly/openapi-core": "1.12.2", + "@redocly/openapi-docs": "3.0.4" + } + }, + "node_modules/@redocly/portal-plugin-mock-server/node_modules/@redocly/openapi-core": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.12.2.tgz", + "integrity": "sha512-dImBZaKws54a4/QdoAVsLDm4/gfVnzAVD68pSGFPMTLNM2AZINvevfUfOrbUNTXwHvG2UJkthUxDGQZLsp3Vaw==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.5.0", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/portal-plugin-mock-server/node_modules/@redocly/openapi-core/node_modules/@redocly/config": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.5.0.tgz", + "integrity": "sha512-oA1ezWPT2tSV9CLk0FtZlViaFKtp+id3iAVeKBme1DdP4xUCdxEdP8umB21iLKdc6leRd5uGa+T5Ox4nHBAXWg==" + }, + "node_modules/@redocly/portal-plugin-mock-server/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/@redocly/portal-plugin-mock-server/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@redocly/portal-plugin-mock-server/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/@redocly/realm": { - "version": "0.78.6", - "resolved": "https://registry.npmjs.org/@redocly/realm/-/realm-0.78.6.tgz", - "integrity": "sha512-Jq+Th1LSnKsRwO7ZJdsidpwDgWi/FZfMs1tbrbR2ntUUCdGr33+B46P6EvARCy2J8ME9C2bmDvrD0L+RveHT3w==", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@redocly/realm/-/realm-0.86.0.tgz", + "integrity": "sha512-zFqBEt/hGyFiA4i9KhLTflv7UpgYJNN4W6gTqezLY3jBnNqGJ+pTHps4q4tuKY7vhvzJee+JMvJVKGSIzV+m/w==", "dependencies": { "@babel/core": "^7.23.3", "@cocalc/ansi-to-react": "7.0.0", "@markdoc/markdoc": "0.4.0", "@redocly/ajv": "^8.11.0", - "@redocly/config": "0.1.4", - "@redocly/graphql-docs": "0.6.39", - "@redocly/openapi-core": "1.10.4", - "@redocly/openapi-docs": "3.0.0-alpha.88", - "@redocly/portal-plugin-mock-server": "^0.1.9", - "@redocly/theme": "0.35.5", + "@redocly/config": "0.6.0", + "@redocly/fuse.js": "^7.0.1", + "@redocly/graphql-docs": "0.6.41", + "@redocly/openapi-core": "1.13.0", + "@redocly/openapi-docs": "3.0.4", + "@redocly/portal-legacy-ui": "0.1.0", + "@redocly/portal-plugin-mock-server": "^0.2.4", + "@redocly/theme": "0.37.3", "@redocly/xml-crypto": "~3.0.1", "@tanstack/react-query": "4.0.5", "@wojtekmaj/react-datetimerange-picker": "^5.0.1", @@ -1989,17 +2317,15 @@ "esbuild": "^0.17.15", "events": "3.3.0", "fflate": "^0.7.4", - "fuse.js": "^6.6.2", "graphql": "^15.6.1", "gray-matter": "^4.0.3", - "hono": "~3.11.0", + "hono": "4.2.9", "htmlparser2": "^8.0.2", "i18next": "^22.4.12", "is-glob": "^4.0.3", "js-yaml": "^4.1.0", "lodash.throttle": "^4.1.1", "lru-cache": "^7.18.3", - "markdown-it": "12.3.2", "minimatch": "^7.4.2", "mri": "^1.2.0", "mustache": "^4.2.0", @@ -2040,20 +2366,56 @@ "react-dom": "^18.0.0" } }, - "node_modules/@redocly/theme": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@redocly/theme/-/theme-0.35.5.tgz", - "integrity": "sha512-3RAAJoFAqkcY7PfD5M/B7WcMrx1oO3Yv9UHwXtGXx6D3DWVVaPo5OPfGJ9e35pb+XtXvZDHJVq5fbT7KWZdCzA==", + "node_modules/@redocly/replay": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@redocly/replay/-/replay-0.0.4.tgz", + "integrity": "sha512-vyP0WwU06mtweT++qM5oPO3Lq2/0Ox2U92XIlME4oHD0e+0479lCu+zI7ONwooOpMMTX4851Pkrgo/nzLrUzkg==", "dependencies": { - "@redocly/config": "0.1.4", + "@codemirror/autocomplete": "^6.15.0", + "@codemirror/lang-html": "^6.4.7", + "@codemirror/lang-json": "^6.0.1", + "@codemirror/lang-xml": "^6.0.2", + "@codemirror/lint": "^6.5.0", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.25.1", + "@hookstate/core": "^4.0.1", + "@lezer/highlight": "^1.1.6", + "@redocly/vscode-json-languageservice": "^3.4.9", + "@uiw/codemirror-theme-material": "^4.21.20", + "@uiw/react-codemirror": "^4.21.20", + "crypto-js": "^4.2.0", + "dayjs": "^1.11.7", + "marked": "^4.0.15", + "rc-tooltip": "^6.1.3", + "react-resizable-panels": "^1.0.9", + "react-select": "^5.8.0", + "styled-components": "^5.3.11" + }, + "peerDependencies": { + "@redocly/theme": "0.37.3", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router-dom": "^6.21.1", + "styled-components": "^5.3.11" + } + }, + "node_modules/@redocly/theme": { + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@redocly/theme/-/theme-0.37.3.tgz", + "integrity": "sha512-nYm2icYBqElT5H7iow2taytcRjM9R7UZTjZ1CQ2IjHHBQXvKRK96dYjkfvdpYclsX7gXWfOoQtnZJT43za5F4A==", + "dependencies": { + "@redocly/config": "0.6.0", "copy-to-clipboard": "^3.3.3", "highlight-words-core": "^1.2.2", "hotkeys-js": "^3.10.1", + "i18next": "^22.4.12", + "nprogress": "^0.2.0", "react-calendar": "4.2.1", "react-date-picker": "10.0.3", "timeago.js": "^4.0.2" }, "peerDependencies": { + "@markdoc/markdoc": "0.4.0", "lodash.throttle": "^4.1.1", "prismjs": "^1.28.0", "react": "^17.0.0 || ^18.0.0", @@ -2253,449 +2615,6 @@ "@styled-system/css": "^5.1.5" } }, - "node_modules/@swagger-api/apidom-ast": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-0.97.0.tgz", - "integrity": "sha512-KpPyC8x5ZrB4l9+jgl8FAhokedh+8b5VuBTTdTJKFf+x5uznMiBf/MZTWgvsIk8/9MtjkQYUN1qgVzEPiKWvHg==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "unraw": "^3.0.0" - } - }, - "node_modules/@swagger-api/apidom-core": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-0.97.0.tgz", - "integrity": "sha512-3LYlN0Cox0FBFNZqmgi7VyJ4MXppCmZoFjlurT+Y90ND1y2lCidcwjAthr3QpV8b+UCc7MG3APBGRfwqaYZ2IA==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@types/ramda": "~0.29.6", - "minim": "~0.23.8", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "short-unique-id": "^5.0.2", - "stampit": "^4.3.2" - } - }, - "node_modules/@swagger-api/apidom-error": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-0.97.0.tgz", - "integrity": "sha512-Y2YRnsJSXp+MdgwwMSCtidzJfy/bL6CZEpc+5aWUw1mphTjfLZC66uA4btUgUevyiT6mNHXm8tUmGomHA7Izdw==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7" - } - }, - "node_modules/@swagger-api/apidom-json-pointer": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.97.0.tgz", - "integrity": "sha512-9vcgePgcYXUiYEqnvx8Ew04j8JtfenosysbSuGgRs93Ls8mQ/+ndIOklHaXJzNjBZZxqxS0p6QLFcj1jpUiojQ==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.97.0.tgz", - "integrity": "sha512-uSTIEX4q9XWoP9TQq9nEtW5xG3hVQN2VD5spYoxvYlzUOtg12yxkVgu776eq0kVZd74acZhKIF7mn3uiqaQcHA==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "ts-mixer": "^6.0.3" - } - }, - "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.97.0.tgz", - "integrity": "sha512-buEQSrXdtjoAkqIWSZ448HlvnareupthIoObYELp25LVuQwhxxVSY3NR0aCIR37GHgSchrmPBVcsvPMtXV96BA==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-json-schema-draft-7": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "ts-mixer": "^6.0.3" - } - }, - "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.97.0.tgz", - "integrity": "sha512-eBMIPxX4huNDGle6TOfSe1kKS1/HvL6w66GWWLFxZW2doCQHMADgjo7j/kVowrXiJtEoMgjBVp3W30WkcwBVug==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.97.0", - "@swagger-api/apidom-core": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "stampit": "^4.3.2" - } - }, - "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.97.0.tgz", - "integrity": "sha512-tRbg3/b4aJGfcODc0HDngZDjBdhPAv8OZM1OZdsqI4EEIw3PI/wpd+b6b8a5udOjAdbUYqnYsq6gCylCDNBnzw==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "stampit": "^4.3.2" - } - }, - "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.97.0.tgz", - "integrity": "sha512-0GITsoa6kVVkoKBUxyeODmh6vjGXuvDQZd3Vxs1nz0c/O6ZR+VBfBB3JW5wzhVr+WCXebaOJGDyWkxJMHKycxw==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@swagger-api/apidom-ns-json-schema-draft-6": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "stampit": "^4.3.2" - } - }, - "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-0.97.0.tgz", - "integrity": "sha512-5gOA9FiO1J9OxJhcVBeXdm77kuh2cwPXG6Sh/DOlbk733Pz9v9W0aQgpLi5Ltsgagxe1sHhBqxJ1asw10QFzzw==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "ts-mixer": "^6.0.3" - } - }, - "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.97.0.tgz", - "integrity": "sha512-fbnN87SF0WN/4DcSpceuo+NUtkAGeicMIucEMF+LIIiCAF27Xi5d6Q823i9DgOEfJtifHKVj6Zhl/zSKAD2eyw==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "ts-mixer": "^6.0.3" - } - }, - "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.97.0.tgz", - "integrity": "sha512-DyvkTim+t7iVKyze6N3tITsfyElthmOwOcxwOjKj/3lySEy61DuY4X2FaPD5+owftVDxMs4Q6F9Chm7qv91a+Q==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.97.0", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "ts-mixer": "^6.0.3" - } - }, - "node_modules/@swagger-api/apidom-ns-workflows-1": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-0.97.0.tgz", - "integrity": "sha512-eIuoTRSITlUtMjpM3J0H9b2rVeEVu13i/Fv6+ZMPob0yHmQBWo9bnLjxxnfEZkpvp050worKULfNMdJV8NKBkA==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "ts-mixer": "^6.0.3" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.97.0.tgz", - "integrity": "sha512-ZDzaiTHMEpz0kM0/iyHEjySTf0xoLKDJwJiSxKNuew141k0rakTVeVisxXeq+6JQi2eC6KuyS98DHMe7hEIVUw==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-api-design-systems": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.97.0.tgz", - "integrity": "sha512-5/BziPWqrHLr91VR+EC4pXt/fNToWMmvG+d7RVjksHinrjps2E6HA+oZOhqKqA2LRCLNjGhNUptXzRMDjjtenw==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-api-design-systems": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.97.0.tgz", - "integrity": "sha512-XLD/YZifnhezRQY5ADQQAje5G5qtZ4GAbXk//1sRNe3R/qCk1pDxmRYr27yzt8w1XhfM+9VQmCTI21ZFpNFQOA==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-asyncapi-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.97.0.tgz", - "integrity": "sha512-whyThDiGN4FoNirgY0XtXF7IJeU6NfsrBwjaxCkYBuSPslZBoWy4ojEQbfg+2HqNLbnHKJyvabh9/tSIxgB92A==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-asyncapi-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.97.0.tgz", - "integrity": "sha512-MPhAX77Z9Csti+Kljtbrl/ez2H610R4fQg0RnkNW40f4e6TXeOogT5tmceeWP+IKGAKX45HA1JpVPxdtSJn3ww==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.97.0", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-0.97.0.tgz", - "integrity": "sha512-HtaoRN7wnVB2ilxs/RpLBR7+MwIfUqUcdCzC/EVV788CnSbutwj61W3jR2w9BRXeANJ4K2APcvU4W7WiI9Sugg==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.97.0.tgz", - "integrity": "sha512-psfxh7k671HukibaY53cems0fcsLQP8U5lQPzVDevEGJQoguAWHyV2C5kOr52XOJInmsN5E+COEn6oPzsIaDCg==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.97.0.tgz", - "integrity": "sha512-PJpcLhS441ATFjbCHHhVUPd8K1JZaiFQJS7yfQEKQmA5MlBRh3w7mqCJAbZN49wuMkelTdB8qJJlVEGUDSxX5Q==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-0.97.0.tgz", - "integrity": "sha512-X5saN/AElpS+LohbSjNPesUPWYOM8Wb19+OD7/WS1r6AVRIlj5gKLy3vO7BLBvaER5G73qYylfrPxCoUPlpZZg==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.97.0.tgz", - "integrity": "sha512-kBW6atIN0rONf9kjNeE5eHkxb3amfby0vxKfk+9fiRdQbJVCg4UiWOFmU5rD9bc2smtLWSQNkjlMkKS3i2/4Wg==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.97.0.tgz", - "integrity": "sha512-cclRwQ9IQj6sFLUCDzqRbbbplQfKdt9xz8YONvtq4XBHZO6Ab8z5CF3A9eLiuW1TJZ3y0QU7xmI6h5jWwUrC9w==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-0.97.0.tgz", - "integrity": "sha512-UvnISzq5JDG43sTIJ2oE8u8qALHmBKbYMGncYgUdlHx7z5RgPAWxIRDWH40YFzUSuKSRNp4TI7eG/9MUd3RnGA==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-workflows-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-0.97.0.tgz", - "integrity": "sha512-TTZS0YkFvy0X8Huom+fr3muZsCy8mtDpuUks45EvPqv6gjGLCBw3/AZ507CS0YxYvoERbXkYfAYqxW8lptwKuQ==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-ns-workflows-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.0.0" - } - }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.97.0.tgz", - "integrity": "sha512-3f1ADjQyKyLnuRhPuoHMgWMW28o0ylohWCQwX4q69CMH0kqGxP7HnqIU/i0I2cxZdjGv72OCdiKwaR/OgHcmEw==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.97.0", - "@swagger-api/apidom-core": "^0.97.0", - "@swagger-api/apidom-error": "^0.97.0", - "@types/ramda": "~0.29.6", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" - } - }, - "node_modules/@swagger-api/apidom-reference": { - "version": "0.97.1", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-0.97.1.tgz", - "integrity": "sha512-Bs1U2VutmVpqbCxbCt4DTiL8v0s6osAJx+4v49BGrTcfFFh97K/EOAm48WgA8ViP7qHUNBhUF83rjbpEwOshFw==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.97.0", - "@types/ramda": "~0.29.6", - "axios": "^1.4.0", - "minimatch": "^7.4.3", - "process": "^0.11.10", - "ramda": "~0.29.1", - "ramda-adjunct": "^4.1.1", - "stampit": "^4.3.2" - }, - "optionalDependencies": { - "@swagger-api/apidom-error": "^0.97.0", - "@swagger-api/apidom-json-pointer": "^0.97.0", - "@swagger-api/apidom-ns-asyncapi-2": "^0.97.0", - "@swagger-api/apidom-ns-openapi-2": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.97.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.97.0", - "@swagger-api/apidom-ns-workflows-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^0.97.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^0.97.0", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-json": "^0.97.0", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^0.97.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^0.97.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^0.97.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^0.97.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.97.0" - } - }, "node_modules/@tanstack/query-core": { "version": "4.36.1", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz", @@ -2832,9 +2751,9 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "optional": true }, "node_modules/@types/lodash": { @@ -2861,9 +2780,9 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "optional": true }, "node_modules/@types/node": { @@ -2881,14 +2800,6 @@ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, - "node_modules/@types/ramda": { - "version": "0.29.11", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.29.11.tgz", - "integrity": "sha512-jm1+PmNOpE7aPS+mMcuB4a72VkCXUJqPSaQRu2YqR8MbsFfaowYXgKxc7bluYdDpRHNXT5Z+xu+Lgr3/ml6wSA==", - "dependencies": { - "types-ramda": "^0.29.9" - } - }, "node_modules/@types/react": { "version": "18.2.32", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.32.tgz", @@ -2900,9 +2811,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", - "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { "@types/react": "*" } @@ -2973,20 +2884,20 @@ } }, "node_modules/@uiw/codemirror-theme-material": { - "version": "4.21.24", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-material/-/codemirror-theme-material-4.21.24.tgz", - "integrity": "sha512-Yn2M0O2MLdcvkznUDdGEQDvaYFaN6sPiJI1DyTgf+4x5WNCbTgI+bsIq291QPqM5SD/eDWfyqvrqL37Bfsj5GQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-material/-/codemirror-theme-material-4.22.2.tgz", + "integrity": "sha512-YJPNkNZo1RqtGgF3KNxFkSY7LDY8RqzJ7N5DR6o0d0IHCQSeTNk3TE14Gmc66GqfoPXfEQVLtPk/MiRZ/JQSpQ==", "dependencies": { - "@uiw/codemirror-themes": "4.21.24" + "@uiw/codemirror-themes": "4.22.2" }, "funding": { "url": "https://jaywcjlove.github.io/#/sponsor" } }, "node_modules/@uiw/codemirror-theme-material/node_modules/@uiw/codemirror-themes": { - "version": "4.21.24", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.21.24.tgz", - "integrity": "sha512-InY24KWP8YArDBACWHKFZ6ZU+WCvRHf3ZB2cCVxMVN35P1ANUmRzpAP2ernZQ5OIriL1/A/kXgD0Zg3Y65PNgg==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.22.2.tgz", + "integrity": "sha512-gsLHn6SUuV5iboBvGrM7YimzLFHQmsNlkGIYs3UaVUJTo/A/ZrKoSJNyPziShLRjBXA2UwKdBTIU6VhHyyaChw==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -3597,41 +3508,6 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", @@ -3887,12 +3763,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -3914,6 +3784,11 @@ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "peer": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4014,14 +3889,6 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -4031,9 +3898,9 @@ } }, "node_modules/core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "hasInstallScript": true, "peer": true, "funding": { @@ -4041,16 +3908,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", - "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -4214,6 +4071,11 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -4272,6 +4134,11 @@ "node": ">= 12" } }, + "node_modules/dayjs": { + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4297,21 +4164,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -4326,15 +4178,6 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -4375,15 +4218,6 @@ "url": "https://github.com/wojtekmaj/detect-element-overflow?sponsor=1" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4458,9 +4292,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.8.tgz", - "integrity": "sha512-O90eQdAQOiLZoE9pEgPz3JfqXh5yrhJHv0/LzOv3wWFLTWUqAKaISD1aWASQTLshLM+jziuSerbtUESKK8Jibw==" + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.5.tgz", + "integrity": "sha512-FgbqnEPiv5Vdtwt6Mxl7XSylttCC03cqP5ldNT2z+Kj0nLxPHJH4+1Cyf5Jasxhw93Rl4Oo11qRoUV72fmya2Q==" }, "node_modules/domutils": { "version": "3.1.0", @@ -4528,15 +4362,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -4701,15 +4526,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -4757,11 +4573,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4903,12 +4714,6 @@ "node": ">=12.20.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4923,14 +4728,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5012,12 +4809,6 @@ "assert-plus": "^1.0.0" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -5238,9 +5029,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/hono": { - "version": "3.11.12", - "resolved": "https://registry.npmjs.org/hono/-/hono-3.11.12.tgz", - "integrity": "sha512-TrxH75bc0m2UbvrhaXkoo32A9OhkJtvICAYgYWtxqLDOxBjRqSikyp4K7HTbnWkPeg9Z+2Q3nv0dN4o8kL6yLg==", + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.2.9.tgz", + "integrity": "sha512-59FAv52UxDWUt/NlC0NzrRCjeVCThUnVlqlrKYm+k80XujBu6uJwBIa5gACKKZWobjA0MJ6Vds0I3URKf383Cw==", "engines": { "node": ">=16.0.0" } @@ -5555,12 +5346,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, "node_modules/invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -5697,14 +5482,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -7509,9 +7286,9 @@ } }, "node_modules/jotai": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.7.1.tgz", - "integrity": "sha512-bsaTPn02nFgWNP6cBtg/htZhCu4s0wxqoklRHePp6l/vlsypR9eLn7diRliwXYWMXDpPvW/LLA2afI8vwgFFaw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.8.3.tgz", + "integrity": "sha512-pR4plVvdbzB6zyt7VLLHPMAkcRSKhRIvZKd+qkifQLa3CEziEo1uwZjePj4acTmQrboiISBlYSdCz3gWcr1Nkg==", "engines": { "node": ">=12.20.0" }, @@ -7773,14 +7550,6 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -7925,34 +7694,6 @@ "tmpl": "1.0.5" } }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -7964,11 +7705,6 @@ "node": ">= 12" } }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", @@ -8021,29 +7757,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minim": { - "version": "0.23.8", - "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", - "integrity": "sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==", - "dependencies": { - "lodash": "^4.15.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/minimatch": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", @@ -8058,21 +7771,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -8102,12 +7800,6 @@ "mustache": "bin/mustache" } }, - "node_modules/nan": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", - "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -8125,35 +7817,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "peer": true }, - "node_modules/node-abi": { - "version": "3.56.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", - "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -8189,22 +7858,6 @@ "url": "https://opencollective.com/node-fetch" } }, - "node_modules/node-fetch-commonjs": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch-commonjs/-/node-fetch-commonjs-3.3.2.tgz", - "integrity": "sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-fetch-h2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", @@ -8390,6 +8043,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "peer": true, "dependencies": { "wrappy": "1" } @@ -8410,9 +8064,9 @@ } }, "node_modules/openapi-sampler": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.4.0.tgz", - "integrity": "sha512-3FKJQCHAMG9T7RsRy9u5Ft4ERPq1QQmn77C8T3OSofYL9uur59AqychvQ0YQKijrqRwIkAbzkh+nQnAE3gjMVA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.5.1.tgz", + "integrity": "sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==", "dependencies": { "@types/json-schema": "^7.0.7", "json-pointer": "0.6.2" @@ -8568,11 +8222,6 @@ "node": ">=8" } }, - "node_modules/perfect-scrollbar": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", - "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -8716,32 +8365,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -8776,14 +8399,6 @@ "node": ">=6" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -8823,16 +8438,6 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -8866,43 +8471,60 @@ "node": ">=0.6" } }, - "node_modules/ramda": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.1.tgz", - "integrity": "sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/ramda-adjunct": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-4.1.1.tgz", - "integrity": "sha512-BnCGsZybQZMDGram9y7RiryoRHS5uwx8YeGuUeDKuZuvK38XO6JJfmK85BwRWAKFA6pZ5nZBO/HBFtExVaf31w==", - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" + "node_modules/rc-motion": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.1.tgz", + "integrity": "sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.39.3" }, "peerDependencies": { - "ramda": ">= 0.29.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" }, - "bin": { - "rc": "cli.js" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", + "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.42.0.tgz", + "integrity": "sha512-uxj2fkMe++/A3CTNagEljdTjZJHVFNH5EZcK9D4YAtWWTdEMglRE4VFtd0psIPUBIY+lSdqwVcIrR1oQMR07vw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, "node_modules/react": { @@ -9151,26 +8773,19 @@ "react": ">=16.3.0" } }, - "node_modules/react-hook-form": { - "version": "7.51.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.1.tgz", - "integrity": "sha512-ifnBjl+kW0ksINHd+8C/Gp6a4eZOdWyvRv0UBaByShwU8JbVx5hTcTWEcd5VdybvmPTATkVVXk9npXArHmo56w==", - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-resizable-panels": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-1.0.10.tgz", + "integrity": "sha512-0+g0CNqregkuocr+Mi+e6wgWVARnKTYIX3U1QK7GlkLQKCmbymZakx80YGwcRO7HNnKJTQ5v38HlBos/cGxWvg==", + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" + } }, "node_modules/react-router": { "version": "6.21.3", @@ -9203,9 +8818,9 @@ } }, "node_modules/react-select": { - "version": "5.7.7", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.7.tgz", - "integrity": "sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -9242,18 +8857,6 @@ "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" } }, - "node_modules/react-tabs": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.0.2.tgz", - "integrity": "sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==", - "dependencies": { - "clsx": "^2.0.0", - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, "node_modules/react-time-picker": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/react-time-picker/-/react-time-picker-6.5.2.tgz", @@ -9449,6 +9052,11 @@ "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -9688,15 +9296,6 @@ "node": ">=8" } }, - "node_modules/short-unique-id": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.0.3.tgz", - "integrity": "sha512-yhniEILouC0s4lpH0h7rJsfylZdca10W9mDJRAFh3EpcSUanCHGb0R7kcFOIUCZYSAPo0PUD5ZxWQdW0T4xaug==", - "bin": { - "short-unique-id": "bin/short-unique-id", - "suid": "bin/short-unique-id" - } - }, "node_modules/should": { "version": "13.2.3", "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", @@ -9768,51 +9367,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "peer": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-git": { "version": "3.20.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.20.0.tgz", @@ -9992,11 +9546,6 @@ "node": ">=8" } }, - "node_modules/stampit": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stampit/-/stampit-4.3.2.tgz", - "integrity": "sha512-pE2org1+ZWQBnIxRPrBM2gVupkuDD0TTNIo1H6GdT/vO82NXli2z8lRE8cu/nBIHrcOCXFBAHpb9ZldrB2/qOA==" - }, "node_modules/stickyfill": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", @@ -10100,15 +9649,6 @@ "node": ">=6" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/style-mod": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", @@ -10195,42 +9735,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swagger-client": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.26.0.tgz", - "integrity": "sha512-1yFR/S2V3v5DwgmNePoHEjq2dZJxDx1leDQ53r5M4hZs+dozm9VnznlSl9a1V5iTYw4UsS4PQuBRQsmBH21ViA==", - "dependencies": { - "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=0.97.0 <1.0.0", - "@swagger-api/apidom-error": ">=0.97.0 <1.0.0", - "@swagger-api/apidom-json-pointer": ">=0.97.0 <1.0.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=0.97.0 <1.0.0", - "@swagger-api/apidom-reference": ">=0.97.0 <1.0.0", - "cookie": "~0.6.0", - "deepmerge": "~4.3.0", - "fast-json-patch": "^3.0.0-1", - "is-plain-object": "^5.0.0", - "js-yaml": "^4.1.0", - "node-abort-controller": "^3.1.1", - "node-fetch-commonjs": "^3.3.2", - "qs": "^6.10.2", - "traverse": "~0.6.6" - } - }, - "node_modules/swagger-client/node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/swagger2openapi": { "version": "7.0.8", "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", @@ -10282,34 +9786,6 @@ "integrity": "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==", "dev": true }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -10429,48 +9905,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.18.0" - } - }, - "node_modules/tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - } - }, "node_modules/ts-jest": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", @@ -10522,11 +9956,6 @@ "ts-jest": ">=20.0.0" } }, - "node_modules/ts-mixer": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -10574,15 +10003,10 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, - "node_modules/ts-toolbelt": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", - "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" - }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -10593,7 +10017,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "devOptional": true, + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -10628,14 +10052,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/types-ramda": { - "version": "0.29.9", - "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.29.9.tgz", - "integrity": "sha512-B+VbLtW68J4ncG/rccKaYDhlirKlVH/Izh2JZUfaPJv+3Tl2jbbgYsB1pvole1vXKSgaPlAe/wgEdOnMdAu52A==", - "dependencies": { - "ts-toolbelt": "^9.6.0" - } - }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -10649,16 +10065,6 @@ "node": ">=14.17" } }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unraw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==" - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -10724,9 +10130,9 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/url/node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dependencies": { "side-channel": "^1.0.6" }, @@ -10892,12 +10298,6 @@ "node": ">= 8" } }, - "node_modules/web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", - "optional": true - }, "node_modules/web-vitals": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.0.tgz", @@ -11011,7 +10411,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "peer": true }, "node_modules/write-file-atomic": { "version": "4.0.2", diff --git a/package.json b/package.json index e8d99c9144..05a1c1a72b 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ "keywords": [], "license": "MIT", "dependencies": { - "@codemirror/state": "6.3.3", + "@codemirror/state": "6.4.1", "@codemirror/view": "^6.22.2", "@lezer/highlight": "^1.2.0", - "@redocly/realm": "^0.78.6", + "@redocly/realm": "0.86.0", "@uiw/codemirror-themes": "4.21.21", "@uiw/react-codemirror": "^4.21.21", "@xrplf/isomorphic": "^1.0.0-beta.1", diff --git a/redirects.yaml b/redirects.yaml index 10a5b268e5..56fee9a2a2 100644 --- a/redirects.yaml +++ b/redirects.yaml @@ -107,7 +107,10 @@ faq.html: to: /faq type: 301 privacy-policy.html: - to: /privacy-policy + to: /about/privacy-policy + type: 301 +privacy-policy/: + to: /about/privacy-policy type: 301 technical-faq.html: to: /faq @@ -398,7 +401,7 @@ automated-market-makers.html: to: /docs/concepts/tokens/decentralized-exchange/automated-market-makers type: 301 accounts.html: - to: /docs/concepts/accounts/accounts + to: /docs/concepts/accounts/ type: 301 account-types.html: to: /docs/concepts/accounts/account-types @@ -493,6 +496,9 @@ python.html: get-started-using-python.html: to: /docs/tutorials/python/get-started type: 301 +docs/tutorials/python/get-started/: + to: docs/tutorials/python/build-apps/get-started/ + type: 301 modular-tutorials-in-python.html: to: /docs/tutorials/python/ type: 301 @@ -532,6 +538,12 @@ javascript.html: get-started-using-javascript.html: to: /docs/tutorials/javascript/build-apps/get-started type: 301 +docs/tutorials/javascript/get-started: + to: docs/tutorials/javascript/build-apps/get-started/ + type: 301 +docs/tutorials/javascript/get-started/: + to: docs/tutorials/javascript/build-apps/get-started/ + type: 301 get-started-using-node-js.html: to: /docs/tutorials/javascript/build-apps/get-started type: 301 @@ -578,20 +590,38 @@ batch-mint-nfts-using-javascript.html: to: /docs/tutorials/javascript/nfts/batch-mint-nfts type: 301 build-a-browser-wallet-in-javascript.html: - to: /docs/tutorials/javascript/build-apps/build-a-browser-wallet-in-javascript + to: /docs/tutorials/javascript/build-apps/build-a-browser-wallet-in-javascript/ type: 301 build-a-browser-wallet-using-javascript.html: - to: /docs/tutorials/javascript/build-apps/build-a-browser-wallet-in-javascript + to: /docs/tutorials/javascript/build-apps/build-a-browser-wallet-in-javascript/ + type: 301 +docs/tutorials/javascript/build-a-browser-wallet-in-javascript: + to: docs/tutorials/javascript/build-apps/build-a-browser-wallet-in-javascript/ + type: 301 +docs/tutorials/javascript/build-a-browser-wallet-in-javascript/: + to: docs/tutorials/javascript/build-apps/build-a-browser-wallet-in-javascript/ type: 301 build-a-desktop-wallet-in-javascript.html: to: /docs/tutorials/javascript/build-apps/build-a-desktop-wallet-in-javascript type: 301 +docs/tutorials/javascript/build-a-desktop-wallet-in-javascript: + to: /docs/tutorials/javascript/build-apps/build-a-desktop-wallet-in-javascript + type: 301 +docs/tutorials/javascript/build-a-desktop-wallet-in-javascript/: + to: /docs/tutorials/javascript/build-apps/build-a-desktop-wallet-in-javascript + type: 301 java.html: to: /docs/tutorials/java/ type: 301 get-started-using-java.html: to: /docs/tutorials/java/build-apps/get-started type: 301 +docs/tutorials/java/get-started: + to: /docs/tutorials/java/build-apps/get-started + type: 301 +docs/tutorials/java/get-started/: + to: /docs/tutorials/java/build-apps/get-started + type: 301 php.html: to: /docs/tutorials/php type: 301 @@ -605,8 +635,14 @@ get-started-with-the-rippled-api.html: to: /docs/tutorials/http-websocket-apis/build-apps/get-started type: 301 get-started-using-http-websocket-apis.html: - to: /docs/tutorials/http-websocket-apis/build-apps/get-started + to: /docs/tutorials/http-websocket-apis/build-apps/get-started/ type: 301 +docs/tutorials/http-websocket-apis/get-started: + to: /docs/tutorials/http-websocket-apis/build-apps/get-started/ + type: 301 +docs/tutorials/http-websocket-apis/get-started/: + to: /docs/tutorials/http-websocket-apis/build-apps/get-started/ + type: 301 monitor-incoming-payments-with-websocket.html: to: /docs/tutorials/http-websocket-apis/build-apps/monitor-incoming-payments-with-websocket type: 301 @@ -1087,6 +1123,9 @@ account_lines.html: account_nfts.html: to: /docs/references/http-websocket-apis/public-api-methods/account-methods/account_nfts type: 301 +/ja/account_nfts.html: + to: /ja/docs/references/http-websocket-apis/public-api-methods/account-methods/account_nfts/ + type: 301 account_objects.html: to: /docs/references/http-websocket-apis/public-api-methods/account-methods/account_objects type: 301 @@ -1576,6 +1615,9 @@ report-a-scam.html: wallets.html: to: /docs/introduction/crypto-wallets type: 301 +blog/2024/rippled-2.2.0.html: + to: /blog/2024/rippled-2.2.0 + type: 301 blog/2024/rippled-2.1.0.html: to: /blog/2024/rippled-2.1.0 type: 301 @@ -2202,4 +2244,4 @@ code_of_conduct.ja/: type: 301 code_of_conduct.ja: to: /ja/code-of-conduct - type: 301 \ No newline at end of file + type: 301 diff --git a/redocly.yaml b/redocly.yaml index 7700a97ef9..047649abf0 100644 --- a/redocly.yaml +++ b/redocly.yaml @@ -32,6 +32,8 @@ theme: - src: ./static/js/xrpl-2.11.0.min.js - src: ./static/vendor/jquery-3.7.1.min.js - src: ./static/vendor/bootstrap.min.js + - src: ./static/js/osano.js + type: text/javascript body: - src: ./static/js/xrplai-config.js id: xrplai-options @@ -71,58 +73,111 @@ theme: groupTranslationKey: theme.footer.about items: - page: about/index.page.tsx + label: XRPL Overview + labelTranslationKey: footer.about.xrpl-overview - label: Use Cases & Projects page: about/uses.page.tsx + labelTranslationKey: footer.about.use-cases-projects - page: about/history.page.tsx + label: History + labelTranslationKey: footer.about.history - page: about/impact.page.tsx + label: Impact + labelTranslationKey: footer.about.impact - label: XRPL Foundation + labelTranslationKey: footer.about.xrpl-foundation href: https://foundation.xrpl.org/ external: true - page: about/faq.md + label: FAQ + labelTranslationKey: footer.about.faq - page: about/privacy-policy.md + label: Privacy Policy + labelTranslationKey: footer.about.privacy-policy - group: Docs groupTranslationKey: theme.footer.docs items: - label: XRPL Documentation page: docs/index.page.tsx + labelTranslationKey: footer.docs.xrpl-documentation - page: docs/introduction/index.md + label: Introduction + labelTranslationKey: footer.docs.introduction - page: docs/use-cases/index.md + label: Use Cases + labelTranslationKey: footer.docs.use-cases - page: docs/concepts/index.md + label: Concepts + labelTranslationKey: footer.docs.concepts - page: docs/tutorials/index.md + label: Tutorials + labelTranslationKey: footer.docs.tutorials - page: docs/references/index.md + label: References + labelTranslationKey: footer.docs.references - page: docs/infrastructure/index.md + label: Infrastructure + labelTranslationKey: footer.docs.infrastructure - group: Resources groupTranslationKey: theme.footer.resources items: - page: resources/code-samples.page.tsx + label: Code Samples + labelTranslationKey: footer.resources.code-samples - page: resources/dev-tools/index.page.tsx + label: Dev Tools + labelTranslationKey: footer.resources.dev-tools - label: XRPL Learning Portal + labelTranslationKey: footer.resources.xrpl-learning-portal href: https://learn.xrpl.org/ external: true - label: XRPL Brand Kit + labelTranslationKey: footer.resources.xrpl-brand-kit href: /XRPL_Brand_Kit.zip external: true - label: Ledger Explorer + labelTranslationKey: footer.resources.explorer href: https://livenet.xrpl.org/ external: true - page: resources/known-amendments.md + label: Known Amendments + labelTranslationKey: footer.resources.known-amendments - page: resources/contribute-code/index.md + label: Contribute Code + labelTranslationKey: footer.resources.contribute-code - page: resources/contribute-documentation/index.md + label: Contribute Documentation + labelTranslationKey: footer.resources.contribute-documentation - group: Community groupTranslationKey: theme.footer.community items: - page: community/index.page.tsx + label: Community + labelTranslationKey: footer.community.community - page: community/events.page.tsx + label: Events + labelTranslationKey: footer.community.events - page: community/ambassadors.page.tsx + label: Ambassadors + labelTranslationKey: footer.community.ambassadors - page: community/developer-funding.page.tsx + label: Developer Funding + labelTranslationKey: footer.community.developer-funding - label: XRPL Jobs + labelTranslationKey: footer.community.xrpl-jobs href: https://jobs.xrpl.org/ external: true - page: blog/index.page.tsx + label: XRP Ledger Community Blog + labelTranslationKey: footer.community.dev-blog - label: XRPL Grants + labelTranslationKey: footer.community.xrpl-grants href: https://xrplgrants.org/ external: true - label: GitHub + labelTranslationKey: footer.community.github href: https://github.com/XRPLF/ external: true - page: community/report-a-scam.md + label: Report a Scam + labelTranslationKey: footer.community.report-a-scam diff --git a/resources/code-samples.page.tsx b/resources/code-samples.page.tsx index 1b3514de47..3d5d9405c5 100644 --- a/resources/code-samples.page.tsx +++ b/resources/code-samples.page.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { usePageSharedData, useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; export const frontmatter = { seo: { @@ -24,6 +24,7 @@ const target = { }; export default function CodeSamples() { + const { useTranslate, usePageSharedData } = useThemeHooks(); const { translate } = useTranslate(); const { codeSamples, langs } = usePageSharedData('code-samples'); diff --git a/resources/contribute-code/index.md b/resources/contribute-code/index.md index e987373d17..03fe22f4ef 100644 --- a/resources/contribute-code/index.md +++ b/resources/contribute-code/index.md @@ -86,7 +86,7 @@ The general development path breaks down as follows: ## Code Flowchart -![Code Flowchart](../../docs/img/contribute-code-flowchart.png) +![Code Flowchart](/docs/img/contribute-code-flowchart.png) ## See Also diff --git a/resources/contribute-documentation/index.md b/resources/contribute-documentation/index.md index acbb87152f..bc0f0c416d 100644 --- a/resources/contribute-documentation/index.md +++ b/resources/contribute-documentation/index.md @@ -222,6 +222,7 @@ referrerpolicy="strict-origin-when-cross-origin" allowfullscreen> Markdoc provides three different syntax styles for generating tables. In most cases, create tables using the pipe character (|) to separate columns and three or more hyphens (---) to create the column headers. + ``` | | Head 1 | | ------- | ------ | diff --git a/resources/dev-tools/components/AlertTemplate.tsx b/resources/dev-tools/components/AlertTemplate.tsx index f04ee0d3d5..592309f9e9 100644 --- a/resources/dev-tools/components/AlertTemplate.tsx +++ b/resources/dev-tools/components/AlertTemplate.tsx @@ -1,6 +1,6 @@ import clsx from 'clsx' import * as React from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; const alertStyle = { position: "relative", @@ -30,6 +30,7 @@ interface AlertTemplateProps { } export default function AlertTemplate ({ message, options, style, close }: AlertTemplateProps): React.JSX.Element { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate() return(
    diff --git a/resources/dev-tools/components/DestinationAddressInput.tsx b/resources/dev-tools/components/DestinationAddressInput.tsx index c9209bba83..54617c879e 100644 --- a/resources/dev-tools/components/DestinationAddressInput.tsx +++ b/resources/dev-tools/components/DestinationAddressInput.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { useState } from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; import { clsx } from 'clsx' import { isValidAddress } from 'xrpl' @@ -27,6 +27,7 @@ export function DestinationAddressInput( setDestinationAddress, } : DestinationAddressInputProps ): React.JSX.Element { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate() const [ isValidDestinationAddress, setIsValidDestinationAddress ] = useState(true) diff --git a/resources/dev-tools/components/InitButton.tsx b/resources/dev-tools/components/InitButton.tsx index 74a4bff280..5025cb8903 100644 --- a/resources/dev-tools/components/InitButton.tsx +++ b/resources/dev-tools/components/InitButton.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; import { clsx } from 'clsx' import { Client, type Wallet, type TxResponse, dropsToXrp } from 'xrpl' @@ -176,6 +176,7 @@ export function InitButton({ isInitEnabled: boolean, toInit: InitializationProps }): React.JSX.Element { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate() return (
    diff --git a/resources/dev-tools/components/Loader.tsx b/resources/dev-tools/components/Loader.tsx index d477a64845..8e9d9a98fd 100644 --- a/resources/dev-tools/components/Loader.tsx +++ b/resources/dev-tools/components/Loader.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; -import { useTranslate } from "@portal/hooks"; +import { useThemeHooks } from '@redocly/theme/core/hooks'; export const Loader = () => { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); return {translate("(loading)")} diff --git a/resources/dev-tools/components/LogEntry.tsx b/resources/dev-tools/components/LogEntry.tsx index 857713044b..61c22eba15 100644 --- a/resources/dev-tools/components/LogEntry.tsx +++ b/resources/dev-tools/components/LogEntry.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; import { clsx } from 'clsx' export const CLASS_GOOD = "badge badge-success" @@ -60,6 +60,7 @@ export function LogEntry({ status }: LogEntryItem) { + const { useTranslate } = useThemeHooks(); const {translate} = useTranslate() let icon = undefined if(!!(status?.icon)) { diff --git a/resources/dev-tools/components/Modal.tsx b/resources/dev-tools/components/Modal.tsx index dc471e2584..ec03fd68bd 100644 --- a/resources/dev-tools/components/Modal.tsx +++ b/resources/dev-tools/components/Modal.tsx @@ -1,5 +1,5 @@ import React, { JSX, ReactElement, ReactNode } from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; interface ModalProps { id: string // used for targeting animations @@ -48,6 +48,7 @@ export const Modal = ({title, footer, children, onClose, id}: ModalProps) => { } export const ModalCloseBtn = ({onClick}) => { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); return diff --git a/resources/dev-tools/xrp-ledger-toml-checker.page.tsx b/resources/dev-tools/xrp-ledger-toml-checker.page.tsx index 52f952d394..401837d59a 100644 --- a/resources/dev-tools/xrp-ledger-toml-checker.page.tsx +++ b/resources/dev-tools/xrp-ledger-toml-checker.page.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; import { TextLookupForm, type TextLookupFormProps } from './components/TextLookupForm'; import { fetchFile, fetchWallet } from './toml-checker/ValidateTomlSteps'; import { LogEntryItem } from './components/LogEntry'; @@ -45,6 +45,7 @@ function handleSubmitDomain( } export default function TomlChecker() { + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); const domainButtonProps: TextLookupFormProps = { diff --git a/shared/components/nav-list.tsx b/shared/components/nav-list.tsx new file mode 100644 index 0000000000..b41dc9d257 --- /dev/null +++ b/shared/components/nav-list.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import { useThemeHooks } from '@redocly/theme/core/hooks'; +import { Link } from "@redocly/theme/components/Link/Link"; + +interface PageProps { + description: string; + link: string; +} + +interface NavListProps { + pages: PageProps[]; + bottomBorder?: boolean; +} + +export const NavList: React.FC = ({ + pages, + bottomBorder = true, +}) => { + const { useTranslate } = useThemeHooks(); + const { translate } = useTranslate(); + return ( +
      + {pages.map((useCase, index) => ( +
    • + + {translate(useCase.description)} + +
    • + ))} +
    + ); +}; diff --git a/static/css/devportal2024-v1.css b/static/css/devportal2024-v1.css index 2fe5e9da00..720ae434af 100644 --- a/static/css/devportal2024-v1.css +++ b/static/css/devportal2024-v1.css @@ -3,4 +3,4 @@ * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue: #19A3FF;--indigo: #6610f2;--purple: #9A52FF;--pink: #FF198B;--red: #dc3545;--orange: #FF6719;--yellow: #FAFF19;--green: #32E685;--teal: #20c997;--cyan: #17a2b8;--white: #FFFFFF;--gray: #454549;--gray-dark: #232325;--primary: #9A52FF;--secondary: #E0E0E1;--success: #32E685;--info: #19A3FF;--warning: #FAFF19;--danger: #FF198B;--light: #FFFFFF;--dark: #111112;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;--font-family-monospace: "Space Mono", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Work Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#e0e0e1;text-align:left;background-color:#111112}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#fff;text-decoration:none;background-color:transparent}a:hover{color:#9a52ff;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:"Space Mono",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#e0e0e1;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:500;line-height:1.2;color:#fff}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:0.875em;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:0.875em;color:#454549}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#111112;border:1px solid #c1c1c2;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#454549}code{font-size:87.5%;color:#e0e0e1;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#111112;border-radius:4px;box-shadow:inset 0 -0.1rem 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;font-size:87.5%;color:#111112}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#e0e0e1}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #c1c1c2}.table thead th{vertical-align:bottom;border-bottom:2px solid #c1c1c2}.table tbody+tbody{border-top:2px solid #c1c1c2}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #c1c1c2}.table-bordered th,.table-bordered td{border:1px solid #c1c1c2}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#e0e0e1;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#e3cfff}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#caa5ff}.table-hover .table-primary:hover{background-color:#d4b6ff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#d4b6ff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#f6f6f7}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#efefef}.table-hover .table-secondary:hover{background-color:#e9e9eb}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#e9e9eb}.table-success,.table-success>th,.table-success>td{background-color:#c6f8dd}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#94f2c0}.table-hover .table-success:hover{background-color:#aff5cf}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aff5cf}.table-info,.table-info>th,.table-info>td{background-color:#bfe5ff}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#87cfff}.table-hover .table-info:hover{background-color:#a6dbff}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a6dbff}.table-warning,.table-warning>th,.table-warning>td{background-color:#feffbf}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#fcff87}.table-hover .table-warning:hover{background-color:#feffa6}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#feffa6}.table-danger,.table-danger>th,.table-danger>td{background-color:#ffbfdf}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ff87c3}.table-hover .table-danger:hover{background-color:#ffa6d2}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ffa6d2}.table-light,.table-light>th,.table-light>td{background-color:#fff}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fff}.table-hover .table-light:hover{background-color:#f2f2f2}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#f2f2f2}.table-dark,.table-dark>th,.table-dark>td{background-color:#bcbcbd}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#838384}.table-hover .table-dark:hover{background-color:#afafb0}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#afafb0}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#232325;border-color:#363639}.table .thead-light th{color:#343437;background-color:#e0e0e1;border-color:#c1c1c2}.table-dark{color:#fff;background-color:#232325}.table-dark th,.table-dark td,.table-dark thead th{border-color:#363639}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.25em + 2rem + 2px);padding:1rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.25;color:#fff;background-color:#232325;background-clip:padding-box;border:1px solid transparent;border-radius:4px;box-shadow:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#fff;background-color:#232325;border-color:#e4d2ff;outline:0;box-shadow:0 0 0 .2rem rgba(154,82,255,.25)}.form-control::placeholder{color:#a2a2a4;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#454549;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}select.form-control:focus::-ms-value{color:#fff;background-color:#232325}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(1rem + 1px);padding-bottom:calc(1rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.25}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:1rem 0;margin-bottom:0;font-size:1rem;line-height:1.25;color:#e0e0e1;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:4px}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:8px}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:#e0e0e1}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#32e685}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#111112;background-color:rgba(50,230,133,.9);border-radius:4px}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#32e685;padding-right:calc(1.25em + 2rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2332E685' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3125em + 0.5rem) center;background-size:calc(0.625em + 1rem) calc(0.625em + 1rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#32e685;box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:6rem !important;background-position:right 3rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.25em + 2rem);background-position:top calc(0.3125em + 0.5rem) right calc(0.3125em + 0.5rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#32e685;padding-right:calc(0.75em + 4rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23232325' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 1.5rem center/8px 10px no-repeat,#232325 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2332E685' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 2.5rem/calc(0.625em + 1rem) calc(0.625em + 1rem) no-repeat}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#32e685;box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#32e685}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#32e685}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#32e685}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#5feca0;background-color:#5feca0}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#32e685}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#32e685}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#32e685;box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff198b}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(255,25,139,.9);border-radius:4px}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff198b;padding-right:calc(1.25em + 2rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23FF198B' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23FF198B' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3125em + 0.5rem) center;background-size:calc(0.625em + 1rem) calc(0.625em + 1rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff198b;box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:6rem !important;background-position:right 3rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.25em + 2rem);background-position:top calc(0.3125em + 0.5rem) right calc(0.3125em + 0.5rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#ff198b;padding-right:calc(0.75em + 4rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23232325' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 1.5rem center/8px 10px no-repeat,#232325 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23FF198B' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23FF198B' stroke='none'/%3e%3c/svg%3e") center right 2.5rem/calc(0.625em + 1rem) calc(0.625em + 1rem) no-repeat}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#ff198b;box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff198b}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#ff198b}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#ff198b}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#ff4ca5;background-color:#ff4ca5}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#ff198b}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#ff198b}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#ff198b;box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#e0e0e1;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:1rem 1.5rem;font-size:0.875rem;line-height:1.25;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#e0e0e1;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{box-shadow:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#9a52ff;border-color:#9a52ff;box-shadow:none}.btn-primary:hover{color:#fff;background-color:#842cff;border-color:#7c1fff}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#842cff;border-color:#7c1fff;box-shadow:0 0 0 .2rem rgba(169,108,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#9a52ff;border-color:#9a52ff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#7c1fff;border-color:#7512ff}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(169,108,255,.5)}.btn-secondary{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1;box-shadow:none}.btn-secondary:hover{color:#111112;background-color:#cdcdce;border-color:#c6c6c8}.btn-secondary:focus,.btn-secondary.focus{color:#111112;background-color:#cdcdce;border-color:#c6c6c8;box-shadow:0 0 0 .2rem rgba(193,193,194,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#111112;background-color:#c6c6c8;border-color:#c0c0c2}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(193,193,194,.5)}.btn-success{color:#111112;background-color:#32e685;border-color:#32e685;box-shadow:none}.btn-success:hover{color:#fff;background-color:#1ad772;border-color:#19cc6c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#1ad772;border-color:#19cc6c;box-shadow:0 0 0 .2rem rgba(45,198,116,.5)}.btn-success.disabled,.btn-success:disabled{color:#111112;background-color:#32e685;border-color:#32e685}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#19cc6c;border-color:#18c166}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(45,198,116,.5)}.btn-info{color:#fff;background-color:#19a3ff;border-color:#19a3ff;box-shadow:none}.btn-info:hover{color:#fff;background-color:#0091f2;border-color:#0089e5}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#0091f2;border-color:#0089e5;box-shadow:0 0 0 .2rem rgba(60,177,255,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#19a3ff;border-color:#19a3ff}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#0089e5;border-color:#0082d8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(60,177,255,.5)}.btn-warning{color:#111112;background-color:#faff19;border-color:#faff19;box-shadow:none}.btn-warning:hover{color:#111112;background-color:#ecf200;border-color:#e0e500}.btn-warning:focus,.btn-warning.focus{color:#111112;background-color:#ecf200;border-color:#e0e500;box-shadow:0 0 0 .2rem rgba(215,219,24,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#111112;background-color:#faff19;border-color:#faff19}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#111112;background-color:#e0e500;border-color:#d4d800}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(215,219,24,.5)}.btn-danger{color:#fff;background-color:#ff198b;border-color:#ff198b;box-shadow:none}.btn-danger:hover{color:#fff;background-color:#f20078;border-color:#e50072}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#f20078;border-color:#e50072;box-shadow:0 0 0 .2rem rgba(255,60,156,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ff198b;border-color:#ff198b}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#e50072;border-color:#d8006b}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,60,156,.5)}.btn-light{color:#111112;background-color:#fff;border-color:#fff;box-shadow:none}.btn-light:hover{color:#111112;background-color:#ececec;border-color:#e6e6e6}.btn-light:focus,.btn-light.focus{color:#111112;background-color:#ececec;border-color:#e6e6e6;box-shadow:0 0 0 .2rem rgba(219,219,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#111112;background-color:#fff;border-color:#fff}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#111112;background-color:#e6e6e6;border-color:#dfdfdf}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(219,219,219,.5)}.btn-dark{color:#fff;background-color:#111112;border-color:#111112;box-shadow:none}.btn-dark:hover{color:#fff;background-color:#000;border-color:#000}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#000;border-color:#000;box-shadow:0 0 0 .2rem rgba(53,53,54,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#111112;border-color:#111112}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#000;border-color:#000}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(53,53,54,.5)}.btn-outline-primary{color:#9a52ff;border-color:#9a52ff}.btn-outline-primary:hover{color:#fff;background-color:#9a52ff;border-color:#9a52ff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(154,82,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#9a52ff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#9a52ff;border-color:#9a52ff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(154,82,255,.5)}.btn-outline-secondary{color:#e0e0e1;border-color:#e0e0e1}.btn-outline-secondary:hover{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(224,224,225,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#e0e0e1;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(224,224,225,.5)}.btn-outline-success{color:#32e685;border-color:#32e685}.btn-outline-success:hover{color:#111112;background-color:#32e685;border-color:#32e685}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(50,230,133,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#32e685;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#111112;background-color:#32e685;border-color:#32e685}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(50,230,133,.5)}.btn-outline-info{color:#19a3ff;border-color:#19a3ff}.btn-outline-info:hover{color:#fff;background-color:#19a3ff;border-color:#19a3ff}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(25,163,255,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#19a3ff;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#19a3ff;border-color:#19a3ff}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(25,163,255,.5)}.btn-outline-warning{color:#faff19;border-color:#faff19}.btn-outline-warning:hover{color:#111112;background-color:#faff19;border-color:#faff19}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(250,255,25,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#faff19;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#111112;background-color:#faff19;border-color:#faff19}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(250,255,25,.5)}.btn-outline-danger{color:#ff198b;border-color:#ff198b}.btn-outline-danger:hover{color:#fff;background-color:#ff198b;border-color:#ff198b}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(255,25,139,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ff198b;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#ff198b;border-color:#ff198b}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,25,139,.5)}.btn-outline-light{color:#fff;border-color:#fff}.btn-outline-light:hover{color:#111112;background-color:#fff;border-color:#fff}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#fff;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#111112;background-color:#fff;border-color:#fff}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-outline-dark{color:#111112;border-color:#111112}.btn-outline-dark:hover{color:#fff;background-color:#111112;border-color:#111112}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(17,17,18,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#111112;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#111112;border-color:#111112}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(17,17,18,.5)}.btn-link{font-weight:400;color:#fff;text-decoration:none}.btn-link:hover{color:#9a52ff;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline}.btn-link:disabled,.btn-link.disabled{color:#454549;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:8px}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:4px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.width{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:.4em solid;border-right:.4em solid transparent;border-bottom:0;border-left:.4em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#e0e0e1;text-align:left;list-style:none;background-color:#111112;background-clip:padding-box;border:1px solid #111112;border-radius:4px;box-shadow:0px 5px 40px #000}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:0;border-right:.4em solid transparent;border-bottom:.4em solid;border-left:.4em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:.4em solid transparent;border-right:0;border-bottom:.4em solid transparent;border-left:.4em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.34em;vertical-align:.34em;content:"";border-top:.4em solid transparent;border-right:.4em solid;border-bottom:.4em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #000}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#fff;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#9a52ff;text-decoration:none;background-color:#111112}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:transparent}.dropdown-item.disabled,.dropdown-item:disabled{color:#838386;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#454549;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:none}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.form-control:not(:last-child),.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:1rem 1.5rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#fff;text-align:center;white-space:nowrap;background-color:#454549;border:1px solid transparent;border-radius:4px}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:8px}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:4px}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:2.5rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;print-color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#9a52ff;background-color:#9a52ff}.custom-control-input:focus~.custom-control-label::before{box-shadow:none,0 0 0 .2rem rgba(154,82,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#e4d2ff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#fff;border-color:#fff}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#454549}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#454549}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#232325;border:1px solid #838386;box-shadow:none}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:4px}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23FFFFFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#9a52ff;background-color:#9a52ff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23FFFFFF' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23FFFFFF'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(0.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#838386;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#232325;transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.25em + 2rem + 2px);padding:1rem 2.5rem 1rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.25;color:#fff;vertical-align:middle;background:#232325 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23232325' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 1.5rem center/8px 10px no-repeat;border:1px solid transparent;border-radius:4px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);appearance:none}.custom-select:focus{border-color:#e4d2ff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .2rem rgba(154,82,255,.25)}.custom-select:focus::-ms-value{color:#fff;background-color:#232325}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:1.5rem;background-image:none}.custom-select:disabled{color:#454549;background-color:#e0e0e1}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.25em + 2rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.25em + 2rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#e4d2ff;box-shadow:0 0 0 .2rem rgba(154,82,255,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#454549}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.25em + 2rem + 2px);padding:1rem 1.5rem;overflow:hidden;font-weight:400;line-height:1.25;color:#fff;background-color:#232325;border:1px solid transparent;border-radius:4px;box-shadow:none}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.25em + 2rem);padding:1rem 1.5rem;line-height:1.25;color:#fff;content:"Browse";background-color:#454549;border-left:inherit;border-radius:0 4px 4px 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#9a52ff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#fff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#c1c1c2;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#9a52ff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#fff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#c1c1c2;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#9a52ff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#fff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-fill-lower{background-color:#c1c1c2;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#c1c1c2;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#838386}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#838386}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#838386}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:1rem 2rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#454549;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #c1c1c2}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:4px;border-top-right-radius:4px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:#e0e0e1 #e0e0e1 #c1c1c2}.nav-tabs .nav-link.disabled{color:#454549;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#343437;background-color:#111112;border-color:#c1c1c2 #c1c1c2 #111112}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:4px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#9a52ff}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:0 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:1.25rem;padding-bottom:1.25rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:1rem;padding-bottom:1rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:#454549}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:#454549;border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23454549' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#454549}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#9a52ff}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23FFFFFF' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#232325;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:8px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:7px;border-top-right-radius:7px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:2rem}.card-title{margin-bottom:2rem}.card-subtitle{margin-top:-1rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:2rem}.card-header{padding:2rem 2rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:7px 7px 0 0}.card-footer{padding:2rem 2rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 7px 7px}.card-header-tabs{margin-right:-1rem;margin-bottom:-2rem;margin-left:-1rem;border-bottom:0}.card-header-pills{margin-right:-1rem;margin-left:-1rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:7px}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:7px;border-top-right-radius:7px}.card-img,.card-img-bottom{border-bottom-right-radius:7px;border-bottom-left-radius:7px}.card-deck .card{margin-bottom:1.25rem}@media(min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-1.25rem;margin-left:-1.25rem}.card-deck .card{flex:1 0 0%;margin-right:1.25rem;margin-bottom:0;margin-left:1.25rem}}.card-group>.card{margin-bottom:15px}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:2rem}@media(min-width: 576px){.card-columns{column-count:3;column-gap:2rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#111112;border-radius:4px}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#454549;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#a2a2a4}.pagination{display:flex;padding-left:0;list-style:none;border-radius:4px}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#fff;background-color:#fff;border:1px solid #c1c1c2}.page-link:hover{z-index:2;color:#9a52ff;text-decoration:none;background-color:#e0e0e1;border-color:#c1c1c2}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(154,82,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.page-item:last-child .page-link{border-top-right-radius:4px;border-bottom-right-radius:4px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#9a52ff;border-color:#9a52ff}.page-item.disabled .page-link{color:#454549;pointer-events:none;cursor:auto;background-color:#fff;border-color:#c1c1c2}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:8px;border-bottom-left-radius:8px}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:8px;border-bottom-right-radius:8px}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:4px;border-bottom-right-radius:4px}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#9a52ff}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#7c1fff}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(154,82,255,.5)}.badge-secondary{color:#111112;background-color:#e0e0e1}a.badge-secondary:hover,a.badge-secondary:focus{color:#111112;background-color:#c6c6c8}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(224,224,225,.5)}.badge-success{color:#111112;background-color:#32e685}a.badge-success:hover,a.badge-success:focus{color:#111112;background-color:#19cc6c}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(50,230,133,.5)}.badge-info{color:#fff;background-color:#19a3ff}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#0089e5}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(25,163,255,.5)}.badge-warning{color:#111112;background-color:#faff19}a.badge-warning:hover,a.badge-warning:focus{color:#111112;background-color:#e0e500}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(250,255,25,.5)}.badge-danger{color:#fff;background-color:#ff198b}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#e50072}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,25,139,.5)}.badge-light{color:#111112;background-color:#fff}a.badge-light:hover,a.badge-light:focus{color:#111112;background-color:#e6e6e6}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.badge-dark{color:#fff;background-color:#111112}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#000}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(17,17,18,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e0e0e1;border-radius:8px}@media(min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:4px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#502b85;background-color:#ebdcff;border-color:#e3cfff}.alert-primary hr{border-top-color:#d4b6ff}.alert-primary .alert-link{color:#391f5e}.alert-secondary{color:#747475;background-color:#f9f9f9;border-color:#f6f6f7}.alert-secondary hr{border-top-color:#e9e9eb}.alert-secondary .alert-link{color:#5b5b5b}.alert-success{color:#1a7845;background-color:#d6fae7;border-color:#c6f8dd}.alert-success hr{border-top-color:#aff5cf}.alert-success .alert-link{color:#114e2d}.alert-info{color:#0d5585;background-color:#d1edff;border-color:#bfe5ff}.alert-info hr{border-top-color:#a6dbff}.alert-info .alert-link{color:#083757}.alert-warning{color:#82850d;background-color:#feffd1;border-color:#feffbf}.alert-warning hr{border-top-color:#feffa6}.alert-warning .alert-link{color:#555708}.alert-danger{color:#850d48;background-color:#ffd1e8;border-color:#ffbfdf}.alert-danger hr{border-top-color:#ffa6d2}.alert-danger .alert-link{color:#57082f}.alert-light{color:#858585;background-color:#fff;border-color:#fff}.alert-light hr{border-top-color:#f2f2f2}.alert-light .alert-link{color:#6c6c6c}.alert-dark{color:#090909;background-color:#cfcfd0;border-color:#bcbcbd}.alert-dark hr{border-top-color:#afafb0}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:0.75rem;background-color:#111112;border-radius:4px;box-shadow:inset 0 .1rem .1rem rgba(0,0,0,.1)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#9a52ff;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:4px}.list-group-item-action{width:100%;color:#343437;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#343437;text-decoration:none;background-color:#f5f5f7}.list-group-item-action:active{color:#e0e0e1;background-color:#e0e0e1}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#111112;border:1px solid #232325}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#e0e0e1;pointer-events:none;background-color:#111112}.list-group-item.active{z-index:2;color:#fff;background-color:#9a52ff;border-color:#9a52ff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#502b85;background-color:#e3cfff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#502b85;background-color:#d4b6ff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#502b85;border-color:#502b85}.list-group-item-secondary{color:#747475;background-color:#f6f6f7}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#747475;background-color:#e9e9eb}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#747475;border-color:#747475}.list-group-item-success{color:#1a7845;background-color:#c6f8dd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1a7845;background-color:#aff5cf}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1a7845;border-color:#1a7845}.list-group-item-info{color:#0d5585;background-color:#bfe5ff}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0d5585;background-color:#a6dbff}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0d5585;border-color:#0d5585}.list-group-item-warning{color:#82850d;background-color:#feffbf}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#82850d;background-color:#feffa6}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#82850d;border-color:#82850d}.list-group-item-danger{color:#850d48;background-color:#ffbfdf}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#850d48;background-color:#ffa6d2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#850d48;border-color:#850d48}.list-group-item-light{color:#858585;background-color:#fff}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#858585;background-color:#f2f2f2}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#858585;border-color:#858585}.list-group-item-dark{color:#090909;background-color:#bcbcbd}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#090909;background-color:#afafb0}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#090909;border-color:#090909}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#ff198b;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#ff198b;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:0.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#454549;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#000;background-clip:padding-box;border:1px solid #e0e0e1;border-radius:8px;box-shadow:0 .25rem .5rem rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #c1c1c2;border-top-left-radius:7px;border-top-right-radius:7px}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #c1c1c2;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:min-content}.modal-content{box-shadow:0 .5rem 1rem rgba(0,0,0,.5)}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Work Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:4px}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Work Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:8px;box-shadow:0 .25rem .5rem rgba(0,0,0,.2)}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 8px}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:8px 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:8px 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:#fff;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:7px;border-top-right-radius:7px}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#e0e0e1}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentcolor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#9a52ff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#7c1fff !important}.bg-secondary{background-color:#e0e0e1 !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#c6c6c8 !important}.bg-success{background-color:#32e685 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#19cc6c !important}.bg-info{background-color:#19a3ff !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#0089e5 !important}.bg-warning{background-color:#faff19 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e0e500 !important}.bg-danger{background-color:#ff198b !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#e50072 !important}.bg-light{background-color:#fff !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#e6e6e6 !important}.bg-dark{background-color:#111112 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#000 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #c1c1c2 !important}.border-top{border-top:1px solid #c1c1c2 !important}.border-right{border-right:1px solid #c1c1c2 !important}.border-bottom{border-bottom:1px solid #c1c1c2 !important}.border-left{border-left:1px solid #c1c1c2 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#9a52ff !important}.border-secondary{border-color:#e0e0e1 !important}.border-success{border-color:#32e685 !important}.border-info{border-color:#19a3ff !important}.border-warning{border-color:#faff19 !important}.border-danger{border-color:#ff198b !important}.border-light{border-color:#fff !important}.border-dark{border-color:#111112 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:4px !important}.rounded{border-radius:4px !important}.rounded-top{border-top-left-radius:4px !important;border-top-right-radius:4px !important}.rounded-right{border-top-right-radius:4px !important;border-bottom-right-radius:4px !important}.rounded-bottom{border-bottom-right-radius:4px !important;border-bottom-left-radius:4px !important}.rounded-left{border-top-left-radius:4px !important;border-bottom-left-radius:4px !important}.rounded-lg{border-radius:8px !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media(min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media(min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media(min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media(min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:"Space Mono",monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#9a52ff !important}a.text-primary:hover,a.text-primary:focus{color:#6d06ff !important}.text-secondary{color:#e0e0e1 !important}a.text-secondary:hover,a.text-secondary:focus{color:#b9b9bb !important}.text-success{color:#32e685 !important}a.text-success:hover,a.text-success:focus{color:#16b560 !important}.text-info{color:#19a3ff !important}a.text-info:hover,a.text-info:focus{color:#007acc !important}.text-warning{color:#faff19 !important}a.text-warning:hover,a.text-warning:focus{color:#c7cc00 !important}.text-danger{color:#ff198b !important}a.text-danger:hover,a.text-danger:focus{color:#cc0065 !important}.text-light{color:#fff !important}a.text-light:hover,a.text-light:focus{color:#d9d9d9 !important}.text-dark{color:#111112 !important}a.text-dark:hover,a.text-dark:focus{color:#000 !important}.text-body{color:#e0e0e1 !important}.text-muted{color:#e0e0e1 !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;word-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #838386;page-break-inside:avoid}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #c1c1c2 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#c1c1c2}.table .thead-dark th{color:inherit;border-color:#c1c1c2}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}pre,code{font-feature-settings:"liga" 0;font-variant-ligatures:none}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-weight:bold}h1,.h1{font-size:3.875rem;line-height:70px}@media(max-width: 480px){h1,.h1{font-size:2.625rem;line-height:48px}}h2,.h2{font-size:3.5rem;line-height:62px}@media(max-width: 767.98px){h2,.h2{font-size:1.75rem;line-height:34px}}@media(max-width: 767.98px){h2-sm,.h2-sm{font-size:1.75rem !important;line-height:34px !important}}h3,.h3{font-size:3rem;line-height:52px}@media(max-width: 767.98px){h3,.h3{font-size:1.5rem;line-height:28px}}@media(max-width: 767.98px){h3-sm,.h3-sm{font-size:1.5rem;line-height:28px}}h4,.h4{font-size:2rem;line-height:38px}@media(max-width: 767.98px){h4,.h4{font-size:1.25rem;line-height:26px}}h5,.h5{font-size:1.5rem;line-height:32px}@media(max-width: 767.98px){h5,.h5{font-size:1.125rem;line-height:26px}}h6,.h6{font-size:1.25rem;line-height:26px}@media(max-width: 767.98px){h6,.h6{font-size:1rem;line-height:24px}}.longform{font-size:1.5rem;line-height:32px;color:#f5f5f7;font-weight:500}@media(max-width: 767.98px){.longform{font-size:1.25rem;line-height:26px}}.numbers{font-size:6rem;line-height:104px;font-weight:bold;color:#fff}@media(max-width: 767.98px){.numbers{font-size:3.875rem;line-height:70px}}p{font-size:1rem;line-height:24px}.fs-base{font-size:1rem}.fs-3{font-size:.75rem;line-height:1rem}.fs-4-5{font-size:1.125rem}.fs-5{font-size:1.25rem}.fs-5-5{font-size:1.375rem}.fs-6{font-size:1.5rem}.normal{font-weight:normal}.bold{font-weight:bold}.text-largest{font-size:1.5rem;font-weight:normal}.text-large{font-size:1.125rem}.text-small{font-size:.875rem}.text-smaller{font-size:.75rem}.text-smallest{font-size:.625rem}.arrow-link{text-decoration:none}.arrow-link:after{content:url(../img/icon-long-arrow.svg);width:28px;padding-left:7px;transition:all .2s ease-in-out;display:inline-block;text-decoration:none}.arrow-link:hover:after{padding-left:14px}.lang-ja{font-family:"Work Sans","Noto Sans JP",sans-serif}.lang-ja h1,.lang-ja h2,.lang-ja h3,.lang-ja h4,.lang-ja h5,.lang-ja .navbar .navbar-nav .nav-link,.lang-ja article .children-display li a,.lang-ja .right-sidebar .level-1 a,.lang-ja .right-sidebar .separator{font-family:"Work Sans","Noto Sans JP",sans-serif}.search .input-group-text{border-width:0;color:#fff;background-color:#232325;border-radius:4px 0 0 4px;padding:.5rem .5rem .5rem 1rem;line-height:1.5}.search .ds-input{background-color:#232325;border-radius:0 4px 4px 0;padding:.75rem 1rem .75rem .5rem;width:100%;border:1px solid #232325}.search .ds-input:focus{box-shadow:none;border-color:#9a52ff}.search .algolia-autocomplete{flex-grow:1}#algolia-autocomplete-listbox-0{z-index:1100 !important}.xrp-ledger-dev-portal .DocSearch-Modal{top:85px;background-color:#232325;box-shadow:none}.xrp-ledger-dev-portal .DocSearch-Form{box-shadow:inset 0 0 0 2px #9a52ff;background-color:#232325}.xrp-ledger-dev-portal .DocSearch-Hit-source{color:#9a52ff}.xrp-ledger-dev-portal .DocSearch-Hits mark{color:#9a52ff}.xrp-ledger-dev-portal .DocSearch-Hit-source,.xrp-ledger-dev-portal .DocSearch-Hit-Container,.xrp-ledger-dev-portal .DocSearch-Footer{background-color:#232325}.xrp-ledger-dev-portal .DocSearch-Hit a{background-color:#232325;box-shadow:none}.xrp-ledger-dev-portal .DocSearch-Hit-source{color:#a2a2a4}.xrp-ledger-dev-portal .DocSearch-Input{color:#fff}.xrp-ledger-dev-portal .DocSearch-Hit-title,.xrp-ledger-dev-portal .DocSearch-Hit-path,.xrp-ledger-dev-portal .DocSearch-Label,.xrp-ledger-dev-portal .DocSearch-Help{color:#f5f5f7 !important}.xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a{background:#343437}.xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-Container{background-color:#343437}.xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a mark{color:#9a52ff !important}.xrp-ledger-dev-portal .DocSearch-Prefill{color:#9a52ff}.xrp-ledger-dev-portal .DocSearch-Button{background:#232325;width:100%}.xrp-ledger-dev-portal .DocSearch-Button:hover{background:#232325;border-radius:40px;box-shadow:inset 0 0 0 2px #9a52ff}.xrp-ledger-dev-portal .DocSearch-Button:hover .DocSearch-Button-Placeholder{color:#fff}.xrp-ledger-dev-portal .DocSearch-Search-Icon{color:#fff !important}.xrp-ledger-dev-portal .DocSearch-Modal{margin-top:-20px;max-width:55%;margin-right:13.5em}@media(max-width: 991.98px){.xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu{min-width:unset}.xrp-ledger-dev-portal .DocSearch-Modal{top:127px;max-width:100%;margin-left:10px;margin-right:20px}}.xrp-ledger-dev-portal .DocSearch-Container{z-index:99999 !important;background-color:transparent !important}.xrp-ledger-dev-portal .DocSearch-Logo svg .cls-1,.xrp-ledger-dev-portal .DocSearch-Logo svg .cls-2{fill:#fff}.xrp-ledger-dev-portal .DocSearch-Commands-Key{color:#232325}.xrp-ledger-dev-portal #centersearchboxcontainer{justify-content:center}.xrp-ledger-dev-portal #topsearchboxcontainer{justify-content:right}.xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background-color:#111112;border:0;border-radius:8px}.xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu::before{background-color:#111112;border:0}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion{background-color:#111112}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header{color:#fff;border:0;border-bottom:2px solid #9a52ff;font-weight:bold}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{color:#fff}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--title{color:#fff}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--text{font-size:.8rem;color:#e0e0e1}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#fff;background-color:#343437}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{box-shadow:none;background-color:#343437}#xrp-ledger-dev-portal{overflow:auto !important}body{position:relative}section{position:relative}.landing{padding:0}.square{position:relative;flex-basis:calc(50% - 30px);margin:15px;box-sizing:border-box;justify-content:center;align-items:center;border-radius:8px}.square::before{content:"";display:block;padding-top:100%}@media(min-width: 992px){.square{flex-basis:calc(25% - 30px)}}.square-50{flex-basis:calc(50% - 30px)}@media(max-width: 767.98px){.square-50{flex-basis:calc(50% - 20px)}}.nav-grid-lg{display:flex;flex-direction:column}.nav-grid-lg .nav-item{width:100%}.nav-grid-lg .nav-item .nav-link{display:flex}.nav-grid-lg .nav-item .nav-link span{flex-grow:0}.nav-grid-lg .nav-item .nav-link img{max-height:2rem}.nav-grid-lg .nav-grid-head{margin-top:2.5rem}@media(min-width: 992px){.nav-grid-lg{display:grid;grid-auto-flow:column;grid-column-gap:80px}.nav-grid-lg .nav-grid-head{margin-top:0}}.col-lg{padding-left:0;padding-right:0}@media(min-width: 992px){.cols-of-1{grid-template-rows:repeat(1, min-content)}}@media(min-width: 992px){.cols-of-2{grid-template-rows:repeat(2, min-content)}}@media(min-width: 992px){.cols-of-3{grid-template-rows:repeat(3, min-content)}}@media(min-width: 992px){.cols-of-4{grid-template-rows:repeat(4, min-content)}}@media(min-width: 992px){.cols-of-5{grid-template-rows:repeat(5, min-content)}}@media(min-width: 992px){.cols-of-6{grid-template-rows:repeat(6, min-content)}}.card-grid{display:grid;grid-gap:40px;padding:0;width:100%;grid-template-columns:1fr}@media(min-width: 992px){.card-grid{grid-gap:80px}}.card-grid .col{padding-left:0;padding-right:0;min-width:100%}.card-grid.card-grid-4xN{grid-auto-rows:auto;grid-template-columns:repeat(2, 1fr)}@media(min-width: 992px){.card-grid.card-grid-4xN{grid-template-columns:repeat(4, 1fr)}}.card-grid.card-grid-3xN{grid-auto-rows:auto}@media(min-width: 992px){.card-grid.card-grid-3xN{grid-template-columns:1fr 1fr 1fr}}.card-grid.card-grid-2xN{grid-template-columns:1fr 1fr;grid-auto-rows:auto}@media(max-width: 991.98px){.card-grid.card-grid-2xN{grid-template-columns:1fr}}.card-grid.card-grid-1x2{grid-template-columns:1fr 2fr;grid-auto-rows:auto}@media(max-width: 991.98px){.card-grid.card-grid-1x2{display:flex}}.card-grid .card{padding:20px;border:0;min-height:264px}@media(min-width: 768px){.card-grid .card{min-height:347px}}@media(min-width: 992px){.card-grid .card{padding:40px}}.card-grid .card .card-body{padding:8px;padding-bottom:24px}.card-grid .card .card-body .card-icon-container{width:50px;height:50px}.card-grid .card .card-body .card-icon-container img{width:70%;height:70%}.card-grid.section-hero{padding-left:0}.container-new{display:flex;flex-wrap:wrap;margin:0 auto;padding:0 32px;max-width:100%;z-index:1}@media(min-width: 768px){.container-new{max-width:608px}}@media(min-width: 992px){.container-new{max-width:942px}}@media(min-width: 1200px){.container-new{max-width:1280px}}@media(max-width: 991.98px){article{overflow-wrap:break-word;word-wrap:break-word;overflow:hidden}}@media(max-width: 480px){html{overflow-x:hidden !important}}@media(max-width: 400px){.navbar .navbar-brand .brand-text{margin-right:0;letter-spacing:-0.08rem}.navbar .navbar-brand{margin-right:0}.navbar .navbar-brand .logo{margin-right:0;margin-left:-1rem}.btn{white-space:normal}}.timeline-wrapper{z-index:999;position:relative}.timeline:before{content:"";position:absolute;top:-40px;left:18px;height:95%;width:4px;background:linear-gradient(180deg, #feff01 0%, #ff2d9a 33%, #a3088f 66%, rgba(44, 4, 128, 0.85) 100%)}@media(max-width: 991.98px){.timeline:before{left:8px}}.timeline-dot{margin-top:94px;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-negative:0;flex-shrink:0;width:18px;height:18px;border-radius:50%;background:#111112;box-sizing:border-box}.timeline-block:first-child .timeline-dot{border:3px solid #faff19}.timeline-block:nth-child(2) .timeline-dot{border:3px solid #ff884b}.timeline-block:nth-child(3) .timeline-dot{border:3px solid #c000e5}.timeline-block:nth-child(4) .timeline-dot{border:3px solid #40004c}.timeline-block{display:flex;position:relative;z-index:1}.timeline-content{flex-grow:1;position:relative;margin-left:1.25em}.timeline h4{margin-top:-4px}@media(min-width: 768px){.timeline:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.timeline-dot{-ms-flex-order:1;order:1;margin-left:calc(5% - 9px);will-change:transform}.timeline-block:nth-child(even){-ms-flex-direction:row-reverse;flex-direction:row-reverse}.timeline-dot{margin-right:calc(5% - 9px)}.timeline-content{width:45%;-ms-flex-positive:0;flex-grow:0;will-change:transform;margin:0;--line-height-multiplier: 1.2}}@media(min-width: 992px){[data-component-name="TableOfContent/TableOfContent"]{margin-right:32px}}aside li a{color:#fff;text-decoration:none;font-size:1.05rem}aside .sidenav_cat_title{color:#fff}aside a:hover,aside .sidenav_cat_title:hover{color:#9a52ff}aside a.active,aside a.active:hover,aside .active>a,aside .active>a:hover{color:#9a52ff;font-weight:700}aside a.active-parent,aside .active-parent>a{font-weight:700}.page-toc .level-1 a,.command-list .separator{font-weight:700;color:#fff}.nav-toggler{position:absolute;width:1.75em;height:1.75em;line-height:0;display:grid;justify-content:center;align-content:center}.nav-toggler::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:.4em solid;border-right:.4em solid transparent;border-bottom:0;border-left:.4em solid transparent}.nav-toggler:empty::after{margin-left:0}.nav-toggler::after{transition-duration:.3s}.nav-toggler.collapsed::after{transform:rotate(-90deg)}.dactyl-tree-nav nav{margin-left:1rem;padding-left:0;border-left:1px solid #fff}.dactyl-tree-nav nav .nav-link:hover,.dactyl-tree-nav nav .nav-link:active{border-left:1px solid #9a52ff;margin-left:-1px}.dactyl-tree-nav nav .active>.nav-link{border-left:2px solid #9a52ff;margin-left:-1px;padding-left:calc(1rem - 1px)}.dactyl-tree-nav .nav-item{position:relative}.dactyl-tree-nav .nav-item .nav-link{padding:.25rem 1rem;font-size:.9rem}.dactyl-tree-nav .nav-item.nav-parent{padding-top:0}.dactyl-tree-nav .nav-item.nav-parent .nav-link{padding-left:0;padding-top:0;font-size:1.125rem;line-height:initial}.dactyl-tree-nav .nav-item .nav-toggler+.nav-link{padding-left:2rem}.dactyl-tree-nav>.nav-item{padding:.5rem 0;font-size:1.125rem}.dactyl-tree-nav>.nav-item>.nav-link{font-weight:bold}.dactyl-tree-nav .collapsing.nav{flex-wrap:unset}.toc-header{font-weight:bold;font-size:14px;padding:1rem 0}.toc-header h4{line-height:20px;font-size:1.2em;padding:0;margin:0}#page-toc-wrapper .card-body{list-style-type:none}.page-toc,.command-list{padding-left:0;border-left:1px solid #fff}.page-toc li,.command-list li{list-style-type:none;padding:0}.page-toc li.separator,.command-list li.separator{padding:.25rem 1rem}.page-toc li a,.command-list li a{display:block;margin-top:5px;padding:.25rem 1rem;font-size:.9rem}.page-toc li a:hover,.page-toc li a .active,.command-list li a:hover,.command-list li a .active{text-decoration:none;border-left:1px solid #9a52ff;margin-left:-1px}.page-toc li.active a,.page-toc li.active a:hover,.command-list li.active a,.command-list li.active a:hover{border-left:2px solid #9a52ff;padding-left:calc(1rem - 1px);margin-left:-1px}.page-toc .level-3,.command-list .level-3{margin-left:16px;border-left:1px solid #fff;margin-bottom:0;padding-bottom:5px}.page-toc .level-3 a,.command-list .level-3 a{margin-top:0;padding-bottom:5px}.page-toc.no-sideline,.command-list.no-sideline{border-left:0}.page-toc.no-sideline a:hover,.page-toc.no-sideline a.active,.command-list.no-sideline a:hover,.command-list.no-sideline a.active{border-left:0;margin-left:0}.command-list li a{margin-top:0}.h32{height:32px}.w32{width:32px}.h36{height:36px}.w36{width:36px}.h40{height:40px}.w40{width:40px}.w44{width:44px}.w48{width:48px}.w-100{width:100%}.min-vh100{min-height:100vh}.vw100{width:100vw;min-width:100%}@media(max-width: 767.98px){.mb-3-sm-i{margin-bottom:1rem !important}}.ml-5{margin-left:1.25rem}@media(min-width: 768px){.ml-5-until-md{margin-left:1.25rem}}.mr-5{margin-right:1.25rem}@media(min-width: 768px){.mr-5-until-md{margin-right:1.25rem}}.mb-6{margin-bottom:1.5rem}@media(max-width: 767.98px){.mb-6-sm{margin-bottom:1.5rem}}.mt-6{margin-top:1.5rem}@media(min-width: 576px){.mt-6-until-sm{margin-top:1.5rem !important}}.mb-8{margin-bottom:2rem}@media(max-width: 767.98px){.mb-8-sm{margin-bottom:2rem}}.mt-8{margin-top:2rem}@media(min-width: 576px){.mt-8-until-sm{margin-top:2rem !important}}.mt-9{margin-top:2.25rem}.mb-9{margin-bottom:2.25rem}.mt-10{margin-top:2.5rem}@media(max-width: 767.98px){.mt-10-sm{margin-top:2.5rem}}.mb-10{margin-bottom:2.5rem}@media(min-width: 576px){.mb-10-until-sm{margin-bottom:2.5rem}}@media(max-width: 767.98px){.mb-10-sm{margin-bottom:2.5rem}}.ml-10{margin-left:2.5rem}.mr-10{margin-right:2.5rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}@media(min-width: 576px){.mx-10-until-sm{margin-left:2.5rem;margin-right:2.5rem}}@media(min-width: 768px){.mx-10-until-md{margin-left:2.5rem;margin-right:2.5rem}}@media(max-width: 767.98px){.mx-10-sm{margin-left:2.5rem;margin-right:2.5rem}}.mt-12{margin-top:3rem}.mb-12{margin-bottom:3rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mt-13{margin-top:3.25rem}.mb-13{margin-bottom:3.25rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}@media(max-width: 767.98px){.mt-16-sm{margin-top:4rem}}.mb-16{margin-bottom:4rem}@media(max-width: 767.98px){.mb-16-sm{margin-bottom:4rem}}.mb-18{margin-bottom:4.5rem}.mt-20{margin-top:5rem}@media(max-width: 767.98px){.mt-20-sm{margin-top:5rem}}@media(min-width: 576px){.mt-20-until-sm{margin-top:5rem}}.mb-20{margin-bottom:5rem}@media(max-width: 767.98px){.mb-20-sm{margin-bottom:5rem}}@media(min-width: 576px){.mb-20-until-sm{margin-bottom:5rem}}.my-20{margin-top:5rem;margin-bottom:5rem}.my-26{margin-top:6.5rem;margin-bottom:6.5rem}.mb-30{margin-bottom:7.5rem}.mt-30{margin-top:7.5rem}@media(min-width: 576px){.mt-30-until-sm{margin-top:7.5rem}}.mt-40{margin-top:10rem}@media(min-width: 576px){.mt-40-until-sm{margin-top:10rem}}.mb-40{margin-bottom:10rem}@media(min-width: 576px){.mb-40-until-sm{margin-bottom:10rem}}.mb-49{margin-bottom:12.25rem}.mb-50{margin-bottom:12.5rem}@media(min-width: 576px){.mb-50-until-sm{margin-bottom:12.5rem}}@media(max-width: 767.98px){.pl-0-sm{padding-left:0 !important}}@media(max-width: 767.98px){.pr-0-sm{padding-right:0 !important}}@media(max-width: 767.98px){.pt-3-sm{padding-top:1rem !important}}.p-6{padding:1.5rem}@media(max-width: 767.98px){.p-6-sm{padding:1.5rem}}.p-8{padding:2rem}@media(max-width: 767.98px){.p-8-sm{padding:2rem}}.p-10{padding:2.5rem}@media(min-width: 576px){.p-10-until-sm{padding:2.5rem}}.py-20{padding-bottom:5rem;padding-top:5rem}.px-20{padding-left:5rem;padding-right:5rem}.pt-20{padding-top:5rem}.pb-20{padding-bottom:5rem}.py-26{padding-top:6.5rem;padding-bottom:6.5rem}@media(max-width: 767.98px){.py-26{padding-top:2.5rem;padding-bottom:2.5rem}}.pt-26{padding-top:2.5rem}@media(min-width: 576px){.pt-26-until-sm{padding-top:6.5rem}}.pb-26{padding-bottom:6.5rem}@media(min-width: 576px){.pb-26-until-sm{padding-bottom:6.5rem}}.pt-30{padding-top:7.5rem}.pb-30{padding-bottom:7.5rem}.pt-40{padding-top:10rem}@media(min-width: 576px){.pt-40-until-sm{padding-top:10rem}}.pb-40{padding-bottom:10rem}.pb-50{padding-bottom:12.5rem}.pt-50{padding-top:12.5rem}.py-50{padding-bottom:12.5rem;padding-top:12.5rem}@media(min-width: 576px){.py-50-until-sm{padding-bottom:12.5rem;padding-top:12.5rem}}.floating-nav{top:6rem}.last-section{margin-bottom:100px}.bottom-0{bottom:0}.justify-center{justify-content:center}@media(max-width: 767.98px){.justify-center-sm{justify-content:center}}@media(max-width: 575.98px){.overflow-xs{overflow:scroll}.overflow-x-xs{overflow-x:scroll;overflow-y:hidden}}@media(min-width: 768px){.position-sm-absolute{position:absolute}}.va-middle{vertical-align:middle}.ls-none{list-style:none}.no-wrap{white-space:nowrap}.align-items-stretch{align-items:stretch}.underline{text-decoration:underline}@media(max-width: 575.98px){.d-none-xs{display:none}}@media(max-width: 767.98px){.d-none-sm{display:none}}@media(min-width: 992px){.d-none-lg{display:none}}.d-block{display:block}.border-green{border:1px solid #9a52ff}.border-none{border:none !important}.grey-400{color:#a2a2a4}.grey-500{color:#838386}.grey-700{color:#343437}.white{color:#fff}.stat-highlight{color:#32e685}.br-8{border-radius:8px}@media(max-width: 767.98px){br.until-sm{content:""}}.z-index-1{z-index:1}.bb-gray{border-bottom:1px solid #454549}@keyframes arrowDance{0%{padding-left:7px}50%{padding-left:14px}100%{padding-left:7px}}@keyframes arrowDance2{0%{right:0}50%{right:7px}100%{right:0}}@keyframes arrowDanceDiag{0%{right:7px;margin-top:0}50%{right:0;margin-top:-7px}100%{right:7px;margin-top:0}}.btn,article a.button,article .btn{font-weight:bold;cursor:pointer;text-decoration:none;transition:.2s;padding:.5rem 1rem;line-height:16px}article a.button{padding:.5rem 1rem;margin:0 .5rem;display:inline-block}.btn.disabled,button.disabled,.btn[disabled=disabled],button[disabled=disabled]{cursor:not-allowed}.btn-primary code,.btn-secondary code{color:inherit}.btn-primary{background:#7919ff;font-weight:bold;color:#fff;border:none;border-color:transparent}.btn-primary:hover{background:#5f00e5}.btn-primary.disabled,.btn-primary[disabled=disabled]{background:#4a00b2}.btn-primary.disabled:hover,.btn-primary[disabled=disabled]:hover{background:#4a00b2}@media(max-width: 767.98px){.btn-arrow{display:block;width:100%}}.btn-arrow::after{display:inline-block;content:url(../img/icons/arrow-right.svg);position:relative;top:1px;vertical-align:middle;padding-left:8px;-webkit-transition:transform .3s ease-out;-moz-transition:transform .3s ease-out;-ms-transition:transform .3s ease-out;-o-transition:transform .3s ease-out;transition:transform .3s ease-out}.btn-arrow:hover{background:#5f00e5 !important;border:none}.btn-arrow:hover::after{-webkit-transform:translateX(4px);-moz-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}.btn-arrow-out::after{background-position:left 0px bottom 0px;content:" ";background-image:url(../img/icons/arrow-up-right-white.svg);background-repeat:no-repeat;display:inline-block;padding:4px 8px 4px 12px;transition:background-position .3s ease-in-out;margin-left:4px}.btn-arrow-out:hover::after{background-position:left 4px bottom 4px}@media(max-width: 767.98px){.btn-arrow-out{display:block;width:100%}}.jump-to-top{display:none;position:fixed;bottom:36px;right:36px;font-weight:700;z-index:1000}.jump-to-top::after{display:none}.accordian-row{background:#232325;border-radius:5px;padding:32px}.accordian-row h3 a{position:relative;padding-right:2rem}.accordian-row h3 a:hover{color:#fff}.accordian-row .chevron{position:absolute;top:0;right:0}article table{clear:right;margin-bottom:48px}article table code{word-break:normal;white-space:nowrap;overflow-wrap:normal}article table th{border-bottom:2px solid #e0e0e1}article table tr{border-bottom:1px solid #e0e0e1}article table th,article table td{padding:.2em;vertical-align:text-top}article table td:nth-child(1){font-weight:bold}.landing-table th,.landing-table tr{border-bottom:2px solid #454549}.landing-table td{width:33.33%;padding:16px 40px 16px 0}.landing-table td:nth-child(1){font-weight:normal}@media(max-width: 767.98px){.landing-table td{font-size:.875rem}}.landing-table tr:last-child{border-bottom:none}.landing-table tbody td{color:#e0e0e1}.dblue{color:#454549}#overview-table td:nth-child(1){width:40%}#overview-table td:nth-child(2){width:30%}#overview-table tbody td{padding:2rem .75rem}@media(max-width: 991.98px){#overview-table{font-size:.875rem}#overview-table thead .h4{font-size:1.125rem}}article table{clear:right;margin-bottom:48px}article table code{word-break:normal;white-space:nowrap;overflow-wrap:normal}article table th{border-bottom:2px solid #e0e0e1}article table tr{border-bottom:1px solid #e0e0e1}article table th,article table td{padding:.2em;vertical-align:text-top}article table td:nth-child(1){font-weight:bold}.landing-table th,.landing-table tr{border-bottom:2px solid #454549}.landing-table td{width:33.33%;padding:16px 40px 16px 0}.landing-table td:nth-child(1){font-weight:normal}@media(max-width: 767.98px){.landing-table td{font-size:.875rem}}.landing-table tr:last-child{border-bottom:none}.landing-table tbody td{color:#e0e0e1}.dblue{color:#454549}#overview-table td:nth-child(1){width:40%}#overview-table td:nth-child(2){width:30%}#overview-table tbody td{padding:2rem .75rem}@media(max-width: 991.98px){#overview-table{font-size:.875rem}#overview-table thead .h4{font-size:1.125rem}}#use_case_companies_list #threezy .biz-logo{max-height:40px;content:url("../img/uses/modallogos/threezy.png")}html.light .cryptum{content:url(../img/uses/lightmode/cryptum.jpg) !important;height:58px;max-width:max-content;width:184px;max-height:none;margin:0px;padding-bottom:10px}.xrp-ledger{content:url(../img/uses/modallogos/xrp-ledger.png)}html.light .xrp-ledger{content:url(../img/uses/lightmode/xrp-ledger.png)}.gatehub{content:url(../img/uses/modallogos/gatehub.png)}html.light .gatehub{content:url(../img/uses/lightmode/gatehub.png)}.towolabs{content:url(../img/uses/modallogos/towolabs.png)}html.light .towolabs{content:url(../img/uses/lightmode/towolabs.png)}.xrpscan{content:url(../img/uses/modallogos/xrpscan.png)}html.light .xrpscan{content:url(../img/uses/lightmode/xrpscan.png)}.xrp-toolkit{content:url(../img/uses/modallogos/xrp-toolkit.png)}html.light .xrp-toolkit{content:url(../img/uses/lightmode/xrp-toolkit.png)}.bithomp{content:url(../img/uses/modallogos/bithomp.png)}html.light .bithomp{content:url(../img/uses/lightmode/bithomp.png)}.onthedex{content:url(../img/uses/modallogos/onthedex.png)}html.light .onthedex{content:url(../img/uses/lightmode/onthedex.png)}.cryptum{content:url(../img/uses/modallogos/cryptum.png)}html.light .cryptum{content:url(../img/uses/lightmode/cryptum.png)}.evernode{content:url(../img/uses/modallogos/evernode.png)}html.light .evernode{content:url(../img/uses/lightmode/evernode.png)}.threezy{content:url(../img/uses/modallogos/threezy.png)}html.light .threezy{content:url(../img/uses/lightmode/threezy.png)}.tokenize{content:url(../img/uses/modallogos/tokenize.png)}html.light .tokenize{content:url(../img/uses/lightmode/tokenize.png)}.multichain{content:url(../img/uses/modallogos/multichain.png)}html.light .multichain{content:url(../img/uses/lightmode/multichain.png)}.crossmark{content:url(../img/uses/modallogos/crossmark.png)}html.light .crossmark{content:url(../img/uses/lightmode/crossmark.png)}.edge{content:url(../img/uses/modallogos/edge.png)}html.light .edge{content:url(../img/uses/lightmode/edge.png)}.gem-wallet{content:url(../img/uses/modallogos/gem-wallet.png)}html.light .gem-wallet{content:url(../img/uses/lightmode/gem-wallet.png)}.xumm{content:url(../img/uses/modallogos/xumm.png)}html.light .xumm{content:url(../img/uses/lightmode/xumm.png)}.aesthetes{content:url(../img/uses/modallogos/aesthetes.png)}html.light .aesthetes{content:url(../img/uses/lightmode/aesthetes.png)}.audiotarky{content:url(../img/uses/modallogos/audiotarky.png)}html.light .audiotarky{content:url(../img/uses/lightmode/audiotarky.png)}.nftmaster{content:url(../img/uses/modallogos/nftmaster.png)}html.light .nftmaster{content:url(../img/uses/lightmode/nftmaster.png)}.peerkat{content:url(../img/uses/modallogos/peerkat.png)}html.light .peerkat{content:url(../img/uses/lightmode/peerkat.png)}.sologenic_dex{content:url(../img/uses/modallogos/sologenic_dex.png)}html.light .sologenic_dex{content:url(../img/uses/lightmode/sologenic_dex.png)}.xrp-cafe{content:url(../img/uses/modallogos/xrp-cafe.png)}html.light .xrp-cafe{content:url(../img/uses/lightmode/xrp-cafe.png)}.xrp-oval{content:url(../img/uses/modallogos/xrp-oval.png)}html.light .xrp-oval{content:url(../img/uses/lightmode/xrp-oval.png)}.sologenic_dex{content:url(../img/uses/modallogos/sologenic_dex.png)}html.light .sologenic_dex{content:url(../img/uses/lightmode/sologenic_dex.png)}.xpmarket{content:url(../img/uses/modallogos/xpmarket.png)}html.light .xpmarket{content:url(../img/uses/lightmode/xpmarket.png)}.forte{content:url(../img/uses/modallogos/forte.png)}html.light .forte{content:url(../img/uses/lightmode/forte.png)}.ledger-city{content:url(../img/uses/modallogos/ledger-city.png)}html.light .ledger-city{content:url(../img/uses/lightmode/ledger-city.png)}.anchain{content:url(../img/uses/modallogos/anchain.png)}html.light .anchain{content:url(../img/uses/lightmode/anchain.png)}.ripple{content:url(../img/uses/modallogos/ripple.png)}html.light .ripple{content:url(../img/uses/lightmode/ripple.png)}.supermojo{content:url(../img/uses/modallogos/supermojo.png)}html.light .supermojo{content:url(../img/uses/lightmode/supermojo.png)}.ripple{content:url(../img/uses/modallogos/ripple.png)}html.light .ripple{content:url(../img/uses/lightmode/ripple.png)}.carbonland-trust{content:url(../img/uses/modallogos/carbonland-trust.png)}html.light .carbonland-trust{content:url(../img/uses/lightmode/carbonland-trust.png)}.gatehub{content:url(../img/uses/modallogos/gatehub.png)}html.light .gatehub{content:url(../img/uses/lightmode/gatehub.png)}.bitgo{content:url(../img/uses/modallogos/bitgo.png)}html.light .bitgo{content:url(../img/uses/lightmode/bitgo.png)}.arrow-button.left-arrow img{content:url(../img/uses/left-arrow.svg)}.arrow-button.right-arrow img{content:url(../img/uses/right-arrow.svg)}.html.light .arrow-button.left-arrow img{content:url(../img/uses/left-arrow-light.svg)}.html.light .arrow-button.right-arrow img{content:url(../img/uses/right-arrow-light.svg)}.related-tasks-links a{color:#454549;text-decoration:none}.related-tasks-links a:hover{color:#000}.arrows-container{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);display:flex;justify-content:space-between;z-index:10}@media only screen and (max-width: 768px){.arrows-container{top:30px}}.arrow-button{background-color:transparent;border:none;cursor:pointer}.arrow-button img{width:40px;height:40px}.left-arrow{margin-left:40px}@media only screen and (max-width: 768px){.left-arrow{margin-left:0px}}.right-arrow{margin-right:40px}@media only screen and (max-width: 768px){.right-arrow{margin-right:0px}}.modal-uses{display:none;position:fixed;z-index:1000;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgba(0,0,0,.4)}.modal-content-uses{position:relative;background-color:#232325;position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);padding:20px;width:60% !important;height:60%;display:flex;flex-direction:column;align-items:center;overflow:scroll}.modal-content-uses::before{content:"";position:absolute;top:0;left:0;width:100%;height:1px;background:linear-gradient(90deg, #b480ff -0.32%, #5f00e6 32.7%, #1aa4ff 61.53%, #19ff83 100.32%, #19ff83 100.32%)}.content-section{width:100%;display:flex;justify-content:center;align-items:center;margin-bottom:20px}.section-image{display:block}.section-text-title{font-family:"Work Sans";font-style:normal;font-weight:500;font-size:24px;line-height:32px;text-align:center;color:#fff}.section-text-description{max-width:320px;font-family:"Work Sans";font-style:normal;font-weight:400;font-size:16px;line-height:24px;text-align:center;color:#c1c1c2}.apps-built{position:relative;top:17px;left:50px;font-family:"Work Sans";font-style:normal;font-weight:600;font-size:12px;line-height:16px;color:#e0e0e1}.numbers-animation{width:218px;height:96px}.arrow-animation{position:relative;right:23px;top:-11px;width:60px !important}.explore-projects{font-family:"Work Sans";font-style:normal;font-weight:600;font-size:12px;line-height:16px;color:#7919ff;position:relative;top:-9px;right:27px}.section-separator{width:50%;border:0;border-top:1px solid #ccc}.threezy-logo{margin:4px;max-height:38px}.blockforce-logo{margin:0px !important;max-height:45px !important}.Evernode-logo{margin-right:39px}.logo-grid{display:grid;grid-template-rows:repeat(2, 1fr);grid-template-columns:repeat(4, 1fr);grid-gap:8px;justify-items:center}.flex-center{display:flex;justify-content:center}.top-row,.bottom-row{display:flex;justify-content:center}@media only screen and (max-width: 768px){.top-row,.bottom-row{flex-wrap:wrap}}.logo-item{max-height:30px;max-width:130px;margin:10px 11px}.close{color:#aaa;float:right;font-size:28px;font-weight:bold;cursor:pointer}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.use-case-circle{display:flex;align-items:center;justify-content:center;aspect-ratio:1/1;border:1px solid #343437;border-radius:50%;margin-bottom:30px;cursor:pointer}@media(min-width: 768px){.use-case-circle{aspect-ratio:1/1;min-width:200px !important;min-height:200px !important}}@media(min-width: 992px){.use-case-circle{aspect-ratio:1/1;min-width:250px !important;min-height:250px !important}}.use-case-circle:hover{border-color:#838386}.circle-content{display:flex;flex-direction:column;align-items:center;gap:13px}.circle-img{width:40px;height:40px}.circle-text{font-family:"Work Sans";font-style:normal;font-weight:700;white-space:nowrap;font-size:16px;margin-bottom:0px}.join-xrpl-section{display:flex;flex-direction:column;align-items:center}.colorful-join-text-wrapper{display:flex;justify-content:center;flex-direction:column;padding:0 5%;box-sizing:border-box}@media(min-width: 992px){.colorful-join-text-wrapper{padding:0 4%}}.colorful-join-text{display:block;width:100%;text-align:left;font-family:"Work Sans";font-style:normal;font-weight:400;font-size:32px;line-height:38px;background:linear-gradient(90deg, #feff01 0%, #ff2d9a 30.82%, #e24cff 64.01%, #9a52ff 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}#numbersAnimation{display:block}#numbersAnimationLight{display:none}html.light .section-separator{background:#c1c1c2}html.light .section-text-description{color:#343437}html.light .modal-content-uses{background:#fff}html.light #numbersAnimation{display:none}html.light #numbersAnimationLight{display:block}html.light .apps-built{position:relative;top:17px;left:50px;font-family:"Work Sans";font-style:normal;font-weight:600;font-size:12px;line-height:16px;color:#232325}html.light .colorful-join-text{display:block;width:100%;text-align:left;font-family:"Work Sans";font-style:normal;font-weight:400;font-size:32px;line-height:38px;background:linear-gradient(90deg, #b480ff -0.32%, #5f00e6 32.7%, #1aa4ff 61.53%, #19ff83 100.32%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}@media(min-width: 992px){html.light .colorful-join-text{width:750px}}@media(min-width: 992px){.colorful-join-text{width:750px}}.pill-box{display:inline-flex;align-items:center;justify-content:center;padding:3.69087px 29.527px;width:73.05px;height:37.38px;background:#7919ff;border:3.69087px solid #5f00e5;border-radius:184.543px}.pill-number{font-family:"Work Sans";font-style:normal;font-weight:600;font-size:22.1452px;color:#f0e5ff}.use-case-steps h2{margin-top:10px;margin-bottom:10px;font-size:1.728em;line-height:32px;font-weight:700}.use-case-steps h2 a{text-decoration:none}.use-case-steps h2:first-of-type:before{display:none}.use-case h1{font-size:2.4em;padding-bottom:10px}.use-case-steps h2:before{margin-top:-30px;height:0}.use-case-steps h2:first-of-type{margin-top:-30px}.related-tasks-links ul{list-style-type:none;padding-left:0}.related-tasks-links ul li{margin:0px;padding-top:2px}.related-tasks-links a:hover::after{padding-left:.5em}.related-tasks-links a::after{content:" ➝";padding-left:0;transition:all .2s ease-in-out}.dark [data-component-name="Breadcrumbs/Breadcrumbs"]+div>a>svg>rect{fill:transparent}[data-component-name="Layout/RootLayout"]{padding-top:126px}.top-nav{background-color:#111112;height:80px;padding:0}.top-nav .navbar-brand{text-decoration:none;white-space:pre;-webkit-transition:opacity .2s ease,color .2s ease;transition:opacity .2s ease,color .2s ease;padding-left:2rem}.top-nav .navbar-brand .logo{margin-left:0;content:url(../img/XRPLedger_DevPortal-white.svg);width:162px;height:40px;display:block}.top-nav .navbar-brand:hover{opacity:.75}@media(max-width: 991.98px){.top-nav .navbar-brand{padding-left:2rem}.top-nav .navbar-brand img{width:120px}}.top-nav .nav-item{font-weight:600}@media(min-width: 992px){.top-nav #topnav-pages{flex-grow:1}}.top-nav #topnav-pages .nav-link{color:#f5f5f7;font-size:1rem;line-height:1.25rem;text-decoration:none;font-weight:600}.top-nav .dropdown-toggle{position:relative}.top-nav .dropdown-menu{border-width:0}.top-nav .dropdown-menu h5{font-weight:400;font-size:12px;color:#a2a2a4;margin-bottom:0}.top-nav .dropdown-menu .dropdown-item{line-height:1rem;padding:.75rem 0;white-space:normal}.top-nav .dropdown-menu .dropdown-item.dropdown-hero{width:100%;display:flex;padding:1rem 2rem}.top-nav .dropdown-menu .dropdown-item.dropdown-hero>img{width:68px;height:68px;background-color:#232325;border-radius:4px;flex-grow:0;padding:.75rem;margin-right:2rem;margin-top:auto;margin-bottom:auto}.top-nav .dropdown-menu .dropdown-item.dropdown-hero p{font-size:14px;color:#c1c1c2;margin:0;white-space:normal}.top-nav .dropdown-menu .dropdown-item.dropdown-hero h4{font-size:1.25rem;font-weight:600;margin-bottom:0;line-height:2rem}.top-nav .dropdown-menu .dropdown-item.dropdown-hero:hover h4{color:#9a52ff}.top-nav .dropdown-menu .dropdown-item.dropdown-hero:hover p{font-weight:400}.top-nav .dropdown-menu .dropdown-item:last-child{padding-bottom:0}.top-nav .dropdown-menu .dropdown-item:first-child{padding-top:0}.top-nav .dropdown-menu .col-for-get_started{background-color:#232325}.top-nav .dropdown-menu a:hover{color:#9a52ff;background-color:inherit}.top-nav .dropdown-menu h5:hover{background-color:inherit}.top-nav #topnav-search{flex-grow:1}.top-nav #topnav-search .input-group{flex-grow:1;flex-wrap:nowrap}@media(max-width: 991.98px){.top-nav #topnav-search .form-inline{padding:1rem 2rem}}.top-nav #topnav-search .input-group-text{height:40px}.top-nav #topnav-search .ds-input{height:40px}.top-nav #topnav-language .dropdown-item{font-weight:600}@media(min-width: 992px){.top-nav{padding:0 2rem}.top-nav .navbar-brand{margin-left:0;padding-left:0}.top-nav .dropdown-toggle::after{display:none}.top-nav .dropdown-toggle>span{border-bottom:2px solid transparent}.top-nav .dropdown .dropdown-toggle:hover>span:not(.chevron){padding-bottom:8px;border-bottom:2px solid #9a52ff;margin-bottom:-8px}.top-nav .dropdown-menu{border-radius:0 0 8px 8px;padding:2.5rem}.top-nav .dropdown-menu .dropdown-item.dropdown-hero{padding:0}.top-nav .dropdown-menu.show{display:grid;gap:40px}.top-nav .dropdown-menu.show#topnav_dd_about{grid-template-columns:180px 180px 180px}.top-nav .dropdown-menu.show#topnav_dd_docs{grid-template-columns:180px 180px 260px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_community{grid-template-columns:200px}.top-nav .dropdown-menu.show#topnav_dd_resources{grid-template-columns:195px 180px 180px;left:-200px}.top-nav .dropdown-menu.show .dropdown-hero{grid-row:1;grid-column:1/4}.top-nav .dropdown-menu.show #dropdown-hero-for-docs{grid-column:1/3}.top-nav .dropdown-menu.show .col-for-xrp_ledger{grid-row:1/3;grid-column:1}.top-nav .dropdown-menu.show .col-for-xrp{grid-column:2}.top-nav .dropdown-menu.show .col-for-sustainability,.top-nav .dropdown-menu.show .col-for-持続可能性{grid-column:2}.top-nav .dropdown-menu.show .col-for-about,.top-nav .dropdown-menu.show .col-for-概要{grid-row:1/3;grid-column:3}.top-nav .dropdown-menu.show .col-for-article_types{grid-column:1;grid-row:2}.top-nav .dropdown-menu.show .col-for-use_cases{grid-column:2;grid-row:2}.top-nav .dropdown-menu.show .col-for-get_started{grid-column:3;grid-row:1/3;margin:-40px -40px -40px 0;padding:40px}.top-nav .dropdown-menu.show .col-for-development{grid-column:1}.top-nav .dropdown-menu.show .col-for-current-status,.top-nav .dropdown-menu.show .col-for-現在のステータス{grid-column:2}.top-nav .dropdown-menu.show .col-for-join-in,.top-nav .dropdown-menu.show .col-for-参加する{grid-column:3}.top-nav .dropdown-menu.smaller-dropdown{min-width:180px;padding:1.25rem}.top-nav #topnav-pages{flex-grow:0}}@media(min-width: 992px)and (min-width: 992px)and (max-width: 1133px){.top-nav #topnav-pages .nav-link{padding:1rem 1rem}}@media(min-width: 992px){.top-nav #topnav-language{flex-grow:0}.top-nav #topnav-language hr{display:none}.top-nav #topnav-language #language_selector_header_btn{padding-right:0}}@media(min-width: 992px)and (min-width: 992px)and (max-width: 1133px){.top-nav #topnav-language #language_selector_header_btn{padding-left:1rem}}@media(min-width: 992px)and (min-width: 1200px){.top-nav #topnav-search{margin-left:3.5rem;margin-right:.5rem}.top-nav #topnav-language{margin-right:.5rem}.top-nav #topnav-button{margin-left:.2rem;margin-right:1rem}}@media(max-width: 991.98px){.top-nav .navbar-toggler{border:0;padding:30px 2rem;font-size:1rem;display:inline-block}.top-nav .navbar-toggler .navbar-toggler-icon{background:none;height:20px;width:20px;position:relative}.top-nav .navbar-toggler .navbar-toggler-icon::after,.top-nav .navbar-toggler .navbar-toggler-icon::before,.top-nav .navbar-toggler .navbar-toggler-icon div{position:absolute;content:" ";background-color:#f5f5f7;display:block;width:100%;height:3px;transition:all .2s ease}.top-nav .navbar-toggler .navbar-toggler-icon::before{top:0}.top-nav .navbar-toggler .navbar-toggler-icon::after{bottom:0}.top-nav .navbar-toggler .navbar-toggler-icon div{top:calc(50% - 1.5px)}.top-nav .navbar-toggler:not(.collapsed) .navbar-toggler-icon::before{transform:translateY(8px) rotate(135deg)}.top-nav .navbar-toggler:not(.collapsed) .navbar-toggler-icon::after{transform:translateY(-9px) rotate(-135deg)}.top-nav .navbar-toggler:not(.collapsed) .navbar-toggler-icon div{transform:scale(0)}.top-nav .navbar-nav{align-items:unset !important}.top-nav .navbar-nav #topnav-theme{background-color:#111112;padding:1rem}.top-nav .navbar-nav #topnav-button{background-color:#111112;padding:1rem 1.5rem}.top-nav .navbar-nav #topnav-search{background-color:#111112}.top-nav .navbar-nav #topnav-search [data-component-name="Search/MobileSearchTrigger"]{padding:2rem;cursor:pointer}.top-nav .navbar-nav .nav-link,.top-nav .navbar-collapse>.nav-item{line-height:150%;background:#111112}.top-nav .navbar-nav .nav-link label,.top-nav .navbar-collapse>.nav-item label{margin-bottom:0}.top-nav .navbar-nav .nav-link{padding:1rem 2rem}.top-nav .dropdown-menu{margin:0;width:100%;overflow:auto;transition:all .2s ease;height:0;display:block;padding:0;border-radius:0}.top-nav .dropdown-menu.show{height:calc(100vh - 80px - 52px)}.top-nav .dropdown-menu.show>:last-child{padding-bottom:4rem}.top-nav .dropdown-menu.show#topnav_dd_docs{display:grid;grid-template-columns:minmax(187px, 1fr) minmax(187px, 1fr);gap:1px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_docs .dropdown-hero{grid-column:1/3;grid-row:1}.top-nav .dropdown-menu.show#topnav_dd_docs .col-for-document_types{grid-column:1;grid-row:2}.top-nav .dropdown-menu.show#topnav_dd_docs .col-for-use_cases{grid-column:2;grid-row:2}.top-nav .dropdown-menu.show#topnav_dd_docs .col-for-get_started{grid-column:1/3;grid-row:4;margin:-1px;padding-top:33px}.top-nav .dropdown-menu .navcol{padding:1rem 2rem}.top-nav .dropdown-menu.smaller-dropdown{padding:0 2rem}.top-nav .dropdown-menu.smaller-dropdown.show{padding:1rem 2rem;height:auto}.top-nav .dropdown-menu .dropdown-hero:first-child{padding-top:1rem}.top-nav .dropdown-toggle:not(.with-caret)::before,.top-nav .dropdown-toggle:not(.with-caret)::after{border:0;font-family:FontAwesome;color:#9a52ff;font-size:.75rem;transition:all .2s ease;overflow:clip;width:1rem}.top-nav .dropdown-toggle:not(.with-caret)::before{content:"";display:inline-block;margin-bottom:-5px}.top-nav .dropdown-toggle:not(.with-caret)::after{content:"";position:absolute;right:2rem}.top-nav .dropdown.show .dropdown-toggle::after{text-indent:5rem}.top-nav .dropdown:not(.show) .dropdown-toggle::before{width:0;height:0;text-indent:-5rem}.top-nav .dropdown-toggle.with-caret::after{border:0}.top-nav #top-main-nav{padding-top:72px;position:relative;transition:padding-top .2s ease}.top-nav #top-main-nav.submenu-expanded{padding-top:0}.top-nav #top-main-nav.submenu-expanded .dropdown:not(.show) .dropdown-toggle{display:none}.top-nav #top-main-nav.submenu-expanded #topnav-search{height:0;overflow:clip;padding-top:0;padding-bottom:0}.top-nav #topnav-search{position:absolute;top:0;width:100%;height:72px;transition:all .2s ease}.top-nav #topnav-search .input-group{flex-wrap:nowrap}.top-nav #topnav-language hr{border-top:1px solid #232325;margin-top:.25rem;margin-bottom:.25rem;display:static}}article h1:before,article h2:before,article h3:before,article h4:before,article h5:before,article h6:before,.interactive-block:before{display:block;content:" ";margin-top:-24px;height:60px;visibility:hidden;pointer-events:none}article h1:first-of-type:before{margin-top:-60px}.chevron{position:relative;display:inline-block;width:.75rem;height:.5625rem}.chevron span{position:absolute;top:.25rem;display:inline-block;width:.5rem;height:.15rem;background-color:#9a52ff;transition:all .2s ease;border:none}.chevron:not(.expander) span:first-of-type{left:0;transform:rotate(45deg)}.chevron:not(.expander) span:last-of-type{right:0;transform:rotate(-45deg)}.chevron.active span:first-of-type{transform:rotate(-45deg)}.chevron.active span:first-of-type{transform:rotate(45deg)}.dropdown.show .chevron span:first-of-type,.expander:not(.collapsed) .chevron span:first-of-type{transform:rotate(-45deg)}.dropdown.show .chevron span:last-of-type,.expander:not(.collapsed) .chevron span:last-of-type{transform:rotate(45deg)}#topnav-theme>div{border-radius:var(--language-picker-border-radius);color:var(--language-picker-text-color);background-color:var(--language-picker-background-color);border:1px solid var(--language-picker-border-color);padding:var(--language-picker-input-padding-vertical) var(--language-picker-input-padding-horizontal);min-height:var(--language-picker-min-height)}@media(max-width: 991.98px){.navbar-collapse,.dropdown-menu{box-shadow:0px 25px 40px -20px #000}}.top-banner{display:flex;align-items:center;justify-content:center;height:46px;background:url(../img/backgrounds/bg-apex-banner.svg);background-position:center !important;background-size:cover;background-color:#7919ff;color:#fff}.top-banner .inner-apex{display:flex;justify-content:center;align-items:center}.top-banner .apex-banner-text{color:#fff;font-family:"Work Sans";font-size:20px;font-style:normal;font-weight:600;line-height:24px}.top-banner .apex-btn{margin-left:16px;color:var(--Gray-100, #000) !important;font-family:"Work Sans";font-size:16px;font-style:normal;display:flex;justify-content:center;font-weight:600;align-items:center;line-height:100%;letter-spacing:-0.16px;padding:2px 4px;border-radius:100px !important;background:#18ff83 !important;text-decoration:none !important;width:135px;height:28px}@media(max-width: 1024px){.top-banner{background:url(../img/backgrounds/bg-apex-banner-md.svg)}.top-banner .apex-banner-text{font-size:18px}.top-banner .apex-btn{width:122px;height:26px;font-size:14px;letter-spacing:-0.14px}}@media(max-width: 535px){.top-banner{background:url(../img/backgrounds/bg-apex-banner-sm.svg)}.top-banner .apex-btn{margin-left:0;width:85px;height:16px;font-size:10px;line-height:100%;letter-spacing:-0.1px}.top-banner .apex-banner-text{font-size:12px;line-height:12px}.top-banner .inner-apex{flex-direction:column;gap:8px}}[data-component-name="Markdown/MarkdownWrapper"] article{padding-bottom:50px}[data-component-name="Markdown/MarkdownWrapper"] article p code,[data-component-name="Markdown/MarkdownWrapper"] article table code,[data-component-name="Markdown/MarkdownWrapper"] article li>code{background-color:#0a2e1b;color:#5beb9d}[data-component-name="Markdown/MarkdownWrapper"] article a{text-decoration:underline}[data-component-name="Markdown/MarkdownWrapper"] article h1{font-size:3rem;margin-top:32px;line-height:1.2;font-weight:700}[data-component-name="Markdown/MarkdownWrapper"] article h1:first-child{margin-top:0;line-height:1.2}[data-component-name="Markdown/MarkdownWrapper"] article h2,[data-component-name="Markdown/MarkdownWrapper"] article h2.md{margin-top:2.5rem;margin-bottom:1.5rem;font-size:2.5rem;font-weight:600;line-height:1.2}[data-component-name="Markdown/MarkdownWrapper"] article h3,[data-component-name="Markdown/MarkdownWrapper"] article h3.md{font-size:2.125rem;margin-top:2rem;margin-bottom:1rem;line-height:1.2}[data-component-name="Markdown/MarkdownWrapper"] article h4{font-size:1.75rem;margin-top:1.5rem;margin-bottom:.5rem;line-height:1.2}[data-component-name="Markdown/MarkdownWrapper"] article h5{font-size:1.25rem;margin-top:1.25rem;line-height:1.2;font-weight:700}[data-component-name="Markdown/MarkdownWrapper"] article h6{font-size:1rem;margin-top:1rem;line-height:1.2;font-weight:700}[data-component-name="Markdown/MarkdownWrapper"] article li{margin:6px;margin-top:24px}[data-component-name="Markdown/MarkdownWrapper"] article li p{margin:0}[data-component-name="Markdown/MarkdownWrapper"] article a[title=Source]{float:right;padding-left:20px}[data-component-name="Markdown/MarkdownWrapper"] article h1.invisible,[data-component-name="Markdown/MarkdownWrapper"] article h2.invisible,[data-component-name="Markdown/MarkdownWrapper"] article h3.invisible,[data-component-name="Markdown/MarkdownWrapper"] article h4.invisible,[data-component-name="Markdown/MarkdownWrapper"] article h5.invisible,[data-component-name="Markdown/MarkdownWrapper"] article h6.invisible{font-size:0;line-height:0;margin:0}[data-component-name="Markdown/MarkdownWrapper"] article h1.invisible .hover_anchor,[data-component-name="Markdown/MarkdownWrapper"] article h2.invisible .hover_anchor,[data-component-name="Markdown/MarkdownWrapper"] article h3.invisible .hover_anchor,[data-component-name="Markdown/MarkdownWrapper"] article h4.invisible .hover_anchor,[data-component-name="Markdown/MarkdownWrapper"] article h5.invisible .hover_anchor,[data-component-name="Markdown/MarkdownWrapper"] article h6.invisible .hover_anchor{display:none}[data-component-name="Markdown/MarkdownWrapper"] article .shield{display:inline-block !important;vertical-align:middle}.blurb a{text-decoration:underline}.hover_anchor{visibility:hidden;padding-left:1rem;font-size:1.25rem}h1:hover .hover_anchor,h2:hover .hover_anchor,h3:hover .hover_anchor,h4:hover .hover_anchor,h5:hover .hover_anchor,h6:hover .hover_anchor{visibility:visible;text-decoration:none}pre{color:#fff;background-color:#232325;word-wrap:normal;padding:2rem;border-radius:4px}pre code{white-space:pre;color:#fff;background-color:#232325}.multicode{padding:0;z-index:1;position:relative}.multicode pre{background:none;border:none;border-radius:0;padding:0;clear:both}.multicode pre code{overflow:auto;max-height:24em;border-radius:0 4px 4px 4px;display:block;padding:2rem}.multicode pre code.expanded{overflow:visible;max-height:none;position:absolute;min-width:100%}.multicode ul{margin:0 !important;padding:0}.multicode ul li{display:block;float:left;list-style-type:none;margin-right:0px;margin-left:0px;border:0;clear:none}.multicode a{text-decoration:none;color:#fff;background-color:transparent;padding:.75rem 2rem;margin:0;border-radius:4px 4px 0 0}.multicode a.current{background-color:#232325}.multicode a:hover{text-decoration:none;background-color:#232325;color:#9a52ff;padding-bottom:.625rem}.multicode .btn{z-index:10}.multicode .codetabs{position:relative;z-index:10}.clipboard-btn{z-index:10;margin-right:10px}.codehilite{background:#232325;color:#fff}.codehilite .c,.codehilite .ch,.codehilite .cm,.codehilite .cp,.codehilite .cpf,.codehilite .c1,.codehilite .cs{color:#838386}.codehilite .k,.codehilite .kc,.codehilite .kd,.codehilite .kn,.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#ff6719}.codehilite .m,.codehilite .mb,.codehilite .mh,.codehilite .mi,.codehilite .mo,.codehilite .il{color:#19a3ff}.codehilite .n,.codehilite .na,.codehilite .nb,.codehilite .nc,.codehilite .nd,.codehilite .ne,.codehilite .nf,.codehilite .ni,.codehilite .nl,.codehilite .nn,.codehilite .nt,.codehilite .nv,.codehilite .nx,.codehilite .bp,.codehilite .fm,.codehilite .py{color:#fff}.codehilite .p{color:#e0e0e1}.codehilite .s,.codehilite .s1,.codehilite .s2,.codehilite .sa,.codehilite .sb,.codehilite .sc,.codehilite .dl,.codehilite .sd,.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#28b86a}.codehilite{background:transparent;position:relative}.codehilite .btn-group{top:1rem;right:1rem;position:absolute}.multicode .codehilite .btn-group{top:70px;right:20px}#redocly_root .cm-foldPlaceholder{background-color:#232325;border:none;font-size:18px}article img{max-width:100%;height:auto}article svg{max-width:100%}article .floating-diagram{margin:.5rem;float:left}article li{clear:left}html:not(.light) article svg[fill=black]{fill:#fff;stroke:#fff}html:not(.light) article svg[fill=black] *[fill=white]{fill:#000}html:not(.light) article svg[fill=black] *[stroke=white]{stroke:#000}html:not(.light) article svg[fill=black] *[fill=black]{fill:#fff}html:not(.light) article svg[fill=black] *[stroke=black]{stroke:#fff}html:not(.light) article svg[fill=black] g[fill=blue]{fill:#19a3ff}html:not(.light) article svg[fill=black] g[stroke=blue]{stroke:#19a3ff}html:not(.light) article svg[fill=black] g[fill="rgb(120,120,120)"]{fill:#e0e0e1}html:not(.light) article svg[fill=black] g[stroke="rgb(120,120,120)"]{stroke:#e0e0e1}html:not(.light) article svg[fill=black] g[fill="rgb(200,200,200)"]{fill:#343437}html:not(.light) article svg[fill=black] g[fill="rgb(70,70,70)"]{fill:#838386}html:not(.light) article svg[fill=black] g[stroke="rgb(70,70,70)"]{stroke:#838386}html:not(.light) article svg[fill=black] g[fill="rgb(29,180,255)"]{fill:#9a52ff}html:not(.light) article svg[fill=black] g[stroke="rgb(29,180,255)"]{stroke:#9a52ff}html:not(.light) article svg[fill=black] rect[stroke="rgb(245,247,249)"]{stroke:#000}html:not(.light) article svg[fill=black] g[fill=lime],html:not(.light) article svg[fill=black] g[fill="rgb(0,255,0)"]{fill:#9a52ff}html:not(.light) article svg[fill=black] g[stroke=lime],html:not(.light) article svg[fill=black] g[stroke="rgb(0,255,0)"]{stroke:#9a52ff}html:not(.light) article svg[fill=black] g[fill=yellow],html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#faff19}html:not(.light) article svg[fill=black] g[fill=yellow] path[stroke=black],html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"] path[stroke=black]{stroke:#000}html:not(.light) article svg[fill=black] g[fill=red],html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#ff198b}html:not(.light) article svg[fill=black] g[stroke=red],html:not(.light) article svg[fill=black] g[stroke="rgb(255,255,0)"]{stroke:#ff198b}html:not(.light) article svg[fill=black] g[fill=yellow]+g text,html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"]+g text{fill:#000}html:not(.light) article svg[fill=black] g[fill=lime]+g text{fill:#000}html:not(.light) article svg[fill=none] path[fill="#000000"]{fill:#fff}html:not(.light) article svg[fill=none] path[stroke="#000000"]{stroke:#fff}html:not(.light) article svg[fill=none] path[fill="#ffffff"]{fill:#000}html:not(.light) article svg[fill=none] path[stroke="#ffffff"]{stroke:#000}html:not(.light) article svg[fill=none] path[fill="#23292f"],html:not(.light) article svg[fill=none] path[fill="#23282f"]{fill:#fff}html:not(.light) article svg[fill=none] path[stroke="#23292f"],html:not(.light) article svg[fill=none] path[stroke="#23282f"]{stroke:#fff}html:not(.light) article svg[fill=none] path[fill="#2c3e50"],html:not(.light) article svg[fill=none] path[fill="#2b3e51"]{fill:#e0e0e1}html:not(.light) article svg[fill=none] path[stroke="#2c3e50"],html:not(.light) article svg[fill=none] path[stroke="#2b3e51"]{stroke:#e0e0e1}html:not(.light) article svg[fill=none] path[fill="#1c2835"]{fill:#f5f5f7}html:not(.light) article svg[fill=none] path[stroke="#1c2835"]{stroke:#f5f5f7}html:not(.light) article svg[fill=none] path[fill="#21aa47"]{fill:#32e685}html:not(.light) article svg[fill=none] path[stroke="#21aa47"]{stroke:#32e685}html:not(.light) article svg[fill=none] path[fill="#e64b3b"]{fill:#dc3545}html:not(.light) article svg[fill=none] path[stroke="#e64b3b"]{stroke:#dc3545}html:not(.light) article svg[fill=none] path[stroke="#27a2db"],html:not(.light) article svg[fill=none] path[stroke="#00aae4"]{stroke:#9a52ff}html:not(.light) article svg[fill=none] path[fill="#27a2db"],html:not(.light) article svg[fill=none] path[fill="#00aae4"]{fill:#9a52ff}html:not(.light) article svg[fill=none] path[fill="#e6e7e8"]{fill:#232325}html:not(.light) article svg[fill=none] path[stroke="#e6e7e8"]{stroke:#232325}html:not(.light) article svg[fill=none] path[stroke="#ffbf27"]{stroke:#d919ff}html:not(.light) article svg[fill=none] path[fill="#00ff00"]{fill:#32e685}html:not(.light) article svg[fill=none] path[stroke="#00ff00"]{stroke:#32e685}html:not(.light) article svg[fill=none] path[fill="#ff00ff"]{fill:#ff198b}html:not(.light) article svg[fill=none] path[stroke="#ff00ff"]{stroke:#ff198b}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#ffffff"]{stop-color:#343437}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#e6e7e8"]{stop-color:#232325}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#dbdcdd"]{stop-color:#000}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#b1b3b5"]{stop-color:#111112}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#29a1da"]{stop-color:#2dcf78}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#2789b9"]{stop-color:#5beb9d}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#6bc1ec"]{stop-color:#adf5ce}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#8ad6f4"]{stop-color:#84f0b6}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#fab913"]{stop-color:#f2b2ff}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#fad26b"]{stop-color:#ea80ff}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#f8a136"]{stop-color:#e24cff}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#f7931a"]{stop-color:#c000e5}html.light svg[fill=black] g[fill=blue]{fill:#006bb2}html.light svg[fill=black] g[stroke=blue]{stroke:#19a3ff}html.light svg[fill=black] g[fill="rgb(120,120,120)"]{fill:#343437}html.light svg[fill=black] g[stroke="rgb(120,120,120)"]{stroke:#343437}html.light svg[fill=black] g[fill="rgb(200,200,200)"]{fill:#a2a2a4}html.light svg[fill=black] g[fill="rgb(70,70,70)"]{fill:#343437}html.light svg[fill=black] g[stroke="rgb(70,70,70)"]{stroke:#343437}html.light svg[fill=black] g[fill="rgb(29,180,255)"]{fill:#19a3ff}html.light svg[fill=black] g[stroke="rgb(29,180,255)"]{stroke:#006bb2}html.light svg[fill=black] rect[stroke="rgb(245,247,249)"]{stroke:#fcfcfd}html.light svg[fill=black] g[fill=lime],html.light svg[fill=black] g[fill="rgb(0,255,0)"]{fill:#5beb9d}html.light svg[fill=black] g[stroke=lime],html.light svg[fill=black] g[stroke="rgb(0,255,0)"]{stroke:#28b86a}html.light svg[fill=black] g[fill=yellow],html.light svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#fcff80}html.light svg[fill=black] g[fill=red],html.light svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#ff4ba4}html.light svg[fill=black] g[stroke=red],html.light svg[fill=black] g[stroke="rgb(255,255,0)"]{stroke:#ff198b}html.light svg[fill=none] rect[fill="#111112"]{fill:#f5f5f7}html.light svg[fill=none] path[fill=white]{fill:#000}html.light svg[fill=none] path[fill="#343437"]{fill:#c1c1c2}html.light svg[fill=none] path[fill="#A2A2A4"],html.light svg[fill=none] rect[fill="#A2A2A4"],html.light svg[fill=none] ellipse[fill="#A2A2A4"]{fill:#454549}html.light svg[fill=none] path[fill="#232325"]{fill:#e0e0e1}html.light svg[fill=none] path[fill="#F5F5F7"]{fill:#111112}html.light svg[fill=none] path[stroke="#F5F5F7"]{stroke:#111112}html.light svg[fill=none] path[stroke="#FF198B"]{stroke:#b20058}html.light svg[fill=none] linearGradient stop[stop-color="#F5F5F7"]{stop-color:#111112}html.light svg[fill=none] linearGradient stop[stop-color="#C1C1C2"]{stop-color:#343437}.external-link::after{content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;display:inline-block;background-size:16px;padding:0 4px 0 8px;width:16px;height:16px;background-position:center;transition:transform 100ms ease-in-out}.external-link:hover::after{transform:translate(3px, -3px)}.external-link .fa-external-link{display:none}.top-nav .dropdown .external-link::after,.xrpl-footer .external-link::after{background-position:left 6px bottom 1px;width:2rem}@-moz-document url-prefix(){@supports(animation: calc(0s)){.top-nav .dropdown .external-link::after,.xrpl-footer .external-link::after{background-position:left 8px bottom 2px}}}.top-nav .dropdown .external-link:hover::after,.xrpl-footer .external-link:hover::after{background-position:left 8px bottom 3px}.q-wrapper .external-link::after{background-position:left 0 bottom 7px}.q-wrapper .external-link:hover::after{background-position:left 4px bottom 11px}.li-links{position:relative;border-bottom:2px solid #454549}.li-links a{width:100%;padding:16px 0}.li-links a::after{position:absolute;right:4px;content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;display:inline-block;background-size:1.5rem;padding:0 .5rem;background-position:left 0 bottom -0.1rem;transition:background-position 100ms ease-in-out}.li-links a:hover::after{background-position:left .2rem bottom .1rem}[data-component-name="Footer/Footer"]{padding:7.5rem 2rem}[data-component-name="Footer/Footer"] [data-component-name="Footer/FooterColumn"]{text-shadow:#111112 0px 0px 2px,#111112 1px 1px 2px,#111112 2px 2px 3px,#111112 2px 2px 4px,#111112 2px 2px 5px,#111112 2px 2px 6px,#111112 -1px -1px 2px,#111112 -2px -2px 3px,#111112 -2px -2px 4px}@media(min-width: 992px){[data-component-name="Footer/Footer"]{background-image:url(../img/backgrounds/footer.svg);background-size:cover;background-repeat:no-repeat;background-position:bottom right}}@media(max-width: 991.98px){[data-component-name="Footer/Footer"] .col-lg:not(:first-child){margin-top:4rem}}[data-component-name="Footer/Footer"] h5{font-size:1rem;font-weight:600;color:#a2a2a4}[data-component-name="Footer/Footer"] .nav-link{padding:.75rem 0;line-height:1}[data-component-name="Footer/Footer"] .absolute-bottom-footer{font-size:10px;line-height:1rem}@media(max-width: 991.98px){[data-component-name="Footer/Footer"] .absolute-bottom-footer .copyright-license{margin-top:3rem}}.devportal-callout.tip,.devportal-callout.ヒント{border-color:#32e685}.devportal-callout.tip>strong:first-child:before,.devportal-callout.ヒント>strong:first-child:before{color:#32e685}.devportal-callout.note>strong:first-child:before,.devportal-callout.注記>strong:first-child:before{color:#19a3ff}.devportal-callout.note,.devportal-callout.注記{border-color:#19a3ff}.devportal-callout.caution,.devportal-callout.注意{border-color:#faff19}.devportal-callout.caution>strong:first-child:before,.devportal-callout.注意>strong:first-child:before{color:#faff19}.devportal-callout.warning,.devportal-callout.警告{border-color:#ff198b}.devportal-callout.warning>strong:first-child:before,.devportal-callout.警告>strong:first-child:before{color:#ff198b}blockquote,.devportal-callout{border-style:solid;border-radius:0;border-width:1px;border-left-width:4px;padding:5px;padding-left:25px;page-break-inside:avoid}.devportal-callout>strong:first-child{display:block;page-break-after:avoid}.devportal-callout.tip>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.note>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.caution>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.warning>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}@media(min-width: 992px){.card,.cta-card,.q-wrapper{box-shadow:0px 5px 40px #000}}#code-samples-deck .card{box-shadow:none;margin:0 2rem 5rem 2rem}#code-samples-deck .card-header{border-bottom:none;background-color:unset}#code-samples-deck .card-footer{background-color:unset;font-size:initial}#code-samples-deck .card-deck .card a{margin:0 2.5rem 5rem 2.5rem}#code-samples-deck .circled-logo{margin-left:-15px}@media(min-width: 992px){.code-contribute{width:75vw;position:relative;left:20%;right:20%;margin-left:-30vw;margin-right:-30vw}}.contribute::before{content:"";display:block;height:2px;width:100%;position:absolute;top:0}.contribute .dot{height:16px;width:16px;background-color:#111112;border-radius:50%;border:3px solid #fbff4c;display:inline-block;position:absolute;top:-7px;left:-6px}@media(max-width: 991.98px){.contribute::before{left:0;height:100%;width:2px;top:15px}.contribute .dot{top:5px;left:-6px}}.contribute_1::before{background:-webkit-linear-gradient(left, #feff01, #ff2d9a)}.contribute_1 .dot{border-color:#fbff4c}.contribute_2::before{background:-webkit-linear-gradient(left, #ff2d9a, #e24cff)}.contribute_2 .dot{border-color:#ff198b}.contribute_3::before{background:-webkit-linear-gradient(left, #e24cff, #9a52ff)}.contribute_3 .dot{border-color:#c000e5}.contribute_4::before{background:-webkit-linear-gradient(left, #9a52ff, #9a52ff)}.contribute_4 .dot{border-color:#9a52ff}.card>img{border-radius:8px 8px 0 0}.card-body>p,.card-body>p:not(:last-child){padding:0;margin-bottom:2rem}main a.card{border:0;color:#fff}a.card:hover,a:hover .card-new,[data-component-name="Markdown/MarkdownWrapper"] a.card{text-decoration:none !important}a.card:hover h3{text-decoration:underline}.circled-logo{background-color:#454549;border-radius:50%;padding:.65rem;width:50px;height:50px;margin-bottom:.75rem;border:2px solid #232325}.circled-logo img{width:26px;height:26px;display:inline-block}.light .circled-logo{border:none}.card-deck{margin-top:2.5rem;margin-left:-1.25rem;margin-right:-1.25rem;margin-bottom:5rem;flex-grow:1}@media(min-width: 992px){.card-deck{margin-top:5rem}}.card-deck .card{flex-grow:0;flex-basis:100%;margin:0 1.25rem 5rem 1.25rem;background-position:bottom;background-repeat:no-repeat;background-size:contain}.card-deck.row-cols-1 .card{flex-basis:100%;min-height:264px}@media(min-width: 768px){.card-deck.row-cols-1 .card{min-height:347px}}@media(min-width: 1200px){.card-deck.row-cols-lg-3{margin-left:-2.5rem;margin-right:-2.5rem}}@media(min-width: 992px){.card-deck.row-cols-lg-3 .card{flex-basis:calc(33% - 2.5rem )}}@media(min-width: 1200px){.card-deck.row-cols-lg-3 .card{margin:0 2.5rem 5rem 2.5rem;flex-basis:calc(33% - 5rem )}}@media(min-width: 992px){.card-deck.row-cols-lg-4 .card{flex-basis:calc(25% - 2.5rem )}}.card-deck a.card{transition:all .35s ease-out;cursor:pointer}.card-deck a.card:hover{-webkit-transform:translateY(-16px);-moz-transform:translateY(-16px);-ms-transform:translateY(-16px);-o-transform:translateY(-16px);transform:translateY(-16px)}.card-deck .card-footer{font-size:0;padding:1rem;background-position:bottom;background-repeat:no-repeat;background-size:cover;border-top:0}@media(max-width: 991.98px){.card-deck{margin-top:2rem}.card-deck .card-body{padding:1rem}.card-deck.row-cols-1 .card{margin:.75rem .75rem 5rem .75rem;max-width:calc(100% - 1.5rem)}.card-deck.row-cols-2 .card{margin:.75rem;max-width:calc(50% - 1.5rem)}}main article .card-grid.card-grid-3xN{grid-gap:1rem}main article .card-grid.card-grid-3xN .card{padding:0;margin:.5rem}main article .card-grid.card-grid-3xN .card .card-body{padding:1rem}main article .card-grid.card-grid-3xN .card .card-icon-container{width:50px;height:50px;background:#454549;display:flex;justify-content:center;align-items:center;border-radius:50%;margin-bottom:12px}main article .card-grid.card-grid-3xN .card .card-icon-container img{width:70%;height:70%}main article .card-grid.card-grid-3xN .card .card-footer{font-size:0;line-height:0;padding:1rem;background-position:bottom;background-repeat:no-repeat;background-size:cover;border-top:0}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3-col-light-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-purple-blue-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-magenta-3.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-light-blue-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3col-orange-yellow-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-pink-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-green-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-purple2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-neutral-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-purple-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3-col-pink2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-orange.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-blue-light-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-magenta-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3-col-light-blue-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-light-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3-col-purple-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-orange-3.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-blue-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3-col-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-orange.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-purple-blue-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3-col-light-blue2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3-col-pink.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-green-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-orange-2.svg")}.cta-card{text-align:center;background-color:#232325}.breadcrumbs-wrap{position:relative;z-index:11;padding:0 0 2rem 0}.interactive-block .breadcrumbs-wrap{padding:0}.breadcrumb-item+.breadcrumb-item:before{content:"";font-family:FontAwesome;padding-right:5px}.breadcrumbs-wrap .breadcrumb{padding:0;margin-bottom:0;font-size:.833em}.breadcrumb-item a{color:#e0e0e1;text-decoration:none}.breadcrumb-item a:hover{color:#9a52ff}.landing .container-fluid.section-hero,.landing .section-hero.container-sm,.landing .section-hero.container-md,.landing .section-hero.container-lg,.landing .section-hero.container-xl{padding:48px 0}.landing article .children-display>ul>li,.landing article .curated-links>ul>li{margin-top:24px}.landing article .children-display li a,.landing article .curated-links li a{font-weight:700;font-size:1.25rem;text-decoration:none}.landing article .children-display li a:hover,.landing article .curated-links li a:hover{text-decoration:underline}.landing section:first-of-type h1:first-child{margin-top:0;line-height:1.2}.landing .level-1,.landing .level-2{margin-top:0}.landing .curated-links ul,.landing .curated-links ol,.landing .children-display ul{padding-left:0;margin-bottom:0}.landing .section-hero .blurb{font-size:1.2em;line-height:1.71em}.landing .doc-index .level-1{list-style-type:disc;margin-left:1rem}.landing .doc-index .level-2{list-style-type:circle;margin-left:2rem}.landing .doc-index .level-3{list-style-type:square;margin-left:3rem}.landing .doc-index .level-4{list-style-type:disc;margin-left:4rem}.landing .doc-index .level-5{margin-left:5rem;list-style-type:circle}.landing .doc-index .level-6{margin-left:6rem;list-style-type:square}.landing p a,.landing h5 a{color:#9a52ff;font-weight:600}.landing p a:hover,.landing h5 a:hover{text-decoration:underline}.landing .display-4{margin-bottom:1.5rem}.landing #test-net-servers h3{font-size:1.4rem;font-weight:700}.landing #test-net-servers pre{overflow-x:auto}.landing section:first-of-type{border-top-width:0}.landing #main_content_wrapper{border-bottom:none;margin-top:80px}.landing .marketing-wrapper{margin-top:10rem;margin-bottom:6rem}@media(max-width: 767.98px){.landing .marketing-wrapper{margin-top:6rem}}.landing .nav .nav-link{padding:1rem 2rem 1rem 0;color:#e0e0e1;border-bottom:1px solid #232325;position:relative}.landing .nav .nav-link:hover{color:#9a52ff}.landing .nav .nav-link:not(.external-link)::after{content:" ";background-image:url(../img/icons/arrow-right-purple.svg);background-repeat:no-repeat;background-position:center;background-size:1rem;position:absolute;right:0;width:1.5rem;height:1.5rem;transition:all .2s ease}.landing .nav .nav-link:not(.external-link):hover::after{animation:arrowDance2 1.2s infinite}.landing .nav .nav-link.external-link::after{content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;position:absolute;background-position:center;background-size:.75rem;right:7px;width:1.5rem;height:1.5rem;transition:all .2s ease}.landing .nav .nav-link.external-link:hover::after{animation:arrowDanceDiag 1.2s infinite}.landing .card-body .nav .nav-link{border-bottom:1px solid #454549}.alert-info{color:#fff;background-color:#006bb2;border-width:0}.alert-info a{text-decoration:underline;color:#fff}.alert-info a:hover{color:#e0e0e1}.highlight-subcard{margin:1.5rem 0;padding:1rem;border:2px solid #fff;background:#111112}.interactive-block-inner{border:1px dashed #9a52ff;padding:10px;margin:5px}.interactive-block-ui>button{margin:10px 0}.interactive-block input:invalid{box-shadow:inset 0 0 5px 5px #ff198b}.interactive-block .breadcrumbs-wrap{margin-bottom:11px}.interactive-block .breadcrumb-item{margin-top:6px}.interactive-block .breadcrumb-item a{text-decoration:none}.interactive-block .breadcrumb-item.current a{font-weight:bold}.interactive-block .breadcrumb-item.active a{color:#b480ff}.interactive-block .breadcrumb-item.disabled a{color:#454549}.interactive-block .breadcrumb-item.done a:after{content:"";font-family:FontAwesome;color:#e0e0e1;padding-right:5px;padding-left:5px}.interactive-block .waiting-for-tx{word-break:break-word}.ws-console{height:200px;overflow:auto}.status{cursor:help;padding:1px 2px;font-weight:normal;text-indent:0}.status.not_enabled{color:#faff19}.status.removed{color:#ff198b}.labels-wrap ul::before{content:"";font-family:FontAwesome;font-size:1.5rem}.labels-wrap .list-inline-item{margin-top:.5rem}.pg-category{color:#a2a2a4}.pg-category::after{content:"";font-family:FontAwesome;padding-left:5px}.label{border-radius:100px;border-width:0;padding:.5rem 1rem;font-weight:bold;text-decoration:none !important;text-align:center;white-space:nowrap;background-color:#111112;color:#c1c1c2}.label .badge-pill{width:24px;height:24px;border-radius:50px;margin-left:.5rem;font-weight:400;line-height:23px;font-size:16px;padding:0;margin-top:-2px}html.light .label{background-color:#e0e0e1;color:#232325}html.light .label .badge-pill{color:#e0e0e1;background-color:#232325}html.light .label:hover{background-color:#c1c1c2;color:#111112}html.light .label:hover .badge-pill{color:#c1c1c2;background-color:#111112}.label .badge-pill{color:#111112;background-color:#c1c1c2}.label:hover{color:#e0e0e1;background-color:#232325}.label:hover .badge-pill{color:#232325;background-color:#e0e0e1}.label.label-accounts,.label.label-payment-channels,.label.label-amm,.label.label-アカウント,.label.label-payment-channel,.label.label-use-infrastructure,.label.label-use-security,.label.blog-category-development,.label.chip-indigo{background-color:#20004c;color:#b480ff}.label.label-accounts .badge-pill,.label.label-payment-channels .badge-pill,.label.label-amm .badge-pill,.label.label-アカウント .badge-pill,.label.label-payment-channel .badge-pill,.label.label-use-infrastructure .badge-pill,.label.label-use-security .badge-pill,.label.blog-category-development .badge-pill,.label.chip-indigo .badge-pill{color:#20004c;background-color:#b480ff}.label.label-accounts:hover,.label.label-payment-channels:hover,.label.label-amm:hover,.label.label-アカウント:hover,.label.label-payment-channel:hover,.label.label-use-infrastructure:hover,.label.label-use-security:hover,.label.blog-category-development:hover,.label.chip-indigo:hover{background-color:#350080;color:#d2b2ff}.label.label-accounts:hover .badge-pill,.label.label-payment-channels:hover .badge-pill,.label.label-amm:hover .badge-pill,.label.label-アカウント:hover .badge-pill,.label.label-payment-channel:hover .badge-pill,.label.label-use-infrastructure:hover .badge-pill,.label.label-use-security:hover .badge-pill,.label.blog-category-development:hover .badge-pill,.label.chip-indigo:hover .badge-pill{color:#350080;background-color:#d2b2ff}html.light .label.label-accounts,html.light .label.label-payment-channels,html.light .label.label-amm,html.light .label.label-アカウント,html.light .label.label-payment-channel,html.light .label.label-use-infrastructure,html.light .label.label-use-security,html.light .label.blog-category-development,html.light .label.chip-indigo{background-color:#d2b2ff;color:#350080}html.light .label.label-accounts .badge-pill,html.light .label.label-payment-channels .badge-pill,html.light .label.label-amm .badge-pill,html.light .label.label-アカウント .badge-pill,html.light .label.label-payment-channel .badge-pill,html.light .label.label-use-infrastructure .badge-pill,html.light .label.label-use-security .badge-pill,html.light .label.blog-category-development .badge-pill,html.light .label.chip-indigo .badge-pill{color:#d2b2ff;background-color:#350080}html.light .label.label-accounts:hover,html.light .label.label-payment-channels:hover,html.light .label.label-amm:hover,html.light .label.label-アカウント:hover,html.light .label.label-payment-channel:hover,html.light .label.label-use-infrastructure:hover,html.light .label.label-use-security:hover,html.light .label.blog-category-development:hover,html.light .label.chip-indigo:hover{background-color:#b480ff;color:#20004c}html.light .label.label-accounts:hover .badge-pill,html.light .label.label-payment-channels:hover .badge-pill,html.light .label.label-amm:hover .badge-pill,html.light .label.label-アカウント:hover .badge-pill,html.light .label.label-payment-channel:hover .badge-pill,html.light .label.label-use-infrastructure:hover .badge-pill,html.light .label.label-use-security:hover .badge-pill,html.light .label.blog-category-development:hover .badge-pill,html.light .label.chip-indigo:hover .badge-pill{color:#b480ff;background-color:#20004c}.label.label-blockchain,.label.label-xrp,.label.label-ブロックチェーン,.label.label-non-fungible-tokens-nfts,.label.label-use-nfts,.label.blog-category-release_notes,.label.blog-category-features,.label.chip-green{background-color:#145c35;color:#84f0b6}.label.label-blockchain .badge-pill,.label.label-xrp .badge-pill,.label.label-ブロックチェーン .badge-pill,.label.label-non-fungible-tokens-nfts .badge-pill,.label.label-use-nfts .badge-pill,.label.blog-category-release_notes .badge-pill,.label.blog-category-features .badge-pill,.label.chip-green .badge-pill{background-color:#84f0b6;color:#145c35}.label.label-blockchain:hover,.label.label-xrp:hover,.label.label-ブロックチェーン:hover,.label.label-non-fungible-tokens-nfts:hover,.label.label-use-nfts:hover,.label.blog-category-release_notes:hover,.label.blog-category-features:hover,.label.chip-green:hover{background-color:#1e8a50;color:#adf5ce}.label.label-blockchain:hover .badge-pill,.label.label-xrp:hover .badge-pill,.label.label-ブロックチェーン:hover .badge-pill,.label.label-non-fungible-tokens-nfts:hover .badge-pill,.label.label-use-nfts:hover .badge-pill,.label.blog-category-release_notes:hover .badge-pill,.label.blog-category-features:hover .badge-pill,.label.chip-green:hover .badge-pill{background-color:#adf5ce;color:#1e8a50}html.light .label.label-blockchain,html.light .label.label-xrp,html.light .label.label-ブロックチェーン,html.light .label.label-non-fungible-tokens-nfts,html.light .label.label-use-nfts,html.light .label.blog-category-release_notes,html.light .label.blog-category-features,html.light .label.chip-green{background-color:#adf5ce;color:#145c35}html.light .label.label-blockchain .badge-pill,html.light .label.label-xrp .badge-pill,html.light .label.label-ブロックチェーン .badge-pill,html.light .label.label-non-fungible-tokens-nfts .badge-pill,html.light .label.label-use-nfts .badge-pill,html.light .label.blog-category-release_notes .badge-pill,html.light .label.blog-category-features .badge-pill,html.light .label.chip-green .badge-pill{color:#adf5ce;background-color:#145c35}html.light .label.label-blockchain:hover,html.light .label.label-xrp:hover,html.light .label.label-ブロックチェーン:hover,html.light .label.label-non-fungible-tokens-nfts:hover,html.light .label.label-use-nfts:hover,html.light .label.blog-category-release_notes:hover,html.light .label.blog-category-features:hover,html.light .label.chip-green:hover{background-color:#84f0b6;color:#000}html.light .label.label-blockchain:hover .badge-pill,html.light .label.label-xrp:hover .badge-pill,html.light .label.label-ブロックチェーン:hover .badge-pill,html.light .label.label-non-fungible-tokens-nfts:hover .badge-pill,html.light .label.label-use-nfts:hover .badge-pill,html.light .label.blog-category-release_notes:hover .badge-pill,html.light .label.blog-category-features:hover .badge-pill,html.light .label.chip-green:hover .badge-pill{color:#84f0b6;background-color:#000}.label.label-checks,.label.label-core-server,.label.label-コアサーバ,.label.label-use-interoperability,.label.label-use-web_monetization,.label.blog-category-gateway_bulletins,.label.chip-purple{background-color:#40004c;color:#ea80ff}.label.label-checks .badge-pill,.label.label-core-server .badge-pill,.label.label-コアサーバ .badge-pill,.label.label-use-interoperability .badge-pill,.label.label-use-web_monetization .badge-pill,.label.blog-category-gateway_bulletins .badge-pill,.label.chip-purple .badge-pill{background-color:#ea80ff;color:#40004c}.label.label-checks:hover,.label.label-core-server:hover,.label.label-コアサーバ:hover,.label.label-use-interoperability:hover,.label.label-use-web_monetization:hover,.label.blog-category-gateway_bulletins:hover,.label.chip-purple:hover{background-color:#6b0080;color:#f2b2ff}.label.label-checks:hover .badge-pill,.label.label-core-server:hover .badge-pill,.label.label-コアサーバ:hover .badge-pill,.label.label-use-interoperability:hover .badge-pill,.label.label-use-web_monetization:hover .badge-pill,.label.blog-category-gateway_bulletins:hover .badge-pill,.label.chip-purple:hover .badge-pill{background-color:#f2b2ff;color:#6b0080}html.light .label.label-checks,html.light .label.label-core-server,html.light .label.label-コアサーバ,html.light .label.label-use-interoperability,html.light .label.label-use-web_monetization,html.light .label.blog-category-gateway_bulletins,html.light .label.chip-purple{background-color:#f2b2ff;color:#6b0080}html.light .label.label-checks .badge-pill,html.light .label.label-core-server .badge-pill,html.light .label.label-コアサーバ .badge-pill,html.light .label.label-use-interoperability .badge-pill,html.light .label.label-use-web_monetization .badge-pill,html.light .label.blog-category-gateway_bulletins .badge-pill,html.light .label.chip-purple .badge-pill{color:#f2b2ff;background-color:#6b0080}html.light .label.label-checks:hover,html.light .label.label-core-server:hover,html.light .label.label-コアサーバ:hover,html.light .label.label-use-interoperability:hover,html.light .label.label-use-web_monetization:hover,html.light .label.blog-category-gateway_bulletins:hover,html.light .label.chip-purple:hover{background-color:#ea80ff;color:#40004c}html.light .label.label-checks:hover .badge-pill,html.light .label.label-core-server:hover .badge-pill,html.light .label.label-コアサーバ:hover .badge-pill,html.light .label.label-use-interoperability:hover .badge-pill,html.light .label.label-use-web_monetization:hover .badge-pill,html.light .label.blog-category-gateway_bulletins:hover .badge-pill,html.light .label.chip-purple:hover .badge-pill{color:#ea80ff;background-color:#40004c}.label.label-cross-currency,.label.label-security,.label.label-クロスカレンシー,.label.label-セキュリティ,.label.label-use-gaming,.label.label-use-defi,.label.blog-category-amendments,.label.chip-yellow{background-color:#4b4c00;color:#fcff80}.label.label-cross-currency .badge-pill,.label.label-security .badge-pill,.label.label-クロスカレンシー .badge-pill,.label.label-セキュリティ .badge-pill,.label.label-use-gaming .badge-pill,.label.label-use-defi .badge-pill,.label.blog-category-amendments .badge-pill,.label.chip-yellow .badge-pill{background-color:#fcff80;color:#4b4c00}.label.label-cross-currency:hover,.label.label-security:hover,.label.label-クロスカレンシー:hover,.label.label-セキュリティ:hover,.label.label-use-gaming:hover,.label.label-use-defi:hover,.label.blog-category-amendments:hover,.label.chip-yellow:hover{background-color:#7d8000;color:#fdffb2}.label.label-cross-currency:hover .badge-pill,.label.label-security:hover .badge-pill,.label.label-クロスカレンシー:hover .badge-pill,.label.label-セキュリティ:hover .badge-pill,.label.label-use-gaming:hover .badge-pill,.label.label-use-defi:hover .badge-pill,.label.blog-category-amendments:hover .badge-pill,.label.chip-yellow:hover .badge-pill{background-color:#fdffb2;color:#7d8000}html.light .label.label-cross-currency,html.light .label.label-security,html.light .label.label-クロスカレンシー,html.light .label.label-セキュリティ,html.light .label.label-use-gaming,html.light .label.label-use-defi,html.light .label.blog-category-amendments,html.light .label.chip-yellow{background-color:#fdffb2;color:#4b4c00}html.light .label.label-cross-currency .badge-pill,html.light .label.label-security .badge-pill,html.light .label.label-クロスカレンシー .badge-pill,html.light .label.label-セキュリティ .badge-pill,html.light .label.label-use-gaming .badge-pill,html.light .label.label-use-defi .badge-pill,html.light .label.blog-category-amendments .badge-pill,html.light .label.chip-yellow .badge-pill{color:#fdffb2;background-color:#4b4c00}html.light .label.label-cross-currency:hover,html.light .label.label-security:hover,html.light .label.label-クロスカレンシー:hover,html.light .label.label-セキュリティ:hover,html.light .label.label-use-gaming:hover,html.light .label.label-use-defi:hover,html.light .label.blog-category-amendments:hover,html.light .label.chip-yellow:hover{background-color:#fcff80;color:#4b4c00}html.light .label.label-cross-currency:hover .badge-pill,html.light .label.label-security:hover .badge-pill,html.light .label.label-クロスカレンシー:hover .badge-pill,html.light .label.label-セキュリティ:hover .badge-pill,html.light .label.label-use-gaming:hover .badge-pill,html.light .label.label-use-defi:hover .badge-pill,html.light .label.blog-category-amendments:hover .badge-pill,html.light .label.chip-yellow:hover .badge-pill{color:#fcff80;background-color:#4b4c00}.label.label-decentralized-exchange,.label.label-smart-contracts,.label.label-transaction-sending,.label.label-分散型取引所,.label.label-スマートコントラクト,.label.label-トランザクション送信,.label.label-use-developer_tooling,.label.label-use-payments,.label.blog-category-developer_reflections,.label.chip-blue{background-color:#002e4c;color:#80ccff}.label.label-decentralized-exchange .badge-pill,.label.label-smart-contracts .badge-pill,.label.label-transaction-sending .badge-pill,.label.label-分散型取引所 .badge-pill,.label.label-スマートコントラクト .badge-pill,.label.label-トランザクション送信 .badge-pill,.label.label-use-developer_tooling .badge-pill,.label.label-use-payments .badge-pill,.label.blog-category-developer_reflections .badge-pill,.label.chip-blue .badge-pill{background-color:#80ccff;color:#002e4c}.label.label-decentralized-exchange:hover,.label.label-smart-contracts:hover,.label.label-transaction-sending:hover,.label.label-分散型取引所:hover,.label.label-スマートコントラクト:hover,.label.label-トランザクション送信:hover,.label.label-use-developer_tooling:hover,.label.label-use-payments:hover,.label.blog-category-developer_reflections:hover,.label.chip-blue:hover{background-color:#004d80;color:#b2e0ff}.label.label-decentralized-exchange:hover .badge-pill,.label.label-smart-contracts:hover .badge-pill,.label.label-transaction-sending:hover .badge-pill,.label.label-分散型取引所:hover .badge-pill,.label.label-スマートコントラクト:hover .badge-pill,.label.label-トランザクション送信:hover .badge-pill,.label.label-use-developer_tooling:hover .badge-pill,.label.label-use-payments:hover .badge-pill,.label.blog-category-developer_reflections:hover .badge-pill,.label.chip-blue:hover .badge-pill{background-color:#b2e0ff;color:#004d80}html.light .label.label-decentralized-exchange,html.light .label.label-smart-contracts,html.light .label.label-transaction-sending,html.light .label.label-分散型取引所,html.light .label.label-スマートコントラクト,html.light .label.label-トランザクション送信,html.light .label.label-use-developer_tooling,html.light .label.label-use-payments,html.light .label.blog-category-developer_reflections,html.light .label.chip-blue{background-color:#b2e0ff;color:#004d80}html.light .label.label-decentralized-exchange .badge-pill,html.light .label.label-smart-contracts .badge-pill,html.light .label.label-transaction-sending .badge-pill,html.light .label.label-分散型取引所 .badge-pill,html.light .label.label-スマートコントラクト .badge-pill,html.light .label.label-トランザクション送信 .badge-pill,html.light .label.label-use-developer_tooling .badge-pill,html.light .label.label-use-payments .badge-pill,html.light .label.blog-category-developer_reflections .badge-pill,html.light .label.chip-blue .badge-pill{color:#b2e0ff;background-color:#004d80}html.light .label.label-decentralized-exchange:hover,html.light .label.label-smart-contracts:hover,html.light .label.label-transaction-sending:hover,html.light .label.label-分散型取引所:hover,html.light .label.label-スマートコントラクト:hover,html.light .label.label-トランザクション送信:hover,html.light .label.label-use-developer_tooling:hover,html.light .label.label-use-payments:hover,html.light .label.blog-category-developer_reflections:hover,html.light .label.chip-blue:hover{background-color:#80ccff;color:#002e4c}html.light .label.label-decentralized-exchange:hover .badge-pill,html.light .label.label-smart-contracts:hover .badge-pill,html.light .label.label-transaction-sending:hover .badge-pill,html.light .label.label-分散型取引所:hover .badge-pill,html.light .label.label-スマートコントラクト:hover .badge-pill,html.light .label.label-トランザクション送信:hover .badge-pill,html.light .label.label-use-developer_tooling:hover .badge-pill,html.light .label.label-use-payments:hover .badge-pill,html.light .label.blog-category-developer_reflections:hover .badge-pill,html.light .label.chip-blue:hover .badge-pill{color:#80ccff;background-color:#002e4c}.label.label-escrow,.label.label-tokens,.label.label-development,.label.label-トークン,.label.label-開発,.label.label-use-wallet,.label.label-use-sustainability,.label.blog-category-advisories,.label.chip-orange{background-color:#4c1a00;color:#ffaa80}.label.label-escrow .badge-pill,.label.label-tokens .badge-pill,.label.label-development .badge-pill,.label.label-トークン .badge-pill,.label.label-開発 .badge-pill,.label.label-use-wallet .badge-pill,.label.label-use-sustainability .badge-pill,.label.blog-category-advisories .badge-pill,.label.chip-orange .badge-pill{background-color:#ffaa80;color:#4c1a00}.label.label-escrow:hover,.label.label-tokens:hover,.label.label-development:hover,.label.label-トークン:hover,.label.label-開発:hover,.label.label-use-wallet:hover,.label.label-use-sustainability:hover,.label.blog-category-advisories:hover,.label.chip-orange:hover{background-color:#802b00;color:#ffccb2}.label.label-escrow:hover .badge-pill,.label.label-tokens:hover .badge-pill,.label.label-development:hover .badge-pill,.label.label-トークン:hover .badge-pill,.label.label-開発:hover .badge-pill,.label.label-use-wallet:hover .badge-pill,.label.label-use-sustainability:hover .badge-pill,.label.blog-category-advisories:hover .badge-pill,.label.chip-orange:hover .badge-pill{background-color:#ffccb2;color:#802b00}html.light .label.label-escrow,html.light .label.label-tokens,html.light .label.label-development,html.light .label.label-トークン,html.light .label.label-開発,html.light .label.label-use-wallet,html.light .label.label-use-sustainability,html.light .label.blog-category-advisories,html.light .label.chip-orange{background-color:#ffccb2;color:#802b00}html.light .label.label-escrow .badge-pill,html.light .label.label-tokens .badge-pill,html.light .label.label-development .badge-pill,html.light .label.label-トークン .badge-pill,html.light .label.label-開発 .badge-pill,html.light .label.label-use-wallet .badge-pill,html.light .label.label-use-sustainability .badge-pill,html.light .label.blog-category-advisories .badge-pill,html.light .label.chip-orange .badge-pill{color:#ffccb2;background-color:#802b00}html.light .label.label-escrow:hover,html.light .label.label-tokens:hover,html.light .label.label-development:hover,html.light .label.label-トークン:hover,html.light .label.label-開発:hover,html.light .label.label-use-wallet:hover,html.light .label.label-use-sustainability:hover,html.light .label.blog-category-advisories:hover,html.light .label.chip-orange:hover{background-color:#ffaa80;color:#4c1a00}html.light .label.label-escrow:hover .badge-pill,html.light .label.label-tokens:hover .badge-pill,html.light .label.label-development:hover .badge-pill,html.light .label.label-トークン:hover .badge-pill,html.light .label.label-開発:hover .badge-pill,html.light .label.label-use-wallet:hover .badge-pill,html.light .label.label-use-sustainability:hover .badge-pill,html.light .label.blog-category-advisories:hover .badge-pill,html.light .label.chip-orange:hover .badge-pill{color:#ffaa80;background-color:#4c1a00}.label.label-fees,.label.label-payments,.label.label-data-retention,.label.label-手数料,.label.label-支払い,.label.label-データ保持,.label.label-use-exchanges,.label.label-use-custody,.label.blog-category-security,.label.chip-magenta{background-color:#4c0026;color:#ff80bf}.label.label-fees .badge-pill,.label.label-payments .badge-pill,.label.label-data-retention .badge-pill,.label.label-手数料 .badge-pill,.label.label-支払い .badge-pill,.label.label-データ保持 .badge-pill,.label.label-use-exchanges .badge-pill,.label.label-use-custody .badge-pill,.label.blog-category-security .badge-pill,.label.chip-magenta .badge-pill{background-color:#ff80bf;color:#4c0026}.label.label-fees:hover,.label.label-payments:hover,.label.label-data-retention:hover,.label.label-手数料:hover,.label.label-支払い:hover,.label.label-データ保持:hover,.label.label-use-exchanges:hover,.label.label-use-custody:hover,.label.blog-category-security:hover,.label.chip-magenta:hover{background-color:#80003f;color:#ffb2d8}.label.label-fees:hover .badge-pill,.label.label-payments:hover .badge-pill,.label.label-data-retention:hover .badge-pill,.label.label-手数料:hover .badge-pill,.label.label-支払い:hover .badge-pill,.label.label-データ保持:hover .badge-pill,.label.label-use-exchanges:hover .badge-pill,.label.label-use-custody:hover .badge-pill,.label.blog-category-security:hover .badge-pill,.label.chip-magenta:hover .badge-pill{background-color:#ffb2d8;color:#80003f}html.light .label.label-fees,html.light .label.label-payments,html.light .label.label-data-retention,html.light .label.label-手数料,html.light .label.label-支払い,html.light .label.label-データ保持,html.light .label.label-use-exchanges,html.light .label.label-use-custody,html.light .label.blog-category-security,html.light .label.chip-magenta{background-color:#ffb2d8;color:#80003f}html.light .label.label-fees .badge-pill,html.light .label.label-payments .badge-pill,html.light .label.label-data-retention .badge-pill,html.light .label.label-手数料 .badge-pill,html.light .label.label-支払い .badge-pill,html.light .label.label-データ保持 .badge-pill,html.light .label.label-use-exchanges .badge-pill,html.light .label.label-use-custody .badge-pill,html.light .label.blog-category-security .badge-pill,html.light .label.chip-magenta .badge-pill{color:#ffb2d8;background-color:#80003f}html.light .label.label-fees:hover,html.light .label.label-payments:hover,html.light .label.label-data-retention:hover,html.light .label.label-手数料:hover,html.light .label.label-支払い:hover,html.light .label.label-データ保持:hover,html.light .label.label-use-exchanges:hover,html.light .label.label-use-custody:hover,html.light .label.blog-category-security:hover,html.light .label.chip-magenta:hover{background-color:#ff80bf;color:#4c0026}html.light .label.label-fees:hover .badge-pill,html.light .label.label-payments:hover .badge-pill,html.light .label.label-data-retention:hover .badge-pill,html.light .label.label-手数料:hover .badge-pill,html.light .label.label-支払い:hover .badge-pill,html.light .label.label-データ保持:hover .badge-pill,html.light .label.label-use-exchanges:hover .badge-pill,html.light .label.label-use-custody:hover .badge-pill,html.light .label.blog-category-security:hover .badge-pill,html.light .label.chip-magenta:hover .badge-pill{color:#ff80bf;background-color:#4c0026}.tag-cloud .list-inline-item{margin-top:1.5rem}.command-list-wrapper{position:sticky;top:calc(var(--navbar-height) + var(--toc-offset-top));max-height:calc(100vh - var(--navbar-height) - var(--toc-offset-top));overflow-y:auto;width:var(--toc-width)}#tx-sender-history .list-group-item{font-size:small;color:#454549}.response-metadata .timestamp{color:#454549}.throbber{width:24px;height:24px}#connection-status .card-body{border-left:0}#connection-status-item.active{background-color:#32e685;border-color:#32e685}.api-input-area .btn-group>.send-request.btn{border-bottom-right-radius:4px;border-top-right-radius:4px}#tx-sender-history ul{overflow:auto;height:220px;border:1px solid #e0e0e1}.progress small{margin-top:.5rem}.page-tx-sender .input-group .form-control,.interactive-block-ui .input-group .form-control{flex:1 1 20%;height:auto}.bootstrap-growl{max-width:90vw !important;overflow:hidden}.list-group-item-danger,#tx-sender-history .list-group-item-danger{background-color:#ff80bf;color:#000}.list-group-item-danger a,#tx-sender-history .list-group-item-danger a{color:#000}.list-group-item-danger a:hover,#tx-sender-history .list-group-item-danger a:hover{color:#000;text-decoration:underline}.rpc-tool .main h1::before,.rpc-tool .main h2::before,.rpc-tool .main h3::before{display:none}@media print{.multicode>div{display:block !important}.multicode>em,.multicode>p>em{display:block !important;page-break-after:avoid}.multicode>p{display:block !important}.code_toggler{display:none}pre{white-space:pre-wrap;max-height:none !important;overflow:visible;page-break-inside:auto;word-wrap:break-word}pre code{white-space:pre-wrap !important;color:#22252b !important}code{white-space:pre-wrap !important;color:#22252b !important}.codehilite .n,.codehilite .na,.codehilite .nb,.codehilite .nc,.codehilite .nd,.codehilite .ne,.codehilite .nf,.codehilite .ni,.codehilite .nl,.codehilite .nn,.codehilite .nt,.codehilite .nv,.codehilite .nx,.codehilite .bp,.codehilite .fm,.codehilite .py{color:#22252b}article a[title=Source]{float:none}header,footer,aside{display:none !important}.navbar{display:none !important}article,#main_content_body{position:static;display:block;width:auto;height:auto;color:#000 !important;max-width:100%;overflow:visible !important}body{overflow:visible;background:#fff}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{color:#000}.interactive-block{display:none}.container{margin-top:1rem !important}}#home-purple{position:absolute;left:0;top:-400px}#home-green{position:absolute;right:-3px;top:60px}.sidelinks:hover{color:#9a52ff}.sidelinks.active{color:#9a52ff;font-weight:bold}.page-home #home-hero-graphic{content:url("../img/home-hero.svg");margin-left:auto;width:856px;margin-right:auto;margin-bottom:24px;max-width:100%}.page-home #benefits-list #public{content:url("../img/icons/public.svg")}.page-home #benefits-list #streamlined{content:url("../img/icons/streamlined.svg")}.page-home #benefits-list #performance{content:url("../img/icons/performance.svg")}.page-home #benefits-list #low-cost{content:url("../img/icons/low-cost.svg")}.page-home #benefits-list #community{content:url("../img/icons/community.svg")}.page-home #benefits-list #reliability{content:url("../img/icons/reliability.svg")}.page-home #advanced-features .card:nth-child(1) .card-footer{background-image:url("../img/cards/3col-pink-purple.svg")}.page-home #advanced-features .card:nth-child(2) .card-footer{background-image:url("../img/cards/3col-neutral-blue.svg")}.page-home #advanced-features .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.page-home #advanced-features .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.page-home #advanced-features .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-purple-blue-2.svg")}.page-home #get-started .card:nth-child(1) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.page-home #get-started .card:nth-child(2) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.page-home #get-started .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-purple-blue-green.svg")}.page-home #get-started .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-light-blue.svg")}.page-home #get-started .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.cta{position:absolute}.cta-top-left{top:0;left:0}.cta-bottom-right{bottom:0;right:0}.landing-bg{opacity:.6}@media(min-width: 768px){.landing-bg{opacity:1}}.landing-builtin-bg::before{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background-repeat:no-repeat;background-position-x:left;background-position-y:top;opacity:.6}@media(min-width: 768px){.landing-builtin-bg::before{opacity:1}}#xrp-overview-blue{position:absolute;top:0;left:0}@media(max-width: 767.98px){#xrp-mark-overview{height:40px;margin-top:16px}}#wallets #wallet-ledger{content:url("../img/wallets/ledger.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-secalot{content:url("../img/wallets/secalot.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-trezor{content:url("../img/wallets/trezor.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-xumm{content:url("../img/wallets/xumm.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-trust{content:url("../img/wallets/trust.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-gatehub{content:url("../img/wallets/gatehub.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-towo{content:url("../img/wallets/towo.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-keystone{content:url("../img/wallets/keystone.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-dcent{content:url("../img/wallets/dcent.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-coin{content:url("../img/wallets/coin.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#top-exchanges #exch-bitstamp{content:url("../img/exchanges/bitstamp.svg")}#top-exchanges #exch-kraken{content:url("../img/exchanges/kraken.svg")}#top-exchanges #exch-cex-io{content:url("../img/exchanges/cex-io.svg")}#top-exchanges #exch-liquid{content:url("../img/exchanges/liquid.svg")}#top-exchanges #exch-lmax{content:url("../img/exchanges/lmax.svg")}#top-exchanges #exch-bitfinex{content:url("../img/exchanges/bitfinex.svg")}#top-exchanges #exch-etoro{content:url("../img/exchanges/etoro.svg")}#top-exchanges #exch-bittrex{content:url("../img/exchanges/bittrex.png")}#top-exchanges #exch-currency-com{content:url("../img/exchanges/currency-com.png")}#top-exchanges #exch-ftx{content:url("../img/exchanges/ftx.png")}#xrpl-overview-purple{position:absolute;top:40px;left:0}@media(max-width: 767.98px){#xrpl-overview-purple{top:0;left:-20vw}}#xrpl-overview-orange{position:absolute;top:80px;right:-4px}#use-cases-orange{position:absolute;top:-480px;right:-4px}#validator-graphic{content:url(../img/validators.svg)}.page-uses .container-new{padding-left:16px;padding-right:16px}.page-uses h1{font-size:42px}.page-uses::before{transform:scaleX(-1);background-image:url(../img/backgrounds/use-cases-blue.svg)}.page-uses .card-grid{grid-gap:8px}.page-uses .card-grid img{max-height:40px}.page-uses .modal{padding:0}.page-uses .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#000;background-clip:padding-box;border:none;border-radius:0;box-shadow:none;outline:none;background:#111112}.page-uses .modal-header{border:none;background:#111112;box-shadow:0px 1px 2px #000}.page-uses .modal-header .cancel .chevron{transform:rotate(90deg)}.page-uses .modal-header .apply .chevron{transform:rotate(-90deg)}.page-uses .modal-footer{border:none;background:#111112;box-shadow:0px -1px 2px #000;align-items:unset;padding:.75rem;flex-direction:column;flex-wrap:wrap}.page-uses .card-title{margin-bottom:.5rem;line-height:26px}.page-uses .card-uses{padding:16px;margin:0;text-decoration:none;transition:all .35s ease-out}.page-uses .card-uses:hover{text-decoration:none;color:#e0e0e1;transform:translateY(-16px);text-decoration:none}.page-uses .card-body{background:#232325;border-radius:8px;height:100%;padding:32px;margin:0}.page-uses .page-events .label{font-weight:normal;font-size:14px;margin:0;padding-left:26px}.page-uses .category-header{font-weight:bold;color:#c1c1c2}.page-uses .light .category-checkbox label{color:#fff}.page-uses .category-checkbox{display:flex;align-items:center}.page-uses .category-checkbox label{font-weight:normal;font-size:14px;margin:0;padding-left:26px}.page-uses .category_count{margin-left:8px;padding:2px 16px;width:24px;height:16px;background:#350080;border-radius:100px;font-weight:600;font-size:12px;line-height:16px;color:#b480ff}.page-uses .category_sidebar{position:sticky;top:10px}.page-uses #infrastructure{content:url("../img/icons/usecases/ic_infrastructure.png")}.page-uses #developer_tooling{content:url("../img/icons/usecases/ic_developer_tooling.png")}.page-uses #interoperability{content:url("../img/icons/usecases/ic_interoperability.png")}.page-uses #wallet{content:url("../img/icons/usecases/ic_wallet.png")}.page-uses #nfts{content:url("../img/icons/usecases/ic_nfts.png")}.page-uses #exchanges{content:url("../img/icons/usecases/ic_exchanges.png")}.page-uses #gaming{content:url("../img/icons/usecases/ic_gaming.png")}.page-uses #security{content:url("../img/icons/usecases/ic_security.png")}.page-uses #payments{content:url("../img/icons/usecases/ic_payments.png")}.page-uses #web_monetization{content:url("../img/icons/usecases/ic_web_monetization.png")}.page-uses #sustainability{content:url("../img/icons/usecases/ic_sustainability.png")}.page-uses #cbdc{content:url("../img/icons/usecases/ic_cbdc.png")}.page-uses #other{content:url("../img/icons/usecases/ic_other.png")}.page-uses #carbon_markets{content:url("../img/icons/usecases/ic_carbon_markets.png")}.page-uses #custody{content:url("../img/icons/usecases/ic_custody.png")}.page-uses #defi{content:url("../img/icons/usecases/ic_defi.png")}.page-uses #use_case_companies_list #bithomp .biz-logo{max-height:40px;content:url("../img/uses/bithomp.svg")}.page-uses #use_case_companies_list #onthedex .biz-logo{max-height:40px;content:url("../img/uses/onthedex.svg")}.page-uses #use_case_companies_list #gatehub .biz-logo{max-height:40px;content:url("../img/uses/gatehub.svg")}.page-uses #use_case_companies_list #towo-labs .biz-logo{max-height:40px;content:url("../img/uses/towo-labs.svg")}.page-uses #use_case_companies_list #xrp-toolkit .biz-logo{max-height:40px;content:url("../img/uses/xrp-toolkit.svg")}.page-uses #use_case_companies_list #xrpl-org-ledger-explorer .biz-logo{max-height:40px;content:url("../img/uses/xrpl-org-ledger-explorer.svg")}.page-uses #use_case_companies_list #xrpl-rosetta .biz-logo{max-height:40px;content:url("../img/uses/xrpl-rosetta.svg")}.page-uses #use_case_companies_list #xrpscan .biz-logo{max-height:40px;content:url("../img/uses/xrpscan.svg")}.page-uses #use_case_companies_list #evernode .biz-logo{max-height:40px;content:url("../img/uses/evernode.svg")}.page-uses #use_case_companies_list #cryptum .biz-logo{max-height:40px;content:url("../img/uses/cryptum.svg")}.page-uses #use_case_companies_list #x-tokenize .biz-logo{max-height:40px;content:url("../img/uses/x-tokenize.svg")}.page-uses #use_case_companies_list #multichain .biz-logo{max-height:40px;content:url("../img/uses/multichain.svg")}.page-uses #use_case_companies_list #xumm-wallet .biz-logo{max-height:40px;content:url("../img/uses/xumm-wallet.svg")}.page-uses #use_case_companies_list #gem-wallet .biz-logo{max-height:40px;content:url("../img/uses/gem-wallet.svg")}.page-uses #use_case_companies_list #aesthetes .biz-logo{max-height:40px;content:url("../img/uses/aesthetes.svg")}.page-uses #use_case_companies_list #audiotarky .biz-logo{max-height:40px;content:url("../img/uses/audiotarky.svg")}.page-uses #use_case_companies_list #xrp-cafe .biz-logo{max-height:40px;content:url("../img/uses/xrp-cafe.svg")}.page-uses #use_case_companies_list #nft-master .biz-logo{max-height:40px;content:url("../img/uses/nft-master.svg")}.page-uses #use_case_companies_list #onxrp .biz-logo{max-height:40px;content:url("../img/uses/onxrp.svg")}.page-uses #use_case_companies_list #peerkat .biz-logo{max-height:40px;content:url("../img/uses/peerkat.svg")}.page-uses #use_case_companies_list #sologenic-nft .biz-logo{max-height:40px;content:url("../img/uses/sologenic-nft.svg")}.page-uses #use_case_companies_list #sologenic-dex .biz-logo{max-height:40px;content:url("../img/uses/sologenic-dex.svg")}.page-uses #use_case_companies_list #xp-market .biz-logo{max-height:40px;content:url("../img/uses/xp-market.svg")}.page-uses #use_case_companies_list #ledger-city .biz-logo{max-height:40px;content:url("../img/uses/ledger-city.svg")}.page-uses #use_case_companies_list #forte .biz-logo{max-height:40px;content:url("../img/uses/forte.svg")}.page-uses #use_case_companies_list #anchain-ai .biz-logo{max-height:40px;content:url("../img/uses/anchain-ai.svg")}.page-uses #use_case_companies_list #coil .biz-logo{max-height:40px;content:url("../img/uses/coil.svg")}.page-uses #use_case_companies_list #carbonland-trust .biz-logo{max-height:40px;content:url("../img/uses/carbonland-trust.svg")}.page-uses #use_case_companies_list #casino-coin .biz-logo{max-height:40px;content:url("../img/uses/casino-coin.svg")}.page-uses #use_case_companies_list #bitgo .biz-logo{max-height:40px;content:url("../img/uses/bitgo.svg")}.page-uses #use_case_companies_list #bitpay .biz-logo{max-height:40px;content:url("../img/uses/bitpay.svg")}.page-uses #use_case_companies_list #ripples-on-demand-liquidity .biz-logo{max-height:40px;content:url("../img/uses/ripples-on-demand-liquidity.svg")}.page-uses #use_case_companies_list #ripples-cbdc-platform .biz-logo{max-height:40px;content:url("../img/uses/ripples-cbdc-platform.svg")}.page-uses #use_case_companies_list #momento .biz-logo{max-height:40px;content:url("../img/uses/momento.svg")}.page-uses #use_case_companies_list #Crossmark .biz-logo{max-height:40px;content:url("../img/uses/Crossmark.png")}.page-uses #use_case_companies_list #Edge .biz-logo{max-height:40px;content:url("../img/uses/Edge.png")}@media(min-width: 992px){.page-uses h1{font-size:62px}.page-uses .container-new{padding-left:64px;padding-right:64px}.page-uses .card-grid img{max-height:48px}.page-uses .card-grid{grid-gap:48px}.page-uses .card-uses{padding:24px}}#history-orange{position:absolute;top:0;right:-4px}#history-purple{position:absolute;top:-480px;left:-4px}.hidden-section{overflow:hidden;visibility:hidden;height:0}.hidden-section.show{overflow:auto;visibility:visible;height:auto}#impact-green{position:absolute;top:0;left:-4px;rotate:180deg}#impact-purple{position:absolute;top:100px;right:-4px}#impact-magenta{position:absolute;top:100px;right:-4px}#foundation-magenta{position:absolute;top:0px;left:0px}#foundation-orange{position:absolute;top:40px;right:-4px}.page-impact #map-light{display:none}.page-impact #map-dark{display:block}.page-impact .connect-list #connect-01{content:url("../img/impact/connect-01.svg")}.page-impact .connect-list #connect-02{content:url("../img/impact/connect-02.svg")}.page-impact .connect-list #connect-03{content:url("../img/impact/connect-03.svg")}.page-impact .connect-list #connect-04{content:url("../img/impact/connect-04.svg")}.page-funding .funding-list #funding-01{content:url("../img/funding/funding-01.svg")}.page-funding .funding-list #funding-02{content:url("../img/funding/funding-02.svg")}.page-funding .funding-list #funding-03{content:url("../img/funding/funding-03.svg")}.page-funding .funding-list #funding-04{content:url("../img/funding/funding-04.svg")}.page-funding #funding-orange{position:absolute;top:132px;left:-4px}@media(min-width: 992px){.page-funding .funding-box{min-height:200px}}.page-ambassadors #benefits-list #benefits-01{content:url("../img/ambassadors/benefits-01.svg")}.page-ambassadors #benefits-list #benefits-02{content:url("../img/ambassadors/benefits-02.svg")}.page-ambassadors #benefits-list #benefits-03{content:url("../img/ambassadors/benefits-03.svg")}.page-ambassadors #benefits-list #benefits-04{content:url("../img/ambassadors/benefits-04.svg")}.page-ambassadors #benefits-list #benefits-05{content:url("../img/ambassadors/benefits-05.svg")}.page-ambassadors #benefits-list #benefits-06{content:url("../img/ambassadors/benefits-06.svg")}.page-ambassadors #eligibility-list #eligibility-01{content:url("../img/ambassadors/eligibility-01.svg")}.page-ambassadors #eligibility-list #eligibility-02{content:url("../img/ambassadors/eligibility-02.svg")}.page-ambassadors #eligibility-list #eligibility-03{content:url("../img/ambassadors/eligibility-03.svg")}.page-ambassadors #eligibility-list #eligibility-04{content:url("../img/ambassadors/eligibility-04.svg")}.page-ambassadors #eligibility-list #eligibility-05{content:url("../img/ambassadors/eligibility-05.svg")}.page-ambassadors .btn{padding:.75rem}.page-ambassadors #container-scroll{height:160px;position:relative;overflow:hidden;margin-top:80px;margin-bottom:64px}.page-ambassadors .photobanner{position:absolute;top:0px;left:0px;overflow:hidden;white-space:nowrap;animation:bannermove 40s linear infinite}.page-ambassadors .photobanner-bottom{top:112px}.page-ambassadors .photobanner img{margin:0 .5em}@keyframes bannermove{0%{transform:translate(0, 0)}100%{transform:translate(-50%, 0)}}.page-ambassadors #carouselSlidesOnly{height:392px;margin-bottom:40px}@media(min-width: 992px){.page-ambassadors #carouselSlidesOnly{height:320px;margin-bottom:104px}}.page-ambassadors h6{font-size:1.25rem}.page-ambassadors .btn-arrow::after{display:inline-block;content:url(../img/icons/arrow-right-purple.svg);vertical-align:middle;padding-left:8px;transition:transform .3s ease-out}.page-ambassadors .btn-arrow:hover{text-decoration:none;background:none !important;border:none}.page-ambassadors .btn-arrow:hover::after{background-position:left 4px bottom 4px;transform:translateX(4px)}.autoscroll-content{animation:autoscroll 15s linear infinite;white-space:nowrap;overflow:hidden;max-width:300px}#community-magenta{position:absolute;top:0px;left:0px}#community-purple{position:absolute;top:160px;right:0px}.page-events #event-hero-image{height:100%;min-height:209px;background:url(../img/events/event-hero1@2x.png);background-size:contain;background-repeat:no-repeat;background-position:center}.page-events #events-orange{position:absolute;top:0px;right:0px}.page-events .event-hero{color:#f5f5f7}.page-events .event-hero p{font-weight:500;font-size:24px;line-height:32px}.page-events .event-save-date{color:#fff;font-weight:bold;font-size:20px;line-height:26px}.page-events .event-small-gray{color:#e0e0e1}.page-events .btn{padding:.75rem}.page-events .event-card{max-width:311px;margin:32px auto;transition:all .35s ease-out;position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-clip:border-box;background-color:#232325;box-shadow:0px 5px 40px #000;border:1px solid rgba(0,0,0,.125);border-radius:8px;font-size:16px;line-height:24px;color:#e0e0e1}.page-events .event-card .event-card-header{position:relative;height:176px;background-size:contain !important;width:100%;border-radius:8px 8px 0 0}.page-events .event-card .event-card-title{position:absolute;bottom:32px;padding:0 32px;color:#f5f5f7;font-weight:bold;font-size:20px;line-height:28px}.page-events .event-card .event-card-body{padding:32px}.page-events .event-card .event-card-footer{padding:0 32px 32px}.page-events .event-card .event-card-footer .icon::before{height:24px;width:24px;content:"";margin-right:8px;background-size:contain;background-repeat:no-repeat}.page-events .event-card .icon-date::before{background:url(../img/events/event-date.svg)}.page-events .event-card .icon-location::before{background:url(../img/events/event-location.svg)}@media(min-width: 992px){.page-events .event-card{max-width:347px;margin:32px}.page-events .event-card-header{height:197px !important}}.page-events a.event-card:hover{transform:translateY(-16px);text-decoration:none}.page-events label{margin:0;padding-left:8px;color:#fff}.page-events .events-filter h6{font-size:16px}.page-events .events-filter{height:20px;width:20px}.page-events .events-filter[type=checkbox]::before{position:relative;display:block;width:20px;height:20px;content:"";background:#111112;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.page-events .events-filter[type=checkbox]::after{position:relative;display:block;top:-20px;width:20px;height:20px;content:"";background-repeat:no-repeat;background-position:center;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.page-events .events-filter[type=checkbox]:checked::before{background:#111112;border:none;border-radius:0}.page-events .events-filter[type=checkbox]:checked::after{background-image:url(../img/events/event-check.svg);background-repeat:no-repeat;background-position:center;background-color:#7919ff;border-width:2px;border-style:solid;border-color:#7919ff;border-radius:4px}.page-events .events-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/events/event-check.svg);background-repeat:no-repeat;background-position:center;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}.page-events .events-filter[type=checkbox]:not(:disabled):hover::before{background:#111112;border:none;border-radius:0}.page-events .events-filter[type=checkbox]:not(:disabled):hover::after{background:#111112;border:none;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}#find-us-on-platforms .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-light-blue-3.svg)}#find-us-on-platforms .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-purple-blue-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-magenta-3.svg)}#find-us-on-platforms .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-green-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(5) .card-footer{background-image:url(../img/cards/4col-orange-yellow-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(6) .card-footer{background-image:url(../img/cards/4col-blue-purple.svg)}#find-us-on-platforms .card-deck .card:nth-child(7) .card-footer{background-image:url(../img/cards/4col-yellow-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(8) .card-footer{background-image:url(../img/cards/4col-orange-2.svg)}#find-us-on-platforms .card-deck .card{margin-bottom:2.5rem}.page-faq::before{background-image:url(../img/backgrounds/faq-bg.svg)}@media(min-width: 768px){.page-faq::before{background-size:contain}}@media(min-width: 992px){.page-faq article{max-width:704px;margin-left:auto;margin-right:auto}}.page-faq article h6:first-of-type{color:#32e685;margin-bottom:1rem;margin-top:2.5rem;font-size:1.25rem;line-height:26px;text-align:center}.page-faq article h6:first-of-type .hover_anchor{display:none}@media(min-width: 992px){.page-faq article h6:first-of-type{margin-top:6.5rem}}.page-faq article h1:first-of-type{font-size:2.625rem;line-height:1.2;margin-top:0;margin-bottom:5rem;text-align:center}.page-faq article h1:first-of-type .hover_anchor{display:none}@media(min-width: 992px){.page-faq article h1:first-of-type{font-size:3.875rem;margin-bottom:13rem}}.page-faq h2{margin-top:13rem;font-size:2rem;line-height:2.375rem;text-align:center;font-weight:700}.page-faq .q-wrapper,.mini-faq .q-wrapper{background:#232325;border-radius:4px;padding:2rem;padding-right:3rem;margin-bottom:3.5rem;position:relative;z-index:5;width:100%;transform:translateY(0%)}.page-faq .q-wrapper p a,.mini-faq .q-wrapper p a{text-decoration:none;font-weight:600;color:#9a52ff}.page-faq .q-wrapper p a:hover,.mini-faq .q-wrapper p a:hover{text-decoration:underline}.page-faq .q-wrapper h4,.mini-faq .q-wrapper h4{font-size:1.25rem;line-height:1.625rem;margin-top:0}.page-faq .q-wrapper h4::before,.mini-faq .q-wrapper h4::before{display:block;content:" ";margin-top:-40px;height:40px;visibility:hidden;pointer-events:none}.page-faq .q-wrapper h4>a,.mini-faq .q-wrapper h4>a{text-decoration:none}.page-faq .q-wrapper h4>a:hover,.mini-faq .q-wrapper h4>a:hover{text-decoration:underline;color:#fff}@media(max-width: 991.98px){.page-faq .q-wrapper h4,.mini-faq .q-wrapper h4{font-size:1rem;line-height:1.5rem}}.page-faq .q-wrapper h4 .chevron,.mini-faq .q-wrapper h4 .chevron{position:absolute;top:40px;right:2rem}.page-docs-index::before{background-position-x:right}.page-docs-index .center-search .input-group-text{height:56px;padding:.75rem .75rem .75rem 1rem;line-height:2rem}.page-docs-index .center-search .ds-input{height:56px;padding:.75rem 1rem .75rem .5rem}.page-docs-index #software-and-sdks .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-green.svg)}.page-docs-index #software-and-sdks .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-light-blue.svg)}.page-docs-index #software-and-sdks .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-orange.svg)}.page-docs-index #software-and-sdks .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-yellow.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-orange-yellow.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-magenta.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-blue-green.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-light-blue-2.svg)}.page-docs-index #docs-hot-topic .longform{margin-top:2.5rem}.page-docs-index #community-heading,.page-community #community-heading{padding-top:25rem;margin-top:0px}@media(max-width: 768px){.page-docs-index #community-heading,.page-community #community-heading{padding-top:31rem}}.page-docs-index #community-heading .hero-title,.page-community #community-heading .hero-title{position:absolute;bottom:0;left:50%;transform:translateX(-50%)}@media(min-width: 992px){.page-docs-index #community-heading,.page-community #community-heading{padding-left:0}.page-docs-index #community-heading .hero-title,.page-community #community-heading .hero-title{min-width:max-content;bottom:-83%}}.page-docs-index #community-heading .parallax,.page-community #community-heading .parallax{position:absolute;-webkit-transition:all .1s ease;-moz-transition:all .1s ease;-ms-transition:all .1s ease;-o-transition:all .1s ease;transition:all .1s ease}.page-docs-index #community-heading .one,.page-community #community-heading .one{top:160px;left:0%;opacity:.4}.page-docs-index #community-heading .two,.page-community #community-heading .two{top:130px;left:56%;height:320px;opacity:.4}.page-docs-index #community-heading .three,.page-community #community-heading .three{top:145px;right:16%;height:67px}.page-docs-index #community-heading .four,.page-community #community-heading .four{top:374px;left:8%;width:107px}.page-docs-index #community-heading .five,.page-community #community-heading .five{top:476px;width:152px;height:102px;right:5%;opacity:.4}.page-docs-index #run-a-network-node .card-deck .card:nth-child(1) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-yellow-2.svg)}.page-docs-index #run-a-network-node .card-deck .card:nth-child(2) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-purple.svg)}.page-docs-index #run-a-network-node .card-deck .card:nth-child(3) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-magenta-2.svg)}.page-docs-index #run-a-network-node .card-deck .card:nth-child(4) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-light-green.svg)}.page-docs-index #run-a-network-node,.page-community #run-a-network-node{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #run-a-network-node,.page-community #run-a-network-node{padding-top:104px;padding-bottom:104px}}.page-docs-index #run-a-network-node .text-cards,.page-community #run-a-network-node .text-cards{grid-gap:40px}.page-docs-index #run-a-network-node .text-cards h6::before,.page-community #run-a-network-node .text-cards h6::before{margin-top:0;height:unset}.page-docs-index #run-a-network-node .text-cards a,.page-community #run-a-network-node .text-cards a{font-size:1.25rem;line-height:26px;color:#fff;font-weight:bold}.page-docs-index #run-a-network-node .text-cards a:hover,.page-community #run-a-network-node .text-cards a:hover{text-decoration:none;background:none !important}.page-docs-index #run-a-network-node .text-cards .btn-arrow::after,.page-community #run-a-network-node .text-cards .btn-arrow::after{display:inline-block;content:url(../img/icons/arrow-right-purple.svg);vertical-align:middle;padding-left:8px;-webkit-transition:transform .3s ease-out;-moz-transition:transform .3s ease-out;-ms-transition:transform .3s ease-out;-o-transition:transform .3s ease-out;transition:transform .3s ease-out}.page-docs-index #xrpl-grants,.page-community #xrpl-grants{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-grants,.page-community #xrpl-grants{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-blog,.page-community #xrpl-blog{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-blog,.page-community #xrpl-blog{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-events,.page-community #xrpl-events{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-events,.page-community #xrpl-events{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-careers,.page-community #xrpl-careers{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-careers,.page-community #xrpl-careers{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-design-assets,.page-community #xrpl-design-assets{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-design-assets,.page-community #xrpl-design-assets{padding-top:104px;padding-bottom:208px}}.page-community #platform-github{content:url("../img/logos/github.svg")}.page-community #platform-twitch{content:url("../img/logos/twitch.svg")}.page-community #platform-stack-overflow{content:url("../img/logos/stack-overflow.svg")}.page-community #platform-twitter{content:url("../img/logos/twitter.svg")}.page-community #platform-discord{content:url("../img/logos/discord.svg")}.page-community #platform-youtube{content:url("../img/logos/youtube.svg")}.page-community #platform-devto{content:url("../img/logos/devto.svg")}.page-references #refs-types .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/3col-orange-2.svg)}.page-references #refs-types .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/3col-green-2.svg)}.page-references #refs-types .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/3col-magenta.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-light-blue-4.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-blue-green-2.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-yellow-3.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-purple-blue.svg)}.page-dev-tools #xrp-explorer .card-footer{background-image:url("../img/cards/3-col-orange.svg")}.page-dev-tools #bithomp-explorer .card-footer{background-image:url("../img/cards/3-col-light-blue.svg")}.page-dev-tools #xrpscan .card-footer{background-image:url("../img/cards/3-col-pink.svg")}.page-dev-tools #token-list .card-footer{background-image:url("../img/cards/3-col-pink2.svg")}.page-dev-tools #websocket .card-footer{background-image:url("../img/cards/3-col-purple2.svg")}.page-dev-tools #rpc .card-footer{background-image:url("../img/cards/3-col-green.svg")}.page-dev-tools #technical-explorer .card-footer{background-image:url("../img/cards/3-col-purple-blue.svg")}.page-dev-tools #faucets .card-footer{background-image:url("../img/cards/3-col-pink2.svg")}.page-dev-tools #trasaction-sender .card-footer{background-image:url("../img/cards/3-col-light-blue2.svg")}.page-dev-tools #domain .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.page-dev-tools #xrp-ledger .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.page-dev-tools #binary-visualizer .card-footer{background-image:url("../img/cards/3-col-purple-blue.svg")}.page-dev-tools #token-metadata-lookup .card-footer{background-image:url("../img/cards/3-col-pink-purple.svg")}.page-dev-tools .nav-link{color:#a2a2a4;background-color:#111112;border-top:none;border-left:none;border-right:none;border-bottom-color:#454549}@media(max-width: 767.98px){.page-dev-tools .nav-tabs{display:flex;list-style:none;margin-left:0;padding-left:0;justify-content:space-between}.page-dev-tools .nav-item{display:inline-flex;width:auto;list-style:outside none none}.page-dev-tools .nav-link{display:inline-flex;width:auto;padding:1em 1em}}.page-dev-tools .nav-link.active{border-bottom-color:#9a52ff;color:#fff;font-weight:bold}.page-dev-tools .nav-tabs{border-bottom:1px solid #454549}.page-dev-tools .btn{padding:.75rem}html.light .page-dev-tools .nav-link{background-color:#f5f5f7}html.light .page-dev-tools .nav-link.active{border-bottom-color:#9a52ff;color:#000;font-weight:bold}html.light .page-dev-tools .nav-link{color:#000}html.light .page-dev-tools #trasaction-sender .card-footer{background-image:url("../img/cards/3-col-light-blue-2.svg")}.json-view{display:block;color:#4d4d4d;--json-property:#009033;--json-index:#676dff;--json-number:#676dff;--json-string:#b2762e;--json-boolean:#dc155e;--json-null:#dc155e}.json-view .json-view--property{color:var(--json-property)}.json-view .json-view--index{color:var(--json-index)}.json-view .json-view--number{color:var(--json-number)}.json-view .json-view--string{color:var(--json-string)}.json-view .json-view--boolean{color:var(--json-boolean)}.json-view .json-view--null{color:var(--json-null)}.json-view .jv-indent{padding-left:1em}.json-view .jv-chevron{display:inline-block;vertical-align:-20%;cursor:pointer;opacity:.4;width:1em;height:1em}:is(.json-view .jv-chevron:hover, .json-view .jv-size:hover + .jv-chevron){opacity:.8}.json-view .jv-size{cursor:pointer;opacity:.4;font-size:.875em;font-style:italic;margin-left:.5em;vertical-align:-5%;line-height:1}.json-view :is(.json-view--copy, .json-view--edit){display:none;width:1em;height:1em;margin-left:.25em;cursor:pointer}.json-view .json-view--input{width:120px;margin-left:.25em;border-radius:4px;border:1px solid currentColor;padding:0px 4px;font-size:87.5%;line-height:1.25;background:transparent}.json-view .json-view--deleting{outline:1px solid #da0000;background-color:#da000011;text-decoration-line:line-through}:is(.json-view:hover, .json-view--pair:hover)>:is(.json-view--copy, .json-view--edit){display:inline-block}.json-view .jv-button{background:transparent;outline:none;border:none;cursor:pointer}.json-view .cursor-pointer{cursor:pointer}.json-view_a11y{color:#545454;--json-property:#aa5d00;--json-index:#007299;--json-number:#007299;--json-string:green;--json-boolean:#d91e18;--json-null:#d91e18}.json-view_github{color:#005cc5;--json-property:#005cc5;--json-index:#005cc5;--json-number:#005cc5;--json-string:#032f62;--json-boolean:#005cc5;--json-null:#005cc5}.json-view_vscode{color:#005cc5;--json-property:#0451a5;--json-index:blue;--json-number:blue;--json-string:#a31515;--json-boolean:blue;--json-null:blue}.json-view_atom{color:#383a42;--json-property:#e45649;--json-index:#986801;--json-number:#986801;--json-string:#50a14f;--json-boolean:#0184bc;--json-null:#0184bc}.json-view_winter-is-coming{color:#0431fa;--json-property:#3a9685;--json-index:#ae408b;--json-number:#ae408b;--json-string:#8123a9;--json-boolean:#0184bc;--json-null:#0184bc}.json-view{font-family:"Space Mono",monospace;padding:1em;background:#232325;overflow:hidden;color:#f5f5f7 !important;font-size:14px;letter-spacing:0}.json-view svg{height:11px !important;color:#f5f5f7}.jv-button{color:#ff6719 !important;font-size:14px}.jv-indent{border-left:1px solid #454549;margin:4px}.json-view--boolean{color:#e50071 !important}.json-view--pair{margin:4px}.json-view--property{color:#f5f5f7 !important}.json-view--null,.json-view--undefined{display:inline-block;padding:1px 2px;border-radius:3px;background-color:#454549;color:#f5f5f7 !important;font-size:11px}.json-view--number{color:#84f0b6 !important}.json-view--string{color:#ff6719 !important}.rpc-tool .nav-link{cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:6px 9px}.dev-blog .image-container{transform:translateY(15%);z-index:1}.dev-blog .text-bg{background-color:#232325;padding:60px 40px;width:100%;border-radius:30px}@media(min-width: 992px){.dev-blog .image-container{transform:translateX(15%)}.dev-blog .text-bg{padding:50px 60px}}.dev-blog .line-clamp{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.dev-blog #blog-purple{position:absolute;top:0px;left:0px}.dev-blog #card-date{color:#a2a2a4}.dev-blog .post-date{text-decoration:overline solid #32e685 10%}.dev-blog #category-list #general{content:url("../img/blog/general.png");max-width:100%;width:100%}.dev-blog #category-list #developer_reflections{content:url("../img/blog/developer_reflections.png");max-width:100%;width:100%}.dev-blog #category-list #amendments{content:url("../img/blog/amendments.png");max-width:100%;width:100%}.dev-blog #category-list #advisories{content:url("../img/blog/advisories.png");max-width:100%;width:100%}.dev-blog #category-list #release_notes{content:url("../img/blog/release_notes.png");max-width:100%;width:100%}.dev-blog #category-list #development{content:url("../img/blog/development.png");max-width:100%;width:100%}.dev-blog #category-list #gateway_bulletins{content:url("../img/blog/gateway_bulletins.png");max-width:100%;width:100%}.dev-blog #category-list #features{content:url("../img/blog/features.png");max-width:100%;width:100%}.dev-blog #category-list #security{content:url("../img/blog/security.png");max-width:100%;width:100%}.dev-blog .category_sidebar{position:sticky;top:126px}.dev-blog .category-checkbox{display:flex;align-items:center}.dev-blog .dropdown{position:relative;display:inline-block}.dev-blog .dropdown-btn{color:#fff;background-color:#232325;border-color:#232325;border-style:solid;border-radius:4px;padding:8px 16px;font-size:16px;cursor:pointer;text-align:start;padding-right:10px}.dev-blog .dropdown-btn img{content:url("../img/icons/chevron-arrow-down.svg");width:10px;height:13px;padding:8px}.dev-blog .dropdown-content{display:flex;align-items:start;background-color:#232325;padding:16px 8px;width:254px;height:auto;border-radius:4px}.dev-blog .category-checkbox label{font-weight:normal;font-size:14px;margin:0;padding-left:26px}.dev-blog .category-header{font-weight:normal;width:200px;color:#f5f5f7}.dev-blog label{margin:0;padding-left:8px;color:#fff}.dev-blog .blog-filter h6{font-size:16px}.dev-blog .blog-filter[type=checkbox]::before{position:relative;display:block;width:20px;height:20px;content:"";background:#111112;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.dev-blog .blog-filter[type=checkbox]::after{position:relative;display:block;top:-20px;width:20px;height:20px;content:"";background-repeat:no-repeat;background-position:center;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.dev-blog .blog-filter[type=checkbox]:checked::before{background:#111112;border:none;border-radius:0}.dev-blog .blog-filter[type=checkbox]:checked::after{background-image:url(../img/blog/blog-check.svg);background-repeat:no-repeat;background-position:center;background-color:#7919ff;border-width:2px;border-style:solid;border-color:#7919ff;border-radius:4px}.dev-blog .blog-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/blog/blog-check.svg);background-repeat:no-repeat;background-position:center;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}.dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::before{background:#111112;border:none;border-radius:0}.dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::after{background:#111112;border:none;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}#feedback-content .docked-widget{border:none !important;background-color:transparent !important;position:static !important;box-shadow:none !important;width:auto !important}#feedback-content .widget-form-wrapper{position:static !important;box-shadow:none !important;display:block;background-color:#232325 !important;border-width:0 !important;padding:24px !important;border-radius:8px !important}#feedback-content .widget-form-wrapper div{background-color:#232325 !important}#feedback-content .widget-form-wrapper textarea{background-color:#fff !important;opacity:1 !important;border:none !important;border-radius:4px !important;margin:0 !important;width:100% !important;color:#000 !important}#feedback-content .widget-form-wrapper .widget-header-title{background:none !important;flex-grow:0 !important;padding-right:1rem !important;height:auto !important;padding:0 !important;margin-bottom:10px !important}#feedback-content .widget-form-wrapper .widget-header-footer{background:none !important}#feedback-content .widget-form-wrapper .widget-form-footer{padding-right:0 !important}#feedback-content .widget-form-wrapper .submit{background-color:#7919ff !important;font-weight:bold !important;color:#fff !important;border:none !important;border-color:transparent !important;border-radius:4px !important;margin:0 !important;margin-top:8px !important}#feedback-content .widget-form-wrapper .submit:hover{background:#5f00e5 !important}#feedback-content .widget-form-wrapper .submit.disabled,#feedback-content .widget-form-wrapper .submit[disabled=disabled]{background-color:#4a00b2 !important}#feedback-content .widget-form-wrapper .submit.disabled:hover,#feedback-content .widget-form-wrapper .submit[disabled=disabled]:hover{background-color:#4a00b2 !important}#feedback-content .widget-form-wrapper .cancel{margin:0 !important;margin-top:8px !important;color:#b480ff !important;font-weight:600 !important}#feedback-content #closeFeedback{display:none}#feedback-content .widget-helpful .widget-header{background-color:#232325 !important;border-radius:8px !important}#feedback-content .widget-helpful .widget-header-title{color:#fff !important}.video-image{transition:all .35s ease-out;cursor:pointer}.video-image:hover{-webkit-transform:translateY(-16px);-moz-transform:translateY(-16px);-ms-transform:translateY(-16px);-o-transform:translateY(-16px);transform:translateY(-16px)}#video-overlay{position:fixed;top:0;left:0;z-index:1190;height:100%;width:100%;background:#fff;opacity:.6;display:none}#video{display:none;position:fixed;top:10%;left:15%;width:70%;z-index:1200}#video-container{position:relative;top:50%;left:50%;-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);max-width:982px;padding:0 20px}#videoWrapper{position:absolute;top:0;left:0;height:calc(90vh - 100px);width:80vw}#videoWrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}#video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-external-link{color:#9a52ff;font-weight:600}.video-external-link::after{content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;display:inline-block;background-size:24px;padding:9px 4px 0 8px;width:2rem;background-position:left 8px bottom 0px;transition:background-position 100ms ease-in-out}.video-external-link.video-external-link:hover::after{background-position:left 12px bottom 8px}.video-title{line-height:1.2}@media(min-width: 768px){.video-title{font-size:1rem}}@media(max-width: 768px){.page-community .sm-align-items-start{align-items:start !important}}.page-community .numbers-animation{width:218px;height:96px}@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}.page-community .bounce-arrow{animation:bounce 1.5s infinite;animation-timing-function:ease-in-out;height:26px;width:26px;position:relative;top:24px}.page-community .m-gif{height:108px}.page-community .middle-image{margin:0 auto;height:35px}.page-community .bg-hero{width:100%;height:635px}.page-community #center-image{cursor:pointer}.page-community .gradient-num-three{background:linear-gradient(35deg, #84F0B6 -0.3%, #B480FF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent}.page-community .middle-image-two{margin:0 auto;height:52px}.page-community .gradient-num-two{background:linear-gradient(35deg, #EA80FF -0.3%, #80CCFF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent}.page-community .gradient-num{background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent}.page-community .surround-gradient{background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:40px;font-weight:400}.page-community .surround-gradient-two{background:linear-gradient(35deg, #EA80FF -0.3%, #80CCFF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:40px;font-weight:400}.page-community .surround-gradient-three{background:linear-gradient(35deg, #84F0B6 -0.3%, #B480FF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:40px;font-weight:400}.page-community .main-title{color:var(--black-black-0, #FFF);text-align:center;font-family:Work Sans;font-size:62px;font-style:normal;font-weight:700;line-height:70px}@media(max-width: 768px){.page-community .main-title{font-size:42px;line-height:52px;text-align:left}}.page-community .get-funding-btn{width:90%;margin:0 auto}@media(max-width: 768px){.page-community .cd-none-sm{display:none !important}}@media(min-width: 769px){.page-community .cd-none-lg{display:none !important}}.page-community .icon-date{padding-right:4px;content:url(../img/events/event-date.svg)}.page-community .icon-location{padding-right:4px;content:url(../img/events/event-location.svg)}.page-community .builders-wrap{white-space:nowrap}@media(min-width: 768px){.page-community .builders-wrap{white-space:normal}}.page-community #community-table{padding:20px 93px;max-width:1280px;margin:0 auto;border-radius:5px;padding-top:165px}@media(min-width: 992px){.page-community #community-table{padding-top:512px}}@media(max-width: 768px){.page-community #community-table{margin:0;padding:20px;margin-top:100px !important}}.page-community .eyebrow-convo{text-align:start;font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:26px;padding-bottom:5px}.page-community .final-tr{border:none !important}.page-community #community-table h4{text-align:start;margin:10px 0;font-family:Work Sans;font-size:32px;font-style:normal;font-weight:700;line-height:38px}.page-community #community-table table{width:100%;margin-top:31px;border-collapse:collapse}.page-community #community-table tr{padding:10px 10px;border-bottom:1px solid #343437}.page-community #community-table td{overflow:hidden;max-width:34vw;position:relative;vertical-align:middle}.page-community .scrolling-text{display:inline-block}.page-community #community-table img{max-width:52px;height:29px}.page-community .td-img{padding:10px;width:69px}.page-community .td-img .discord-icon{content:url(../img/community/ic_discord.png)}.page-community .td-img .twitter-icon{content:url(../img/community/ic_twitter.png)}.page-community .td-img .youtube-icon{content:url(../img/community/ic_youtube.png)}.page-community .td-img .xrpl-icon{content:url(../img/community/ic_xrpl.png)}.page-community .td-img .github-icon{content:url(../img/community/ic_github.png)}.page-community .td-img .stackoverflow-icon{content:url(../img/community/ic_stackoverflow.png)}.page-community .text-external-link{display:inline-flex;align-items:center;margin-left:10px}.page-community .external-link-contribute{display:inline-block;vertical-align:middle;padding-right:41px;height:16px;background:url(../img/icons/arrow-up-right.svg) no-repeat center center;transition:transform .3s ease}.page-community .text-external-link:hover .external-link-contribute{transform:translate(5px, -5px)}.page-community table td{position:relative;padding-right:25px}.page-community table td .text-external-link{position:absolute;right:5px;top:50%;transform:translateY(-50%)}@media(max-width: 768px){.page-community #community-table img{width:96px;height:29px}.page-community #community-table{width:100%}.page-community .td-img{min-width:60px}}.page-community .funding-text{color:var(#FFFFFF);font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:44px;padding-bottom:4px}.page-community .xrpl-events-section{padding:50px 40px;margin:100px auto;display:flex;justify-content:space-around;align-items:center;max-width:1280px}@media screen and (max-width: 768px){.page-community .xrpl-events-section{flex-direction:column;align-items:start}.page-community .xrpl-events-section .header-div{text-align:center}.page-community .xrpl-events-section .header{display:flex;flex-direction:column;align-items:start}.page-community .xrpl-events-section .header h6{margin-bottom:.5rem;font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:28px}.page-community .xrpl-events-section .header h4{font-family:Work Sans;font-size:28px;font-style:normal;font-weight:700;line-height:34px}.page-community .xrpl-events-section .description{text-align:start;margin-top:2rem;font-family:Work Sans;font-size:24px;font-style:normal;font-weight:500;line-height:28px}.page-community .xrpl-events-section .view-all-events-btn{float:left}.page-community .xrpl-events-section .upcoming-event{text-align:start;margin-top:2rem;padding:1rem 0}.page-community .xrpl-events-section .upcoming-event .days-count{margin-bottom:1rem}}.page-community .xrpl-events-section .header-div{padding-top:27px}.page-community .xrpl-events-section .header h6{padding-left:1.5px;font-family:"Work Sans",sans-serif;font-size:20px;font-weight:700;color:var(--black-black-0, #FFF);text-align:start}.page-community .xrpl-events-section .header h4{text-align:start;font-family:"Work Sans",sans-serif;font-size:32px;font-weight:700;color:var(--black-black-0, #FFF)}.page-community .xrpl-events-section .description{font-family:"Work Sans",sans-serif;font-size:20px;font-weight:500;max-width:444px;color:var(--black-black-10-gray-200, #E0E0E1);line-height:32px}.page-community .xrpl-events-section .view-all-events-btn{display:inline-block;margin-top:1rem}.page-community .xrpl-events-section .upcoming-event{margin-top:2rem}.page-community .xrpl-events-section .upcoming-event .upcoming-label{position:relative;top:7px;font-family:"Work Sans",sans-serif;font-size:12px;font-weight:600;text-transform:uppercase;color:var(--black-black-30, #C1C1C2)}.page-community .xrpl-events-section .upcoming-event .days-count{font-weight:300;margin-bottom:21px;line-height:99px;font-size:88px;background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;display:inline-block}.page-community .xrpl-events-section .upcoming-event .days-word{vertical-align:bottom;font-weight:normal;margin-bottom:21px;line-height:99px;font-size:40px;background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;display:inline-block}.page-community .xrpl-events-section .upcoming-event h5{font-family:"Work Sans",sans-serif;font-size:16px;font-weight:700;color:var(--black-black-10, #F5F5F7)}.page-community .xrpl-events-section .upcoming-event .event-details,.page-community .xrpl-events-section .upcoming-event .event-location{font-family:"Work Sans",sans-serif;font-size:12px;font-weight:600;color:var(--black-black-30, #C1C1C2)}.page-community .community-funding{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:1280px;margin:100px auto;padding-right:54px;padding-left:73px;margin-top:120px}.page-community .funding-section{flex:1;padding:20px;color:var(--black-black-0)}.page-community .small-text{color:var(--black-black-30, #C1C1C2);font-family:Work Sans;font-size:12px;font-style:normal;font-weight:600;line-height:16px;text-transform:uppercase;padding-left:11px;text-align:start}.page-community .funding-section h2{font-size:32px;font-weight:700;line-height:38px;margin-top:10px;margin-bottom:40px}.page-community .funding-section p{color:var(--black-black-20);font-size:24px;font-weight:500;line-height:32px;margin-bottom:40px}.page-community .stats{flex:1;display:flex;justify-content:space-between}@media(max-width: 768px){.page-community .stats{flex-direction:column;align-items:start;text-align:start;padding-left:7px}}.page-community .stacked-stats{display:flex;flex-direction:column;justify-content:space-between}.page-community .stat{align-self:center;text-align:center;margin:0 auto;display:flex;flex-direction:column}@media(max-width: 768px){.page-community .stat{margin:0px;text-align:start;align-self:start}}.page-community .number{opacity:1;font-size:88px;display:flex;padding:10px;align-items:center;line-height:96px;font-weight:300}@media screen and (max-width: 768px){.page-community .community-funding{flex-direction:column-reverse;padding-left:16px;padding-right:16px}.page-community .funding-section,.page-community .stats{width:100%}}.page-community .carousel{position:relative;width:1280px;margin:0 auto;margin-top:106px;max-width:100%}.page-community .carousel .flex-align{display:flex;align-items:center}@media(max-width: 768px){.page-community .carousel{width:100%}}.page-community .center-image-wrapper{position:relative;width:552px;height:314px}@media(max-width: 1118px){.page-community .center-image-wrapper{width:55%;height:auto}}@media(max-width: 768px){.page-community .center-image-wrapper{margin:0 auto;width:86%}}.page-community .image-container{display:flex;justify-content:space-around;align-items:center;overflow:hidden}.page-community .image-container img{max-width:100%;transition:transform .7s ease-in-out,opacity .7s ease-in-out}.page-community #center-image{width:100%}.page-community #left-image,.page-community #right-image{width:252px;height:144px;opacity:.7}@media(max-width: 1118px){.page-community #left-image,.page-community #right-image{width:15%;height:auto}}@media(max-width: 768px){.page-community #left-image,.page-community #right-image{display:none;margin:0}}.page-community #left-image.exit,.page-community #right-image.exit{transform:translateX(-100%);opacity:0}.page-community #left-image.enter,.page-community #right-image.enter{transform:translateX(100%);opacity:0}.page-community #center-image.exit{transform:scale(0.8);opacity:0}.page-community #center-image.enter{transform:scale(1);opacity:1}.page-community .nav-btn{position:absolute;top:50%;transform:translateY(-50%);font-size:24px;background:none;border:none;cursor:pointer}.page-community #prev-btn{left:0}.page-community #next-btn{right:0}.page-community .event-info{position:absolute;bottom:10px;left:32px;display:flex;flex-direction:column;gap:4px}@media(max-width: 768px){.page-community .event-info{left:7px}}.page-community .event-info span{color:#fff;font-family:Work Sans;font-size:12px;font-style:normal;font-weight:600;line-height:16px}.page-community .event-info .name{padding-bottom:5px;color:var(--black-black-10, #F5F5F7);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:700;line-height:24px}.page-community .arrow-wrapper{display:flex;justify-content:center;padding-top:24px}.page-community :root{--black-black-0: #FFF;--black-black-10: #F5F5F7;--black-black-30: #C1C1C2}.page-community .community-spotlight-wrapper{display:flex;padding:20px;max-width:1280px;min-height:582px;margin:100px auto;gap:48px;padding-right:54px;padding-left:73px}.page-community .community-spotlight{flex:1;display:flex;flex-direction:column;padding-right:10px}.page-community .projects-wrapper{flex:1;position:relative;display:flex;justify-content:center;gap:48px}@media(max-width: 768px){.page-community .projects-wrapper{gap:48px}}.page-community .project-card{background-color:transparent;border-radius:4px;height:fit-content;width:252px;max-height:456px}@media(max-width: 768px){.page-community .project-card{width:99%}}.page-community .project-card.bottom-right{align-self:end}.page-community .card-image{border-radius:4px;height:144px;width:252px;background-color:#2c2b2b;display:flex;align-items:center}.page-community .spotlight-title,.page-community .project-title{color:var(--black-black-10, #F5F5F7);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:700;line-height:16px}.page-community .spotlight-subtitle{color:var(--black-black-10, #F5F5F7);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:700;line-height:16px}.page-community .project-description{color:var(--black-black-30, #C1C1C2);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:400;line-height:24px}.page-community .card-details{background-color:transparent;display:flex;flex-direction:column;text-align:start;padding:15px;height:fit-content}.page-community .view-project{color:var(--blue-purple-blue-purple-50, #7919FF);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:400;line-height:16px;cursor:pointer;text-decoration:none}@media(max-width: 1076px){.page-community .project-card.bottom-right{align-self:auto}.page-community .community-spotlight-wrapper{flex-direction:column;align-items:center;margin-left:0px;padding-right:26px;padding-left:26px}.page-community .community-spotlight,.page-community .projects-wrapper{width:100%;margin:0;padding:0}.page-community .projects-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center;position:static}.page-community .card-image{width:100%}.page-community .card-details{gap:16px;margin-top:10px}.page-community .project-card{position:static;margin:20px 0;height:fit-content}}.page-community .w-222{width:222px}.page-community .bottom-cards-section .com-card .card-content{display:flex;flex-direction:column;justify-content:space-between;gap:16px;position:relative;z-index:1;height:100%}.page-community .bottom-cards-section .com-card{border-radius:8px;padding:36px;background:#232325;min-width:352px;height:442px;max-width:352px;position:relative;display:flex;flex-direction:column;justify-content:space-between}.page-community .bottom-cards-section{display:flex;flex-direction:row;justify-content:center;gap:48px;max-width:1280px;margin:0 auto}.page-community .bottom-cards-section .com-card{padding:36px;background:#232325;min-width:352px;height:442px;max-width:352px;position:relative}.page-community .bottom-cards-section .com-card .top-left-img{position:absolute;top:0;height:292px;left:0;content:url(../img/community/card-bg-1.svg)}.page-community .bottom-cards-section .com-card .bottom-right-img{position:absolute;bottom:0;right:0;height:333px;content:url(../img/community/card-bg-2.svg)}.page-community .bottom-cards-section .com-card .top-right-img{height:390px;position:absolute;top:0;right:0;content:url(../img/community/card-bg-3.svg)}.page-community .bottom-cards-section .com-card .card-content{display:flex;flex-direction:column;gap:16px;position:relative;z-index:1}.page-community .bottom-cards-section .com-card .card-content .card-title{margin-bottom:0px !important;color:var(--black-black-0-white, #FFF);white-space:nowrap;font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:26px}.page-community .bottom-cards-section .com-card .card-content .card-subtitle{color:var(--black-black-0, #FFF);font-family:Work Sans;font-size:24px;font-style:normal;font-weight:700;line-height:32px;margin-top:2px}.page-community .bottom-cards-section .com-card .card-content .card-description{color:var(--black-black-20, #E0E0E1);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:400;line-height:24px;margin-top:15px;margin-bottom:15px}.page-community .bottom-cards-section .com-card .card-content .card-links{display:flex;flex-direction:column;gap:8px}.page-community .bottom-cards-section .com-card .card-content .com-card-link{text-decoration:none;cursor:pointer;color:#9a52ff;font-family:Work Sans;font-size:16px;font-style:normal;font-weight:600;line-height:24px}@media(max-width: 767.98px){.page-community .bottom-cards-section .com-card .card-content .com-card-link{display:block;width:100%}}.page-community .bottom-cards-section .com-card .card-content .com-card-link::after{display:inline-block;content:url(../img/icons/arrow-right-purple.svg);position:relative;top:1px;vertical-align:middle;padding-left:8px;-webkit-transition:transform .3s ease-out;-moz-transition:transform .3s ease-out;-ms-transition:transform .3s ease-out;-o-transition:transform .3s ease-out;transition:transform .3s ease-out}.page-community .bottom-cards-section .com-card .card-content .com-card-link:hover{border:none}.page-community .bottom-cards-section .com-card .card-content .com-card-link:hover::after{-webkit-transform:translateX(4px);-moz-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}@media(max-width: 768px){.page-community .bottom-cards-section{flex-direction:column;align-items:center;padding:20px}.page-community .bottom-cards-section .com-card{margin-bottom:20px;display:block;width:100%}.page-community .com-card .top-left-img,.page-community .com-card .bottom-right-img,.page-community .com-card .top-right-img{position:static;display:block;width:100%;margin-bottom:15px}}.page-community .num-separator{width:32px;height:1px;background:var(--black-black-70, #343437);margin-bottom:32px;margin-top:1px}.page-community .stat-separator{width:32px;height:1px;background:var(--black-black-70, #343437);margin-bottom:32px;margin-top:8px}.page-community .ml-8{margin-left:8px}.page-community .ml-19{margin-left:19px}.page-community .ml-14{margin-left:11px}.page-community .header-div .header{gap:10px;display:flex;flex-direction:column;padding-bottom:35px}.page-community .spotlight-subtitle{font-size:32px;font-weight:700;line-height:38px;margin-top:10px;margin-bottom:40px}.page-community .spotlight-description{color:var(--black-black-20);font-size:24px;font-weight:500;line-height:32px;margin-bottom:40px}.sdk-img{align-self:center}.light .sdk-img{content:url(../img/graphics/sdk-white.png)}.light .ref-book-illustration{content:url(../img/graphics/ref-book-light.png)}.light .tutorial-illustration{content:url(../img/graphics/tutorials-illustration-light.png)}.light .concepts-doc-illustration{content:url(../img/graphics/concepts-docs-light.png)}.light .use-cases .wallet-illustration{content:url(../img/graphics/wallet-light.svg)}.light .use-cases .token-illustration{content:url(../img/graphics/tokens-light.png)}.light .use-cases .connections-illustration{content:url(../img/graphics/nodes-light.svg)}.light .quickstart-image{content:url(../img/graphics/getting-started-pages-light.png)}.light .dev-tools-img{content:url(../img/graphics/dev-tools-light.svg)}.light .dev-tools-link:hover p{color:#000}.dark .sdk-img{content:url(../img/graphics/sdk-black.png)}.dark .ref-book-illustration{content:url(../img/graphics/ref-book.png)}.dark .tutorial-illustration{content:url(../img/graphics/tutorials-illustration.png)}.dark .concepts-doc-illustration{content:url(../img/graphics/concepts-doc.png)}.dark .use-cases .wallet-illustration{content:url(../img/graphics/wallet-dark.png)}.dark .use-cases .token-illustration{content:url(../img/graphics/tokens-dark.png)}.dark .use-cases .connections-illustration{content:url(../img/graphics/nodes-dark.png)}.dark .quickstart-image{content:url(../img/graphics/getting-started-pages-dark.svg)}.dark .dev-tools-img{content:url(../img/graphics/dev-tools-dark.png)}.dark .dev-tools-link:hover p{color:#fff}.dark .flat-card-grid .nav-link:hover{color:#e0e0e1}.get-started-img,.flat-card{max-width:100%;max-height:100%}.faded-text{font-family:"Work Sans";font-style:normal;font-weight:400;font-size:15.5667px;line-height:23px}.page-docs-index section{padding-top:64px;padding-bottom:64px}.page-docs-index .dev-tools-link h6::before{margin-top:-20px;height:20px}.page-docs-index .dev-tools-link h6:hover{text-decoration:underline;text-decoration-color:#9a52ff;background:none !important}.page-docs-index .dev-tools-link:hover p{text-decoration:none !important;background:none !important;display:inline-block}.page-docs-index .dev-tools-link a:hover{color:#9a52ff;text-decoration:none !important}.page-docs-index .dev-tools-link .btn-arrow::after{content:url(../img/icons/arrow-right-purple.svg);width:1.5rem;height:1.5rem}.page-docs-index .langs>a{display:block}.page-docs-index .langs h5:hover{text-decoration:underline;text-decoration-color:#9a52ff;background:none !important}.page-docs-index .langs a:hover{text-decoration:none !important}.page-docs-index .langs .btn-arrow::after{content:url(../img/icons/arrow-right-purple.svg);vertical-align:baseline;width:1.5rem;height:1.5rem}.page-docs-index .langs h5{margin-block-start:0 !important}.page-docs-index .langs h5::before{margin-top:0;height:0}.page-docs-index h1{font-size:3.875rem}.page-docs-index .arrow-purple::after{content:url(../img/icons/arrow-right-purple.svg)}.page-docs-index .documentation-index:hover,.page-docs-index .documentation-index::after{color:#9a52ff;text-decoration:none !important;background:none !important}@media(max-width: 765px){.page-docs-index h1{font-size:3rem}.page-docs-index .flat-card-grid{grid-gap:24px}.page-docs-index .flat-card-grid .flat-card{padding:32px 12px}.page-docs-index::before{display:none}}#langs-cards{grid-gap:40px}@media(max-width: 991.98px){.page-docs-index .langs-cards{grid-template-columns:1fr 1fr;grid-auto-rows:auto}}.dev-tools-img{max-width:100%;max-height:100%;margin:auto}.page-docs .h4::before{margin-top:0;height:0}.page-docs .row{margin-right:0;margin-left:0}.page-docs .video-grid{grid-gap:35px}.page-docs .title-space{margin-bottom:16px}.page-docs .circled-logo{margin-left:.1rem}.flat-card-grid{grid-gap:15px;max-width:100%;min-height:384px}.flat-card-grid .flat-card{padding:32px 50px;height:100%;width:100%;box-shadow:none}.flat-card-grid .flat-card-padding{margin-bottom:75px}.flat-card-grid img{width:auto;height:115px;margin-left:auto;margin-right:auto}.flat-card-grid .nav-link{border:none !important}.flat-card-grid .nav-link:hover{text-decoration:underline;text-decoration-color:#9a52ff}.flat-card-grid .nav-link::after{content:none !important}@media(max-width: 991.98px){.flat-card-grid .flat-card-padding{margin-bottom:0}.flat-card-grid .nav-link::after{content:" " !important}.flat-card-grid .flat-card .btn{display:none}}.float-up-on-hover{transition:all .35s ease-out;cursor:pointer}.float-up-on-hover:hover{-webkit-transform:translateY(-16px);-moz-transform:translateY(-16px);-ms-transform:translateY(-16px);-o-transform:translateY(-16px);transform:translateY(-16px)}.float-up-on-hover .video-image:hover{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}@media(min-width: 992px){.align-button-on-bottom .btn-primary{position:absolute;bottom:0}}.center-image{display:flex;justify-content:center}.quickstart-card .quickstart-image{margin-left:-20px;margin-right:-20px;margin-bottom:-20px}@media(min-width: 992px){.quickstart-card{margin-left:-32px;margin-right:-32px;margin-bottom:-32px;width:calc(100% + 64px)}}.explore-links .card-grid{grid-gap:40px}.full-documentation-link{margin-top:-35px}button.MarkpromptFloatingTrigger{bottom:4.5rem;border-radius:4px;right:16px;border:1px solid transparent}@media(min-width: 992px){button.MarkpromptFloatingTrigger{right:32px}}html.light .MarkpromptContentDialog a{color:#7919ff}html.light .MarkpromptContentDialog h3:not(.chip){color:#000}.MarkpromptExtendedFeedbackTextInput{background-color:#fff;color:#000}.MarkpromptOverlay{z-index:20}.osano-cm-close{box-sizing:content-box !important}.osano-cm-switch{box-sizing:content-box !important}.osano-cm-widget{right:16px;width:50px;height:50px;border:1px solid transparent}@media(min-width: 992px){.osano-cm-widget{right:32px}}html.light article p code,html.light article table code,html.light article li>code{background-color:#e0e0e1;color:#111112}html.light body{background-color:#f5f5f7;color:#000}html.light #topnav-theme .custom-theme-toggle .custom-control-label::before{background-color:transparent;background-position:bottom right;transform:rotate(-15deg)}html.light h1:not(.chip),html.light h2:not(.chip),html.light h3:not(.chip),html.light h4:not(.chip),html.light h5:not(.chip),html.light h6:not(.chip),html.light .h1:not(.chip),html.light .h2:not(.chip),html.light .h3:not(.chip),html.light .h4:not(.chip),html.light .h5:not(.chip),html.light .h6:not(.chip){color:#000}html.light h1.green-500,html.light h2.green-500,html.light h3.green-500,html.light h4.green-500,html.light h5.green-500,html.light h6.green-500,html.light .h1.green-500,html.light .h2.green-500,html.light .h3.green-500,html.light .h4.green-500,html.light .h5.green-500,html.light .h6.green-500{color:#28b86a;text-shadow:#fff 0 0 2px,#fff -1px -1px 2px,#fff 1px 1px 2px}html.light .bg-grey-800{background-color:#fcfcfd}html.light .grey-400{color:#454549}html.light .text-muted{color:#232325 !important}html.light .longform{color:#232325}html.light .numbers{color:#000}html.light .stat-highlight,html.light .eyebrow{color:#111112}html.light .invertible-img{filter:invert(100%)}html.light .arrow-link::after{content:url("../img/lightmode/icon-long-arrow.svg")}html.light .search .input-group-text,html.light .input-group .input-group-text,html.light .form-group .input-group-text{background-color:#e0e0e1;color:#232325}html.light .search label .input-group-text,html.light .search .form-control:not(.btn),html.light .input-group label .input-group-text,html.light .input-group .form-control:not(.btn),html.light .form-group label .input-group-text,html.light .form-group .form-control:not(.btn){color:#000;background-color:#e0e0e1;border-color:#e0e0e1}html.light .search .ds-input,html.light .input-group .ds-input,html.light .form-group .ds-input{color:#000;background-color:#e0e0e1;border-color:#e0e0e1}html.light .search .ds-input:focus,html.light .input-group .ds-input:focus,html.light .form-group .ds-input:focus{border-color:#9a52ff}html.light .list-group-item{border-color:#232325;background-color:#f5f5f7}html.light .list-group-item.disabled{color:#a2a2a4}html.light .progress{background-color:#e0e0e1}html.light .xrp-ledger-dev-portal .DocSearch-Modal{background:#fff}html.light .xrp-ledger-dev-portal .DocSearch-Prefill{color:#7919ff}html.light .xrp-ledger-dev-portal .DocSearch-Button{background:var(--docsearch-searchbox-background)}html.light .xrp-ledger-dev-portal .DocSearch-Button:hover{box-shadow:inset 0 0 0 2px #7919ff;border-radius:40px;background:var(--docsearch-searchbox-background)}html.light .xrp-ledger-dev-portal .DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--docsearch-text-color)}html.light .xrp-ledger-dev-portal .DocSearch-Search-Icon{color:var(--docsearch-text-color) !important}html.light .xrp-ledger-dev-portal .DocSearch-Input{color:#111112}html.light .xrp-ledger-dev-portal .DocSearch-Hit-Select-Icon{color:#111112}html.light .xrp-ledger-dev-portal .DocSearch-Form{box-shadow:inset 0 0 0 2px #7919ff;background-color:var(--docsearch-searchbox-focus-background)}html.light .xrp-ledger-dev-portal .DocSearch-Hit-source{color:#7919ff;background:#fff}html.light .xrp-ledger-dev-portal .DocSearch-Hits mark{color:#7919ff}html.light .xrp-ledger-dev-portal .DocSearch-Hit-Container{background:#fff}html.light .xrp-ledger-dev-portal .DocSearch-Hit a{background-color:#fff}html.light .xrp-ledger-dev-portal .DocSearch-Hit-content-wrapper .DocSearch-Hit-title{color:#000 !important}html.light .xrp-ledger-dev-portal .DocSearch-Hit-content-wrapper .DocSearch-Hit-path{color:#454549 !important}html.light .xrp-ledger-dev-portal .DocSearch-Logo svg .cls-1,html.light .xrp-ledger-dev-portal .DocSearch-Logo svg .cls-2{fill:var(--docsearch-logo-color)}html.light .xrp-ledger-dev-portal .DocSearch-Hit-title,html.light .xrp-ledger-dev-portal .DocSearch-Hit-path,html.light .xrp-ledger-dev-portal .DocSearch-Label,html.light .xrp-ledger-dev-portal .DocSearch-Help{color:#454549 !important}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a{background:#f5f5f7}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-Container{background-color:#f5f5f7}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-content-wrapper .DocSearch-Hit-title{color:#000 !important}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-content-wrapper .DocSearch-Hit-path{color:#454549 !important}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-icon svg{color:#000 !important}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-action .DocSearch-Hit-action-button svg{color:#000 !important}html.light .xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a mark{color:#7919ff !important}html.light .xrp-ledger-dev-portal .DocSearch-Footer{background:var(--docsearch-footer-background)}html.light .xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background-color:#fcfcfd}html.light .xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu::before{background-color:#fcfcfd}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion{background-color:#fcfcfd}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header{color:#000;border-bottom-color:#7919ff}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{color:#000}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--title{color:#000}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--text{color:#232325}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#000;background-color:#c1c1c2}html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,html.light .xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{background-color:#c1c1c2}html.light a,html.light nav a,html.light a:not([role=button]){color:#000}html.light a.btn-primary,html.light nav a.btn-primary,html.light a:not([role=button]).btn-primary{color:#fff}html.light a.btn-primary:hover,html.light nav a.btn-primary:hover,html.light a:not([role=button]).btn-primary:hover{color:#fff}html.light a:hover,html.light a:active,html.light a.active,html.light nav a:hover,html.light nav a:active,html.light nav a.active,html.light a:not([role=button]):hover,html.light a:not([role=button]):active,html.light a:not([role=button]).active{color:#7919ff}html.light a:not(.btn):focus,html.light nav a:not(.btn):focus,html.light a:not([role=button]):not(.btn):focus{background-color:transparent}html.light a.card:hover,html.light:active,html.light.active{color:#000}html.light .landing-table tbody td{color:#232325}html.light .btn-outline-secondary,html.light article a.button,html.light .navbar-dark .navbar-nav .nav-link.btn-outline-secondary{color:#111112;border-color:#111112}html.light .btn-outline-secondary:not(:disabled):not(.disabled):hover,html.light .btn-outline-secondary:not(:disabled):not(.disabled):active,html.light article a.button:not(:disabled):not(.disabled):hover,html.light article a.button:not(:disabled):not(.disabled):active,html.light .navbar-dark .navbar-nav .nav-link.btn-outline-secondary:not(:disabled):not(.disabled):hover,html.light .navbar-dark .navbar-nav .nav-link.btn-outline-secondary:not(:disabled):not(.disabled):active{color:#9a52ff;border-color:#9a52ff;background-color:transparent}html.light .breadcrumb{background:#f5f5f7}html.light .breadcrumb-item a{color:#454549}html.light .breadcrumb-item a:hover{color:#9a52ff}html.light .top-nav{background:#f5f5f7}html.light .top-nav #topnav-pages .nav-link{color:#000}html.light .top-nav .navbar-brand .logo{content:url(../img/XRPLedger_DevPortal-black.svg);height:40px}html.light .top-nav #dropdown-hero-for-docs>img{content:url(../img/icons/lightmode/docs.svg)}html.light .top-nav #dropdown-hero-for-community>img{content:url(../img/icons/lightmode/contribute.svg)}html.light .top-nav .dropdown-menu{background-color:#f5f5f7;border-color:#f5f5f7;box-shadow:0px 5px 20px 0px #c1c1c2}html.light .top-nav .dropdown-menu a:hover,html.light .top-nav .dropdown-menu a.active{color:#7919ff}html.light .top-nav .dropdown-menu .dropdown-item.dropdown-hero>img{background-color:#fcfcfd}html.light .top-nav .dropdown-menu .dropdown-item.dropdown-hero p{color:#343437}html.light .top-nav .dropdown-menu .dropdown-item.active{color:#7919ff}html.light .top-nav .dropdown-menu h5{color:#454549}html.light .top-nav .dropdown-menu .col-for-get_started{background-color:#e0e0e1}html.light .top-nav #topnav-button{background-color:#e0e0e1}@media(max-width: 991.98px){html.light .top-nav .navbar-toggler .navbar-toggler-icon::after,html.light .top-nav .navbar-toggler .navbar-toggler-icon::before,html.light .top-nav .navbar-toggler .navbar-toggler-icon div{background-color:#111112}html.light .top-nav .navbar-nav .nav-link,html.light .top-nav .navbar-collapse>.nav-item,html.light .top-nav .navbar-nav #topnav-theme,html.light .top-nav .navbar-nav #topnav-search{background:#e0e0e1}}html.light aside .sidenav_cat_title{color:#000}html.light .page-toc .level-1 a,html.light .command-list .separator{color:#000}html.light aside a:hover,html.light aside .sidenav_cat_title:hover,html.light aside a.active,html.light aside a.active:hover,html.light aside .active>a,html.light aside .active>a:hover{color:#7919ff}html.light .dactyl-tree-nav nav{border-left:1px solid #000}html.light .dactyl-tree-nav nav .nav-link:hover,html.light .dactyl-tree-nav nav .nav-link:active{border-left-color:#7919ff}html.light .dactyl-tree-nav nav .active>.nav-link{border-left-color:#7919ff}html.light .page-toc,html.light .command-list{border-left:1px solid #000}html.light .page-toc .level-3,html.light .command-list .level-3{border-left:1px solid #000}html.light .page-toc li a:hover,html.light .page-toc li a .active,html.light .command-list li a:hover,html.light .command-list li a .active{border-left-color:#7919ff}html.light .footer-brand .logo{filter:invert(100%)}html.light .copyright-license{text-shadow:#fff 0px 0px 2px,#fff 1px 1px 2px,#fff 2px 2px 3px,#fff 2px 2px 4px,#fff 2px 2px 5px,#fff 2px 2px 6px,#fff -1px -1px 2px,#fff -2px -2px 3px,#fff -2px -2px 4px}html.light a.osano-cm-link{color:#fff}html.light article .card,html.light .landing .card,html.light .cta-card,html.light aside .card{color:#000;background-color:#fcfcfd;box-shadow:0px 5px 20px 0px #c1c1c2}html.light #code-samples-deck .card{box-shadow:0px 5px 20px 0px #c1c1c2}html.light #code-samples-deck .card-header{border-bottom:none;background-color:#fcfcfd}html.light #code-samples-deck .card-footer{background-color:#fcfcfd}html.light .page-faq.landing-builtin-bg::before,html.light .mini-faq.landing-builtin-bg::before{opacity:.6}html.light .page-faq .q-wrapper,html.light .mini-faq .q-wrapper{background-color:#fcfcfd;color:#000;box-shadow:0px 5px 20px 0px #c1c1c2}html.light .page-faq .q-wrapper>h4 a.expander:hover,html.light .mini-faq .q-wrapper>h4 a.expander:hover{color:#000}html.light .page-community .com-card{background:#fff}html.light .page-community .project-description{color:#343437}html.light .page-community #platform-stack-overflow{content:url("../img/logos/lightmode/stack-overflow.svg")}html.light .page-community #platform-discord{content:url("../img/logos/lightmode/discord.svg")}html.light .status.not_enabled{color:#aeb200}html.light .pg-category{color:#454549}html.light .landing .nav .nav-link{color:#232325;border-bottom-color:#c1c1c2}html.light .landing .circled-logo{background-color:#e0e0e1}html.light .landing .circled-logo img[src="assets/img/logos/globe.svg"]{filter:invert(100%)}html.light .landing p a,html.light .landing .longform a{color:#7919ff}html.light .devportal-callout.caution,html.light .devportal-callout.注意{border-color:#aeb200}html.light .devportal-callout.caution>strong:first-child::before,html.light .devportal-callout.注意>strong:first-child::before{color:#aeb200}html.light .devportal-callout.tip,html.light .devportal-callout.ヒント{border-color:#2dcf78}html.light .devportal-callout.tip>strong:first-child::before,html.light .devportal-callout.ヒント>strong:first-child::before{color:#2dcf78}html.light code{color:#000}html.light pre code,html.light pre{background-color:#e0e0e1}html.light .multicode a{color:#000}html.light .multicode a.current{color:#fff}html.light .multicode a:hover{text-decoration:none;background-color:#e0e0e1;color:#fff}html.light .multicode a:focus{background-color:#232325}html.light .codehilite .btn-outline-secondary{background-color:#232325;color:#f5f5f7;border-color:#f5f5f7}html.light .interactive-block .breadcrumb-item.done a::after{color:#145c35}html.light .modal-content{background-color:#fcfcfd}html.light .rpc-tool pre .toggle{color:#fff}html.light .rpc-tool pre .toggle:hover{color:#b480ff}html.light .page-home #home-hero-graphic{content:url("../img/lightmode/home-hero.svg")}html.light .page-home #benefits-list #public{content:url("../img/icons/lightmode/public.svg")}html.light .page-home #benefits-list #streamlined{content:url("../img/icons/lightmode/streamlined.svg")}html.light .page-home #benefits-list #performance{content:url("../img/icons/lightmode/performance.svg")}html.light .page-home #benefits-list #low-cost{content:url("../img/icons/lightmode/low-cost.svg")}html.light .page-home #benefits-list #community{content:url("../img/icons/lightmode/community.svg")}html.light .page-home #benefits-list #reliability{content:url("../img/icons/lightmode/reliability.svg")}html.light #validator-graphic{content:url("../img/lightmode/validators.svg")}html.light #wallets #wallet-xumm{content:url("../img/wallets/lightmode/xumm.svg")}html.light #wallets #wallet-bitfrost{content:url("../img/wallets/lightmode/bitfrost.png")}html.light #wallets #wallet-towo{content:url("../img/wallets/lightmode/towo.svg")}html.light #wallets #wallet-keystone{content:url("../img/wallets/lightmode/keystone.svg")}html.light #wallets #wallet-dcent{content:url("../img/wallets/lightmode/dcent.svg")}html.light #wallets #wallet-coin{content:url("../img/wallets/lightmode/coin.svg")}html.light #top-exchanges #exch-bitstamp{content:url("../img/exchanges/lightmode/bitstamp.svg")}html.light #top-exchanges #exch-cex-io{content:url("../img/exchanges/lightmode/cex-io.svg")}html.light #top-exchanges #exch-liquid{content:url("../img/exchanges/lightmode/liquid.svg")}html.light #top-exchanges #exch-bitfinex{content:url("../img/exchanges/lightmode/bitfinex.svg")}html.light #top-exchanges #exch-bittrex{content:url("../img/exchanges/lightmode/bittrex.png")}html.light #top-exchanges #exch-currency-com{content:url("../img/exchanges/lightmode/currency-com.png")}html.light #top-exchanges #exch-ftx{content:url("../img/exchanges/lightmode/ftx.png")}html.light #top-exchanges #exch-lmax{content:url("../img/exchanges/lightmode/lmax.png")}html.light .timeline-dot{background-color:#f5f5f7}html.light .page-uses .card-body{background:#fff;color:#343437}html.light .page-uses .modal-footer,html.light .page-uses .modal-header{background-color:#fcfcfd}html.light .page-uses #infrastructure{content:url("../img/icons/usecases/lightmode/ic_infrastructure.png")}html.light .page-uses #developer_tooling{content:url("../img/icons/usecases/lightmode/ic_developer_tooling.png")}html.light .page-uses #interoperability{content:url("../img/icons/usecases/lightmode/ic_interoperability.png")}html.light .page-uses #wallet{content:url("../img/icons/usecases/lightmode/ic_wallet.png")}html.light .page-uses #nfts{content:url("../img/icons/usecases/lightmode/ic_nfts.png")}html.light .page-uses #exchanges{content:url("../img/icons/usecases/lightmode/ic_exchanges.png")}html.light .page-uses #gaming{content:url("../img/icons/usecases/lightmode/ic_gaming.png")}html.light .page-uses #security{content:url("../img/icons/usecases/lightmode/ic_security.png")}html.light .page-uses #payments{content:url("../img/icons/usecases/lightmode/ic_payments.png")}html.light .page-uses #web_monetization{content:url("../img/icons/usecases/lightmode/ic_web_monetization.png")}html.light .page-uses #sustainability{content:url("../img/icons/usecases/lightmode/ic_sustainability.png")}html.light .page-uses #cbdc{content:url("../img/icons/usecases/lightmode/ic_cbdc.png")}html.light .page-uses #custody{content:url("../img/icons/usecases/lightmode/ic_custody.png")}html.light .page-uses #other{content:url("../img/icons/usecases/lightmode/ic_other.png")}html.light .page-uses #carbon_markets{content:url("../img/icons/usecases/lightmode/ic_carbon_markets.png")}html.light .page-uses #defi{content:url("../img/icons/usecases/lightmode/ic_defi.png")}html.light .page-uses .category-header{color:#343437}html.light .page-uses .category_count{background:#d2b2ff;color:#350080}html.light .page-uses .section-text-title{color:#000}html.light .page-uses #use_case_companies_list #bitgo .biz-logo{max-height:40px;content:url("../img/uses/lightmode/bitgo.svg")}html.light .page-uses #use_case_companies_list #sologenic-nft .biz-logo{max-height:40px;content:url("../img/uses/lightmode/sologenic-nft.svg")}html.light .page-uses #use_case_companies_list #carbonland-trust .biz-logo{max-height:40px;content:url("../img/uses/lightmode/carbonland-trust.svg")}html.light .page-uses #use_case_companies_list #x-tokenize .biz-logo{max-height:40px;content:url("../img/uses/lightmode/x-tokenize.svg")}html.light .page-uses #use_case_companies_list #casino-coin .biz-logo{max-height:40px;content:url("../img/uses/lightmode/casino-coin.svg")}html.light .page-uses #use_case_companies_list #xrp-cafe .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrp-cafe.svg")}html.light .page-uses #use_case_companies_list #coil .biz-logo{max-height:40px;content:url("../img/uses/lightmode/coil.svg")}html.light .page-uses #use_case_companies_list #xrp-toolkit .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrp-toolkit.svg")}html.light .page-uses #use_case_companies_list #cryptum .biz-logo{max-height:40px;content:url("../img/uses/lightmode/cryptum.svg")}html.light .page-uses #use_case_companies_list #xrpl-org-ledger-explorer .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrpl-org-ledger-explorer.svg")}html.light .page-uses #use_case_companies_list #evernode .biz-logo{max-height:40px;content:url("../img/uses/lightmode/evernode.svg")}html.light .page-uses #use_case_companies_list #xrpl-rosetta .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrpl-rosetta.svg")}html.light .page-uses #use_case_companies_list #ripples-cbdc-platform .biz-logo{max-height:40px;content:url("../img/uses/lightmode/ripples-cbdc-platform.svg")}html.light .page-uses #use_case_companies_list #xrpscan .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrpscan.svg")}html.light .page-uses #use_case_companies_list #ripples-on-demand-liquidity .biz-logo{max-height:40px;content:url("../img/uses/lightmode/ripples-on-demand-liquidity.svg")}html.light .page-uses #use_case_companies_list #xumm-wallet .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xumm-wallet.svg")}html.light .page-uses #use_case_companies_list #sologenic-dex .biz-logo{max-height:40px;content:url("../img/uses/lightmode/sologenic-dex.svg")}html.light .page-uses #use_case_companies_list #Crossmark .biz-logo{max-height:40px;content:url("../img/uses/lightmode/Crossmark.png")}html.light .page-uses #use_case_companies_list #threezy .biz-logo{max-height:40px;content:url("../img/uses/lightmode/threezy.png")}html.light .page-uses #bitpay .biz-logo,html.light .page-uses #forte .biz-logo,html.light .page-uses #xrplorer .biz-logo,html.light .page-uses #gatehub .biz-logo{filter:invert(100%)}html.light .landing-bg{opacity:.4}@media(min-width: 768px){html.light .landing-bg{opacity:1}}html.light .landing-builtin-bg::before{opacity:.4}@media(min-width: 768px){html.light .landing-builtin-bg::before{opacity:1}}html.light #feedback-content .widget-form-wrapper{background-color:#fff !important}html.light #feedback-content .widget-form-wrapper div{background-color:#fff !important}html.light #feedback-content .widget-form-wrapper textarea{background-color:#f5f5f7 !important}html.light #feedback-content .widget-form-wrapper .widget-header-title{color:#111112 !important}html.light #feedback-content .widget-form-wrapper .cancel{color:#7919ff !important}html.light #feedback-content .widget-helpful .widget-header{background-color:#fff !important}html.light #feedback-content .widget-helpful .widget-header-title{color:#111112 !important}html.light #feedback-content .widget-helpful .widget-header-icon{filter:invert(100%)}html.light .page-docs-index #software-and-sdks .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/lightmode/4col-green.svg)}html.light .page-docs-index #software-and-sdks .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue.svg)}html.light .page-docs-index #software-and-sdks .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/lightmode/4col-yellow.svg)}html.light .page-docs-index #doc-types .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue-2.svg)}html.light .page-docs-index .funding-text,html.light .page-community .funding-text{color:#232325}html.light .page-docs-index .stat .small-text,html.light .page-community .stat .small-text{color:#232325}html.light .page-docs-index .project-card,html.light .page-community .project-card{background-color:transparent}html.light .page-docs-index .card-details,html.light .page-community .card-details{background-color:transparent}html.light .page-docs-index .card-image,html.light .page-community .card-image{background:#e0e0e1}html.light .page-docs-index #community-table tr,html.light .page-community #community-table tr{border-bottom:1px solid #34343740}html.light .page-docs-index .card-description,html.light .page-community .card-description{color:#343437 !important}html.light .page-docs-index .card-subtitle,html.light .page-community .card-subtitle{color:#111112 !important}html.light .page-docs-index .card-title,html.light .page-community .card-title{color:#111112 !important}html.light .page-docs-index .main-title,html.light .page-community .main-title{color:#111112}html.light .page-docs-index .event-location,html.light .page-community .event-location{color:#232325 !important}html.light .page-docs-index .event-details,html.light .page-community .event-details{color:#232325 !important}html.light .page-docs-index .upcoming-event .event-name,html.light .page-community .upcoming-event .event-name{color:#111112}html.light .page-docs-index .upcoming-label,html.light .page-community .upcoming-label{color:#232325 !important}html.light .page-docs-index .description,html.light .page-community .description{color:#232325}html.light .page-docs-index .events-text,html.light .page-community .events-text{color:#111112}html.light .page-docs-index .discord-icon,html.light .page-community .discord-icon{content:url(../img/community/ic_discord_light.png)}html.light .page-docs-index .twitter-icon,html.light .page-community .twitter-icon{content:url(../img/community/ic_twitter_light.png)}html.light .page-docs-index .youtube-icon,html.light .page-community .youtube-icon{content:url(../img/community/ic_youtube_light.png)}html.light .page-docs-index .xrpl-icon,html.light .page-community .xrpl-icon{content:url(../img/community/ic_xrpl_light.png)}html.light .page-docs-index .github-icon,html.light .page-community .github-icon{content:url(../img/community/ic_github_light.png)}html.light .page-docs-index .stackoverflow-icon,html.light .page-community .stackoverflow-icon{content:url(../img/community/ic_stackoverflow_light.png)}html.light .page-docs-index #run-a-network-node .card-deck .card:nth-child(4) .card-footer,html.light .page-community #run-a-network-node .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/lightmode/4col-light-green.svg)}html.light .page-docs-index #run-a-network-node .text-cards a,html.light .page-community #run-a-network-node .text-cards a{color:#000}html.light .page-docs-index #xrpl-blog .blog-graphic,html.light .page-community #xrpl-blog .blog-graphic{content:url(../img/community/lightmode/community-blog@2x.png)}html.light .page-docs-index #xrpl-events .text-light,html.light .page-community #xrpl-events .text-light{color:#000 !important}html.light .page-docs-index #xrplGrantsDark g,html.light .page-docs-index #xrplGrantsDark-small g,html.light .page-docs-index #careersDark g,html.light .page-docs-index #careersDark-small g,html.light .page-community #xrplGrantsDark g,html.light .page-community #xrplGrantsDark-small g,html.light .page-community #careersDark g,html.light .page-community #careersDark-small g{filter:invert(100%) brightness(0.8)}html.light #find-us-on-platforms .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue-3.svg)}html.light .page-references #refs-types .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/lightmode/3col-green-2.svg)}html.light .page-references #xrpl-protocol .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue-4.svg)}html.light ::-webkit-input-placeholder{color:#454549}html.light :-ms-input-placeholder{color:#454549}html.light ::-moz-placeholder{color:#454549;opacity:1}html.light :-moz-placeholder{color:#454549;opacity:1}html.light .page-events label{color:#111112}html.light .page-events .event-card{color:#000;background-color:#fcfcfd;box-shadow:0px 5px 20px 0px #c1c1c2}html.light .page-events a.event-card:hover{color:#000}html.light .page-events .event-hero{color:#111112}html.light .page-events .event-save-date{color:#111112}html.light .page-events .event-small-gray{color:#454549}html.light .page-events #event-hero-image{height:100%;min-height:209px;background:url(../img/events/event-hero1-light@2x.png);background-size:contain;background-repeat:no-repeat;background-position:center}html.light .page-events .icon-date::before{background:url(../img/events/event-date-light.svg)}html.light .page-events .icon-location::before{background:url(../img/events/event-location-light.svg)}html.light .page-events .events-filter[type=checkbox]::before{background-color:#f5f5f7}html.light .page-events .events-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/events/event-check.svg);background-repeat:no-repeat;background-position:center;background-color:#5f00e5;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}html.light .page-events .events-filter[type=checkbox]:not(:disabled):hover::before{background-color:#f5f5f7}html.light .page-events .events-filter[type=checkbox]:not(:disabled):hover::after{background-color:#f5f5f7}html.light .page-ambassadors #benefits-list #benefits-01{content:url("../img/ambassadors/lightmode/benefits-01.svg")}html.light .page-ambassadors #benefits-list #benefits-02{content:url("../img/ambassadors/lightmode/benefits-02.svg")}html.light .page-ambassadors #benefits-list #benefits-03{content:url("../img/ambassadors/lightmode/benefits-03.svg")}html.light .page-ambassadors #benefits-list #benefits-04{content:url("../img/ambassadors/lightmode/benefits-04.svg")}html.light .page-ambassadors #benefits-list #benefits-05{content:url("../img/ambassadors/lightmode/benefits-05.svg")}html.light .page-ambassadors #benefits-list #benefits-06{content:url("../img/ambassadors/lightmode/benefits-06.svg")}html.light .page-ambassadors #eligibility-list #eligibility-01{content:url("../img/ambassadors/lightmode/eligibility-01.svg")}html.light .page-ambassadors #eligibility-list #eligibility-02{content:url("../img/ambassadors/lightmode/eligibility-02.svg")}html.light .page-ambassadors #eligibility-list #eligibility-03{content:url("../img/ambassadors/lightmode/eligibility-03.svg")}html.light .page-ambassadors #eligibility-list #eligibility-04{content:url("../img/ambassadors/lightmode/eligibility-04.svg")}html.light .page-ambassadors #eligibility-list #eligibility-05{content:url("../img/ambassadors/lightmode/eligibility-05.svg")}html.light .page-funding .funding-list #funding-01{content:url("../img/funding/lightmode/funding-01.svg")}html.light .page-funding .funding-list #funding-02{content:url("../img/funding/lightmode/funding-02.svg")}html.light .page-funding .funding-list #funding-03{content:url("../img/funding/lightmode/funding-03.svg")}html.light .page-funding .funding-list #funding-04{content:url("../img/funding/lightmode/funding-04.svg")}html.light .page-funding #xrplGrantsDark{filter:invert(100%) brightness(0.8)}html.light .page-impact .connect-list #connect-01{content:url("../img/impact/lightmode/connect-01.svg")}html.light .page-impact .connect-list #connect-02{content:url("../img/impact/lightmode/connect-02.svg")}html.light .page-impact .connect-list #connect-03{content:url("../img/impact/lightmode/connect-03.svg")}html.light .page-impact .connect-list #connect-04{content:url("../img/impact/lightmode/connect-04.svg")}html.light .page-impact #map-light{display:block}html.light .page-impact #map-dark{display:none}html.light main article .card-grid{color:#000}html.light main article .card-grid code{background-color:#d6fae7}html.light main article .card-grid .card-icon-container,html.light main article .card-grid.card-grid-3xN .card-icon-container{background:#c1c1c2}html.light [data-component-name="Footer/Footer"] [data-component-name="Footer/FooterColumn"]{text-shadow:#f5f5f7 0px 0px 2px,#f5f5f7 1px 1px 2px,#f5f5f7 2px 2px 3px,#f5f5f7 2px 2px 4px,#f5f5f7 2px 2px 5px,#f5f5f7 2px 2px 6px,#f5f5f7 -1px -1px 2px,#f5f5f7 -2px -2px 3px,#f5f5f7 -2px -2px 4px}html.light .dev-blog .text-bg{background-color:#fff}html.light .dev-blog #card-date{color:#454549}html.light .dev-blog .category-header{color:#111112}html.light .dev-blog label{color:#343437}html.light .dev-blog .blog-filter[type=checkbox]::before{background:#f5f5f7}html.light .dev-blog .blog-filter[type=checkbox]:checked::before{background:#f5f5f7}html.light .dev-blog .blog-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/blog/blog-check-light-mode.svg)}html.light .dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::before{background:#f5f5f7}html.light .dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::after{background:#f5f5f7}html.light .dev-blog .post-date{text-decoration:overline solid #145c35 10%}html.light .dev-blog #general-badge{background-color:#fff;color:#343437}html.light .dev-blog #release_notes-badge{background-color:#32e685;color:#145c35}html.light .dev-blog #advisories-badge{background-color:#ff6719;color:#4c1a00}html.light .dev-blog #amendments-badge{background-color:#faff19;color:#4b4c00}html.light .dev-blog #development-badge{background-color:#7919ff;color:#20004c}html.light .dev-blog #developer_reflections-badge{background-color:#19a3ff;color:#002e4c}html.light .dev-blog #gateway_bulletins-badge{background-color:#d919ff;color:#40004c}html.light .dev-blog #features-badge{background-color:#32e685;color:#145c35}html.light .dev-blog #security-badge{background-color:#ff198b;color:#4c0026}html.light .dev-blog .dropdown-btn{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}html.light .dev-blog .dropdown-btn img{content:url("../img/icons/lightmode/chevron-arrow-down.svg")}html.light .dev-blog .dropdown-content{background-color:#e0e0e1} + */:root{--blue: #19A3FF;--indigo: #6610f2;--purple: #9A52FF;--pink: #FF198B;--red: #dc3545;--orange: #FF6719;--yellow: #FAFF19;--green: #32E685;--teal: #20c997;--cyan: #17a2b8;--white: #FFFFFF;--gray: #454549;--gray-dark: #232325;--primary: #9A52FF;--secondary: #E0E0E1;--success: #32E685;--info: #19A3FF;--warning: #FAFF19;--danger: #FF198B;--light: #FFFFFF;--dark: #111112;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;--font-family-monospace: "Space Mono", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Work Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#e0e0e1;text-align:left;background-color:#111112}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#fff;text-decoration:none;background-color:transparent}a:hover{color:#9a52ff;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:"Space Mono",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#e0e0e1;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:500;line-height:1.2;color:#fff}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:0.875em;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:0.875em;color:#454549}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#111112;border:1px solid #c1c1c2;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#454549}code{font-size:87.5%;color:#e0e0e1;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#111112;border-radius:4px;box-shadow:inset 0 -0.1rem 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;font-size:87.5%;color:#111112}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#e0e0e1}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #c1c1c2}.table thead th{vertical-align:bottom;border-bottom:2px solid #c1c1c2}.table tbody+tbody{border-top:2px solid #c1c1c2}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #c1c1c2}.table-bordered th,.table-bordered td{border:1px solid #c1c1c2}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#e0e0e1;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#e3cfff}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#caa5ff}.table-hover .table-primary:hover{background-color:#d4b6ff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#d4b6ff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#f6f6f7}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#efefef}.table-hover .table-secondary:hover{background-color:#e9e9eb}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#e9e9eb}.table-success,.table-success>th,.table-success>td{background-color:#c6f8dd}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#94f2c0}.table-hover .table-success:hover{background-color:#aff5cf}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aff5cf}.table-info,.table-info>th,.table-info>td{background-color:#bfe5ff}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#87cfff}.table-hover .table-info:hover{background-color:#a6dbff}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a6dbff}.table-warning,.table-warning>th,.table-warning>td{background-color:#feffbf}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#fcff87}.table-hover .table-warning:hover{background-color:#feffa6}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#feffa6}.table-danger,.table-danger>th,.table-danger>td{background-color:#ffbfdf}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ff87c3}.table-hover .table-danger:hover{background-color:#ffa6d2}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ffa6d2}.table-light,.table-light>th,.table-light>td{background-color:#fff}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fff}.table-hover .table-light:hover{background-color:#f2f2f2}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#f2f2f2}.table-dark,.table-dark>th,.table-dark>td{background-color:#bcbcbd}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#838384}.table-hover .table-dark:hover{background-color:#afafb0}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#afafb0}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#232325;border-color:#363639}.table .thead-light th{color:#343437;background-color:#e0e0e1;border-color:#c1c1c2}.table-dark{color:#fff;background-color:#232325}.table-dark th,.table-dark td,.table-dark thead th{border-color:#363639}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.25em + 2rem + 2px);padding:1rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.25;color:#fff;background-color:#232325;background-clip:padding-box;border:1px solid transparent;border-radius:4px;box-shadow:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#fff;background-color:#232325;border-color:#e4d2ff;outline:0;box-shadow:0 0 0 .2rem rgba(154,82,255,.25)}.form-control::placeholder{color:#a2a2a4;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#454549;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}select.form-control:focus::-ms-value{color:#fff;background-color:#232325}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(1rem + 1px);padding-bottom:calc(1rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.25}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:1rem 0;margin-bottom:0;font-size:1rem;line-height:1.25;color:#e0e0e1;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:4px}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:8px}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:#e0e0e1}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#32e685}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#111112;background-color:rgba(50,230,133,.9);border-radius:4px}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#32e685;padding-right:calc(1.25em + 2rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2332E685' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3125em + 0.5rem) center;background-size:calc(0.625em + 1rem) calc(0.625em + 1rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#32e685;box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:6rem !important;background-position:right 3rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.25em + 2rem);background-position:top calc(0.3125em + 0.5rem) right calc(0.3125em + 0.5rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#32e685;padding-right:calc(0.75em + 4rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23232325' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 1.5rem center/8px 10px no-repeat,#232325 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2332E685' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 2.5rem/calc(0.625em + 1rem) calc(0.625em + 1rem) no-repeat}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#32e685;box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#32e685}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#32e685}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#32e685}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#5feca0;background-color:#5feca0}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#32e685}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#32e685}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#32e685;box-shadow:0 0 0 .2rem rgba(50,230,133,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff198b}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(255,25,139,.9);border-radius:4px}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff198b;padding-right:calc(1.25em + 2rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23FF198B' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23FF198B' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3125em + 0.5rem) center;background-size:calc(0.625em + 1rem) calc(0.625em + 1rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff198b;box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:6rem !important;background-position:right 3rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.25em + 2rem);background-position:top calc(0.3125em + 0.5rem) right calc(0.3125em + 0.5rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#ff198b;padding-right:calc(0.75em + 4rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23232325' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 1.5rem center/8px 10px no-repeat,#232325 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23FF198B' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23FF198B' stroke='none'/%3e%3c/svg%3e") center right 2.5rem/calc(0.625em + 1rem) calc(0.625em + 1rem) no-repeat}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#ff198b;box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff198b}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#ff198b}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#ff198b}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#ff4ca5;background-color:#ff4ca5}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#ff198b}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#ff198b}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#ff198b;box-shadow:0 0 0 .2rem rgba(255,25,139,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#e0e0e1;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:1rem 1.5rem;font-size:0.875rem;line-height:1.25;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#e0e0e1;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{box-shadow:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#9a52ff;border-color:#9a52ff;box-shadow:none}.btn-primary:hover{color:#fff;background-color:#842cff;border-color:#7c1fff}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#842cff;border-color:#7c1fff;box-shadow:0 0 0 .2rem rgba(169,108,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#9a52ff;border-color:#9a52ff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#7c1fff;border-color:#7512ff}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(169,108,255,.5)}.btn-secondary{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1;box-shadow:none}.btn-secondary:hover{color:#111112;background-color:#cdcdce;border-color:#c6c6c8}.btn-secondary:focus,.btn-secondary.focus{color:#111112;background-color:#cdcdce;border-color:#c6c6c8;box-shadow:0 0 0 .2rem rgba(193,193,194,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#111112;background-color:#c6c6c8;border-color:#c0c0c2}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(193,193,194,.5)}.btn-success{color:#111112;background-color:#32e685;border-color:#32e685;box-shadow:none}.btn-success:hover{color:#fff;background-color:#1ad772;border-color:#19cc6c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#1ad772;border-color:#19cc6c;box-shadow:0 0 0 .2rem rgba(45,198,116,.5)}.btn-success.disabled,.btn-success:disabled{color:#111112;background-color:#32e685;border-color:#32e685}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#19cc6c;border-color:#18c166}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(45,198,116,.5)}.btn-info{color:#fff;background-color:#19a3ff;border-color:#19a3ff;box-shadow:none}.btn-info:hover{color:#fff;background-color:#0091f2;border-color:#0089e5}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#0091f2;border-color:#0089e5;box-shadow:0 0 0 .2rem rgba(60,177,255,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#19a3ff;border-color:#19a3ff}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#0089e5;border-color:#0082d8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(60,177,255,.5)}.btn-warning{color:#111112;background-color:#faff19;border-color:#faff19;box-shadow:none}.btn-warning:hover{color:#111112;background-color:#ecf200;border-color:#e0e500}.btn-warning:focus,.btn-warning.focus{color:#111112;background-color:#ecf200;border-color:#e0e500;box-shadow:0 0 0 .2rem rgba(215,219,24,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#111112;background-color:#faff19;border-color:#faff19}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#111112;background-color:#e0e500;border-color:#d4d800}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(215,219,24,.5)}.btn-danger{color:#fff;background-color:#ff198b;border-color:#ff198b;box-shadow:none}.btn-danger:hover{color:#fff;background-color:#f20078;border-color:#e50072}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#f20078;border-color:#e50072;box-shadow:0 0 0 .2rem rgba(255,60,156,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ff198b;border-color:#ff198b}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#e50072;border-color:#d8006b}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,60,156,.5)}.btn-light{color:#111112;background-color:#fff;border-color:#fff;box-shadow:none}.btn-light:hover{color:#111112;background-color:#ececec;border-color:#e6e6e6}.btn-light:focus,.btn-light.focus{color:#111112;background-color:#ececec;border-color:#e6e6e6;box-shadow:0 0 0 .2rem rgba(219,219,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#111112;background-color:#fff;border-color:#fff}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#111112;background-color:#e6e6e6;border-color:#dfdfdf}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(219,219,219,.5)}.btn-dark{color:#fff;background-color:#111112;border-color:#111112;box-shadow:none}.btn-dark:hover{color:#fff;background-color:#000;border-color:#000}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#000;border-color:#000;box-shadow:0 0 0 .2rem rgba(53,53,54,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#111112;border-color:#111112}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#000;border-color:#000}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(53,53,54,.5)}.btn-outline-primary{color:#9a52ff;border-color:#9a52ff}.btn-outline-primary:hover{color:#fff;background-color:#9a52ff;border-color:#9a52ff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(154,82,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#9a52ff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#9a52ff;border-color:#9a52ff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(154,82,255,.5)}.btn-outline-secondary{color:#e0e0e1;border-color:#e0e0e1}.btn-outline-secondary:hover{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(224,224,225,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#e0e0e1;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(224,224,225,.5)}.btn-outline-success{color:#32e685;border-color:#32e685}.btn-outline-success:hover{color:#111112;background-color:#32e685;border-color:#32e685}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(50,230,133,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#32e685;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#111112;background-color:#32e685;border-color:#32e685}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(50,230,133,.5)}.btn-outline-info{color:#19a3ff;border-color:#19a3ff}.btn-outline-info:hover{color:#fff;background-color:#19a3ff;border-color:#19a3ff}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(25,163,255,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#19a3ff;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#19a3ff;border-color:#19a3ff}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(25,163,255,.5)}.btn-outline-warning{color:#faff19;border-color:#faff19}.btn-outline-warning:hover{color:#111112;background-color:#faff19;border-color:#faff19}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(250,255,25,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#faff19;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#111112;background-color:#faff19;border-color:#faff19}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(250,255,25,.5)}.btn-outline-danger{color:#ff198b;border-color:#ff198b}.btn-outline-danger:hover{color:#fff;background-color:#ff198b;border-color:#ff198b}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(255,25,139,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ff198b;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#ff198b;border-color:#ff198b}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,25,139,.5)}.btn-outline-light{color:#fff;border-color:#fff}.btn-outline-light:hover{color:#111112;background-color:#fff;border-color:#fff}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#fff;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#111112;background-color:#fff;border-color:#fff}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.btn-outline-dark{color:#111112;border-color:#111112}.btn-outline-dark:hover{color:#fff;background-color:#111112;border-color:#111112}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(17,17,18,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#111112;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#111112;border-color:#111112}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(17,17,18,.5)}.btn-link{font-weight:400;color:#fff;text-decoration:none}.btn-link:hover{color:#9a52ff;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline}.btn-link:disabled,.btn-link.disabled{color:#454549;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:8px}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:4px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.width{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:.4em solid;border-right:.4em solid transparent;border-bottom:0;border-left:.4em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#e0e0e1;text-align:left;list-style:none;background-color:#111112;background-clip:padding-box;border:1px solid #111112;border-radius:4px;box-shadow:0px 5px 40px #000}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:0;border-right:.4em solid transparent;border-bottom:.4em solid;border-left:.4em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:.4em solid transparent;border-right:0;border-bottom:.4em solid transparent;border-left:.4em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.34em;vertical-align:.34em;content:"";border-top:.4em solid transparent;border-right:.4em solid;border-bottom:.4em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #000}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#fff;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#9a52ff;text-decoration:none;background-color:#111112}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:transparent}.dropdown-item.disabled,.dropdown-item:disabled{color:#838386;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#454549;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:none}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.form-control:not(:last-child),.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:1rem 1.5rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#fff;text-align:center;white-space:nowrap;background-color:#454549;border:1px solid transparent;border-radius:4px}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:8px}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:4px}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:2.5rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;print-color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#9a52ff;background-color:#9a52ff}.custom-control-input:focus~.custom-control-label::before{box-shadow:none,0 0 0 .2rem rgba(154,82,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#e4d2ff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#fff;border-color:#fff}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#454549}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#454549}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#232325;border:1px solid #838386;box-shadow:none}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:4px}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23FFFFFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#9a52ff;background-color:#9a52ff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23FFFFFF' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23FFFFFF'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(0.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#838386;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#232325;transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(154,82,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.25em + 2rem + 2px);padding:1rem 2.5rem 1rem 1.5rem;font-size:1rem;font-weight:400;line-height:1.25;color:#fff;vertical-align:middle;background:#232325 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23232325' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 1.5rem center/8px 10px no-repeat;border:1px solid transparent;border-radius:4px;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);appearance:none}.custom-select:focus{border-color:#e4d2ff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .2rem rgba(154,82,255,.25)}.custom-select:focus::-ms-value{color:#fff;background-color:#232325}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:1.5rem;background-image:none}.custom-select:disabled{color:#454549;background-color:#e0e0e1}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.25em + 2rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.25em + 2rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#e4d2ff;box-shadow:0 0 0 .2rem rgba(154,82,255,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#454549}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.25em + 2rem + 2px);padding:1rem 1.5rem;overflow:hidden;font-weight:400;line-height:1.25;color:#fff;background-color:#232325;border:1px solid transparent;border-radius:4px;box-shadow:none}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.25em + 2rem);padding:1rem 1.5rem;line-height:1.25;color:#fff;content:"Browse";background-color:#454549;border-left:inherit;border-radius:0 4px 4px 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#9a52ff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#fff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#c1c1c2;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#9a52ff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#fff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#c1c1c2;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#9a52ff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#fff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-fill-lower{background-color:#c1c1c2;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#c1c1c2;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#838386}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#838386}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#838386}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:1rem 2rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#454549;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #c1c1c2}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:4px;border-top-right-radius:4px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:#e0e0e1 #e0e0e1 #c1c1c2}.nav-tabs .nav-link.disabled{color:#454549;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#343437;background-color:#111112;border-color:#c1c1c2 #c1c1c2 #111112}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:4px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#9a52ff}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:0 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:1.25rem;padding-bottom:1.25rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:1rem;padding-bottom:1rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:2rem;padding-left:2rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:#454549}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:#454549;border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23454549' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#454549}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#fff}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#9a52ff}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#fff;border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23FFFFFF' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#fff}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#232325;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:8px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:7px;border-top-right-radius:7px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:2rem}.card-title{margin-bottom:2rem}.card-subtitle{margin-top:-1rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:2rem}.card-header{padding:2rem 2rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:7px 7px 0 0}.card-footer{padding:2rem 2rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 7px 7px}.card-header-tabs{margin-right:-1rem;margin-bottom:-2rem;margin-left:-1rem;border-bottom:0}.card-header-pills{margin-right:-1rem;margin-left:-1rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:7px}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:7px;border-top-right-radius:7px}.card-img,.card-img-bottom{border-bottom-right-radius:7px;border-bottom-left-radius:7px}.card-deck .card{margin-bottom:1.25rem}@media(min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-1.25rem;margin-left:-1.25rem}.card-deck .card{flex:1 0 0%;margin-right:1.25rem;margin-bottom:0;margin-left:1.25rem}}.card-group>.card{margin-bottom:15px}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:2rem}@media(min-width: 576px){.card-columns{column-count:3;column-gap:2rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#111112;border-radius:4px}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#454549;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#a2a2a4}.pagination{display:flex;padding-left:0;list-style:none;border-radius:4px}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#fff;background-color:#fff;border:1px solid #c1c1c2}.page-link:hover{z-index:2;color:#9a52ff;text-decoration:none;background-color:#e0e0e1;border-color:#c1c1c2}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(154,82,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.page-item:last-child .page-link{border-top-right-radius:4px;border-bottom-right-radius:4px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#9a52ff;border-color:#9a52ff}.page-item.disabled .page-link{color:#454549;pointer-events:none;cursor:auto;background-color:#fff;border-color:#c1c1c2}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:8px;border-bottom-left-radius:8px}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:8px;border-bottom-right-radius:8px}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:4px;border-bottom-right-radius:4px}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#9a52ff}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#7c1fff}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(154,82,255,.5)}.badge-secondary{color:#111112;background-color:#e0e0e1}a.badge-secondary:hover,a.badge-secondary:focus{color:#111112;background-color:#c6c6c8}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(224,224,225,.5)}.badge-success{color:#111112;background-color:#32e685}a.badge-success:hover,a.badge-success:focus{color:#111112;background-color:#19cc6c}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(50,230,133,.5)}.badge-info{color:#fff;background-color:#19a3ff}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#0089e5}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(25,163,255,.5)}.badge-warning{color:#111112;background-color:#faff19}a.badge-warning:hover,a.badge-warning:focus{color:#111112;background-color:#e0e500}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(250,255,25,.5)}.badge-danger{color:#fff;background-color:#ff198b}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#e50072}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,25,139,.5)}.badge-light{color:#111112;background-color:#fff}a.badge-light:hover,a.badge-light:focus{color:#111112;background-color:#e6e6e6}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,255,255,.5)}.badge-dark{color:#fff;background-color:#111112}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#000}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(17,17,18,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e0e0e1;border-radius:8px}@media(min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:4px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#502b85;background-color:#ebdcff;border-color:#e3cfff}.alert-primary hr{border-top-color:#d4b6ff}.alert-primary .alert-link{color:#391f5e}.alert-secondary{color:#747475;background-color:#f9f9f9;border-color:#f6f6f7}.alert-secondary hr{border-top-color:#e9e9eb}.alert-secondary .alert-link{color:#5b5b5b}.alert-success{color:#1a7845;background-color:#d6fae7;border-color:#c6f8dd}.alert-success hr{border-top-color:#aff5cf}.alert-success .alert-link{color:#114e2d}.alert-info{color:#0d5585;background-color:#d1edff;border-color:#bfe5ff}.alert-info hr{border-top-color:#a6dbff}.alert-info .alert-link{color:#083757}.alert-warning{color:#82850d;background-color:#feffd1;border-color:#feffbf}.alert-warning hr{border-top-color:#feffa6}.alert-warning .alert-link{color:#555708}.alert-danger{color:#850d48;background-color:#ffd1e8;border-color:#ffbfdf}.alert-danger hr{border-top-color:#ffa6d2}.alert-danger .alert-link{color:#57082f}.alert-light{color:#858585;background-color:#fff;border-color:#fff}.alert-light hr{border-top-color:#f2f2f2}.alert-light .alert-link{color:#6c6c6c}.alert-dark{color:#090909;background-color:#cfcfd0;border-color:#bcbcbd}.alert-dark hr{border-top-color:#afafb0}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:0.75rem;background-color:#111112;border-radius:4px;box-shadow:inset 0 .1rem .1rem rgba(0,0,0,.1)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#9a52ff;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:4px}.list-group-item-action{width:100%;color:#343437;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#343437;text-decoration:none;background-color:#f5f5f7}.list-group-item-action:active{color:#e0e0e1;background-color:#e0e0e1}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#111112;border:1px solid #232325}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#e0e0e1;pointer-events:none;background-color:#111112}.list-group-item.active{z-index:2;color:#fff;background-color:#9a52ff;border-color:#9a52ff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#502b85;background-color:#e3cfff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#502b85;background-color:#d4b6ff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#502b85;border-color:#502b85}.list-group-item-secondary{color:#747475;background-color:#f6f6f7}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#747475;background-color:#e9e9eb}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#747475;border-color:#747475}.list-group-item-success{color:#1a7845;background-color:#c6f8dd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1a7845;background-color:#aff5cf}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1a7845;border-color:#1a7845}.list-group-item-info{color:#0d5585;background-color:#bfe5ff}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0d5585;background-color:#a6dbff}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0d5585;border-color:#0d5585}.list-group-item-warning{color:#82850d;background-color:#feffbf}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#82850d;background-color:#feffa6}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#82850d;border-color:#82850d}.list-group-item-danger{color:#850d48;background-color:#ffbfdf}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#850d48;background-color:#ffa6d2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#850d48;border-color:#850d48}.list-group-item-light{color:#858585;background-color:#fff}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#858585;background-color:#f2f2f2}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#858585;border-color:#858585}.list-group-item-dark{color:#090909;background-color:#bcbcbd}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#090909;background-color:#afafb0}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#090909;border-color:#090909}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#ff198b;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#ff198b;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:0.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#454549;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#000;background-clip:padding-box;border:1px solid #e0e0e1;border-radius:8px;box-shadow:0 .25rem .5rem rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #c1c1c2;border-top-left-radius:7px;border-top-right-radius:7px}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #c1c1c2;border-bottom-right-radius:7px;border-bottom-left-radius:7px}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:min-content}.modal-content{box-shadow:0 .5rem 1rem rgba(0,0,0,.5)}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Work Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:4px}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Work Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:8px;box-shadow:0 .25rem .5rem rgba(0,0,0,.2)}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 8px}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:8px 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:8px 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:#fff;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:7px;border-top-right-radius:7px}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#e0e0e1}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentcolor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#9a52ff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#7c1fff !important}.bg-secondary{background-color:#e0e0e1 !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#c6c6c8 !important}.bg-success{background-color:#32e685 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#19cc6c !important}.bg-info{background-color:#19a3ff !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#0089e5 !important}.bg-warning{background-color:#faff19 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e0e500 !important}.bg-danger{background-color:#ff198b !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#e50072 !important}.bg-light{background-color:#fff !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#e6e6e6 !important}.bg-dark{background-color:#111112 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#000 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #c1c1c2 !important}.border-top{border-top:1px solid #c1c1c2 !important}.border-right{border-right:1px solid #c1c1c2 !important}.border-bottom{border-bottom:1px solid #c1c1c2 !important}.border-left{border-left:1px solid #c1c1c2 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#9a52ff !important}.border-secondary{border-color:#e0e0e1 !important}.border-success{border-color:#32e685 !important}.border-info{border-color:#19a3ff !important}.border-warning{border-color:#faff19 !important}.border-danger{border-color:#ff198b !important}.border-light{border-color:#fff !important}.border-dark{border-color:#111112 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:4px !important}.rounded{border-radius:4px !important}.rounded-top{border-top-left-radius:4px !important;border-top-right-radius:4px !important}.rounded-right{border-top-right-radius:4px !important;border-bottom-right-radius:4px !important}.rounded-bottom{border-bottom-right-radius:4px !important;border-bottom-left-radius:4px !important}.rounded-left{border-top-left-radius:4px !important;border-bottom-left-radius:4px !important}.rounded-lg{border-radius:8px !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media(min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media(min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media(min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media(min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:"Space Mono",monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#9a52ff !important}a.text-primary:hover,a.text-primary:focus{color:#6d06ff !important}.text-secondary{color:#e0e0e1 !important}a.text-secondary:hover,a.text-secondary:focus{color:#b9b9bb !important}.text-success{color:#32e685 !important}a.text-success:hover,a.text-success:focus{color:#16b560 !important}.text-info{color:#19a3ff !important}a.text-info:hover,a.text-info:focus{color:#007acc !important}.text-warning{color:#faff19 !important}a.text-warning:hover,a.text-warning:focus{color:#c7cc00 !important}.text-danger{color:#ff198b !important}a.text-danger:hover,a.text-danger:focus{color:#cc0065 !important}.text-light{color:#fff !important}a.text-light:hover,a.text-light:focus{color:#d9d9d9 !important}.text-dark{color:#111112 !important}a.text-dark:hover,a.text-dark:focus{color:#000 !important}.text-body{color:#e0e0e1 !important}.text-muted{color:#e0e0e1 !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;word-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #838386;page-break-inside:avoid}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #c1c1c2 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#c1c1c2}.table .thead-dark th{color:inherit;border-color:#c1c1c2}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}pre,code{font-feature-settings:"liga" 0;font-variant-ligatures:none}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-weight:bold}h1,.h1{font-size:3.875rem;line-height:70px}@media(max-width: 480px){h1,.h1{font-size:2.625rem;line-height:48px}}h2,.h2{font-size:3.5rem;line-height:62px}@media(max-width: 767.98px){h2,.h2{font-size:1.75rem;line-height:34px}}@media(max-width: 767.98px){h2-sm,.h2-sm{font-size:1.75rem !important;line-height:34px !important}}h3,.h3{font-size:3rem;line-height:52px}@media(max-width: 767.98px){h3,.h3{font-size:1.5rem;line-height:28px}}@media(max-width: 767.98px){h3-sm,.h3-sm{font-size:1.5rem;line-height:28px}}h4,.h4{font-size:2rem;line-height:38px}@media(max-width: 767.98px){h4,.h4{font-size:1.25rem;line-height:26px}}h5,.h5{font-size:1.5rem;line-height:32px}@media(max-width: 767.98px){h5,.h5{font-size:1.125rem;line-height:26px}}h6,.h6{font-size:1.25rem;line-height:26px}@media(max-width: 767.98px){h6,.h6{font-size:1rem;line-height:24px}}.longform{font-size:1.5rem;line-height:32px;color:#f5f5f7;font-weight:500}@media(max-width: 767.98px){.longform{font-size:1.25rem;line-height:26px}}.numbers{font-size:6rem;line-height:104px;font-weight:bold;color:#fff}@media(max-width: 767.98px){.numbers{font-size:3.875rem;line-height:70px}}p{font-size:1rem;line-height:24px}.fs-base{font-size:1rem}.fs-3{font-size:.75rem;line-height:1rem}.fs-4-5{font-size:1.125rem}.fs-5{font-size:1.25rem}.fs-5-5{font-size:1.375rem}.fs-6{font-size:1.5rem}.normal{font-weight:normal}.bold{font-weight:bold}.text-largest{font-size:1.5rem;font-weight:normal}.text-large{font-size:1.125rem}.text-small{font-size:.875rem}.text-smaller{font-size:.75rem}.text-smallest{font-size:.625rem}.arrow-link{text-decoration:none}.arrow-link:after{content:url(../img/icon-long-arrow.svg);width:28px;padding-left:7px;transition:all .2s ease-in-out;display:inline-block;text-decoration:none}.arrow-link:hover:after{padding-left:14px}.lang-ja{font-family:"Work Sans","Noto Sans JP",sans-serif}.lang-ja h1,.lang-ja h2,.lang-ja h3,.lang-ja h4,.lang-ja h5,.lang-ja .navbar .navbar-nav .nav-link,.lang-ja article .children-display li a,.lang-ja .right-sidebar .level-1 a,.lang-ja .right-sidebar .separator{font-family:"Work Sans","Noto Sans JP",sans-serif}.search .input-group-text{border-width:0;color:#fff;background-color:#232325;border-radius:4px 0 0 4px;padding:.5rem .5rem .5rem 1rem;line-height:1.5}.search .ds-input{background-color:#232325;border-radius:0 4px 4px 0;padding:.75rem 1rem .75rem .5rem;width:100%;border:1px solid #232325}.search .ds-input:focus{box-shadow:none;border-color:#9a52ff}.search .algolia-autocomplete{flex-grow:1}#algolia-autocomplete-listbox-0{z-index:1100 !important}.xrp-ledger-dev-portal .DocSearch-Modal{top:85px;background-color:#232325;box-shadow:none}.xrp-ledger-dev-portal .DocSearch-Form{box-shadow:inset 0 0 0 2px #9a52ff;background-color:#232325}.xrp-ledger-dev-portal .DocSearch-Hit-source{color:#9a52ff}.xrp-ledger-dev-portal .DocSearch-Hits mark{color:#9a52ff}.xrp-ledger-dev-portal .DocSearch-Hit-source,.xrp-ledger-dev-portal .DocSearch-Hit-Container,.xrp-ledger-dev-portal .DocSearch-Footer{background-color:#232325}.xrp-ledger-dev-portal .DocSearch-Hit a{background-color:#232325;box-shadow:none}.xrp-ledger-dev-portal .DocSearch-Hit-source{color:#a2a2a4}.xrp-ledger-dev-portal .DocSearch-Input{color:#fff}.xrp-ledger-dev-portal .DocSearch-Hit-title,.xrp-ledger-dev-portal .DocSearch-Hit-path,.xrp-ledger-dev-portal .DocSearch-Label,.xrp-ledger-dev-portal .DocSearch-Help{color:#f5f5f7 !important}.xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a{background:#343437}.xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-Container{background-color:#343437}.xrp-ledger-dev-portal .DocSearch-Hit[aria-selected=true] a mark{color:#9a52ff !important}.xrp-ledger-dev-portal .DocSearch-Prefill{color:#9a52ff}.xrp-ledger-dev-portal .DocSearch-Button{background:#232325;width:100%}.xrp-ledger-dev-portal .DocSearch-Button:hover{background:#232325;border-radius:40px;box-shadow:inset 0 0 0 2px #9a52ff}.xrp-ledger-dev-portal .DocSearch-Button:hover .DocSearch-Button-Placeholder{color:#fff}.xrp-ledger-dev-portal .DocSearch-Search-Icon{color:#fff !important}.xrp-ledger-dev-portal .DocSearch-Modal{margin-top:-20px;max-width:55%;margin-right:13.5em}@media(max-width: 991.98px){.xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu{min-width:unset}.xrp-ledger-dev-portal .DocSearch-Modal{top:127px;max-width:100%;margin-left:10px;margin-right:20px}}.xrp-ledger-dev-portal .DocSearch-Container{z-index:99999 !important;background-color:transparent !important}.xrp-ledger-dev-portal .DocSearch-Logo svg .cls-1,.xrp-ledger-dev-portal .DocSearch-Logo svg .cls-2{fill:#fff}.xrp-ledger-dev-portal .DocSearch-Commands-Key{color:#232325}.xrp-ledger-dev-portal #centersearchboxcontainer{justify-content:center}.xrp-ledger-dev-portal #topsearchboxcontainer{justify-content:right}.xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background-color:#111112;border:0;border-radius:8px}.xrp-ledger-dev-portal .algolia-autocomplete .ds-dropdown-menu::before{background-color:#111112;border:0}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion{background-color:#111112}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header{color:#fff;border:0;border-bottom:2px solid #9a52ff;font-weight:bold}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{color:#fff}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--title{color:#fff}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--text{font-size:.8rem;color:#e0e0e1}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#fff;background-color:#343437}.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.xrp-ledger-dev-portal .algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{box-shadow:none;background-color:#343437}#xrp-ledger-dev-portal{overflow:auto !important}body{position:relative}section{position:relative}.landing{padding:0}.square{position:relative;flex-basis:calc(50% - 30px);margin:15px;box-sizing:border-box;justify-content:center;align-items:center;border-radius:8px}.square::before{content:"";display:block;padding-top:100%}@media(min-width: 992px){.square{flex-basis:calc(25% - 30px)}}.square-50{flex-basis:calc(50% - 30px)}@media(max-width: 767.98px){.square-50{flex-basis:calc(50% - 20px)}}.nav-grid-lg{display:flex;flex-direction:column}.nav-grid-lg .nav-item{width:100%}.nav-grid-lg .nav-item .nav-link{display:flex}.nav-grid-lg .nav-item .nav-link span{flex-grow:0}.nav-grid-lg .nav-item .nav-link img{max-height:2rem}.nav-grid-lg .nav-grid-head{margin-top:2.5rem}@media(min-width: 992px){.nav-grid-lg{display:grid;grid-auto-flow:column;grid-column-gap:80px}.nav-grid-lg .nav-grid-head{margin-top:0}}.col-lg{padding-left:0;padding-right:0}@media(min-width: 992px){.cols-of-1{grid-template-rows:repeat(1, min-content)}}@media(min-width: 992px){.cols-of-2{grid-template-rows:repeat(2, min-content)}}@media(min-width: 992px){.cols-of-3{grid-template-rows:repeat(3, min-content)}}@media(min-width: 992px){.cols-of-4{grid-template-rows:repeat(4, min-content)}}@media(min-width: 992px){.cols-of-5{grid-template-rows:repeat(5, min-content)}}@media(min-width: 992px){.cols-of-6{grid-template-rows:repeat(6, min-content)}}.card-grid{display:grid;grid-gap:40px;padding:0;width:100%;grid-template-columns:1fr}@media(min-width: 992px){.card-grid{grid-gap:80px}}.card-grid .col{padding-left:0;padding-right:0;min-width:100%}.card-grid.card-grid-4xN{grid-auto-rows:auto;grid-template-columns:repeat(2, 1fr)}@media(min-width: 992px){.card-grid.card-grid-4xN{grid-template-columns:repeat(4, 1fr)}}.card-grid.card-grid-3xN{grid-auto-rows:auto}@media(min-width: 992px){.card-grid.card-grid-3xN{grid-template-columns:1fr 1fr 1fr}}.card-grid.card-grid-2xN{grid-template-columns:1fr 1fr;grid-auto-rows:auto}@media(max-width: 991.98px){.card-grid.card-grid-2xN{grid-template-columns:1fr}}.card-grid.card-grid-1x2{grid-template-columns:1fr 2fr;grid-auto-rows:auto}@media(max-width: 991.98px){.card-grid.card-grid-1x2{display:flex}}.card-grid .card{padding:20px;border:0;min-height:264px}@media(min-width: 768px){.card-grid .card{min-height:347px}}@media(min-width: 992px){.card-grid .card{padding:40px}}.card-grid .card .card-body{padding:8px;padding-bottom:24px}.card-grid .card .card-body .card-icon-container{width:50px;height:50px}.card-grid .card .card-body .card-icon-container img{width:70%;height:70%}.card-grid.section-hero{padding-left:0}.container-new{display:flex;flex-wrap:wrap;margin:0 auto;padding:0 32px;max-width:100%;z-index:1}@media(min-width: 768px){.container-new{max-width:608px}}@media(min-width: 992px){.container-new{max-width:942px}}@media(min-width: 1200px){.container-new{max-width:1280px}}@media(max-width: 991.98px){article{overflow-wrap:break-word;word-wrap:break-word;overflow:hidden}}@media(max-width: 480px){html{overflow-x:hidden !important}}@media(max-width: 400px){.navbar .navbar-brand .brand-text{margin-right:0;letter-spacing:-0.08rem}.navbar .navbar-brand{margin-right:0}.navbar .navbar-brand .logo{margin-right:0;margin-left:-1rem}.btn{white-space:normal}}.timeline-wrapper{z-index:999;position:relative}.timeline:before{content:"";position:absolute;top:-40px;left:18px;height:95%;width:4px;background:linear-gradient(180deg, #feff01 0%, #ff2d9a 33%, #a3088f 66%, rgba(44, 4, 128, 0.85) 100%)}@media(max-width: 991.98px){.timeline:before{left:8px}}.timeline-dot{margin-top:94px;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-negative:0;flex-shrink:0;width:18px;height:18px;border-radius:50%;background:#111112;box-sizing:border-box}.timeline-block:first-child .timeline-dot{border:3px solid #faff19}.timeline-block:nth-child(2) .timeline-dot{border:3px solid #ff884b}.timeline-block:nth-child(3) .timeline-dot{border:3px solid #c000e5}.timeline-block:nth-child(4) .timeline-dot{border:3px solid #40004c}.timeline-block{display:flex;position:relative;z-index:1}.timeline-content{flex-grow:1;position:relative;margin-left:1.25em}.timeline h4{margin-top:-4px}@media(min-width: 768px){.timeline:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.timeline-dot{-ms-flex-order:1;order:1;margin-left:calc(5% - 9px);will-change:transform}.timeline-block:nth-child(even){-ms-flex-direction:row-reverse;flex-direction:row-reverse}.timeline-dot{margin-right:calc(5% - 9px)}.timeline-content{width:45%;-ms-flex-positive:0;flex-grow:0;will-change:transform;margin:0;--line-height-multiplier: 1.2}}@media(min-width: 992px){[data-component-name="TableOfContent/TableOfContent"]{margin-right:32px}}aside li a{color:#fff;text-decoration:none;font-size:1.05rem}aside .sidenav_cat_title{color:#fff}aside a:hover,aside .sidenav_cat_title:hover{color:#9a52ff}aside a.active,aside a.active:hover,aside .active>a,aside .active>a:hover{color:#9a52ff;font-weight:700}aside a.active-parent,aside .active-parent>a{font-weight:700}.page-toc .level-1 a,.command-list .separator{font-weight:700;color:#fff}.nav-toggler{position:absolute;width:1.75em;height:1.75em;line-height:0;display:grid;justify-content:center;align-content:center}.nav-toggler::after{display:inline-block;margin-left:.34em;vertical-align:.34em;content:"";border-top:.4em solid;border-right:.4em solid transparent;border-bottom:0;border-left:.4em solid transparent}.nav-toggler:empty::after{margin-left:0}.nav-toggler::after{transition-duration:.3s}.nav-toggler.collapsed::after{transform:rotate(-90deg)}.dactyl-tree-nav nav{margin-left:1rem;padding-left:0;border-left:1px solid #fff}.dactyl-tree-nav nav .nav-link:hover,.dactyl-tree-nav nav .nav-link:active{border-left:1px solid #9a52ff;margin-left:-1px}.dactyl-tree-nav nav .active>.nav-link{border-left:2px solid #9a52ff;margin-left:-1px;padding-left:calc(1rem - 1px)}.dactyl-tree-nav .nav-item{position:relative}.dactyl-tree-nav .nav-item .nav-link{padding:.25rem 1rem;font-size:.9rem}.dactyl-tree-nav .nav-item.nav-parent{padding-top:0}.dactyl-tree-nav .nav-item.nav-parent .nav-link{padding-left:0;padding-top:0;font-size:1.125rem;line-height:initial}.dactyl-tree-nav .nav-item .nav-toggler+.nav-link{padding-left:2rem}.dactyl-tree-nav>.nav-item{padding:.5rem 0;font-size:1.125rem}.dactyl-tree-nav>.nav-item>.nav-link{font-weight:bold}.dactyl-tree-nav .collapsing.nav{flex-wrap:unset}.toc-header{font-weight:bold;font-size:14px;padding:1rem 0}.toc-header h4{line-height:20px;font-size:1.2em;padding:0;margin:0}#page-toc-wrapper .card-body{list-style-type:none}.page-toc,.command-list{padding-left:0;border-left:1px solid #fff}.page-toc li,.command-list li{list-style-type:none;padding:0}.page-toc li.separator,.command-list li.separator{padding:.25rem 1rem}.page-toc li a,.command-list li a{display:block;margin-top:5px;padding:.25rem 1rem;font-size:.9rem}.page-toc li a:hover,.page-toc li a .active,.command-list li a:hover,.command-list li a .active{text-decoration:none;border-left:1px solid #9a52ff;margin-left:-1px}.page-toc li.active a,.page-toc li.active a:hover,.command-list li.active a,.command-list li.active a:hover{border-left:2px solid #9a52ff;padding-left:calc(1rem - 1px);margin-left:-1px}.page-toc .level-3,.command-list .level-3{margin-left:16px;border-left:1px solid #fff;margin-bottom:0;padding-bottom:5px}.page-toc .level-3 a,.command-list .level-3 a{margin-top:0;padding-bottom:5px}.page-toc.no-sideline,.command-list.no-sideline{border-left:0}.page-toc.no-sideline a:hover,.page-toc.no-sideline a.active,.command-list.no-sideline a:hover,.command-list.no-sideline a.active{border-left:0;margin-left:0}.command-list li a{margin-top:0}.h32{height:32px}.w32{width:32px}.h36{height:36px}.w36{width:36px}.h40{height:40px}.w40{width:40px}.w44{width:44px}.w48{width:48px}.w-100{width:100%}.min-vh100{min-height:100vh}.vw100{width:100vw;min-width:100%}@media(max-width: 767.98px){.mb-3-sm-i{margin-bottom:1rem !important}}.ml-5{margin-left:1.25rem}@media(min-width: 768px){.ml-5-until-md{margin-left:1.25rem}}.mr-5{margin-right:1.25rem}@media(min-width: 768px){.mr-5-until-md{margin-right:1.25rem}}.mb-6{margin-bottom:1.5rem}@media(max-width: 767.98px){.mb-6-sm{margin-bottom:1.5rem}}.mt-6{margin-top:1.5rem}@media(min-width: 576px){.mt-6-until-sm{margin-top:1.5rem !important}}.mb-8{margin-bottom:2rem}@media(max-width: 767.98px){.mb-8-sm{margin-bottom:2rem}}.mt-8{margin-top:2rem}@media(min-width: 576px){.mt-8-until-sm{margin-top:2rem !important}}.mt-9{margin-top:2.25rem}.mb-9{margin-bottom:2.25rem}.mt-10{margin-top:2.5rem}@media(max-width: 767.98px){.mt-10-sm{margin-top:2.5rem}}.mb-10{margin-bottom:2.5rem}@media(min-width: 576px){.mb-10-until-sm{margin-bottom:2.5rem}}@media(max-width: 767.98px){.mb-10-sm{margin-bottom:2.5rem}}.ml-10{margin-left:2.5rem}.mr-10{margin-right:2.5rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}@media(min-width: 576px){.mx-10-until-sm{margin-left:2.5rem;margin-right:2.5rem}}@media(min-width: 768px){.mx-10-until-md{margin-left:2.5rem;margin-right:2.5rem}}@media(max-width: 767.98px){.mx-10-sm{margin-left:2.5rem;margin-right:2.5rem}}.mt-12{margin-top:3rem}.mb-12{margin-bottom:3rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mt-13{margin-top:3.25rem}.mb-13{margin-bottom:3.25rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}@media(max-width: 767.98px){.mt-16-sm{margin-top:4rem}}.mb-16{margin-bottom:4rem}@media(max-width: 767.98px){.mb-16-sm{margin-bottom:4rem}}.mb-18{margin-bottom:4.5rem}.mt-20{margin-top:5rem}@media(max-width: 767.98px){.mt-20-sm{margin-top:5rem}}@media(min-width: 576px){.mt-20-until-sm{margin-top:5rem}}.mb-20{margin-bottom:5rem}@media(max-width: 767.98px){.mb-20-sm{margin-bottom:5rem}}@media(min-width: 576px){.mb-20-until-sm{margin-bottom:5rem}}.my-20{margin-top:5rem;margin-bottom:5rem}.my-26{margin-top:6.5rem;margin-bottom:6.5rem}.mb-30{margin-bottom:7.5rem}.mt-30{margin-top:7.5rem}@media(min-width: 576px){.mt-30-until-sm{margin-top:7.5rem}}.mt-40{margin-top:10rem}@media(min-width: 576px){.mt-40-until-sm{margin-top:10rem}}.mb-40{margin-bottom:10rem}@media(min-width: 576px){.mb-40-until-sm{margin-bottom:10rem}}.mb-49{margin-bottom:12.25rem}.mb-50{margin-bottom:12.5rem}@media(min-width: 576px){.mb-50-until-sm{margin-bottom:12.5rem}}@media(max-width: 767.98px){.pl-0-sm{padding-left:0 !important}}@media(max-width: 767.98px){.pr-0-sm{padding-right:0 !important}}@media(max-width: 767.98px){.pt-3-sm{padding-top:1rem !important}}.p-6{padding:1.5rem}@media(max-width: 767.98px){.p-6-sm{padding:1.5rem}}.p-8{padding:2rem}@media(max-width: 767.98px){.p-8-sm{padding:2rem}}.p-10{padding:2.5rem}@media(min-width: 576px){.p-10-until-sm{padding:2.5rem}}.py-20{padding-bottom:5rem;padding-top:5rem}.px-20{padding-left:5rem;padding-right:5rem}.pt-20{padding-top:5rem}.pb-20{padding-bottom:5rem}.py-26{padding-top:6.5rem;padding-bottom:6.5rem}@media(max-width: 767.98px){.py-26{padding-top:2.5rem;padding-bottom:2.5rem}}.pt-26{padding-top:2.5rem}@media(min-width: 576px){.pt-26-until-sm{padding-top:6.5rem}}.pb-26{padding-bottom:6.5rem}@media(min-width: 576px){.pb-26-until-sm{padding-bottom:6.5rem}}.pt-30{padding-top:7.5rem}.pb-30{padding-bottom:7.5rem}.pt-40{padding-top:10rem}@media(min-width: 576px){.pt-40-until-sm{padding-top:10rem}}.pb-40{padding-bottom:10rem}.pb-50{padding-bottom:12.5rem}.pt-50{padding-top:12.5rem}.py-50{padding-bottom:12.5rem;padding-top:12.5rem}@media(min-width: 576px){.py-50-until-sm{padding-bottom:12.5rem;padding-top:12.5rem}}.floating-nav{top:6rem}.last-section{margin-bottom:100px}.bottom-0{bottom:0}.justify-center{justify-content:center}@media(max-width: 767.98px){.justify-center-sm{justify-content:center}}@media(max-width: 575.98px){.overflow-xs{overflow:scroll}.overflow-x-xs{overflow-x:scroll;overflow-y:hidden}}@media(min-width: 768px){.position-sm-absolute{position:absolute}}.va-middle{vertical-align:middle}.ls-none{list-style:none}.no-wrap{white-space:nowrap}.align-items-stretch{align-items:stretch}.underline{text-decoration:underline}@media(max-width: 575.98px){.d-none-xs{display:none}}@media(max-width: 767.98px){.d-none-sm{display:none}}@media(min-width: 992px){.d-none-lg{display:none}}.d-block{display:block}.border-green{border:1px solid #9a52ff}.border-none{border:none !important}.grey-400{color:#a2a2a4}.grey-500{color:#838386}.grey-700{color:#343437}.white{color:#fff}.stat-highlight{color:#32e685}.br-8{border-radius:8px}@media(max-width: 767.98px){br.until-sm{content:""}}.z-index-1{z-index:1}.bb-gray{border-bottom:1px solid #454549}@keyframes arrowDance{0%{padding-left:7px}50%{padding-left:14px}100%{padding-left:7px}}@keyframes arrowDance2{0%{right:0}50%{right:7px}100%{right:0}}@keyframes arrowDanceDiag{0%{right:7px;margin-top:0}50%{right:0;margin-top:-7px}100%{right:7px;margin-top:0}}.btn,article a.button,article .btn{font-weight:bold;cursor:pointer;text-decoration:none;transition:.2s;padding:.5rem 1rem;line-height:16px}article a.button{padding:.5rem 1rem;margin:0 .5rem;display:inline-block}.btn.disabled,button.disabled,.btn[disabled=disabled],button[disabled=disabled]{cursor:not-allowed}.btn-primary code,.btn-secondary code{color:inherit}.btn-primary{background:#7919ff;font-weight:bold;color:#fff;border:none;border-color:transparent}.btn-primary:hover{background:#5f00e5}.btn-primary.disabled,.btn-primary[disabled=disabled]{background:#4a00b2}.btn-primary.disabled:hover,.btn-primary[disabled=disabled]:hover{background:#4a00b2}@media(max-width: 767.98px){.btn-arrow{display:block;width:100%}}.btn-arrow::after{display:inline-block;content:url(../img/icons/arrow-right.svg);position:relative;top:1px;vertical-align:middle;padding-left:8px;-webkit-transition:transform .3s ease-out;-moz-transition:transform .3s ease-out;-ms-transition:transform .3s ease-out;-o-transition:transform .3s ease-out;transition:transform .3s ease-out}.btn-arrow:hover{background:#5f00e5 !important;border:none}.btn-arrow:hover::after{-webkit-transform:translateX(4px);-moz-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}.btn-arrow-out::after{background-position:left 0px bottom 0px;content:" ";background-image:url(../img/icons/arrow-up-right-white.svg);background-repeat:no-repeat;display:inline-block;padding:4px 8px 4px 12px;transition:background-position .3s ease-in-out;margin-left:4px}.btn-arrow-out:hover::after{background-position:left 4px bottom 4px}@media(max-width: 767.98px){.btn-arrow-out{display:block;width:100%}}.jump-to-top{display:none;position:fixed;bottom:36px;right:36px;font-weight:700;z-index:1000}.jump-to-top::after{display:none}.accordian-row{background:#232325;border-radius:5px;padding:32px}.accordian-row h3 a{position:relative;padding-right:2rem}.accordian-row h3 a:hover{color:#fff}.accordian-row .chevron{position:absolute;top:0;right:0}article table{clear:right;margin-bottom:48px}article table code{word-break:normal;white-space:nowrap;overflow-wrap:normal}article table th{border-bottom:2px solid #e0e0e1}article table tr{border-bottom:1px solid #e0e0e1}article table th,article table td{padding:.2em;vertical-align:text-top}article table td:nth-child(1){font-weight:bold}.landing-table th,.landing-table tr{border-bottom:2px solid #454549}.landing-table td{width:33.33%;padding:16px 40px 16px 0}.landing-table td:nth-child(1){font-weight:normal}@media(max-width: 767.98px){.landing-table td{font-size:.875rem}}.landing-table tr:last-child{border-bottom:none}.landing-table tbody td{color:#e0e0e1}.dblue{color:#454549}#overview-table td:nth-child(1){width:40%}#overview-table td:nth-child(2){width:30%}#overview-table tbody td{padding:2rem .75rem}@media(max-width: 991.98px){#overview-table{font-size:.875rem}#overview-table thead .h4{font-size:1.125rem}}article table{clear:right;margin-bottom:48px}article table code{word-break:normal;white-space:nowrap;overflow-wrap:normal}article table th{border-bottom:2px solid #e0e0e1}article table tr{border-bottom:1px solid #e0e0e1}article table th,article table td{padding:.2em;vertical-align:text-top}article table td:nth-child(1){font-weight:bold}.landing-table th,.landing-table tr{border-bottom:2px solid #454549}.landing-table td{width:33.33%;padding:16px 40px 16px 0}.landing-table td:nth-child(1){font-weight:normal}@media(max-width: 767.98px){.landing-table td{font-size:.875rem}}.landing-table tr:last-child{border-bottom:none}.landing-table tbody td{color:#e0e0e1}.dblue{color:#454549}#overview-table td:nth-child(1){width:40%}#overview-table td:nth-child(2){width:30%}#overview-table tbody td{padding:2rem .75rem}@media(max-width: 991.98px){#overview-table{font-size:.875rem}#overview-table thead .h4{font-size:1.125rem}}.modal-content-uses .first-ledger-bot{min-height:80px !important;position:relative;bottom:20px;content:url("../img/uses/first-ledger-bot.svg")}.modal-content-uses .orchestra-finance{content:url("../img/uses/orchestra-finance.svg")}.modal-content-uses .moai-finance{min-height:80px !important;position:relative;bottom:20px;content:url("../img/uses/moai-finance.svg")}.modal-content-uses .ledger-city{margin:0px !important;position:relative;bottom:4px;left:6px;max-height:47px !important}.modal-content-uses .zerpmon{margin:0px;min-width:80px;min-height:84px;position:relative;bottom:13px;content:url("../img/uses/zerpmon.png") !important}#use_case_companies_list #threezy .biz-logo{max-height:40px;content:url("../img/uses/modallogos/threezy.png")}html.light .cryptum{content:url(../img/uses/lightmode/cryptum.jpg) !important;height:58px;max-width:max-content;width:184px;max-height:none;margin:0px;padding-bottom:10px}.xrp-ledger{content:url(../img/uses/modallogos/xrp-ledger.png)}html.light .xrp-ledger{content:url(../img/uses/lightmode/xrp-ledger.png)}.gatehub{content:url(../img/uses/modallogos/gatehub.png)}html.light .gatehub{content:url(../img/uses/lightmode/gatehub.png)}.towolabs{content:url(../img/uses/modallogos/towolabs.png)}html.light .towolabs{content:url(../img/uses/lightmode/towolabs.png)}.xrpscan{content:url(../img/uses/modallogos/xrpscan.png)}html.light .xrpscan{content:url(../img/uses/lightmode/xrpscan.png)}.xrp-toolkit{content:url(../img/uses/modallogos/xrp-toolkit.png)}html.light .xrp-toolkit{content:url(../img/uses/lightmode/xrp-toolkit.png)}.bithomp{content:url(../img/uses/modallogos/bithomp.png)}html.light .bithomp{content:url(../img/uses/lightmode/bithomp.png)}.onthedex{content:url(../img/uses/modallogos/onthedex.png)}html.light .onthedex{content:url(../img/uses/lightmode/onthedex.png)}.cryptum{content:url(../img/uses/modallogos/cryptum.png)}html.light .cryptum{content:url(../img/uses/lightmode/cryptum.png)}.evernode{content:url(../img/uses/modallogos/evernode.png)}html.light .evernode{content:url(../img/uses/lightmode/evernode.png)}.threezy{content:url(../img/uses/modallogos/threezy.png)}html.light .threezy{content:url(../img/uses/lightmode/threezy.png)}.tokenize{content:url(../img/uses/modallogos/tokenize.png)}html.light .tokenize{content:url(../img/uses/lightmode/tokenize.png)}.multichain{content:url(../img/uses/modallogos/multichain.png)}html.light .multichain{content:url(../img/uses/lightmode/multichain.png)}.crossmark{content:url(../img/uses/modallogos/crossmark.png)}html.light .crossmark{content:url(../img/uses/lightmode/crossmark.png)}.edge{content:url(../img/uses/modallogos/edge.png)}html.light .edge{content:url(../img/uses/lightmode/edge.png)}.gem-wallet{content:url(../img/uses/modallogos/gem-wallet.png)}html.light .gem-wallet{content:url(../img/uses/lightmode/gem-wallet.png)}.xumm{content:url(../img/uses/modallogos/xumm.png)}html.light .xumm{content:url(../img/uses/lightmode/xumm.png)}.aesthetes{content:url(../img/uses/modallogos/aesthetes.png)}html.light .aesthetes{content:url(../img/uses/lightmode/aesthetes.png)}.audiotarky{content:url(../img/uses/modallogos/audiotarky.png)}html.light .audiotarky{content:url(../img/uses/lightmode/audiotarky.png)}.nftmaster{content:url(../img/uses/modallogos/nftmaster.png)}html.light .nftmaster{content:url(../img/uses/lightmode/nftmaster.png)}.peerkat{content:url(../img/uses/modallogos/peerkat.png)}html.light .peerkat{content:url(../img/uses/lightmode/peerkat.png)}.sologenic_dex{content:url(../img/uses/modallogos/sologenic_dex.png)}html.light .sologenic_dex{content:url(../img/uses/lightmode/sologenic_dex.png)}.xrp-cafe{content:url(../img/uses/modallogos/xrp-cafe.png)}html.light .xrp-cafe{content:url(../img/uses/lightmode/xrp-cafe.png)}.xrp-oval{content:url(../img/uses/modallogos/xrp-oval.png)}html.light .xrp-oval{content:url(../img/uses/lightmode/xrp-oval.png)}.sologenic_dex{content:url(../img/uses/modallogos/sologenic_dex.png)}html.light .sologenic_dex{content:url(../img/uses/lightmode/sologenic_dex.png)}.xpmarket{content:url(../img/uses/modallogos/xpmarket.png)}html.light .xpmarket{content:url(../img/uses/lightmode/xpmarket.png)}.orchestra-finance{content:url(../img/uses/modallogos/orchestra-finance.png)}html.light .orchestra-finance{content:url(../img/uses/lightmode/orchestra-finance.png)}.moai-finance{content:url(../img/uses/modallogos/moai-finance.png)}html.light .moai-finance{content:url(../img/uses/lightmode/moai-finance.png)}.first-ledger-bot{content:url(../img/uses/modallogos/first-ledger-bot.png)}html.light .first-ledger-bot{content:url(../img/uses/lightmode/first-ledger-bot.png)}.forte{content:url(../img/uses/modallogos/forte.png)}html.light .forte{content:url(../img/uses/lightmode/forte.png)}.ledger-city{content:url(../img/uses/modallogos/ledger-city.png)}html.light .ledger-city{content:url(../img/uses/lightmode/ledger-city.png)}.futureverse{content:url(../img/uses/modallogos/futureverse.png)}html.light .futureverse{content:url(../img/uses/lightmode/futureverse.png)}.zerpmon{content:url(../img/uses/modallogos/zerpmon.png)}html.light .zerpmon{content:url(../img/uses/lightmode/zerpmon.png)}.anchain{content:url(../img/uses/modallogos/anchain.png)}html.light .anchain{content:url(../img/uses/lightmode/anchain.png)}.ripple{content:url(../img/uses/modallogos/ripple.png)}html.light .ripple{content:url(../img/uses/lightmode/ripple.png)}.supermojo{content:url(../img/uses/modallogos/supermojo.png)}html.light .supermojo{content:url(../img/uses/lightmode/supermojo.png)}.ripple{content:url(../img/uses/modallogos/ripple.png)}html.light .ripple{content:url(../img/uses/lightmode/ripple.png)}.carbonland-trust{content:url(../img/uses/modallogos/carbonland-trust.png)}html.light .carbonland-trust{content:url(../img/uses/lightmode/carbonland-trust.png)}.gatehub{content:url(../img/uses/modallogos/gatehub.png)}html.light .gatehub{content:url(../img/uses/lightmode/gatehub.png)}.bitgo{content:url(../img/uses/modallogos/bitgo.png)}html.light .bitgo{content:url(../img/uses/lightmode/bitgo.png)}.arrow-button.left-arrow img{content:url(../img/uses/left-arrow.svg)}.arrow-button.right-arrow img{content:url(../img/uses/right-arrow.svg)}.right-arrow-button.right-arrow img{background-color:transparent;border:none;cursor:pointer}.html.light .arrow-button.left-arrow img{content:url(../img/uses/left-arrow-light.svg)}.html.light .arrow-button.right-arrow img{content:url(../img/uses/right-arrow-light.svg)}.related-tasks-links a{color:#454549;text-decoration:none}.related-tasks-links a:hover{color:#000}.arrows-container{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);display:flex;justify-content:space-between;z-index:10}@media only screen and (max-width: 768px){.arrows-container{top:30px}}.arrow-button{background-color:transparent;border:none;cursor:pointer}.arrow-button img{width:40px;height:40px}.left-arrow{margin-left:40px}@media only screen and (max-width: 768px){.left-arrow{margin-left:0px}}.right-arrow{margin-right:40px}@media only screen and (max-width: 768px){.right-arrow{margin-right:0px}}.modal-uses{display:none;position:fixed;z-index:1000;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgba(0,0,0,.4)}.modal-content-uses{position:relative;background-color:#232325;position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);padding:20px;width:60% !important;height:60%;display:flex;flex-direction:column;align-items:center;overflow:scroll}.modal-content-uses::before{content:"";position:absolute;top:0;left:0;width:100%;height:1px;background:linear-gradient(90deg, #b480ff -0.32%, #5f00e6 32.7%, #1aa4ff 61.53%, #19ff83 100.32%, #19ff83 100.32%)}.content-section{width:100%;display:flex;justify-content:center;align-items:center;margin-bottom:20px}.section-image{display:block}.section-text-title{font-family:"Work Sans";font-style:normal;font-weight:500;font-size:24px;line-height:32px;text-align:center;color:#fff}.section-text-description{max-width:320px;font-family:"Work Sans";font-style:normal;font-weight:400;font-size:16px;line-height:24px;text-align:center;color:#c1c1c2}.apps-built{position:relative;top:17px;left:50px;font-family:"Work Sans";font-style:normal;font-weight:600;font-size:12px;line-height:16px;color:#e0e0e1}.numbers-animation{width:218px;height:96px}.arrow-animation{position:relative;right:23px;top:-11px;width:60px !important}.explore-projects{font-family:"Work Sans";font-style:normal;font-weight:600;font-size:12px;line-height:16px;color:#7919ff;position:relative;top:-9px;right:27px}.section-separator{width:50%;border:0;border-top:1px solid #ccc}.threezy-logo{margin:4px;max-height:38px}.blockforce-logo{margin:0px !important;max-height:45px !important}.Evernode-logo{margin-right:39px}.logo-grid{display:grid;grid-template-rows:repeat(2, 1fr);grid-template-columns:repeat(4, 1fr);grid-gap:8px;justify-items:center}.flex-center{display:flex;justify-content:center}.top-row,.bottom-row{display:flex;justify-content:center}@media only screen and (max-width: 768px){.top-row,.bottom-row{flex-wrap:wrap}}.logo-item{max-height:30px;max-width:130px;margin:10px 11px}.close{color:#aaa;float:right;font-size:28px;font-weight:bold;cursor:pointer}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}#use-case-card-grid{grid-template-columns:repeat(2, 1fr)}@media(min-width: 768px){#use-case-card-grid{grid-template-columns:repeat(3, 1fr)}}@media(min-width: 992px){#use-case-card-grid{grid-template-columns:repeat(4, 1fr)}}.use-case-circle{display:flex;align-items:center;justify-content:center;aspect-ratio:1/1;border:1px solid #343437;border-radius:50%;margin-bottom:30px;cursor:pointer}@media(min-width: 768px){.use-case-circle{aspect-ratio:1/1;min-width:200px !important;min-height:200px !important}}@media(min-width: 992px){.use-case-circle{aspect-ratio:1/1;min-width:250px !important;min-height:250px !important}}.use-case-circle:hover{border-color:#838386}.circle-content{display:flex;flex-direction:column;align-items:center;gap:13px}.circle-img{width:40px;height:40px}.circle-text{font-family:"Work Sans";font-style:normal;font-weight:700;white-space:nowrap;font-size:16px;margin-bottom:0px}.join-xrpl-section{display:flex;flex-direction:column;align-items:center}.colorful-join-text-wrapper{display:flex;justify-content:center;flex-direction:column;padding:0 5%;box-sizing:border-box}@media(min-width: 992px){.colorful-join-text-wrapper{padding:0 4%}}.colorful-join-text{display:block;width:100%;text-align:left;font-family:"Work Sans";font-style:normal;font-weight:400;font-size:32px;line-height:38px;background:linear-gradient(90deg, #feff01 0%, #ff2d9a 30.82%, #e24cff 64.01%, #9a52ff 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}#numbersAnimation{display:block}#numbersAnimationLight{display:none}html.light .section-separator{background:#c1c1c2}html.light .section-text-description{color:#343437}html.light .modal-content-uses{background:#fff}html.light #numbersAnimation{display:none}html.light #numbersAnimationLight{display:block}html.light .apps-built{position:relative;top:17px;left:50px;font-family:"Work Sans";font-style:normal;font-weight:600;font-size:12px;line-height:16px;color:#232325}html.light .colorful-join-text{display:block;width:100%;text-align:left;font-family:"Work Sans";font-style:normal;font-weight:400;font-size:32px;line-height:38px;background:linear-gradient(90deg, #b480ff -0.32%, #5f00e6 32.7%, #1aa4ff 61.53%, #19ff83 100.32%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}@media(min-width: 992px){html.light .colorful-join-text{width:750px}}@media(min-width: 992px){.colorful-join-text{width:750px}}.pill-box{display:inline-flex;align-items:center;justify-content:center;padding:3.69087px 29.527px;width:73.05px;height:37.38px;background:#7919ff;border:3.69087px solid #5f00e5;border-radius:184.543px}.pill-number{font-family:"Work Sans";font-style:normal;font-weight:600;font-size:22.1452px;color:#f0e5ff}.use-case-steps h2{margin-top:10px;margin-bottom:10px;font-size:1.728em;line-height:32px;font-weight:700}.use-case-steps h2 a{text-decoration:none}.use-case-steps h2:first-of-type:before{display:none}.use-case h1{font-size:2.4em;padding-bottom:10px}.use-case-steps h2:before{margin-top:-30px;height:0}.use-case-steps h2:first-of-type{margin-top:-30px}.related-tasks-links ul{list-style-type:none;padding-left:0}.related-tasks-links ul li{margin:0px;padding-top:2px}.related-tasks-links a:hover::after{padding-left:.5em}.related-tasks-links a::after{content:" ➝";padding-left:0;transition:all .2s ease-in-out}.page-tokenization .tokenization-graphic{content:url("../img/backgrounds/tokenization-illustration.svg");width:100%;height:100%}.page-tokenization .show-md{display:none}@media(max-width: 991.98px){.page-tokenization .show-md{display:block}}.page-tokenization .hide-md{display:block}@media(max-width: 991.98px){.page-tokenization .hide-md{display:none}}.page-tokenization .tokenization-use-case{font-size:12px;display:flex;flex-direction:row;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:10px;border-bottom:1px solid #454549}.page-tokenization .tokenization-use-case .arrow-button img{width:15px;height:15px}.page-tokenization .tokenization-stats{width:100%;height:250px;border-radius:8px;background:linear-gradient(88deg, #9A52FF -14.32%, #32E685 45.35%, #19A3FF 100.76%);padding:4rem 2rem;display:grid;grid-template-columns:repeat(4, 1fr)}@media(max-width: 991.98px){.page-tokenization .tokenization-stats{display:block;height:100%;width:100%;padding:0 25%}}.page-tokenization .stat-container{color:#000;text-align:center;border-right:2px solid #000}@media(max-width: 991.98px){.page-tokenization .stat-container{border-right:none;padding-bottom:3rem;padding-top:2rem;border-bottom:2px solid #000}}.page-tokenization .stat-container:last-child{border:none}.page-tokenization .stat-container .stat{font-size:3rem;font-weight:300}.page-tokenization .stat-container p{font-weight:400}.page-tokenization .security-card{position:relative;border-radius:.5rem;background-color:transparent;white-space:normal;box-sizing:border-box}.page-tokenization .security-card::before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;padding:1px;background:linear-gradient(90deg, #d91aff 26.41%, #1aa4ff 100.32%);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;-webkit-mask-composite:xor;z-index:-1}.page-tokenization .security-card p{margin-bottom:0 !important}@media(max-width: 767.98px){.page-tokenization .security-card .h6{font-size:1.25rem}}.page-tokenization .security-card-grid{gap:1rem;grid-template-columns:repeat(2, 1fr)}@media(min-width: 1200px){.page-tokenization .security-card-grid{grid-template-columns:repeat(4, 1fr)}}@media(max-width: 768px){.page-tokenization .security-card-grid{grid-template-columns:repeat(1, 1fr)}}.page-tokenization .video-external-link .link-text{margin-left:.25rem}.page-tokenization .video-external-link{margin-bottom:9px}.page-tokenization .tokenization-color-bar{align-self:stretch;height:.25rem;border-radius:2rem;background:var(--Gradient-3, linear-gradient(90deg, #FEFF01 0%, #FF2D9A 30.82%, #E24CFF 64.01%, #9A52FF 100%))}.page-tokenization .project-cards-container{gap:3rem}.page-tokenization .project-cards{width:100%}.page-tokenization .project-cards .project-name{word-break:break-word}.page-tokenization .project-cards .card{min-height:240px}.page-tokenization .project-cards .col::before{content:"";position:absolute;top:0;left:0;width:100%;height:.25rem;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.page-tokenization .project-cards .col.odd::before{background:linear-gradient(90deg, #D91AFF 26.41%, #1AA4FF 100.32%)}.page-tokenization .project-cards .col.even::before{background:linear-gradient(90deg, #4BB7FF -0.32%, #32E685 30.61%)}.page-tokenization .project-cards .project-logo{width:100%;height:50px;vertical-align:center;padding:0 .5rem}.page-tokenization .project-cards img{max-width:100%;height:auto;display:block;box-sizing:border-box}.page-tokenization .amy{content:url("../img/logos/amy.svg")}.page-tokenization .carbonland{content:url("../img/logos/carbonland.svg")}.page-tokenization .evernode{content:url("../img/logos/evernode.svg")}.page-tokenization .nautilus{content:url("../img/logos/nautilus.svg")}.page-tokenization .onXRP{content:url("../img/logos/onXRP.svg")}.page-tokenization .raised-in-space{content:url("../img/logos/raised-in-space.svg")}.page-tokenization .sologenic{content:url("../img/logos/sologenic.svg")}.page-tokenization .xaman{content:url("../img/logos/xaman-labs.svg")}.page-tokenization .xrpcafe{content:url("../img/logos/xrpcafe.svg")}.page-tokenization .prev img{content:url("../img/icons/prev.svg")}.page-tokenization .next img{content:url("../img/icons/prev.svg");transform:scaleX(-1)}.page-tokenization .arrow-wrapper{gap:1rem}.page-tokenization .arrow-button{background-color:#232325;border-radius:.25rem;align-items:center;justify-content:center}.page-tokenization .next.hover-color:hover img{content:url("../img/icons/next-purple.svg");transform:scaleX(1)}.page-tokenization .prev.hover-color:hover img{content:url("../img/icons/next-purple.svg");transform:scaleX(-1)}.page-tokenization .related-articles{gap:2.5rem}.page-tokenization .related-articles .col{background-color:#000;padding:2rem !important;border-radius:.5rem}.page-tokenization .related-articles .time{position:relative;padding-top:.5rem}.page-tokenization .related-articles .time::before{content:"";position:absolute;top:0;left:0;width:50px;height:4px;background-color:#32e685}.page-tokenization .project-cards a,.page-tokenization .related-articles a{text-decoration:none}.page-tokenization .project-cards a:hover .project-name{color:#9a52ff}.page-tokenization .related-articles a:hover .h5{color:#9a52ff}.page-tokenization .article-card-container{position:relative;width:100%}.page-tokenization .article-card-container:nth-child(1) .article-card-background{background-image:linear-gradient(86deg, #B20058 -21.16%, #E24CFF 31.78%, #9A52FF 101.64%)}.page-tokenization .article-card-container:nth-child(2) .article-card-background{background-image:linear-gradient(22deg, #B480FF -6.54%, #5F00E5 50.87%, #1AA4FF 114.16%)}.page-tokenization .article-card-container:nth-child(3) .article-card-background{background-image:linear-gradient(162deg, #B480FF -11.11%, #1AA4FF 56.26%, #2DCF78 112.84%)}.page-tokenization .article-card-background{height:calc(100% + 1.5rem);width:100%;z-index:1;background-size:cover;position:absolute;top:-0.75rem;border-radius:.5rem}.page-tokenization .article-card{width:100%;height:100%;position:relative;top:0;left:.75rem;z-index:2;display:block}.dark [data-component-name="Breadcrumbs/Breadcrumbs"]+div>a>svg>rect{fill:transparent}[data-component-name="layouts/RootLayout"]{padding-top:80px}.top-nav{background-color:#111112;height:80px;padding:0}.top-nav .navbar-brand{text-decoration:none;white-space:pre;-webkit-transition:opacity .2s ease,color .2s ease;transition:opacity .2s ease,color .2s ease;padding-left:2rem}.top-nav .navbar-brand .logo{margin-left:0;content:url(../img/XRPLedger_DevPortal-white.svg);width:162px;height:40px;display:block}.top-nav .navbar-brand:hover{opacity:.75}@media(max-width: 991.98px){.top-nav .navbar-brand{padding-left:2rem}.top-nav .navbar-brand img{width:120px}}.top-nav .nav-item{font-weight:600}@media(min-width: 992px){.top-nav #topnav-pages{flex-grow:1}}.top-nav #topnav-pages .nav-link{color:#f5f5f7;font-size:1rem;line-height:1.25rem;text-decoration:none;font-weight:600}.top-nav .dropdown-toggle{position:relative}.top-nav .dropdown-menu{border-width:0}.top-nav .dropdown-menu h5{font-weight:400;font-size:12px;color:#a2a2a4;margin-bottom:0}.top-nav .dropdown-menu .dropdown-item{line-height:1rem;padding:.75rem 0;white-space:normal}.top-nav .dropdown-menu .dropdown-item.dropdown-hero{width:100%;display:flex;padding:1rem 2rem}.top-nav .dropdown-menu .dropdown-item.dropdown-hero>img{width:68px;height:68px;background-color:#232325;border-radius:4px;flex-grow:0;padding:.75rem;margin-right:2rem;margin-top:auto;margin-bottom:auto}.top-nav .dropdown-menu .dropdown-item.dropdown-hero p{font-size:14px;color:#c1c1c2;margin:0;white-space:normal}.top-nav .dropdown-menu .dropdown-item.dropdown-hero h4{font-size:1.25rem;font-weight:600;margin-bottom:0;line-height:2rem}.top-nav .dropdown-menu .dropdown-item.dropdown-hero:hover h4{color:#9a52ff}.top-nav .dropdown-menu .dropdown-item.dropdown-hero:hover p{font-weight:400}.top-nav .dropdown-menu .dropdown-item:last-child{padding-bottom:0}.top-nav .dropdown-menu .dropdown-item:first-child{padding-top:0}.top-nav .dropdown-menu .col-for-get_started{background-color:#232325}.top-nav .dropdown-menu a:hover{color:#9a52ff;background-color:inherit}.top-nav .dropdown-menu h5:hover{background-color:inherit}.top-nav #topnav-search{flex-grow:1}.top-nav #topnav-search .input-group{flex-grow:1;flex-wrap:nowrap}@media(max-width: 991.98px){.top-nav #topnav-search .form-inline{padding:1rem 2rem}}.top-nav #topnav-search .input-group-text{height:40px}.top-nav #topnav-search .ds-input{height:40px}.top-nav #topnav-language .dropdown-item{font-weight:600}@media(min-width: 992px){.top-nav{padding:0 2rem}.top-nav .navbar-brand{margin-left:0;padding-left:0}.top-nav .dropdown-toggle::after{display:none}.top-nav .dropdown-toggle>span{border-bottom:2px solid transparent}.top-nav .dropdown .dropdown-toggle:hover>span:not(.chevron){padding-bottom:8px;border-bottom:2px solid #9a52ff;margin-bottom:-8px}.top-nav .dropdown-menu{border-radius:0 0 8px 8px;padding:2.5rem}.top-nav .dropdown-menu .dropdown-item.dropdown-hero{padding:0}.top-nav .dropdown-menu.show{display:grid;gap:40px}.top-nav .dropdown-menu.show#topnav_dd_about{grid-template-columns:180px 180px 180px}.top-nav .dropdown-menu.show#topnav_dd_docs{grid-template-columns:180px 180px 260px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_community{grid-template-columns:200px}.top-nav .dropdown-menu.show#topnav_dd_resources{grid-template-columns:195px 180px 180px;left:-200px}.top-nav .dropdown-menu.show .dropdown-hero{grid-row:1;grid-column:1/4}.top-nav .dropdown-menu.show #dropdown-hero-for-docs{grid-column:1/3}.top-nav .dropdown-menu.show .col-for-xrp_ledger{grid-row:1/3;grid-column:1}.top-nav .dropdown-menu.show .col-for-xrp{grid-column:2}.top-nav .dropdown-menu.show .col-for-sustainability,.top-nav .dropdown-menu.show .col-for-持続可能性{grid-column:2}.top-nav .dropdown-menu.show .col-for-about,.top-nav .dropdown-menu.show .col-for-概要{grid-row:1/3;grid-column:3}.top-nav .dropdown-menu.show .col-for-article_types{grid-column:1;grid-row:2}.top-nav .dropdown-menu.show .col-for-use_cases{grid-column:2;grid-row:2}.top-nav .dropdown-menu.show .col-for-get_started{grid-column:3;grid-row:1/3;margin:-40px -40px -40px 0;padding:40px}.top-nav .dropdown-menu.show .col-for-development{grid-column:1}.top-nav .dropdown-menu.show .col-for-current-status,.top-nav .dropdown-menu.show .col-for-現在のステータス{grid-column:2}.top-nav .dropdown-menu.show .col-for-join-in,.top-nav .dropdown-menu.show .col-for-参加する{grid-column:3}.top-nav .dropdown-menu.smaller-dropdown{min-width:180px;padding:1.25rem}.top-nav #topnav-pages{flex-grow:0}}@media(min-width: 992px)and (min-width: 992px)and (max-width: 1133px){.top-nav #topnav-pages .nav-link{padding:1rem 1rem}}@media(min-width: 992px){.top-nav #topnav-language{flex-grow:0}.top-nav #topnav-language hr{display:none}.top-nav #topnav-language #language_selector_header_btn{padding-right:0}}@media(min-width: 992px)and (min-width: 992px)and (max-width: 1133px){.top-nav #topnav-language #language_selector_header_btn{padding-left:1rem}}@media(min-width: 992px)and (min-width: 1200px){.top-nav #topnav-search{margin-left:3.5rem;margin-right:.5rem}.top-nav #topnav-language{margin-right:.5rem}.top-nav #topnav-button{margin-left:.2rem;margin-right:1rem}}@media(max-width: 991.98px){.top-nav .navbar-toggler{border:0;padding:30px 2rem;font-size:1rem;display:inline-block}.top-nav .navbar-toggler .navbar-toggler-icon{background:none;height:20px;width:20px;position:relative}.top-nav .navbar-toggler .navbar-toggler-icon::after,.top-nav .navbar-toggler .navbar-toggler-icon::before,.top-nav .navbar-toggler .navbar-toggler-icon div{position:absolute;content:" ";background-color:#f5f5f7;display:block;width:100%;height:3px;transition:all .2s ease}.top-nav .navbar-toggler .navbar-toggler-icon::before{top:0}.top-nav .navbar-toggler .navbar-toggler-icon::after{bottom:0}.top-nav .navbar-toggler .navbar-toggler-icon div{top:calc(50% - 1.5px)}.top-nav .navbar-toggler:not(.collapsed) .navbar-toggler-icon::before{transform:translateY(8px) rotate(135deg)}.top-nav .navbar-toggler:not(.collapsed) .navbar-toggler-icon::after{transform:translateY(-9px) rotate(-135deg)}.top-nav .navbar-toggler:not(.collapsed) .navbar-toggler-icon div{transform:scale(0)}.top-nav .navbar-nav{align-items:unset !important}.top-nav .navbar-nav #topnav-button{background-color:#111112;padding:1rem 1.5rem}.top-nav .navbar-nav #topnav-search [data-component-name="Search/SearchTrigger"]{cursor:pointer}.top-nav .navbar-nav .nav-link,.top-nav .navbar-collapse>.nav-item{line-height:150%;background:#111112}.top-nav .navbar-nav .nav-link label,.top-nav .navbar-collapse>.nav-item label{margin-bottom:0}.top-nav .navbar-nav .nav-link{padding:1rem 2rem}.top-nav .dropdown-menu{margin:0;width:100%;overflow:auto;transition:all .2s ease;height:0;display:block;padding:0;border-radius:0}.top-nav .dropdown-menu.show{height:calc(100vh - 80px - 52px)}.top-nav .dropdown-menu.show>:last-child{padding-bottom:4rem}.top-nav .dropdown-menu.show#topnav_dd_docs{display:grid;grid-template-columns:minmax(187px, 1fr) minmax(187px, 1fr);gap:1px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_docs .dropdown-hero{grid-column:1/3;grid-row:1}.top-nav .dropdown-menu.show#topnav_dd_docs .col-for-document_types{grid-column:1;grid-row:2}.top-nav .dropdown-menu.show#topnav_dd_docs .col-for-use_cases{grid-column:2;grid-row:2}.top-nav .dropdown-menu.show#topnav_dd_docs .col-for-get_started{grid-column:1/3;grid-row:4;margin:-1px;padding-top:33px}.top-nav .dropdown-menu .navcol{padding:1rem 2rem}.top-nav .dropdown-menu.smaller-dropdown{padding:0 2rem}.top-nav .dropdown-menu.smaller-dropdown.show{padding:1rem 2rem;height:auto}.top-nav .dropdown-menu .dropdown-hero:first-child{padding-top:1rem}.top-nav .dropdown-toggle:not(.with-caret)::before,.top-nav .dropdown-toggle:not(.with-caret)::after{border:0;font-family:FontAwesome;color:#9a52ff;font-size:.75rem;transition:all .2s ease;overflow:clip;width:1rem}.top-nav .dropdown-toggle:not(.with-caret)::before{content:"";display:inline-block;margin-bottom:-5px}.top-nav .dropdown-toggle:not(.with-caret)::after{content:"";position:absolute;right:2rem}.top-nav .dropdown.show .dropdown-toggle::after{text-indent:5rem}.top-nav .dropdown:not(.show) .dropdown-toggle::before{width:0;height:0;text-indent:-5rem}.top-nav .dropdown-toggle.with-caret::after{border:0}.top-nav #top-main-nav{background-color:#232325;padding-top:32px;position:relative}.top-nav #top-main-nav.submenu-expanded{padding-top:0}.top-nav #top-main-nav.submenu-expanded .dropdown:not(.show) .dropdown-toggle{display:none}.top-nav #top-main-nav.submenu-expanded #topnav-search,.top-nav #top-main-nav.submenu-expanded #topnav-language,.top-nav #top-main-nav.submenu-expanded #topnav-theme{height:0;overflow:clip;padding-top:0;padding-bottom:0}.top-nav #topnav-search{position:absolute;top:0;right:105px}.top-nav #topnav-search .input-group{flex-wrap:nowrap}.top-nav #topnav-language{position:absolute;top:0;right:65px}.top-nav #topnav-language hr{border-top:1px solid #232325;margin-top:.25rem;margin-bottom:.25rem;display:static}.top-nav #topnav-theme{position:absolute;top:0;right:26px}}article h1:before,article h2:before,article h3:before,article h4:before,article h5:before,article h6:before,.interactive-block:before{display:block;content:" ";margin-top:-24px;height:60px;visibility:hidden;pointer-events:none}article h1:first-of-type:before{margin-top:-40px}.chevron{position:relative;display:inline-block;width:.75rem;height:.5625rem}.chevron span{position:absolute;top:.25rem;display:inline-block;width:.5rem;height:.15rem;background-color:#9a52ff;transition:all .2s ease;border:none}.chevron:not(.expander) span:first-of-type{left:0;transform:rotate(45deg)}.chevron:not(.expander) span:last-of-type{right:0;transform:rotate(-45deg)}.chevron.active span:first-of-type{transform:rotate(-45deg)}.chevron.active span:first-of-type{transform:rotate(45deg)}.dropdown.show .chevron span:first-of-type,.expander:not(.collapsed) .chevron span:first-of-type{transform:rotate(-45deg)}.dropdown.show .chevron span:last-of-type,.expander:not(.collapsed) .chevron span:last-of-type{transform:rotate(45deg)}#topnav-theme>div{border-radius:var(--language-picker-border-radius);color:var(--language-picker-text-color);background-color:var(--language-picker-background-color);border:1px solid var(--language-picker-border-color);padding:var(--language-picker-input-padding-vertical) var(--language-picker-input-padding-horizontal);min-height:var(--language-picker-min-height)}@media(max-width: 991.98px){.navbar-collapse,.dropdown-menu{box-shadow:0px 25px 40px -20px #000}}.top-banner{display:flex;align-items:center;justify-content:center;height:46px;background:url(../img/backgrounds/bg-apex-banner.svg);background-position:center !important;background-size:cover;background-color:#7919ff;color:#fff}.top-banner .inner-apex{display:flex;justify-content:center;align-items:center}.top-banner .apex-banner-text{color:#fff;font-family:"Work Sans";font-size:20px;font-style:normal;font-weight:600;line-height:24px}.top-banner .apex-btn{margin-left:16px;color:var(--Gray-100, #000) !important;font-family:"Work Sans";font-size:16px;font-style:normal;display:flex;justify-content:center;font-weight:600;align-items:center;line-height:100%;letter-spacing:-0.16px;padding:2px 4px;border-radius:100px !important;background:#18ff83 !important;text-decoration:none !important;width:135px;height:28px}@media(max-width: 1024px){.top-banner{background:url(../img/backgrounds/bg-apex-banner-md.svg)}.top-banner .apex-banner-text{font-size:18px}.top-banner .apex-btn{width:122px;height:26px;font-size:14px;letter-spacing:-0.14px}}@media(max-width: 535px){.top-banner{background:url(../img/backgrounds/bg-apex-banner-sm.svg)}.top-banner .apex-btn{margin-left:0;width:85px;height:16px;font-size:10px;line-height:100%;letter-spacing:-0.1px}.top-banner .apex-banner-text{font-size:12px;line-height:12px}.top-banner .inner-apex{flex-direction:column;gap:8px}}[data-component-name="Markdown/Markdown"] article{padding-bottom:50px}[data-component-name="Markdown/Markdown"] article p code,[data-component-name="Markdown/Markdown"] article table code,[data-component-name="Markdown/Markdown"] article li>code{background-color:#0a2e1b;color:#5beb9d}[data-component-name="Markdown/Markdown"] article a{text-decoration:underline}[data-component-name="Markdown/Markdown"] article h1{font-size:3rem;margin-top:32px;line-height:1.2;font-weight:700}[data-component-name="Markdown/Markdown"] article h1:first-child{margin-top:0;line-height:1.2}[data-component-name="Markdown/Markdown"] article h2,[data-component-name="Markdown/Markdown"] article h2.md{margin-top:2.5rem;margin-bottom:1.5rem;font-size:2.5rem;font-weight:600;line-height:1.2}[data-component-name="Markdown/Markdown"] article h3,[data-component-name="Markdown/Markdown"] article h3.md{font-size:2.125rem;margin-top:2rem;margin-bottom:1rem;line-height:1.2}[data-component-name="Markdown/Markdown"] article h4{font-size:1.75rem;margin-top:1.5rem;margin-bottom:.5rem;line-height:1.2}[data-component-name="Markdown/Markdown"] article h5{font-size:1.25rem;margin-top:1.25rem;line-height:1.2;font-weight:700}[data-component-name="Markdown/Markdown"] article h6{font-size:1rem;margin-top:1rem;line-height:1.2;font-weight:700}[data-component-name="Markdown/Markdown"] article li{margin:6px;margin-top:24px}[data-component-name="Markdown/Markdown"] article li p{margin:0}[data-component-name="Markdown/Markdown"] article a[title=Source]{float:right;padding-left:20px}[data-component-name="Markdown/Markdown"] article h1.invisible,[data-component-name="Markdown/Markdown"] article h2.invisible,[data-component-name="Markdown/Markdown"] article h3.invisible,[data-component-name="Markdown/Markdown"] article h4.invisible,[data-component-name="Markdown/Markdown"] article h5.invisible,[data-component-name="Markdown/Markdown"] article h6.invisible{font-size:0;line-height:0;margin:0}[data-component-name="Markdown/Markdown"] article h1.invisible .hover_anchor,[data-component-name="Markdown/Markdown"] article h2.invisible .hover_anchor,[data-component-name="Markdown/Markdown"] article h3.invisible .hover_anchor,[data-component-name="Markdown/Markdown"] article h4.invisible .hover_anchor,[data-component-name="Markdown/Markdown"] article h5.invisible .hover_anchor,[data-component-name="Markdown/Markdown"] article h6.invisible .hover_anchor{display:none}[data-component-name="Markdown/Markdown"] article .shield{display:inline-block !important;vertical-align:middle}.blurb a{text-decoration:underline}.hover_anchor{visibility:hidden;padding-left:1rem;font-size:1.25rem}h1:hover .hover_anchor,h2:hover .hover_anchor,h3:hover .hover_anchor,h4:hover .hover_anchor,h5:hover .hover_anchor,h6:hover .hover_anchor{visibility:visible;text-decoration:none}pre{color:#fff;background-color:#232325;word-wrap:normal;padding:2rem;border-radius:4px}pre code{white-space:pre;color:#fff;background-color:#232325}.multicode{padding:0;z-index:1;position:relative}.multicode pre{background:none;border:none;border-radius:0;padding:0;clear:both}.multicode pre code{overflow:auto;max-height:24em;border-radius:0 4px 4px 4px;display:block;padding:2rem}.multicode pre code.expanded{overflow:visible;max-height:none;position:absolute;min-width:100%}.multicode ul{margin:0 !important;padding:0}.multicode ul li{display:block;float:left;list-style-type:none;margin-right:0px;margin-left:0px;border:0;clear:none}.multicode a{text-decoration:none;color:#fff;background-color:transparent;padding:.75rem 2rem;margin:0;border-radius:4px 4px 0 0}.multicode a.current{background-color:#232325}.multicode a:hover{text-decoration:none;background-color:#232325;color:#9a52ff;padding-bottom:.625rem}.multicode .btn{z-index:10}.multicode .codetabs{position:relative;z-index:10}.clipboard-btn{z-index:10;margin-right:10px}.codehilite{background:#232325;color:#fff}.codehilite .c,.codehilite .ch,.codehilite .cm,.codehilite .cp,.codehilite .cpf,.codehilite .c1,.codehilite .cs{color:#838386}.codehilite .k,.codehilite .kc,.codehilite .kd,.codehilite .kn,.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#ff6719}.codehilite .m,.codehilite .mb,.codehilite .mh,.codehilite .mi,.codehilite .mo,.codehilite .il{color:#19a3ff}.codehilite .n,.codehilite .na,.codehilite .nb,.codehilite .nc,.codehilite .nd,.codehilite .ne,.codehilite .nf,.codehilite .ni,.codehilite .nl,.codehilite .nn,.codehilite .nt,.codehilite .nv,.codehilite .nx,.codehilite .bp,.codehilite .fm,.codehilite .py{color:#fff}.codehilite .p{color:#e0e0e1}.codehilite .s,.codehilite .s1,.codehilite .s2,.codehilite .sa,.codehilite .sb,.codehilite .sc,.codehilite .dl,.codehilite .sd,.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#28b86a}.codehilite{background:transparent;position:relative}.codehilite .btn-group{top:1rem;right:1rem;position:absolute}.multicode .codehilite .btn-group{top:70px;right:20px}#redocly_root .cm-foldPlaceholder{background-color:#232325;border:none;font-size:18px}article img{max-width:100%;height:auto}article svg{max-width:100%}article .floating-diagram{margin:.5rem;float:left}article li{clear:left}html:not(.light) article svg[fill=black]{fill:#fff;stroke:#fff}html:not(.light) article svg[fill=black] *[fill=white]{fill:#000}html:not(.light) article svg[fill=black] *[stroke=white]{stroke:#000}html:not(.light) article svg[fill=black] *[fill=black]{fill:#fff}html:not(.light) article svg[fill=black] *[stroke=black]{stroke:#fff}html:not(.light) article svg[fill=black] g[fill=blue]{fill:#19a3ff}html:not(.light) article svg[fill=black] g[stroke=blue]{stroke:#19a3ff}html:not(.light) article svg[fill=black] g[fill="rgb(120,120,120)"]{fill:#e0e0e1}html:not(.light) article svg[fill=black] g[stroke="rgb(120,120,120)"]{stroke:#e0e0e1}html:not(.light) article svg[fill=black] g[fill="rgb(200,200,200)"]{fill:#343437}html:not(.light) article svg[fill=black] g[fill="rgb(70,70,70)"]{fill:#838386}html:not(.light) article svg[fill=black] g[stroke="rgb(70,70,70)"]{stroke:#838386}html:not(.light) article svg[fill=black] g[fill="rgb(29,180,255)"]{fill:#9a52ff}html:not(.light) article svg[fill=black] g[stroke="rgb(29,180,255)"]{stroke:#9a52ff}html:not(.light) article svg[fill=black] rect[stroke="rgb(245,247,249)"]{stroke:#000}html:not(.light) article svg[fill=black] g[fill=lime],html:not(.light) article svg[fill=black] g[fill="rgb(0,255,0)"]{fill:#9a52ff}html:not(.light) article svg[fill=black] g[stroke=lime],html:not(.light) article svg[fill=black] g[stroke="rgb(0,255,0)"]{stroke:#9a52ff}html:not(.light) article svg[fill=black] g[fill=yellow],html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#faff19}html:not(.light) article svg[fill=black] g[fill=yellow] path[stroke=black],html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"] path[stroke=black]{stroke:#000}html:not(.light) article svg[fill=black] g[fill=red],html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#ff198b}html:not(.light) article svg[fill=black] g[stroke=red],html:not(.light) article svg[fill=black] g[stroke="rgb(255,255,0)"]{stroke:#ff198b}html:not(.light) article svg[fill=black] g[fill=yellow]+g text,html:not(.light) article svg[fill=black] g[fill="rgb(255,255,0)"]+g text{fill:#000}html:not(.light) article svg[fill=black] g[fill=lime]+g text{fill:#000}html:not(.light) article svg[fill=none] path[fill="#000000"]{fill:#fff}html:not(.light) article svg[fill=none] path[stroke="#000000"]{stroke:#fff}html:not(.light) article svg[fill=none] path[fill="#ffffff"]{fill:#000}html:not(.light) article svg[fill=none] path[stroke="#ffffff"]{stroke:#000}html:not(.light) article svg[fill=none] path[fill="#23292f"],html:not(.light) article svg[fill=none] path[fill="#23282f"]{fill:#fff}html:not(.light) article svg[fill=none] path[stroke="#23292f"],html:not(.light) article svg[fill=none] path[stroke="#23282f"]{stroke:#fff}html:not(.light) article svg[fill=none] path[fill="#2c3e50"],html:not(.light) article svg[fill=none] path[fill="#2b3e51"]{fill:#e0e0e1}html:not(.light) article svg[fill=none] path[stroke="#2c3e50"],html:not(.light) article svg[fill=none] path[stroke="#2b3e51"]{stroke:#e0e0e1}html:not(.light) article svg[fill=none] path[fill="#1c2835"]{fill:#f5f5f7}html:not(.light) article svg[fill=none] path[stroke="#1c2835"]{stroke:#f5f5f7}html:not(.light) article svg[fill=none] path[fill="#21aa47"]{fill:#32e685}html:not(.light) article svg[fill=none] path[stroke="#21aa47"]{stroke:#32e685}html:not(.light) article svg[fill=none] path[fill="#e64b3b"]{fill:#dc3545}html:not(.light) article svg[fill=none] path[stroke="#e64b3b"]{stroke:#dc3545}html:not(.light) article svg[fill=none] path[stroke="#27a2db"],html:not(.light) article svg[fill=none] path[stroke="#00aae4"]{stroke:#9a52ff}html:not(.light) article svg[fill=none] path[fill="#27a2db"],html:not(.light) article svg[fill=none] path[fill="#00aae4"]{fill:#9a52ff}html:not(.light) article svg[fill=none] path[fill="#e6e7e8"]{fill:#232325}html:not(.light) article svg[fill=none] path[stroke="#e6e7e8"]{stroke:#232325}html:not(.light) article svg[fill=none] path[stroke="#ffbf27"]{stroke:#d919ff}html:not(.light) article svg[fill=none] path[fill="#00ff00"]{fill:#32e685}html:not(.light) article svg[fill=none] path[stroke="#00ff00"]{stroke:#32e685}html:not(.light) article svg[fill=none] path[fill="#ff00ff"]{fill:#ff198b}html:not(.light) article svg[fill=none] path[stroke="#ff00ff"]{stroke:#ff198b}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#ffffff"]{stop-color:#343437}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#e6e7e8"]{stop-color:#232325}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#dbdcdd"]{stop-color:#000}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#b1b3b5"]{stop-color:#111112}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#29a1da"]{stop-color:#2dcf78}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#2789b9"]{stop-color:#5beb9d}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#6bc1ec"]{stop-color:#adf5ce}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#8ad6f4"]{stop-color:#84f0b6}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#fab913"]{stop-color:#f2b2ff}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#fad26b"]{stop-color:#ea80ff}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#f8a136"]{stop-color:#e24cff}html:not(.light) article svg[fill=none] linearGradient stop[stop-color="#f7931a"]{stop-color:#c000e5}html.light svg[fill=black] g[fill=blue]{fill:#006bb2}html.light svg[fill=black] g[stroke=blue]{stroke:#19a3ff}html.light svg[fill=black] g[fill="rgb(120,120,120)"]{fill:#343437}html.light svg[fill=black] g[stroke="rgb(120,120,120)"]{stroke:#343437}html.light svg[fill=black] g[fill="rgb(200,200,200)"]{fill:#a2a2a4}html.light svg[fill=black] g[fill="rgb(70,70,70)"]{fill:#343437}html.light svg[fill=black] g[stroke="rgb(70,70,70)"]{stroke:#343437}html.light svg[fill=black] g[fill="rgb(29,180,255)"]{fill:#19a3ff}html.light svg[fill=black] g[stroke="rgb(29,180,255)"]{stroke:#006bb2}html.light svg[fill=black] rect[stroke="rgb(245,247,249)"]{stroke:#fcfcfd}html.light svg[fill=black] g[fill=lime],html.light svg[fill=black] g[fill="rgb(0,255,0)"]{fill:#5beb9d}html.light svg[fill=black] g[stroke=lime],html.light svg[fill=black] g[stroke="rgb(0,255,0)"]{stroke:#28b86a}html.light svg[fill=black] g[fill=yellow],html.light svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#fcff80}html.light svg[fill=black] g[fill=red],html.light svg[fill=black] g[fill="rgb(255,255,0)"]{fill:#ff4ba4}html.light svg[fill=black] g[stroke=red],html.light svg[fill=black] g[stroke="rgb(255,255,0)"]{stroke:#ff198b}html.light svg[fill=none] rect[fill="#111112"]{fill:#f5f5f7}html.light svg[fill=none] path[fill=white]{fill:#000}html.light svg[fill=none] path[fill="#343437"]{fill:#c1c1c2}html.light svg[fill=none] path[fill="#A2A2A4"],html.light svg[fill=none] rect[fill="#A2A2A4"],html.light svg[fill=none] ellipse[fill="#A2A2A4"]{fill:#454549}html.light svg[fill=none] path[fill="#232325"]{fill:#e0e0e1}html.light svg[fill=none] path[fill="#F5F5F7"]{fill:#111112}html.light svg[fill=none] path[stroke="#F5F5F7"]{stroke:#111112}html.light svg[fill=none] path[stroke="#FF198B"]{stroke:#b20058}html.light svg[fill=none] linearGradient stop[stop-color="#F5F5F7"]{stop-color:#111112}html.light svg[fill=none] linearGradient stop[stop-color="#C1C1C2"]{stop-color:#343437}.external-link::after{content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;display:inline-block;background-size:16px;padding:0 4px 0 8px;width:16px;height:16px;background-position:center;transition:transform 100ms ease-in-out}.external-link:hover::after{transform:translate(3px, -3px)}.external-link .fa-external-link{display:none}.top-nav .dropdown .external-link::after,.xrpl-footer .external-link::after{background-position:left 6px bottom 1px;width:2rem}@-moz-document url-prefix(){@supports(animation: calc(0s)){.top-nav .dropdown .external-link::after,.xrpl-footer .external-link::after{background-position:left 8px bottom 2px}}}.top-nav .dropdown .external-link:hover::after,.xrpl-footer .external-link:hover::after{background-position:left 8px bottom 3px}.q-wrapper .external-link::after{background-position:left 0 bottom 7px}.q-wrapper .external-link:hover::after{background-position:left 4px bottom 11px}.li-links{position:relative;border-bottom:2px solid #454549}.li-links a{width:100%;padding:16px 0}.li-links a::after{position:absolute;right:4px;content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;display:inline-block;background-size:1.5rem;padding:0 .5rem;background-position:left 0 bottom -0.1rem;transition:background-position 100ms ease-in-out}.li-links a:hover::after{background-position:left .2rem bottom .1rem}[data-component-name="Footer/Footer"]{padding:7.5rem 2rem}[data-component-name="Footer/Footer"] [data-component-name="Footer/FooterColumn"]{text-shadow:#111112 0px 0px 2px,#111112 1px 1px 2px,#111112 2px 2px 3px,#111112 2px 2px 4px,#111112 2px 2px 5px,#111112 2px 2px 6px,#111112 -1px -1px 2px,#111112 -2px -2px 3px,#111112 -2px -2px 4px}@media(min-width: 992px){[data-component-name="Footer/Footer"]{background-image:url(../img/backgrounds/footer.svg);background-size:cover;background-repeat:no-repeat;background-position:bottom right}}@media(max-width: 991.98px){[data-component-name="Footer/Footer"] .col-lg:not(:first-child){margin-top:4rem}}[data-component-name="Footer/Footer"] h5{font-size:1rem;font-weight:600;color:#a2a2a4}[data-component-name="Footer/Footer"] .nav-link{padding:.75rem 0;line-height:1}[data-component-name="Footer/Footer"] .absolute-bottom-footer{font-size:10px;line-height:1rem}@media(max-width: 991.98px){[data-component-name="Footer/Footer"] .absolute-bottom-footer .copyright-license{margin-top:3rem}}.devportal-callout.tip,.devportal-callout.ヒント{border-color:#32e685}.devportal-callout.tip>strong:first-child:before,.devportal-callout.ヒント>strong:first-child:before{color:#32e685}.devportal-callout.note>strong:first-child:before,.devportal-callout.注記>strong:first-child:before{color:#19a3ff}.devportal-callout.note,.devportal-callout.注記{border-color:#19a3ff}.devportal-callout.caution,.devportal-callout.注意{border-color:#faff19}.devportal-callout.caution>strong:first-child:before,.devportal-callout.注意>strong:first-child:before{color:#faff19}.devportal-callout.warning,.devportal-callout.警告{border-color:#ff198b}.devportal-callout.warning>strong:first-child:before,.devportal-callout.警告>strong:first-child:before{color:#ff198b}blockquote,.devportal-callout{border-style:solid;border-radius:0;border-width:1px;border-left-width:4px;padding:5px;padding-left:25px;page-break-inside:avoid}.devportal-callout>strong:first-child{display:block;page-break-after:avoid}.devportal-callout.tip>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.note>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.caution>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.warning>strong:first-child:before{content:"";font-family:FontAwesome;margin-left:-20px;padding-right:5px}@media(min-width: 992px){.card,.cta-card,.q-wrapper{box-shadow:0px 5px 40px #000}}#code-samples-deck .card{box-shadow:none;margin:0 2rem 5rem 2rem}#code-samples-deck .card-header{border-bottom:none;background-color:unset}#code-samples-deck .card-footer{background-color:unset;font-size:initial}#code-samples-deck .card-deck .card a{margin:0 2.5rem 5rem 2.5rem}#code-samples-deck .circled-logo{margin-left:-15px}@media(min-width: 992px){.code-contribute{width:75vw;position:relative;left:20%;right:20%;margin-left:-30vw;margin-right:-30vw}}.contribute::before{content:"";display:block;height:2px;width:100%;position:absolute;top:0}.contribute .dot{height:16px;width:16px;background-color:#111112;border-radius:50%;border:3px solid #fbff4c;display:inline-block;position:absolute;top:-7px;left:-6px}@media(max-width: 991.98px){.contribute::before{left:0;height:100%;width:2px;top:15px}.contribute .dot{top:5px;left:-6px}}.contribute_1::before{background:-webkit-linear-gradient(left, #feff01, #ff2d9a)}.contribute_1 .dot{border-color:#fbff4c}.contribute_2::before{background:-webkit-linear-gradient(left, #ff2d9a, #e24cff)}.contribute_2 .dot{border-color:#ff198b}.contribute_3::before{background:-webkit-linear-gradient(left, #e24cff, #9a52ff)}.contribute_3 .dot{border-color:#c000e5}.contribute_4::before{background:-webkit-linear-gradient(left, #9a52ff, #9a52ff)}.contribute_4 .dot{border-color:#9a52ff}.card>img{border-radius:8px 8px 0 0}.card-body>p,.card-body>p:not(:last-child){padding:0;margin-bottom:2rem}main a.card{border:0;color:#fff}a.card:hover,a:hover .card-new,[data-component-name="Markdown/Markdown"] a.card{text-decoration:none !important}a.card:hover h3{text-decoration:underline}.circled-logo{background-color:#454549;border-radius:50%;padding:.65rem;width:50px;height:50px;margin-bottom:.75rem;border:2px solid #232325}.circled-logo img{width:26px;height:26px;display:inline-block}.light .circled-logo{border:none}.card-deck{margin-top:2.5rem;margin-left:-1.25rem;margin-right:-1.25rem;margin-bottom:5rem;flex-grow:1}@media(min-width: 992px){.card-deck{margin-top:5rem}}.card-deck .card{flex-grow:0;flex-basis:100%;margin:0 1.25rem 5rem 1.25rem;background-position:bottom;background-repeat:no-repeat;background-size:contain}.card-deck.row-cols-1 .card{flex-basis:100%;min-height:264px}@media(min-width: 768px){.card-deck.row-cols-1 .card{min-height:347px}}@media(min-width: 1200px){.card-deck.row-cols-lg-3{margin-left:-2.5rem;margin-right:-2.5rem}}@media(min-width: 992px){.card-deck.row-cols-lg-3 .card{flex-basis:calc(33% - 2.5rem )}}@media(min-width: 1200px){.card-deck.row-cols-lg-3 .card{margin:0 2.5rem 5rem 2.5rem;flex-basis:calc(33% - 5rem )}}@media(min-width: 992px){.card-deck.row-cols-lg-4 .card{flex-basis:calc(25% - 2.5rem )}}.card-deck a.card{transition:all .35s ease-out;cursor:pointer}.card-deck a.card:hover{-webkit-transform:translateY(-16px);-moz-transform:translateY(-16px);-ms-transform:translateY(-16px);-o-transform:translateY(-16px);transform:translateY(-16px)}.card-deck .card-footer{font-size:0;padding:1rem;background-position:bottom;background-repeat:no-repeat;background-size:cover;border-top:0}@media(max-width: 991.98px){.card-deck{margin-top:2rem}.card-deck .card-body{padding:1rem}.card-deck.row-cols-1 .card{margin:.75rem .75rem 5rem .75rem;max-width:calc(100% - 1.5rem)}.card-deck.row-cols-2 .card{margin:.75rem;max-width:calc(50% - 1.5rem)}}main article .card-grid.card-grid-3xN{grid-gap:1rem}main article .card-grid.card-grid-3xN .card{padding:0;margin:.5rem}main article .card-grid.card-grid-3xN .card .card-body{padding:1rem}main article .card-grid.card-grid-3xN .card .card-icon-container{width:50px;height:50px;background:#454549;display:flex;justify-content:center;align-items:center;border-radius:50%;margin-bottom:12px}main article .card-grid.card-grid-3xN .card .card-icon-container img{width:70%;height:70%}main article .card-grid.card-grid-3xN .card .card-footer{font-size:0;line-height:0;padding:1rem;background-position:bottom;background-repeat:no-repeat;background-size:cover;border-top:0}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3-col-light-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-purple-blue-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-magenta-3.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-light-blue-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3col-orange-yellow-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-pink-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(0) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-green-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-purple2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-neutral-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-purple-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3-col-pink2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-orange.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-blue-light-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(1) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-magenta-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3-col-light-blue-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-light-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3-col-purple-blue.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-orange-3.svg")}main article .card-grid.card-grid-3xN:nth-of-type(2) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-blue-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(1) .card-footer{background-image:url("../img/cards/3-col-green.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(2) .card-footer{background-image:url("../img/cards/3-col-orange.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-purple-blue-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-purple.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(5) .card-footer{background-image:url("../img/cards/3-col-light-blue2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(6) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(7) .card-footer{background-image:url("../img/cards/3-col-pink.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(8) .card-footer{background-image:url("../img/cards/3col-green-2.svg")}main article .card-grid.card-grid-3xN:nth-of-type(3) .card:nth-child(9) .card-footer{background-image:url("../img/cards/3col-orange-2.svg")}.cta-card{text-align:center;background-color:#232325}.card-subhead{font-size:1rem;margin-bottom:.25rem;margin-top:.5rem}.breadcrumbs-wrap{position:relative;z-index:11;padding:0 0 2rem 0}.interactive-block .breadcrumbs-wrap{padding:0}.breadcrumb-item+.breadcrumb-item:before{content:"";font-family:FontAwesome;padding-right:5px}.breadcrumbs-wrap .breadcrumb{padding:0;margin-bottom:0;font-size:.833em}.breadcrumb-item a{color:#e0e0e1;text-decoration:none}.breadcrumb-item a:hover{color:#9a52ff}.landing .container-fluid.section-hero,.landing .section-hero.container-sm,.landing .section-hero.container-md,.landing .section-hero.container-lg,.landing .section-hero.container-xl{padding:48px 0}.landing article .children-display>ul>li,.landing article .curated-links>ul>li{margin-top:24px}.landing article .children-display li a,.landing article .curated-links li a{font-weight:700;font-size:1.25rem;text-decoration:none}.landing article .children-display li a:hover,.landing article .curated-links li a:hover{text-decoration:underline}.landing section:first-of-type h1:first-child{margin-top:0;line-height:1.2}.landing .level-1,.landing .level-2{margin-top:0}.landing .curated-links ul,.landing .curated-links ol,.landing .children-display ul{padding-left:0;margin-bottom:0}.landing .section-hero .blurb{font-size:1.2em;line-height:1.71em}.landing .doc-index .level-1{list-style-type:disc;margin-left:1rem}.landing .doc-index .level-2{list-style-type:circle;margin-left:2rem}.landing .doc-index .level-3{list-style-type:square;margin-left:3rem}.landing .doc-index .level-4{list-style-type:disc;margin-left:4rem}.landing .doc-index .level-5{margin-left:5rem;list-style-type:circle}.landing .doc-index .level-6{margin-left:6rem;list-style-type:square}.landing p a,.landing h5 a{color:#9a52ff;font-weight:600}.landing p a:hover,.landing h5 a:hover{text-decoration:underline}.landing .display-4{margin-bottom:1.5rem}.landing #test-net-servers h3{font-size:1.4rem;font-weight:700}.landing #test-net-servers pre{overflow-x:auto}.landing section:first-of-type{border-top-width:0}.landing #main_content_wrapper{border-bottom:none;margin-top:80px}.landing .marketing-wrapper{margin-top:10rem;margin-bottom:6rem}@media(max-width: 767.98px){.landing .marketing-wrapper{margin-top:6rem}}.landing .nav .nav-link{padding:1rem 2rem 1rem 0;color:#e0e0e1;border-bottom:1px solid #232325;position:relative}.landing .nav .nav-link:hover{color:#9a52ff}.landing .nav .nav-link:not(.external-link)::after{content:" ";background-image:url(../img/icons/arrow-right-purple.svg);background-repeat:no-repeat;background-position:center;background-size:1rem;position:absolute;right:0;width:1.5rem;height:1.5rem;transition:all .2s ease}.landing .nav .nav-link:not(.external-link):hover::after{animation:arrowDance2 1.2s infinite}.landing .nav .nav-link.external-link::after{content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;position:absolute;background-position:center;background-size:.75rem;right:7px;width:1.5rem;height:1.5rem;transition:all .2s ease}.landing .nav .nav-link.external-link:hover::after{animation:arrowDanceDiag 1.2s infinite}.landing .card-body .nav .nav-link{border-bottom:1px solid #454549}.alert-info{color:#fff;background-color:#006bb2;border-width:0}.alert-info a{text-decoration:underline;color:#fff}.alert-info a:hover{color:#e0e0e1}.highlight-subcard{margin:1.5rem 0;padding:1rem;border:2px solid #fff;background:#111112}.interactive-block-inner{border:1px dashed #9a52ff;padding:10px;margin:5px}.interactive-block-ui>button{margin:10px 0}.interactive-block input:invalid{box-shadow:inset 0 0 5px 5px #ff198b}.interactive-block .breadcrumbs-wrap{margin-bottom:11px}.interactive-block .breadcrumb-item{margin-top:6px}.interactive-block .breadcrumb-item a{text-decoration:none}.interactive-block .breadcrumb-item.current a{font-weight:bold}.interactive-block .breadcrumb-item.active a{color:#b480ff}.interactive-block .breadcrumb-item.disabled a{color:#454549}.interactive-block .breadcrumb-item.done a:after{content:"";font-family:FontAwesome;color:#e0e0e1;padding-right:5px;padding-left:5px}.interactive-block .waiting-for-tx{word-break:break-word}.ws-console{height:200px;overflow:auto}.status{cursor:help;padding:1px 2px;font-weight:normal;text-indent:0}.status.not_enabled{color:#faff19}.status.removed{color:#ff198b}.labels-wrap ul::before{content:"";font-family:FontAwesome;font-size:1.5rem}.labels-wrap .list-inline-item{margin-top:.5rem}.pg-category{color:#a2a2a4}.pg-category::after{content:"";font-family:FontAwesome;padding-left:5px}.label{border-radius:100px;border-width:0;padding:.5rem 1rem;font-weight:bold;text-decoration:none !important;text-align:center;white-space:nowrap;background-color:#111112;color:#c1c1c2}.label .badge-pill{width:24px;height:24px;border-radius:50px;margin-left:.5rem;font-weight:400;line-height:23px;font-size:16px;padding:0;margin-top:-2px}html.light .label{background-color:#e0e0e1;color:#232325}html.light .label .badge-pill{color:#e0e0e1;background-color:#232325}html.light .label:hover{background-color:#c1c1c2;color:#111112}html.light .label:hover .badge-pill{color:#c1c1c2;background-color:#111112}.label .badge-pill{color:#111112;background-color:#c1c1c2}.label:hover{color:#e0e0e1;background-color:#232325}.label:hover .badge-pill{color:#232325;background-color:#e0e0e1}.label.label-accounts,.label.label-payment-channels,.label.label-amm,.label.label-アカウント,.label.label-payment-channel,.label.label-use-infrastructure,.label.label-use-security,.label.blog-category-development,.label.chip-indigo{background-color:#20004c;color:#b480ff}.label.label-accounts .badge-pill,.label.label-payment-channels .badge-pill,.label.label-amm .badge-pill,.label.label-アカウント .badge-pill,.label.label-payment-channel .badge-pill,.label.label-use-infrastructure .badge-pill,.label.label-use-security .badge-pill,.label.blog-category-development .badge-pill,.label.chip-indigo .badge-pill{color:#20004c;background-color:#b480ff}.label.label-accounts:hover,.label.label-payment-channels:hover,.label.label-amm:hover,.label.label-アカウント:hover,.label.label-payment-channel:hover,.label.label-use-infrastructure:hover,.label.label-use-security:hover,.label.blog-category-development:hover,.label.chip-indigo:hover{background-color:#350080;color:#d2b2ff}.label.label-accounts:hover .badge-pill,.label.label-payment-channels:hover .badge-pill,.label.label-amm:hover .badge-pill,.label.label-アカウント:hover .badge-pill,.label.label-payment-channel:hover .badge-pill,.label.label-use-infrastructure:hover .badge-pill,.label.label-use-security:hover .badge-pill,.label.blog-category-development:hover .badge-pill,.label.chip-indigo:hover .badge-pill{color:#350080;background-color:#d2b2ff}html.light .label.label-accounts,html.light .label.label-payment-channels,html.light .label.label-amm,html.light .label.label-アカウント,html.light .label.label-payment-channel,html.light .label.label-use-infrastructure,html.light .label.label-use-security,html.light .label.blog-category-development,html.light .label.chip-indigo{background-color:#d2b2ff;color:#350080}html.light .label.label-accounts .badge-pill,html.light .label.label-payment-channels .badge-pill,html.light .label.label-amm .badge-pill,html.light .label.label-アカウント .badge-pill,html.light .label.label-payment-channel .badge-pill,html.light .label.label-use-infrastructure .badge-pill,html.light .label.label-use-security .badge-pill,html.light .label.blog-category-development .badge-pill,html.light .label.chip-indigo .badge-pill{color:#d2b2ff;background-color:#350080}html.light .label.label-accounts:hover,html.light .label.label-payment-channels:hover,html.light .label.label-amm:hover,html.light .label.label-アカウント:hover,html.light .label.label-payment-channel:hover,html.light .label.label-use-infrastructure:hover,html.light .label.label-use-security:hover,html.light .label.blog-category-development:hover,html.light .label.chip-indigo:hover{background-color:#b480ff;color:#20004c}html.light .label.label-accounts:hover .badge-pill,html.light .label.label-payment-channels:hover .badge-pill,html.light .label.label-amm:hover .badge-pill,html.light .label.label-アカウント:hover .badge-pill,html.light .label.label-payment-channel:hover .badge-pill,html.light .label.label-use-infrastructure:hover .badge-pill,html.light .label.label-use-security:hover .badge-pill,html.light .label.blog-category-development:hover .badge-pill,html.light .label.chip-indigo:hover .badge-pill{color:#b480ff;background-color:#20004c}.label.label-blockchain,.label.label-xrp,.label.label-ブロックチェーン,.label.label-non-fungible-tokens-nfts,.label.label-use-nfts,.label.blog-category-release_notes,.label.blog-category-features,.label.chip-green{background-color:#145c35;color:#84f0b6}.label.label-blockchain .badge-pill,.label.label-xrp .badge-pill,.label.label-ブロックチェーン .badge-pill,.label.label-non-fungible-tokens-nfts .badge-pill,.label.label-use-nfts .badge-pill,.label.blog-category-release_notes .badge-pill,.label.blog-category-features .badge-pill,.label.chip-green .badge-pill{background-color:#84f0b6;color:#145c35}.label.label-blockchain:hover,.label.label-xrp:hover,.label.label-ブロックチェーン:hover,.label.label-non-fungible-tokens-nfts:hover,.label.label-use-nfts:hover,.label.blog-category-release_notes:hover,.label.blog-category-features:hover,.label.chip-green:hover{background-color:#1e8a50;color:#adf5ce}.label.label-blockchain:hover .badge-pill,.label.label-xrp:hover .badge-pill,.label.label-ブロックチェーン:hover .badge-pill,.label.label-non-fungible-tokens-nfts:hover .badge-pill,.label.label-use-nfts:hover .badge-pill,.label.blog-category-release_notes:hover .badge-pill,.label.blog-category-features:hover .badge-pill,.label.chip-green:hover .badge-pill{background-color:#adf5ce;color:#1e8a50}html.light .label.label-blockchain,html.light .label.label-xrp,html.light .label.label-ブロックチェーン,html.light .label.label-non-fungible-tokens-nfts,html.light .label.label-use-nfts,html.light .label.blog-category-release_notes,html.light .label.blog-category-features,html.light .label.chip-green{background-color:#adf5ce;color:#145c35}html.light .label.label-blockchain .badge-pill,html.light .label.label-xrp .badge-pill,html.light .label.label-ブロックチェーン .badge-pill,html.light .label.label-non-fungible-tokens-nfts .badge-pill,html.light .label.label-use-nfts .badge-pill,html.light .label.blog-category-release_notes .badge-pill,html.light .label.blog-category-features .badge-pill,html.light .label.chip-green .badge-pill{color:#adf5ce;background-color:#145c35}html.light .label.label-blockchain:hover,html.light .label.label-xrp:hover,html.light .label.label-ブロックチェーン:hover,html.light .label.label-non-fungible-tokens-nfts:hover,html.light .label.label-use-nfts:hover,html.light .label.blog-category-release_notes:hover,html.light .label.blog-category-features:hover,html.light .label.chip-green:hover{background-color:#84f0b6;color:#000}html.light .label.label-blockchain:hover .badge-pill,html.light .label.label-xrp:hover .badge-pill,html.light .label.label-ブロックチェーン:hover .badge-pill,html.light .label.label-non-fungible-tokens-nfts:hover .badge-pill,html.light .label.label-use-nfts:hover .badge-pill,html.light .label.blog-category-release_notes:hover .badge-pill,html.light .label.blog-category-features:hover .badge-pill,html.light .label.chip-green:hover .badge-pill{color:#84f0b6;background-color:#000}.label.label-checks,.label.label-core-server,.label.label-コアサーバ,.label.label-use-interoperability,.label.label-use-web_monetization,.label.blog-category-gateway_bulletins,.label.chip-purple{background-color:#40004c;color:#ea80ff}.label.label-checks .badge-pill,.label.label-core-server .badge-pill,.label.label-コアサーバ .badge-pill,.label.label-use-interoperability .badge-pill,.label.label-use-web_monetization .badge-pill,.label.blog-category-gateway_bulletins .badge-pill,.label.chip-purple .badge-pill{background-color:#ea80ff;color:#40004c}.label.label-checks:hover,.label.label-core-server:hover,.label.label-コアサーバ:hover,.label.label-use-interoperability:hover,.label.label-use-web_monetization:hover,.label.blog-category-gateway_bulletins:hover,.label.chip-purple:hover{background-color:#6b0080;color:#f2b2ff}.label.label-checks:hover .badge-pill,.label.label-core-server:hover .badge-pill,.label.label-コアサーバ:hover .badge-pill,.label.label-use-interoperability:hover .badge-pill,.label.label-use-web_monetization:hover .badge-pill,.label.blog-category-gateway_bulletins:hover .badge-pill,.label.chip-purple:hover .badge-pill{background-color:#f2b2ff;color:#6b0080}html.light .label.label-checks,html.light .label.label-core-server,html.light .label.label-コアサーバ,html.light .label.label-use-interoperability,html.light .label.label-use-web_monetization,html.light .label.blog-category-gateway_bulletins,html.light .label.chip-purple{background-color:#f2b2ff;color:#6b0080}html.light .label.label-checks .badge-pill,html.light .label.label-core-server .badge-pill,html.light .label.label-コアサーバ .badge-pill,html.light .label.label-use-interoperability .badge-pill,html.light .label.label-use-web_monetization .badge-pill,html.light .label.blog-category-gateway_bulletins .badge-pill,html.light .label.chip-purple .badge-pill{color:#f2b2ff;background-color:#6b0080}html.light .label.label-checks:hover,html.light .label.label-core-server:hover,html.light .label.label-コアサーバ:hover,html.light .label.label-use-interoperability:hover,html.light .label.label-use-web_monetization:hover,html.light .label.blog-category-gateway_bulletins:hover,html.light .label.chip-purple:hover{background-color:#ea80ff;color:#40004c}html.light .label.label-checks:hover .badge-pill,html.light .label.label-core-server:hover .badge-pill,html.light .label.label-コアサーバ:hover .badge-pill,html.light .label.label-use-interoperability:hover .badge-pill,html.light .label.label-use-web_monetization:hover .badge-pill,html.light .label.blog-category-gateway_bulletins:hover .badge-pill,html.light .label.chip-purple:hover .badge-pill{color:#ea80ff;background-color:#40004c}.label.label-cross-currency,.label.label-security,.label.label-クロスカレンシー,.label.label-セキュリティ,.label.label-use-gaming,.label.label-use-defi,.label.blog-category-amendments,.label.chip-yellow{background-color:#4b4c00;color:#fcff80}.label.label-cross-currency .badge-pill,.label.label-security .badge-pill,.label.label-クロスカレンシー .badge-pill,.label.label-セキュリティ .badge-pill,.label.label-use-gaming .badge-pill,.label.label-use-defi .badge-pill,.label.blog-category-amendments .badge-pill,.label.chip-yellow .badge-pill{background-color:#fcff80;color:#4b4c00}.label.label-cross-currency:hover,.label.label-security:hover,.label.label-クロスカレンシー:hover,.label.label-セキュリティ:hover,.label.label-use-gaming:hover,.label.label-use-defi:hover,.label.blog-category-amendments:hover,.label.chip-yellow:hover{background-color:#7d8000;color:#fdffb2}.label.label-cross-currency:hover .badge-pill,.label.label-security:hover .badge-pill,.label.label-クロスカレンシー:hover .badge-pill,.label.label-セキュリティ:hover .badge-pill,.label.label-use-gaming:hover .badge-pill,.label.label-use-defi:hover .badge-pill,.label.blog-category-amendments:hover .badge-pill,.label.chip-yellow:hover .badge-pill{background-color:#fdffb2;color:#7d8000}html.light .label.label-cross-currency,html.light .label.label-security,html.light .label.label-クロスカレンシー,html.light .label.label-セキュリティ,html.light .label.label-use-gaming,html.light .label.label-use-defi,html.light .label.blog-category-amendments,html.light .label.chip-yellow{background-color:#fdffb2;color:#4b4c00}html.light .label.label-cross-currency .badge-pill,html.light .label.label-security .badge-pill,html.light .label.label-クロスカレンシー .badge-pill,html.light .label.label-セキュリティ .badge-pill,html.light .label.label-use-gaming .badge-pill,html.light .label.label-use-defi .badge-pill,html.light .label.blog-category-amendments .badge-pill,html.light .label.chip-yellow .badge-pill{color:#fdffb2;background-color:#4b4c00}html.light .label.label-cross-currency:hover,html.light .label.label-security:hover,html.light .label.label-クロスカレンシー:hover,html.light .label.label-セキュリティ:hover,html.light .label.label-use-gaming:hover,html.light .label.label-use-defi:hover,html.light .label.blog-category-amendments:hover,html.light .label.chip-yellow:hover{background-color:#fcff80;color:#4b4c00}html.light .label.label-cross-currency:hover .badge-pill,html.light .label.label-security:hover .badge-pill,html.light .label.label-クロスカレンシー:hover .badge-pill,html.light .label.label-セキュリティ:hover .badge-pill,html.light .label.label-use-gaming:hover .badge-pill,html.light .label.label-use-defi:hover .badge-pill,html.light .label.blog-category-amendments:hover .badge-pill,html.light .label.chip-yellow:hover .badge-pill{color:#fcff80;background-color:#4b4c00}.label.label-decentralized-exchange,.label.label-smart-contracts,.label.label-transaction-sending,.label.label-分散型取引所,.label.label-スマートコントラクト,.label.label-トランザクション送信,.label.label-use-developer_tooling,.label.label-use-payments,.label.blog-category-developer_reflections,.label.chip-blue{background-color:#002e4c;color:#80ccff}.label.label-decentralized-exchange .badge-pill,.label.label-smart-contracts .badge-pill,.label.label-transaction-sending .badge-pill,.label.label-分散型取引所 .badge-pill,.label.label-スマートコントラクト .badge-pill,.label.label-トランザクション送信 .badge-pill,.label.label-use-developer_tooling .badge-pill,.label.label-use-payments .badge-pill,.label.blog-category-developer_reflections .badge-pill,.label.chip-blue .badge-pill{background-color:#80ccff;color:#002e4c}.label.label-decentralized-exchange:hover,.label.label-smart-contracts:hover,.label.label-transaction-sending:hover,.label.label-分散型取引所:hover,.label.label-スマートコントラクト:hover,.label.label-トランザクション送信:hover,.label.label-use-developer_tooling:hover,.label.label-use-payments:hover,.label.blog-category-developer_reflections:hover,.label.chip-blue:hover{background-color:#004d80;color:#b2e0ff}.label.label-decentralized-exchange:hover .badge-pill,.label.label-smart-contracts:hover .badge-pill,.label.label-transaction-sending:hover .badge-pill,.label.label-分散型取引所:hover .badge-pill,.label.label-スマートコントラクト:hover .badge-pill,.label.label-トランザクション送信:hover .badge-pill,.label.label-use-developer_tooling:hover .badge-pill,.label.label-use-payments:hover .badge-pill,.label.blog-category-developer_reflections:hover .badge-pill,.label.chip-blue:hover .badge-pill{background-color:#b2e0ff;color:#004d80}html.light .label.label-decentralized-exchange,html.light .label.label-smart-contracts,html.light .label.label-transaction-sending,html.light .label.label-分散型取引所,html.light .label.label-スマートコントラクト,html.light .label.label-トランザクション送信,html.light .label.label-use-developer_tooling,html.light .label.label-use-payments,html.light .label.blog-category-developer_reflections,html.light .label.chip-blue{background-color:#b2e0ff;color:#004d80}html.light .label.label-decentralized-exchange .badge-pill,html.light .label.label-smart-contracts .badge-pill,html.light .label.label-transaction-sending .badge-pill,html.light .label.label-分散型取引所 .badge-pill,html.light .label.label-スマートコントラクト .badge-pill,html.light .label.label-トランザクション送信 .badge-pill,html.light .label.label-use-developer_tooling .badge-pill,html.light .label.label-use-payments .badge-pill,html.light .label.blog-category-developer_reflections .badge-pill,html.light .label.chip-blue .badge-pill{color:#b2e0ff;background-color:#004d80}html.light .label.label-decentralized-exchange:hover,html.light .label.label-smart-contracts:hover,html.light .label.label-transaction-sending:hover,html.light .label.label-分散型取引所:hover,html.light .label.label-スマートコントラクト:hover,html.light .label.label-トランザクション送信:hover,html.light .label.label-use-developer_tooling:hover,html.light .label.label-use-payments:hover,html.light .label.blog-category-developer_reflections:hover,html.light .label.chip-blue:hover{background-color:#80ccff;color:#002e4c}html.light .label.label-decentralized-exchange:hover .badge-pill,html.light .label.label-smart-contracts:hover .badge-pill,html.light .label.label-transaction-sending:hover .badge-pill,html.light .label.label-分散型取引所:hover .badge-pill,html.light .label.label-スマートコントラクト:hover .badge-pill,html.light .label.label-トランザクション送信:hover .badge-pill,html.light .label.label-use-developer_tooling:hover .badge-pill,html.light .label.label-use-payments:hover .badge-pill,html.light .label.blog-category-developer_reflections:hover .badge-pill,html.light .label.chip-blue:hover .badge-pill{color:#80ccff;background-color:#002e4c}.label.label-escrow,.label.label-tokens,.label.label-development,.label.label-トークン,.label.label-開発,.label.label-use-wallet,.label.label-use-sustainability,.label.blog-category-advisories,.label.chip-orange{background-color:#4c1a00;color:#ffaa80}.label.label-escrow .badge-pill,.label.label-tokens .badge-pill,.label.label-development .badge-pill,.label.label-トークン .badge-pill,.label.label-開発 .badge-pill,.label.label-use-wallet .badge-pill,.label.label-use-sustainability .badge-pill,.label.blog-category-advisories .badge-pill,.label.chip-orange .badge-pill{background-color:#ffaa80;color:#4c1a00}.label.label-escrow:hover,.label.label-tokens:hover,.label.label-development:hover,.label.label-トークン:hover,.label.label-開発:hover,.label.label-use-wallet:hover,.label.label-use-sustainability:hover,.label.blog-category-advisories:hover,.label.chip-orange:hover{background-color:#802b00;color:#ffccb2}.label.label-escrow:hover .badge-pill,.label.label-tokens:hover .badge-pill,.label.label-development:hover .badge-pill,.label.label-トークン:hover .badge-pill,.label.label-開発:hover .badge-pill,.label.label-use-wallet:hover .badge-pill,.label.label-use-sustainability:hover .badge-pill,.label.blog-category-advisories:hover .badge-pill,.label.chip-orange:hover .badge-pill{background-color:#ffccb2;color:#802b00}html.light .label.label-escrow,html.light .label.label-tokens,html.light .label.label-development,html.light .label.label-トークン,html.light .label.label-開発,html.light .label.label-use-wallet,html.light .label.label-use-sustainability,html.light .label.blog-category-advisories,html.light .label.chip-orange{background-color:#ffccb2;color:#802b00}html.light .label.label-escrow .badge-pill,html.light .label.label-tokens .badge-pill,html.light .label.label-development .badge-pill,html.light .label.label-トークン .badge-pill,html.light .label.label-開発 .badge-pill,html.light .label.label-use-wallet .badge-pill,html.light .label.label-use-sustainability .badge-pill,html.light .label.blog-category-advisories .badge-pill,html.light .label.chip-orange .badge-pill{color:#ffccb2;background-color:#802b00}html.light .label.label-escrow:hover,html.light .label.label-tokens:hover,html.light .label.label-development:hover,html.light .label.label-トークン:hover,html.light .label.label-開発:hover,html.light .label.label-use-wallet:hover,html.light .label.label-use-sustainability:hover,html.light .label.blog-category-advisories:hover,html.light .label.chip-orange:hover{background-color:#ffaa80;color:#4c1a00}html.light .label.label-escrow:hover .badge-pill,html.light .label.label-tokens:hover .badge-pill,html.light .label.label-development:hover .badge-pill,html.light .label.label-トークン:hover .badge-pill,html.light .label.label-開発:hover .badge-pill,html.light .label.label-use-wallet:hover .badge-pill,html.light .label.label-use-sustainability:hover .badge-pill,html.light .label.blog-category-advisories:hover .badge-pill,html.light .label.chip-orange:hover .badge-pill{color:#ffaa80;background-color:#4c1a00}.label.label-fees,.label.label-payments,.label.label-data-retention,.label.label-手数料,.label.label-支払い,.label.label-データ保持,.label.label-use-exchanges,.label.label-use-custody,.label.blog-category-security,.label.chip-magenta{background-color:#4c0026;color:#ff80bf}.label.label-fees .badge-pill,.label.label-payments .badge-pill,.label.label-data-retention .badge-pill,.label.label-手数料 .badge-pill,.label.label-支払い .badge-pill,.label.label-データ保持 .badge-pill,.label.label-use-exchanges .badge-pill,.label.label-use-custody .badge-pill,.label.blog-category-security .badge-pill,.label.chip-magenta .badge-pill{background-color:#ff80bf;color:#4c0026}.label.label-fees:hover,.label.label-payments:hover,.label.label-data-retention:hover,.label.label-手数料:hover,.label.label-支払い:hover,.label.label-データ保持:hover,.label.label-use-exchanges:hover,.label.label-use-custody:hover,.label.blog-category-security:hover,.label.chip-magenta:hover{background-color:#80003f;color:#ffb2d8}.label.label-fees:hover .badge-pill,.label.label-payments:hover .badge-pill,.label.label-data-retention:hover .badge-pill,.label.label-手数料:hover .badge-pill,.label.label-支払い:hover .badge-pill,.label.label-データ保持:hover .badge-pill,.label.label-use-exchanges:hover .badge-pill,.label.label-use-custody:hover .badge-pill,.label.blog-category-security:hover .badge-pill,.label.chip-magenta:hover .badge-pill{background-color:#ffb2d8;color:#80003f}html.light .label.label-fees,html.light .label.label-payments,html.light .label.label-data-retention,html.light .label.label-手数料,html.light .label.label-支払い,html.light .label.label-データ保持,html.light .label.label-use-exchanges,html.light .label.label-use-custody,html.light .label.blog-category-security,html.light .label.chip-magenta{background-color:#ffb2d8;color:#80003f}html.light .label.label-fees .badge-pill,html.light .label.label-payments .badge-pill,html.light .label.label-data-retention .badge-pill,html.light .label.label-手数料 .badge-pill,html.light .label.label-支払い .badge-pill,html.light .label.label-データ保持 .badge-pill,html.light .label.label-use-exchanges .badge-pill,html.light .label.label-use-custody .badge-pill,html.light .label.blog-category-security .badge-pill,html.light .label.chip-magenta .badge-pill{color:#ffb2d8;background-color:#80003f}html.light .label.label-fees:hover,html.light .label.label-payments:hover,html.light .label.label-data-retention:hover,html.light .label.label-手数料:hover,html.light .label.label-支払い:hover,html.light .label.label-データ保持:hover,html.light .label.label-use-exchanges:hover,html.light .label.label-use-custody:hover,html.light .label.blog-category-security:hover,html.light .label.chip-magenta:hover{background-color:#ff80bf;color:#4c0026}html.light .label.label-fees:hover .badge-pill,html.light .label.label-payments:hover .badge-pill,html.light .label.label-data-retention:hover .badge-pill,html.light .label.label-手数料:hover .badge-pill,html.light .label.label-支払い:hover .badge-pill,html.light .label.label-データ保持:hover .badge-pill,html.light .label.label-use-exchanges:hover .badge-pill,html.light .label.label-use-custody:hover .badge-pill,html.light .label.blog-category-security:hover .badge-pill,html.light .label.chip-magenta:hover .badge-pill{color:#ff80bf;background-color:#4c0026}.tag-cloud .list-inline-item{margin-top:1.5rem}.command-list-wrapper{position:sticky;top:calc(var(--navbar-height) + var(--toc-offset-top));max-height:calc(100vh - var(--navbar-height) - var(--toc-offset-top));overflow-y:auto;width:var(--toc-width)}#tx-sender-history .list-group-item{font-size:small;color:#454549}.response-metadata .timestamp{color:#454549}.throbber{width:24px;height:24px}#connection-status .card-body{border-left:0}#connection-status-item.active{background-color:#32e685;border-color:#32e685}.api-input-area .btn-group>.send-request.btn{border-bottom-right-radius:4px;border-top-right-radius:4px}#tx-sender-history ul{overflow:auto;height:220px;border:1px solid #e0e0e1}.progress small{margin-top:.5rem}.page-tx-sender .input-group .form-control,.interactive-block-ui .input-group .form-control{flex:1 1 20%;height:auto}.bootstrap-growl{max-width:90vw !important;overflow:hidden}.list-group-item-danger,#tx-sender-history .list-group-item-danger{background-color:#ff80bf;color:#000}.list-group-item-danger a,#tx-sender-history .list-group-item-danger a{color:#000}.list-group-item-danger a:hover,#tx-sender-history .list-group-item-danger a:hover{color:#000;text-decoration:underline}.rpc-tool .main h1::before,.rpc-tool .main h2::before,.rpc-tool .main h3::before{display:none}@media print{.multicode>div{display:block !important}.multicode>em,.multicode>p>em{display:block !important;page-break-after:avoid}.multicode>p{display:block !important}.code_toggler{display:none}pre{white-space:pre-wrap;max-height:none !important;overflow:visible;page-break-inside:auto;word-wrap:break-word}pre code{white-space:pre-wrap !important;color:#22252b !important}code{white-space:pre-wrap !important;color:#22252b !important}.codehilite .n,.codehilite .na,.codehilite .nb,.codehilite .nc,.codehilite .nd,.codehilite .ne,.codehilite .nf,.codehilite .ni,.codehilite .nl,.codehilite .nn,.codehilite .nt,.codehilite .nv,.codehilite .nx,.codehilite .bp,.codehilite .fm,.codehilite .py{color:#22252b}article a[title=Source]{float:none}header,footer,aside{display:none !important}.navbar{display:none !important}article,#main_content_body{position:static;display:block;width:auto;height:auto;color:#000 !important;max-width:100%;overflow:visible !important}body{overflow:visible;background:#fff}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{color:#000}.interactive-block{display:none}.container{margin-top:1rem !important}}#home-purple{position:absolute;left:0;top:-400px}#home-green{position:absolute;right:-3px;top:60px}.sidelinks:hover{color:#9a52ff}.sidelinks.active{color:#9a52ff;font-weight:bold}.page-home #home-hero-graphic{content:url("../img/home-hero.svg");margin-left:auto;width:856px;margin-right:auto;margin-bottom:24px;max-width:100%}.page-home #benefits-list #public{content:url("../img/icons/public.svg")}.page-home #benefits-list #streamlined{content:url("../img/icons/streamlined.svg")}.page-home #benefits-list #performance{content:url("../img/icons/performance.svg")}.page-home #benefits-list #low-cost{content:url("../img/icons/low-cost.svg")}.page-home #benefits-list #community{content:url("../img/icons/community.svg")}.page-home #benefits-list #reliability{content:url("../img/icons/reliability.svg")}.page-home #advanced-features .card:nth-child(1) .card-footer{background-image:url("../img/cards/3col-pink-purple.svg")}.page-home #advanced-features .card:nth-child(2) .card-footer{background-image:url("../img/cards/3col-neutral-blue.svg")}.page-home #advanced-features .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.page-home #advanced-features .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.page-home #advanced-features .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-purple-blue-2.svg")}.page-home #get-started .card:nth-child(1) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.page-home #get-started .card:nth-child(2) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.page-home #get-started .card:nth-child(3) .card-footer{background-image:url("../img/cards/3col-purple-blue-green.svg")}.page-home #get-started .card:nth-child(4) .card-footer{background-image:url("../img/cards/3col-light-blue.svg")}.page-home #get-started .card:nth-child(5) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.cta{position:absolute}.cta-top-left{top:0;left:0}.cta-bottom-right{bottom:0;right:0}.landing-bg{opacity:.6}@media(min-width: 768px){.landing-bg{opacity:1}}.landing-builtin-bg::before{content:"";position:absolute;top:0;left:0;background-repeat:no-repeat;background-position-x:left;background-position-y:top;opacity:.6}@media(min-width: 768px){.landing-builtin-bg::before{opacity:1}}#xrp-overview-blue{position:absolute;top:0;left:0}@media(max-width: 767.98px){#xrp-mark-overview{height:40px;margin-top:16px}}#wallets #wallet-ledger{content:url("../img/wallets/ledger.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-secalot{content:url("../img/wallets/secalot.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-trezor{content:url("../img/wallets/trezor.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-xumm{content:url("../img/wallets/xumm.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-trust{content:url("../img/wallets/trust.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-gatehub{content:url("../img/wallets/gatehub.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-towo{content:url("../img/wallets/towo.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-keystone{content:url("../img/wallets/keystone.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-dcent{content:url("../img/wallets/dcent.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#wallets #wallet-coin{content:url("../img/wallets/coin.svg")}#wallets #wallet-bitfrost{content:url("../img/wallets/bitfrost.png")}#top-exchanges #exch-bitstamp{content:url("../img/exchanges/bitstamp.svg")}#top-exchanges #exch-kraken{content:url("../img/exchanges/kraken.svg")}#top-exchanges #exch-cex-io{content:url("../img/exchanges/cex-io.svg")}#top-exchanges #exch-liquid{content:url("../img/exchanges/liquid.svg")}#top-exchanges #exch-lmax{content:url("../img/exchanges/lmax.svg")}#top-exchanges #exch-bitfinex{content:url("../img/exchanges/bitfinex.svg")}#top-exchanges #exch-etoro{content:url("../img/exchanges/etoro.svg")}#top-exchanges #exch-bittrex{content:url("../img/exchanges/bittrex.png")}#top-exchanges #exch-currency-com{content:url("../img/exchanges/currency-com.png")}#top-exchanges #exch-ftx{content:url("../img/exchanges/ftx.png")}#xrpl-overview-purple{position:absolute;top:40px;left:0}@media(max-width: 767.98px){#xrpl-overview-purple{top:0;left:-20vw}}#xrpl-overview-orange{position:absolute;top:80px;right:-4px}#use-cases-orange{position:absolute;top:-480px;right:-4px}#validator-graphic{content:url(../img/validators.svg)}.page-uses .container-new{padding-left:16px;padding-right:16px}.page-uses h1{font-size:42px}.page-uses::before{transform:scaleX(-1);background-image:url(../img/backgrounds/use-cases-blue.svg)}.page-uses .card-grid{grid-gap:8px}.page-uses .card-grid img{max-height:40px}.page-uses .modal{padding:0}.page-uses .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#000;background-clip:padding-box;border:none;border-radius:0;box-shadow:none;outline:none;background:#111112}.page-uses .modal-header{border:none;background:#111112;box-shadow:0px 1px 2px #000}.page-uses .modal-header .cancel .chevron{transform:rotate(90deg)}.page-uses .modal-header .apply .chevron{transform:rotate(-90deg)}.page-uses .modal-footer{border:none;background:#111112;box-shadow:0px -1px 2px #000;align-items:unset;padding:.75rem;flex-direction:column;flex-wrap:wrap}.page-uses .card-title{margin-bottom:.5rem;line-height:26px}.page-uses .card-uses{padding:16px;margin:0;text-decoration:none;transition:all .35s ease-out}.page-uses .card-uses:hover{text-decoration:none;color:#e0e0e1;transform:translateY(-16px);text-decoration:none}.page-uses .card-body{background:#232325;border-radius:8px;height:100%;padding:32px;margin:0}.page-uses .page-events .label{font-weight:normal;font-size:14px;margin:0;padding-left:26px}.page-uses .category-header{font-weight:bold;color:#c1c1c2}.page-uses .light .category-checkbox label{color:#fff}.page-uses .category-checkbox{display:flex;align-items:center}.page-uses .category-checkbox label{font-weight:normal;font-size:14px;margin:0;padding-left:26px}.page-uses .category_count{margin-left:8px;padding:2px 16px;width:24px;height:16px;background:#350080;border-radius:100px;font-weight:600;font-size:12px;line-height:16px;color:#b480ff}.page-uses .category_sidebar{position:sticky;top:10px}.page-uses #infrastructure{content:url("../img/icons/usecases/ic_infrastructure.png")}.page-uses #developer_tooling{content:url("../img/icons/usecases/ic_developer_tooling.png")}.page-uses #interoperability{content:url("../img/icons/usecases/ic_interoperability.png")}.page-uses #wallet{content:url("../img/icons/usecases/ic_wallet.png")}.page-uses #nfts{content:url("../img/icons/usecases/ic_nfts.png")}.page-uses #exchanges{content:url("../img/icons/usecases/ic_exchanges.png")}.page-uses #gaming{content:url("../img/icons/usecases/ic_gaming.png")}.page-uses #security{content:url("../img/icons/usecases/ic_security.png")}.page-uses #payments{content:url("../img/icons/usecases/ic_payments.png")}.page-uses #web_monetization{content:url("../img/icons/usecases/ic_web_monetization.png")}.page-uses #sustainability{content:url("../img/icons/usecases/ic_sustainability.png")}.page-uses #cbdc{content:url("../img/icons/usecases/ic_cbdc.png")}.page-uses #other{content:url("../img/icons/usecases/ic_other.png")}.page-uses #carbon_markets{content:url("../img/icons/usecases/ic_carbon_markets.png")}.page-uses #custody{content:url("../img/icons/usecases/ic_custody.png")}.page-uses #defi{content:url("../img/icons/usecases/ic_defi.png")}.page-uses #use_case_companies_list #bithomp .biz-logo{max-height:40px;content:url("../img/uses/bithomp.svg")}.page-uses #use_case_companies_list #onthedex .biz-logo{max-height:40px;content:url("../img/uses/onthedex.svg")}.page-uses #use_case_companies_list #gatehub .biz-logo{max-height:40px;content:url("../img/uses/gatehub.svg")}.page-uses #use_case_companies_list #towo-labs .biz-logo{max-height:40px;content:url("../img/uses/towo-labs.svg")}.page-uses #use_case_companies_list #xrp-toolkit .biz-logo{max-height:40px;content:url("../img/uses/xrp-toolkit.svg")}.page-uses #use_case_companies_list #xrpl-org-ledger-explorer .biz-logo{max-height:40px;content:url("../img/uses/xrpl-org-ledger-explorer.svg")}.page-uses #use_case_companies_list #xrpl-rosetta .biz-logo{max-height:40px;content:url("../img/uses/xrpl-rosetta.svg")}.page-uses #use_case_companies_list #xrpscan .biz-logo{max-height:40px;content:url("../img/uses/xrpscan.svg")}.page-uses #use_case_companies_list #evernode .biz-logo{max-height:40px;content:url("../img/uses/evernode.svg")}.page-uses #use_case_companies_list #cryptum .biz-logo{max-height:40px;content:url("../img/uses/cryptum.svg")}.page-uses #use_case_companies_list #x-tokenize .biz-logo{max-height:40px;content:url("../img/uses/x-tokenize.svg")}.page-uses #use_case_companies_list #multichain .biz-logo{max-height:40px;content:url("../img/uses/multichain.svg")}.page-uses #use_case_companies_list #xumm-wallet .biz-logo{max-height:40px;content:url("../img/uses/xumm-wallet.svg")}.page-uses #use_case_companies_list #gem-wallet .biz-logo{max-height:40px;content:url("../img/uses/gem-wallet.svg")}.page-uses #use_case_companies_list #aesthetes .biz-logo{max-height:40px;content:url("../img/uses/aesthetes.svg")}.page-uses #use_case_companies_list #audiotarky .biz-logo{max-height:40px;content:url("../img/uses/audiotarky.svg")}.page-uses #use_case_companies_list #xrp-cafe .biz-logo{max-height:40px;content:url("../img/uses/xrp-cafe.svg")}.page-uses #use_case_companies_list #nft-master .biz-logo{max-height:40px;content:url("../img/uses/nft-master.svg")}.page-uses #use_case_companies_list #onxrp .biz-logo{max-height:40px;content:url("../img/uses/onxrp.svg")}.page-uses #use_case_companies_list #peerkat .biz-logo{max-height:40px;content:url("../img/uses/peerkat.svg")}.page-uses #use_case_companies_list #sologenic-nft .biz-logo{max-height:40px;content:url("../img/uses/sologenic-nft.svg")}.page-uses #use_case_companies_list #sologenic-dex .biz-logo{max-height:40px;content:url("../img/uses/sologenic-dex.svg")}.page-uses #use_case_companies_list #xp-market .biz-logo{max-height:40px;content:url("../img/uses/xp-market.svg")}.page-uses #use_case_companies_list #ledger-city .biz-logo{max-height:40px;content:url("../img/uses/ledger-city.svg")}.page-uses #use_case_companies_list #forte .biz-logo{max-height:40px;content:url("../img/uses/forte.svg")}.page-uses #use_case_companies_list #futureverse .biz-logo{max-height:40px;content:url("../img/uses/futureverse.svg")}.page-uses #use_case_companies_list #first-ledger-bot .biz-logo{max-height:40px;content:url("../img/uses/first-ledger-bot.svg")}.page-uses #use_case_companies_list #moai-finance .biz-logo{max-height:40px;content:url("../img/uses/moai-finance.svg")}.page-uses #use_case_companies_list #orchestra-finance .biz-logo{max-height:40px;content:url("../img/uses/orchestra-finance.svg")}.page-uses #use_case_companies_list #anchain-ai .biz-logo{max-height:40px;content:url("../img/uses/anchain-ai.svg")}.page-uses #use_case_companies_list #coil .biz-logo{max-height:40px;content:url("../img/uses/coil.svg")}.page-uses #use_case_companies_list #carbonland-trust .biz-logo{max-height:40px;content:url("../img/uses/carbonland-trust.svg")}.page-uses #use_case_companies_list #casino-coin .biz-logo{max-height:40px;content:url("../img/uses/casino-coin.svg")}.page-uses #use_case_companies_list #bitgo .biz-logo{max-height:40px;content:url("../img/uses/bitgo.svg")}.page-uses #use_case_companies_list #bitpay .biz-logo{max-height:40px;content:url("../img/uses/bitpay.svg")}.page-uses #use_case_companies_list #ripples-on-demand-liquidity .biz-logo{max-height:40px;content:url("../img/uses/ripples-on-demand-liquidity.svg")}.page-uses #use_case_companies_list #ripples-cbdc-platform .biz-logo{max-height:40px;content:url("../img/uses/ripples-cbdc-platform.svg")}.page-uses #use_case_companies_list #momento .biz-logo{max-height:40px;content:url("../img/uses/momento.svg")}.page-uses #use_case_companies_list #zerpmon .biz-logo{max-height:40px;content:url("../img/uses/zerpmon.png")}.page-uses #use_case_companies_list #Crossmark .biz-logo{max-height:40px;content:url("../img/uses/Crossmark.png")}.page-uses #use_case_companies_list #Edge .biz-logo{max-height:40px;content:url("../img/uses/Edge.png")}.page-uses .orchestra-finance{max-height:52px !important;margin:0 !important}.page-uses #use_case_companies_list #first-ledger-bot .biz-logo{max-height:81px !important}.page-uses #use_case_companies_list #zerpmon .biz-logo{max-height:81px !important}@media(min-width: 992px){.page-uses h1{font-size:62px}.page-uses .container-new{padding-left:64px;padding-right:64px}.page-uses .card-grid img{max-height:48px}.page-uses .card-grid{grid-gap:48px}.page-uses .card-uses{padding:24px}}#history-orange{position:absolute;top:0;right:-4px}#history-purple{position:absolute;top:-480px;left:-4px}.hidden-section{overflow:hidden;visibility:hidden;height:0}.hidden-section.show{overflow:auto;visibility:visible;height:auto}#impact-green{position:absolute;top:0;left:-4px;rotate:180deg}#impact-purple{position:absolute;top:100px;right:-4px}#impact-magenta{position:absolute;top:100px;right:-4px}#foundation-magenta{position:absolute;top:0px;left:0px}#foundation-orange{position:absolute;top:40px;right:-4px}.page-impact #map-light{display:none}.page-impact #map-dark{display:block}.page-impact .connect-list #connect-01{content:url("../img/impact/connect-01.svg")}.page-impact .connect-list #connect-02{content:url("../img/impact/connect-02.svg")}.page-impact .connect-list #connect-03{content:url("../img/impact/connect-03.svg")}.page-impact .connect-list #connect-04{content:url("../img/impact/connect-04.svg")}.page-funding .funding-list #funding-01{content:url("../img/funding/funding-01.svg")}.page-funding .funding-list #funding-02{content:url("../img/funding/funding-02.svg")}.page-funding .funding-list #funding-03{content:url("../img/funding/funding-03.svg")}.page-funding .funding-list #funding-04{content:url("../img/funding/funding-04.svg")}.page-funding #funding-orange{position:absolute;top:132px;left:-4px}@media(min-width: 992px){.page-funding .funding-box{min-height:200px}}.page-ambassadors #benefits-list #benefits-01{content:url("../img/ambassadors/benefits-01.svg")}.page-ambassadors #benefits-list #benefits-02{content:url("../img/ambassadors/benefits-02.svg")}.page-ambassadors #benefits-list #benefits-03{content:url("../img/ambassadors/benefits-03.svg")}.page-ambassadors #benefits-list #benefits-04{content:url("../img/ambassadors/benefits-04.svg")}.page-ambassadors #benefits-list #benefits-05{content:url("../img/ambassadors/benefits-05.svg")}.page-ambassadors #benefits-list #benefits-06{content:url("../img/ambassadors/benefits-06.svg")}.page-ambassadors #eligibility-list #eligibility-01{content:url("../img/ambassadors/eligibility-01.svg")}.page-ambassadors #eligibility-list #eligibility-02{content:url("../img/ambassadors/eligibility-02.svg")}.page-ambassadors #eligibility-list #eligibility-03{content:url("../img/ambassadors/eligibility-03.svg")}.page-ambassadors #eligibility-list #eligibility-04{content:url("../img/ambassadors/eligibility-04.svg")}.page-ambassadors #eligibility-list #eligibility-05{content:url("../img/ambassadors/eligibility-05.svg")}.page-ambassadors .btn{padding:.75rem}.page-ambassadors #container-scroll{height:160px;position:relative;overflow:hidden;margin-top:80px;margin-bottom:64px}.page-ambassadors .photobanner{position:absolute;top:0px;left:0px;overflow:hidden;white-space:nowrap;animation:bannermove 40s linear infinite}.page-ambassadors .photobanner-bottom{top:112px}.page-ambassadors .photobanner img{margin:0 .5em}@keyframes bannermove{0%{transform:translate(0, 0)}100%{transform:translate(-50%, 0)}}.page-ambassadors #carouselSlidesOnly{height:392px;margin-bottom:40px}@media(min-width: 992px){.page-ambassadors #carouselSlidesOnly{height:320px;margin-bottom:104px}}.page-ambassadors h6{font-size:1.25rem}.page-ambassadors .btn-arrow::after{display:inline-block;content:url(../img/icons/arrow-right-purple.svg);vertical-align:middle;padding-left:8px;transition:transform .3s ease-out}.page-ambassadors .btn-arrow:hover{text-decoration:none;background:none !important;border:none}.page-ambassadors .btn-arrow:hover::after{background-position:left 4px bottom 4px;transform:translateX(4px)}.autoscroll-content{animation:autoscroll 15s linear infinite;white-space:nowrap;overflow:hidden;max-width:300px}#community-magenta{position:absolute;top:0px;left:0px}#community-purple{position:absolute;top:160px;right:0px}.page-events #event-hero-image{height:100%;min-height:209px;background:url(../img/events/event-hero1@2x.png);background-size:contain;background-repeat:no-repeat;background-position:center}.page-events #events-orange{position:absolute;top:0px;right:0px}.page-events .event-hero{color:#f5f5f7}.page-events .event-hero p{font-weight:500;font-size:24px;line-height:32px}.page-events .event-save-date{color:#fff;font-weight:bold;font-size:20px;line-height:26px}.page-events .event-small-gray{color:#e0e0e1}.page-events .btn{padding:.75rem}.page-events .event-card{max-width:311px;margin:32px auto;transition:all .35s ease-out;position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-clip:border-box;background-color:#232325;box-shadow:0px 5px 40px #000;border:1px solid rgba(0,0,0,.125);border-radius:8px;font-size:16px;line-height:24px;color:#e0e0e1}.page-events .event-card .event-card-header{position:relative;height:176px;background-size:contain !important;width:100%;border-radius:8px 8px 0 0}.page-events .event-card .event-card-title{position:absolute;bottom:32px;padding:0 32px;color:#f5f5f7;font-weight:bold;font-size:20px;line-height:28px}.page-events .event-card .event-card-body{padding:32px}.page-events .event-card .event-card-footer{padding:0 32px 32px}.page-events .event-card .event-card-footer .icon::before{height:24px;width:24px;content:"";margin-right:8px;background-size:contain;background-repeat:no-repeat}.page-events .event-card .icon-date::before{background:url(../img/events/event-date.svg)}.page-events .event-card .icon-location::before{background:url(../img/events/event-location.svg)}@media(min-width: 992px){.page-events .event-card{max-width:347px;margin:32px}.page-events .event-card-header{height:197px !important}}.page-events a.event-card:hover{transform:translateY(-16px);text-decoration:none}.page-events label{margin:0;padding-left:8px;color:#fff}.page-events .events-filter h6{font-size:16px}.page-events .events-filter{height:20px;width:20px}.page-events .events-filter[type=checkbox]::before{position:relative;display:block;width:20px;height:20px;content:"";background:#111112;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.page-events .events-filter[type=checkbox]::after{position:relative;display:block;top:-20px;width:20px;height:20px;content:"";background-repeat:no-repeat;background-position:center;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.page-events .events-filter[type=checkbox]:checked::before{background:#111112;border:none;border-radius:0}.page-events .events-filter[type=checkbox]:checked::after{background-image:url(../img/events/event-check.svg);background-repeat:no-repeat;background-position:center;background-color:#7919ff;border-width:2px;border-style:solid;border-color:#7919ff;border-radius:4px}.page-events .events-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/events/event-check.svg);background-repeat:no-repeat;background-position:center;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}.page-events .events-filter[type=checkbox]:not(:disabled):hover::before{background:#111112;border:none;border-radius:0}.page-events .events-filter[type=checkbox]:not(:disabled):hover::after{background:#111112;border:none;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}#find-us-on-platforms .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-light-blue-3.svg)}#find-us-on-platforms .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-purple-blue-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-magenta-3.svg)}#find-us-on-platforms .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-green-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(5) .card-footer{background-image:url(../img/cards/4col-orange-yellow-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(6) .card-footer{background-image:url(../img/cards/4col-blue-purple.svg)}#find-us-on-platforms .card-deck .card:nth-child(7) .card-footer{background-image:url(../img/cards/4col-yellow-2.svg)}#find-us-on-platforms .card-deck .card:nth-child(8) .card-footer{background-image:url(../img/cards/4col-orange-2.svg)}#find-us-on-platforms .card-deck .card{margin-bottom:2.5rem}.page-faq::before{background-image:url(../img/backgrounds/faq-bg.svg)}@media(min-width: 768px){.page-faq::before{background-size:contain}}@media(min-width: 992px){.page-faq article{max-width:704px;margin-left:auto;margin-right:auto}}.page-faq article h6:first-of-type{color:#32e685;margin-bottom:1rem;margin-top:2.5rem;font-size:1.25rem;line-height:26px;text-align:center}.page-faq article h6:first-of-type .hover_anchor{display:none}@media(min-width: 992px){.page-faq article h6:first-of-type{margin-top:6.5rem}}.page-faq article h1:first-of-type{font-size:2.625rem;line-height:1.2;margin-top:0;margin-bottom:5rem;text-align:center}.page-faq article h1:first-of-type .hover_anchor{display:none}@media(min-width: 992px){.page-faq article h1:first-of-type{font-size:3.875rem;margin-bottom:13rem}}.page-faq h2{margin-top:13rem;font-size:2rem;line-height:2.375rem;text-align:center;font-weight:700}.page-faq .q-wrapper,.mini-faq .q-wrapper{background:#232325;border-radius:4px;padding:2rem;padding-right:3rem;margin-bottom:1.5rem;position:relative;z-index:5;width:100%;transform:translateY(0%)}.page-faq .q-wrapper p a,.mini-faq .q-wrapper p a{text-decoration:none;font-weight:600;color:#9a52ff}.page-faq .q-wrapper p a:hover,.mini-faq .q-wrapper p a:hover{text-decoration:underline}.page-faq .q-wrapper h4,.mini-faq .q-wrapper h4{font-size:1.25rem;line-height:1.625rem;margin-top:0}.page-faq .q-wrapper h4::before,.mini-faq .q-wrapper h4::before{display:block;content:" ";margin-top:-40px;height:40px;visibility:hidden;pointer-events:none}.page-faq .q-wrapper h4>a,.mini-faq .q-wrapper h4>a{text-decoration:none}.page-faq .q-wrapper h4>a:hover,.mini-faq .q-wrapper h4>a:hover{text-decoration:underline;color:#fff}@media(max-width: 991.98px){.page-faq .q-wrapper h4,.mini-faq .q-wrapper h4{font-size:1rem;line-height:1.5rem}}.page-faq .q-wrapper h4 .chevron,.mini-faq .q-wrapper h4 .chevron{position:absolute;top:40px;right:2rem}.page-docs-index::before{background-position-x:right}.page-docs-index .center-search .input-group-text{height:56px;padding:.75rem .75rem .75rem 1rem;line-height:2rem}.page-docs-index .center-search .ds-input{height:56px;padding:.75rem 1rem .75rem .5rem}.page-docs-index #software-and-sdks .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-green.svg)}.page-docs-index #software-and-sdks .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-light-blue.svg)}.page-docs-index #software-and-sdks .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-orange.svg)}.page-docs-index #software-and-sdks .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-yellow.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-orange-yellow.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-magenta.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-blue-green.svg)}.page-docs-index #doc-types .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-light-blue-2.svg)}.page-docs-index #docs-hot-topic .longform{margin-top:2.5rem}.page-docs-index #community-heading,.page-community #community-heading{padding-top:25rem;margin-top:0px}@media(max-width: 768px){.page-docs-index #community-heading,.page-community #community-heading{padding-top:31rem}}.page-docs-index #community-heading .hero-title,.page-community #community-heading .hero-title{position:absolute;bottom:0;left:50%;transform:translateX(-50%)}@media(min-width: 992px){.page-docs-index #community-heading,.page-community #community-heading{padding-left:0}.page-docs-index #community-heading .hero-title,.page-community #community-heading .hero-title{min-width:max-content;bottom:-83%}}.page-docs-index #community-heading .parallax,.page-community #community-heading .parallax{position:absolute;-webkit-transition:all .1s ease;-moz-transition:all .1s ease;-ms-transition:all .1s ease;-o-transition:all .1s ease;transition:all .1s ease}.page-docs-index #community-heading .one,.page-community #community-heading .one{top:160px;left:0%;opacity:.4}.page-docs-index #community-heading .two,.page-community #community-heading .two{top:130px;left:56%;height:320px;opacity:.4}.page-docs-index #community-heading .three,.page-community #community-heading .three{top:145px;right:16%;height:67px}.page-docs-index #community-heading .four,.page-community #community-heading .four{top:374px;left:8%;width:107px}.page-docs-index #community-heading .five,.page-community #community-heading .five{top:476px;width:152px;height:102px;right:5%;opacity:.4}.page-docs-index #run-a-network-node .card-deck .card:nth-child(1) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-yellow-2.svg)}.page-docs-index #run-a-network-node .card-deck .card:nth-child(2) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-purple.svg)}.page-docs-index #run-a-network-node .card-deck .card:nth-child(3) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-magenta-2.svg)}.page-docs-index #run-a-network-node .card-deck .card:nth-child(4) .card-footer,.page-community #run-a-network-node .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-light-green.svg)}.page-docs-index #run-a-network-node,.page-community #run-a-network-node{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #run-a-network-node,.page-community #run-a-network-node{padding-top:104px;padding-bottom:104px}}.page-docs-index #run-a-network-node .text-cards,.page-community #run-a-network-node .text-cards{grid-gap:40px}.page-docs-index #run-a-network-node .text-cards h6::before,.page-community #run-a-network-node .text-cards h6::before{margin-top:0;height:unset}.page-docs-index #run-a-network-node .text-cards a,.page-community #run-a-network-node .text-cards a{font-size:1.25rem;line-height:26px;color:#fff;font-weight:bold}.page-docs-index #run-a-network-node .text-cards a:hover,.page-community #run-a-network-node .text-cards a:hover{text-decoration:none;background:none !important}.page-docs-index #run-a-network-node .text-cards .btn-arrow::after,.page-community #run-a-network-node .text-cards .btn-arrow::after{display:inline-block;content:url(../img/icons/arrow-right-purple.svg);vertical-align:middle;padding-left:8px;-webkit-transition:transform .3s ease-out;-moz-transition:transform .3s ease-out;-ms-transition:transform .3s ease-out;-o-transition:transform .3s ease-out;transition:transform .3s ease-out}.page-docs-index #xrpl-grants,.page-community #xrpl-grants{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-grants,.page-community #xrpl-grants{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-blog,.page-community #xrpl-blog{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-blog,.page-community #xrpl-blog{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-events,.page-community #xrpl-events{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-events,.page-community #xrpl-events{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-careers,.page-community #xrpl-careers{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-careers,.page-community #xrpl-careers{padding-top:104px;padding-bottom:104px}}.page-docs-index #xrpl-design-assets,.page-community #xrpl-design-assets{padding-bottom:5rem}@media(min-width: 768px){.page-docs-index #xrpl-design-assets,.page-community #xrpl-design-assets{padding-top:104px;padding-bottom:208px}}.page-community #platform-github{content:url("../img/logos/github.svg")}.page-community #platform-twitch{content:url("../img/logos/twitch.svg")}.page-community #platform-stack-overflow{content:url("../img/logos/stack-overflow.svg")}.page-community #platform-twitter{content:url("../img/logos/twitter.svg")}.page-community #platform-discord{content:url("../img/logos/discord.svg")}.page-community #platform-youtube{content:url("../img/logos/youtube.svg")}.page-community #platform-devto{content:url("../img/logos/devto.svg")}.page-references #refs-types .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/3col-orange-2.svg)}.page-references #refs-types .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/3col-green-2.svg)}.page-references #refs-types .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/3col-magenta.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/4col-light-blue-4.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/4col-blue-green-2.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(3) .card-footer{background-image:url(../img/cards/4col-yellow-3.svg)}.page-references #xrpl-protocol .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/4col-purple-blue.svg)}.page-dev-tools #xrp-explorer .card-footer{background-image:url("../img/cards/3-col-orange.svg")}.page-dev-tools #bithomp-explorer .card-footer{background-image:url("../img/cards/3-col-light-blue.svg")}.page-dev-tools #xrpscan .card-footer{background-image:url("../img/cards/3-col-pink.svg")}.page-dev-tools #token-list .card-footer{background-image:url("../img/cards/3-col-pink2.svg")}.page-dev-tools #websocket .card-footer{background-image:url("../img/cards/3-col-purple2.svg")}.page-dev-tools #rpc .card-footer{background-image:url("../img/cards/3-col-green.svg")}.page-dev-tools #technical-explorer .card-footer{background-image:url("../img/cards/3-col-purple-blue.svg")}.page-dev-tools #faucets .card-footer{background-image:url("../img/cards/3-col-pink2.svg")}.page-dev-tools #trasaction-sender .card-footer{background-image:url("../img/cards/3-col-light-blue2.svg")}.page-dev-tools #domain .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.page-dev-tools #xrp-ledger .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.page-dev-tools #binary-visualizer .card-footer{background-image:url("../img/cards/3-col-purple-blue.svg")}.page-dev-tools #token-metadata-lookup .card-footer{background-image:url("../img/cards/3-col-pink-purple.svg")}.page-dev-tools .nav-link{color:#a2a2a4;background-color:#111112;border-top:none;border-left:none;border-right:none;border-bottom-color:#454549}@media(max-width: 767.98px){.page-dev-tools .nav-tabs{display:flex;list-style:none;margin-left:0;padding-left:0;justify-content:space-between}.page-dev-tools .nav-item{display:inline-flex;width:auto;list-style:outside none none}.page-dev-tools .nav-link{display:inline-flex;width:auto;padding:1em 1em}}.page-dev-tools .nav-link.active{border-bottom-color:#9a52ff;color:#fff;font-weight:bold}.page-dev-tools .nav-tabs{border-bottom:1px solid #454549}.page-dev-tools .btn{padding:.75rem}html.light .page-dev-tools .nav-link{background-color:#f5f5f7}html.light .page-dev-tools .nav-link.active{border-bottom-color:#9a52ff;color:#000;font-weight:bold}html.light .page-dev-tools .nav-link{color:#000}html.light .page-dev-tools #trasaction-sender .card-footer{background-image:url("../img/cards/3-col-light-blue-2.svg")}.json-view{display:block;color:#4d4d4d;--json-property:#009033;--json-index:#676dff;--json-number:#676dff;--json-string:#b2762e;--json-boolean:#dc155e;--json-null:#dc155e}.json-view .json-view--property{color:var(--json-property)}.json-view .json-view--index{color:var(--json-index)}.json-view .json-view--number{color:var(--json-number)}.json-view .json-view--string{color:var(--json-string)}.json-view .json-view--boolean{color:var(--json-boolean)}.json-view .json-view--null{color:var(--json-null)}.json-view .jv-indent{padding-left:1em}.json-view .jv-chevron{display:inline-block;vertical-align:-20%;cursor:pointer;opacity:.4;width:1em;height:1em}:is(.json-view .jv-chevron:hover, .json-view .jv-size:hover + .jv-chevron){opacity:.8}.json-view .jv-size{cursor:pointer;opacity:.4;font-size:.875em;font-style:italic;margin-left:.5em;vertical-align:-5%;line-height:1}.json-view :is(.json-view--copy, .json-view--edit){display:none;width:1em;height:1em;margin-left:.25em;cursor:pointer}.json-view .json-view--input{width:120px;margin-left:.25em;border-radius:4px;border:1px solid currentColor;padding:0px 4px;font-size:87.5%;line-height:1.25;background:transparent}.json-view .json-view--deleting{outline:1px solid #da0000;background-color:#da000011;text-decoration-line:line-through}:is(.json-view:hover, .json-view--pair:hover)>:is(.json-view--copy, .json-view--edit){display:inline-block}.json-view .jv-button{background:transparent;outline:none;border:none;cursor:pointer}.json-view .cursor-pointer{cursor:pointer}.json-view_a11y{color:#545454;--json-property:#aa5d00;--json-index:#007299;--json-number:#007299;--json-string:green;--json-boolean:#d91e18;--json-null:#d91e18}.json-view_github{color:#005cc5;--json-property:#005cc5;--json-index:#005cc5;--json-number:#005cc5;--json-string:#032f62;--json-boolean:#005cc5;--json-null:#005cc5}.json-view_vscode{color:#005cc5;--json-property:#0451a5;--json-index:blue;--json-number:blue;--json-string:#a31515;--json-boolean:blue;--json-null:blue}.json-view_atom{color:#383a42;--json-property:#e45649;--json-index:#986801;--json-number:#986801;--json-string:#50a14f;--json-boolean:#0184bc;--json-null:#0184bc}.json-view_winter-is-coming{color:#0431fa;--json-property:#3a9685;--json-index:#ae408b;--json-number:#ae408b;--json-string:#8123a9;--json-boolean:#0184bc;--json-null:#0184bc}.json-view{font-family:"Space Mono",monospace;padding:1em;background:#232325;overflow:hidden;color:#f5f5f7 !important;font-size:14px;letter-spacing:0}.json-view svg{height:11px !important;color:#f5f5f7}.jv-button{color:#ff6719 !important;font-size:14px}.jv-indent{border-left:1px solid #454549;margin:4px}.json-view--boolean{color:#e50071 !important}.json-view--pair{margin:4px}.json-view--property{color:#f5f5f7 !important}.json-view--null,.json-view--undefined{display:inline-block;padding:1px 2px;border-radius:3px;background-color:#454549;color:#f5f5f7 !important;font-size:11px}.json-view--number{color:#84f0b6 !important}.json-view--string{color:#ff6719 !important}.rpc-tool .nav-link{cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:6px 9px}.dev-blog .image-container{transform:translateY(15%);z-index:1}.dev-blog .text-bg{background-color:#232325;padding:60px 40px;width:100%;border-radius:30px}@media(min-width: 992px){.dev-blog .image-container{transform:translateX(15%)}.dev-blog .text-bg{padding:50px 60px}}.dev-blog .line-clamp{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.dev-blog #blog-purple{position:absolute;top:0px;left:0px}.dev-blog #card-date{color:#a2a2a4}.dev-blog .post-date{text-decoration:overline solid #32e685 10%}.dev-blog #category-list #general{content:url("../img/blog/general.png");max-width:100%;width:100%}.dev-blog #category-list #developer_reflections{content:url("../img/blog/developer_reflections.png");max-width:100%;width:100%}.dev-blog #category-list #amendments{content:url("../img/blog/amendments.png");max-width:100%;width:100%}.dev-blog #category-list #advisories{content:url("../img/blog/advisories.png");max-width:100%;width:100%}.dev-blog #category-list #release_notes{content:url("../img/blog/release_notes.png");max-width:100%;width:100%}.dev-blog #category-list #development{content:url("../img/blog/development.png");max-width:100%;width:100%}.dev-blog #category-list #gateway_bulletins{content:url("../img/blog/gateway_bulletins.png");max-width:100%;width:100%}.dev-blog #category-list #features{content:url("../img/blog/features.png");max-width:100%;width:100%}.dev-blog #category-list #security{content:url("../img/blog/security.png");max-width:100%;width:100%}.dev-blog .category_sidebar{position:sticky;top:80px}.dev-blog .category-checkbox{display:flex;align-items:center}.dev-blog .dropdown{position:relative;display:inline-block}.dev-blog .dropdown-btn{color:#fff;background-color:#232325;border-color:#232325;border-style:solid;border-radius:4px;padding:8px 16px;font-size:16px;cursor:pointer;text-align:start;padding-right:10px}.dev-blog .dropdown-btn img{content:url("../img/icons/chevron-arrow-down.svg");width:10px;height:13px;padding:8px}.dev-blog .dropdown-content{display:flex;align-items:start;background-color:#232325;padding:16px 8px;width:254px;height:auto;border-radius:4px}.dev-blog .category-checkbox label{font-weight:normal;font-size:14px;margin:0;padding-left:26px}.dev-blog .category-header{font-weight:normal;width:200px;color:#f5f5f7}.dev-blog label{margin:0;padding-left:8px;color:#fff}.dev-blog .blog-filter h6{font-size:16px}.dev-blog .blog-filter[type=checkbox]::before{position:relative;display:block;width:20px;height:20px;content:"";background:#111112;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.dev-blog .blog-filter[type=checkbox]::after{position:relative;display:block;top:-20px;width:20px;height:20px;content:"";background-repeat:no-repeat;background-position:center;border-radius:4px;border-width:2px;border-style:solid;border-color:#a2a2a4}.dev-blog .blog-filter[type=checkbox]:checked::before{background:#111112;border:none;border-radius:0}.dev-blog .blog-filter[type=checkbox]:checked::after{background-image:url(../img/blog/blog-check.svg);background-repeat:no-repeat;background-position:center;background-color:#7919ff;border-width:2px;border-style:solid;border-color:#7919ff;border-radius:4px}.dev-blog .blog-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/blog/blog-check.svg);background-repeat:no-repeat;background-position:center;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}.dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::before{background:#111112;border:none;border-radius:0}.dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::after{background:#111112;border:none;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}#feedback-content .docked-widget{border:none !important;background-color:transparent !important;position:static !important;box-shadow:none !important;width:auto !important}#feedback-content .widget-form-wrapper{position:static !important;box-shadow:none !important;display:block;background-color:#232325 !important;border-width:0 !important;padding:24px !important;border-radius:8px !important}#feedback-content .widget-form-wrapper div{background-color:#232325 !important}#feedback-content .widget-form-wrapper textarea{background-color:#fff !important;opacity:1 !important;border:none !important;border-radius:4px !important;margin:0 !important;width:100% !important;color:#000 !important}#feedback-content .widget-form-wrapper .widget-header-title{background:none !important;flex-grow:0 !important;padding-right:1rem !important;height:auto !important;padding:0 !important;margin-bottom:10px !important}#feedback-content .widget-form-wrapper .widget-header-footer{background:none !important}#feedback-content .widget-form-wrapper .widget-form-footer{padding-right:0 !important}#feedback-content .widget-form-wrapper .submit{background-color:#7919ff !important;font-weight:bold !important;color:#fff !important;border:none !important;border-color:transparent !important;border-radius:4px !important;margin:0 !important;margin-top:8px !important}#feedback-content .widget-form-wrapper .submit:hover{background:#5f00e5 !important}#feedback-content .widget-form-wrapper .submit.disabled,#feedback-content .widget-form-wrapper .submit[disabled=disabled]{background-color:#4a00b2 !important}#feedback-content .widget-form-wrapper .submit.disabled:hover,#feedback-content .widget-form-wrapper .submit[disabled=disabled]:hover{background-color:#4a00b2 !important}#feedback-content .widget-form-wrapper .cancel{margin:0 !important;margin-top:8px !important;color:#b480ff !important;font-weight:600 !important}#feedback-content #closeFeedback{display:none}#feedback-content .widget-helpful .widget-header{background-color:#232325 !important;border-radius:8px !important}#feedback-content .widget-helpful .widget-header-title{color:#fff !important}.video-image{transition:all .35s ease-out;cursor:pointer}.video-image:hover{-webkit-transform:translateY(-16px);-moz-transform:translateY(-16px);-ms-transform:translateY(-16px);-o-transform:translateY(-16px);transform:translateY(-16px)}#video-overlay{position:fixed;top:0;left:0;z-index:1190;height:100%;width:100%;background:#fff;opacity:.6;display:none}#video{display:none;position:fixed;top:10%;left:15%;width:70%;z-index:1200}#video-container{position:relative;top:50%;left:50%;-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);max-width:982px;padding:0 20px}#videoWrapper{position:absolute;top:0;left:0;height:calc(90vh - 100px);width:80vw}#videoWrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}#video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-external-link{color:#9a52ff;font-weight:600}.video-external-link::after{content:" ";background-image:url(../img/icons/arrow-up-right.svg);background-repeat:no-repeat;display:inline-block;background-size:24px;padding:9px 4px 0 8px;width:2rem;background-position:left 8px bottom 0px;transition:background-position 100ms ease-in-out}.video-external-link.video-external-link:hover::after{background-position:left 12px bottom 8px}.video-title{line-height:1.2}@media(min-width: 768px){.video-title{font-size:1rem}}@media(max-width: 768px){.page-community .sm-align-items-start{align-items:start !important}}.page-community .numbers-animation{width:218px;height:96px}@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}.page-community .bounce-arrow{animation:bounce 1.5s infinite;animation-timing-function:ease-in-out;height:26px;width:26px;position:relative;top:24px}.page-community .m-gif{height:108px}.page-community .middle-image{margin:0 auto;height:35px}.page-community .bg-hero{width:100%;height:635px}.page-community #center-image{cursor:pointer}.page-community .gradient-num-three{background:linear-gradient(35deg, #84F0B6 -0.3%, #B480FF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent}.page-community .middle-image-two{margin:0 auto;height:52px}.page-community .gradient-num-two{background:linear-gradient(35deg, #EA80FF -0.3%, #80CCFF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent}.page-community .gradient-num{background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent}.page-community .surround-gradient{background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:40px;font-weight:400}.page-community .surround-gradient-two{background:linear-gradient(35deg, #EA80FF -0.3%, #80CCFF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:40px;font-weight:400}.page-community .surround-gradient-three{background:linear-gradient(35deg, #84F0B6 -0.3%, #B480FF 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:40px;font-weight:400}.page-community .main-title{color:var(--black-black-0, #FFF);text-align:center;font-family:Work Sans;font-size:62px;font-style:normal;font-weight:700;line-height:70px}@media(max-width: 768px){.page-community .main-title{font-size:42px;line-height:52px;text-align:left}}.page-community .get-funding-btn{width:90%;margin:0 auto}@media(max-width: 768px){.page-community .cd-none-sm{display:none !important}}@media(min-width: 769px){.page-community .cd-none-lg{display:none !important}}.page-community .icon-date{padding-right:4px;content:url(../img/events/event-date.svg)}.page-community .icon-location{padding-right:4px;content:url(../img/events/event-location.svg)}.page-community .builders-wrap{white-space:nowrap}@media(min-width: 768px){.page-community .builders-wrap{white-space:normal}}.page-community #community-table{padding:20px 93px;max-width:1280px;margin:0 auto;border-radius:5px;padding-top:165px}@media(min-width: 992px){.page-community #community-table{padding-top:512px}}@media(max-width: 768px){.page-community #community-table{margin:0;padding:20px;margin-top:100px !important}}.page-community .eyebrow-convo{text-align:start;font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:26px;padding-bottom:5px}.page-community .final-tr{border:none !important}.page-community #community-table h4{text-align:start;margin:10px 0;font-family:Work Sans;font-size:32px;font-style:normal;font-weight:700;line-height:38px}.page-community #community-table table{width:100%;margin-top:31px;border-collapse:collapse}.page-community #community-table tr{padding:10px 10px;border-bottom:1px solid #343437}.page-community #community-table td{overflow:hidden;max-width:34vw;position:relative;vertical-align:middle}.page-community .scrolling-text{display:inline-block}.page-community #community-table img{max-width:52px;height:29px}.page-community .td-img{padding:10px;width:69px}.page-community .td-img .discord-icon{content:url(../img/community/ic_discord.png)}.page-community .td-img .twitter-icon{content:url(../img/community/ic_twitter.png)}.page-community .td-img .youtube-icon{content:url(../img/community/ic_youtube.png)}.page-community .td-img .xrpl-icon{content:url(../img/community/ic_xrpl.png)}.page-community .td-img .github-icon{content:url(../img/community/ic_github.png)}.page-community .td-img .stackoverflow-icon{content:url(../img/community/ic_stackoverflow.png)}.page-community .text-external-link{display:inline-flex;align-items:center;margin-left:10px}.page-community .external-link-contribute{display:inline-block;vertical-align:middle;padding-right:41px;height:16px;background:url(../img/icons/arrow-up-right.svg) no-repeat center center;transition:transform .3s ease}.page-community .text-external-link:hover .external-link-contribute{transform:translate(5px, -5px)}.page-community table td{position:relative;padding-right:25px}.page-community table td .text-external-link{position:absolute;right:5px;top:50%;transform:translateY(-50%)}@media(max-width: 768px){.page-community #community-table img{width:96px;height:29px}.page-community #community-table{width:100%}.page-community .td-img{min-width:60px}}.page-community .funding-text{color:var(#FFFFFF);font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:44px;padding-bottom:4px}.page-community .xrpl-events-section{padding:50px 40px;margin:100px auto;display:flex;justify-content:space-around;align-items:center;max-width:1280px}@media screen and (max-width: 768px){.page-community .xrpl-events-section{flex-direction:column;align-items:start}.page-community .xrpl-events-section .header-div{text-align:center}.page-community .xrpl-events-section .header{display:flex;flex-direction:column;align-items:start}.page-community .xrpl-events-section .header h6{margin-bottom:.5rem;font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:28px}.page-community .xrpl-events-section .header h4{font-family:Work Sans;font-size:28px;font-style:normal;font-weight:700;line-height:34px}.page-community .xrpl-events-section .description{text-align:start;margin-top:2rem;font-family:Work Sans;font-size:24px;font-style:normal;font-weight:500;line-height:28px}.page-community .xrpl-events-section .view-all-events-btn{float:left}.page-community .xrpl-events-section .upcoming-event{text-align:start;margin-top:2rem;padding:1rem 0}.page-community .xrpl-events-section .upcoming-event .days-count{margin-bottom:1rem}}.page-community .xrpl-events-section .header-div{padding-top:27px}.page-community .xrpl-events-section .header h6{padding-left:1.5px;font-family:"Work Sans",sans-serif;font-size:20px;font-weight:700;color:var(--black-black-0, #FFF);text-align:start}.page-community .xrpl-events-section .header h4{text-align:start;font-family:"Work Sans",sans-serif;font-size:32px;font-weight:700;color:var(--black-black-0, #FFF)}.page-community .xrpl-events-section .description{font-family:"Work Sans",sans-serif;font-size:20px;font-weight:500;max-width:444px;color:var(--black-black-10-gray-200, #E0E0E1);line-height:32px}.page-community .xrpl-events-section .view-all-events-btn{display:inline-block;margin-top:1rem}.page-community .xrpl-events-section .upcoming-event{margin-top:2rem}.page-community .xrpl-events-section .upcoming-event .upcoming-label{position:relative;top:7px;font-family:"Work Sans",sans-serif;font-size:12px;font-weight:600;text-transform:uppercase;color:var(--black-black-30, #C1C1C2)}.page-community .xrpl-events-section .upcoming-event .days-count{font-weight:300;margin-bottom:21px;line-height:99px;font-size:88px;background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;display:inline-block}.page-community .xrpl-events-section .upcoming-event .days-word{vertical-align:bottom;font-weight:normal;margin-bottom:21px;line-height:99px;font-size:40px;background:linear-gradient(35deg, #B480FF -0.3%, #FFAA80 99.7%);-webkit-background-clip:text;background-clip:text;color:transparent;display:inline-block}.page-community .xrpl-events-section .upcoming-event h5{font-family:"Work Sans",sans-serif;font-size:16px;font-weight:700;color:var(--black-black-10, #F5F5F7)}.page-community .xrpl-events-section .upcoming-event .event-details,.page-community .xrpl-events-section .upcoming-event .event-location{font-family:"Work Sans",sans-serif;font-size:12px;font-weight:600;color:var(--black-black-30, #C1C1C2)}.page-community .community-funding{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:1280px;margin:100px auto;padding-right:54px;padding-left:73px;margin-top:120px}.page-community .funding-section{flex:1;padding:20px;color:var(--black-black-0)}.page-community .small-text{color:var(--black-black-30, #C1C1C2);font-family:Work Sans;font-size:12px;font-style:normal;font-weight:600;line-height:16px;text-transform:uppercase;padding-left:11px;text-align:start}.page-community .funding-section h2{font-size:32px;font-weight:700;line-height:38px;margin-top:10px;margin-bottom:40px}.page-community .funding-section p{color:var(--black-black-20);font-size:24px;font-weight:500;line-height:32px;margin-bottom:40px}.page-community .stats{flex:1;display:flex;justify-content:space-between}@media(max-width: 768px){.page-community .stats{flex-direction:column;align-items:start;text-align:start;padding-left:7px}}.page-community .stacked-stats{display:flex;flex-direction:column;justify-content:space-between}.page-community .stat{align-self:center;text-align:center;margin:0 auto;display:flex;flex-direction:column}@media(max-width: 768px){.page-community .stat{margin:0px;text-align:start;align-self:start}}.page-community .number{opacity:1;font-size:88px;display:flex;padding:10px;align-items:center;line-height:96px;font-weight:300}@media screen and (max-width: 768px){.page-community .community-funding{flex-direction:column-reverse;padding-left:16px;padding-right:16px}.page-community .funding-section,.page-community .stats{width:100%}}.page-community .carousel{position:relative;width:1280px;margin:0 auto;margin-top:106px;max-width:100%}.page-community .carousel .flex-align{display:flex;align-items:center}@media(max-width: 768px){.page-community .carousel{width:100%}}.page-community .center-image-wrapper{position:relative;width:552px;height:314px}@media(max-width: 1118px){.page-community .center-image-wrapper{width:55%;height:auto}}@media(max-width: 768px){.page-community .center-image-wrapper{margin:0 auto;width:86%}}.page-community .image-container{display:flex;justify-content:space-around;align-items:center;overflow:hidden}.page-community .image-container img{max-width:100%;transition:transform .7s ease-in-out,opacity .7s ease-in-out}.page-community #center-image{width:100%}.page-community #left-image,.page-community #right-image{width:252px;height:144px;opacity:.7}@media(max-width: 1118px){.page-community #left-image,.page-community #right-image{width:15%;height:auto}}@media(max-width: 768px){.page-community #left-image,.page-community #right-image{display:none;margin:0}}.page-community #left-image.exit,.page-community #right-image.exit{transform:translateX(-100%);opacity:0}.page-community #left-image.enter,.page-community #right-image.enter{transform:translateX(100%);opacity:0}.page-community #center-image.exit{transform:scale(0.8);opacity:0}.page-community #center-image.enter{transform:scale(1);opacity:1}.page-community .nav-btn{position:absolute;top:50%;transform:translateY(-50%);font-size:24px;background:none;border:none;cursor:pointer}.page-community #prev-btn{left:0}.page-community #next-btn{right:0}.page-community .event-info{position:absolute;bottom:10px;left:32px;display:flex;flex-direction:column;gap:4px}@media(max-width: 768px){.page-community .event-info{left:7px}}.page-community .event-info span{color:#fff;font-family:Work Sans;font-size:12px;font-style:normal;font-weight:600;line-height:16px}.page-community .event-info .name{padding-bottom:5px;color:var(--black-black-10, #F5F5F7);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:700;line-height:24px}.page-community .arrow-wrapper{display:flex;justify-content:center;padding-top:24px}.page-community :root{--black-black-0: #FFF;--black-black-10: #F5F5F7;--black-black-30: #C1C1C2}.page-community .community-spotlight-wrapper{display:flex;padding:20px;max-width:1280px;min-height:582px;margin:100px auto;gap:48px;padding-right:54px;padding-left:73px}.page-community .community-spotlight{flex:1;display:flex;flex-direction:column;padding-right:10px}.page-community .projects-wrapper{flex:1;position:relative;display:flex;justify-content:center;gap:48px}@media(max-width: 768px){.page-community .projects-wrapper{gap:48px}}.page-community .project-card{background-color:transparent;border-radius:4px;height:fit-content;width:252px;max-height:456px}@media(max-width: 768px){.page-community .project-card{width:99%}}.page-community .project-card.bottom-right{align-self:end}.page-community .card-image{border-radius:4px;height:144px;width:252px;background-color:#2c2b2b;display:flex;align-items:center}.page-community .spotlight-title,.page-community .project-title{color:var(--black-black-10, #F5F5F7);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:700;line-height:16px}.page-community .spotlight-subtitle{color:var(--black-black-10, #F5F5F7);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:700;line-height:16px}.page-community .project-description{color:var(--black-black-30, #C1C1C2);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:400;line-height:24px}.page-community .card-details{background-color:transparent;display:flex;flex-direction:column;text-align:start;padding:15px;height:fit-content}.page-community .view-project{color:var(--blue-purple-blue-purple-50, #7919FF);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:400;line-height:16px;cursor:pointer;text-decoration:none}@media(max-width: 1076px){.page-community .project-card.bottom-right{align-self:auto}.page-community .community-spotlight-wrapper{flex-direction:column;align-items:center;margin-left:0px;padding-right:26px;padding-left:26px}.page-community .community-spotlight,.page-community .projects-wrapper{width:100%;margin:0;padding:0}.page-community .projects-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center;position:static}.page-community .card-image{width:100%}.page-community .card-details{gap:16px;margin-top:10px}.page-community .project-card{position:static;margin:20px 0;height:fit-content}}.page-community .w-222{width:222px}.page-community .bottom-cards-section .com-card .card-content{display:flex;flex-direction:column;justify-content:space-between;gap:16px;position:relative;z-index:1;height:100%}.page-community .bottom-cards-section .com-card{border-radius:8px;padding:36px;background:#232325;min-width:352px;height:442px;max-width:352px;position:relative;display:flex;flex-direction:column;justify-content:space-between}.page-community .bottom-cards-section{display:flex;flex-direction:row;justify-content:center;gap:48px;max-width:1280px;margin:0 auto}.page-community .bottom-cards-section .com-card{padding:36px;background:#232325;min-width:352px;height:442px;max-width:352px;position:relative}.page-community .bottom-cards-section .com-card .top-left-img{position:absolute;top:0;height:292px;left:0;content:url(../img/community/card-bg-1.svg)}.page-community .bottom-cards-section .com-card .bottom-right-img{position:absolute;bottom:0;right:0;height:333px;content:url(../img/community/card-bg-2.svg)}.page-community .bottom-cards-section .com-card .top-right-img{height:390px;position:absolute;top:0;right:0;content:url(../img/community/card-bg-3.svg)}.page-community .bottom-cards-section .com-card .card-content{display:flex;flex-direction:column;gap:16px;position:relative;z-index:1}.page-community .bottom-cards-section .com-card .card-content .card-title{margin-bottom:0px !important;color:var(--black-black-0-white, #FFF);white-space:nowrap;font-family:Work Sans;font-size:20px;font-style:normal;font-weight:700;line-height:26px}.page-community .bottom-cards-section .com-card .card-content .card-subtitle{color:var(--black-black-0, #FFF);font-family:Work Sans;font-size:24px;font-style:normal;font-weight:700;line-height:32px;margin-top:2px}.page-community .bottom-cards-section .com-card .card-content .card-description{color:var(--black-black-20, #E0E0E1);font-family:Work Sans;font-size:16px;font-style:normal;font-weight:400;line-height:24px;margin-top:15px;margin-bottom:15px}.page-community .bottom-cards-section .com-card .card-content .card-links{display:flex;flex-direction:column;gap:8px}.page-community .bottom-cards-section .com-card .card-content .com-card-link{text-decoration:none;cursor:pointer;color:#9a52ff;font-family:Work Sans;font-size:16px;font-style:normal;font-weight:600;line-height:24px}@media(max-width: 767.98px){.page-community .bottom-cards-section .com-card .card-content .com-card-link{display:block;width:100%}}.page-community .bottom-cards-section .com-card .card-content .com-card-link::after{display:inline-block;content:url(../img/icons/arrow-right-purple.svg);position:relative;top:1px;vertical-align:middle;padding-left:8px;-webkit-transition:transform .3s ease-out;-moz-transition:transform .3s ease-out;-ms-transition:transform .3s ease-out;-o-transition:transform .3s ease-out;transition:transform .3s ease-out}.page-community .bottom-cards-section .com-card .card-content .com-card-link:hover{border:none}.page-community .bottom-cards-section .com-card .card-content .com-card-link:hover::after{-webkit-transform:translateX(4px);-moz-transform:translateX(4px);-ms-transform:translateX(4px);-o-transform:translateX(4px);transform:translateX(4px)}@media(max-width: 768px){.page-community .bottom-cards-section{flex-direction:column;align-items:center;padding:20px}.page-community .bottom-cards-section .com-card{margin-bottom:20px;display:block;width:100%}.page-community .com-card .top-left-img,.page-community .com-card .bottom-right-img,.page-community .com-card .top-right-img{position:static;display:block;width:100%;margin-bottom:15px}}.page-community .num-separator{width:32px;height:1px;background:var(--black-black-70, #343437);margin-bottom:32px;margin-top:1px}.page-community .stat-separator{width:32px;height:1px;background:var(--black-black-70, #343437);margin-bottom:32px;margin-top:8px}.page-community .ml-8{margin-left:8px}.page-community .ml-19{margin-left:19px}.page-community .ml-14{margin-left:11px}.page-community .header-div .header{gap:10px;display:flex;flex-direction:column;padding-bottom:35px}.page-community .spotlight-subtitle{font-size:32px;font-weight:700;line-height:38px;margin-top:10px;margin-bottom:40px}.page-community .spotlight-description{color:var(--black-black-20);font-size:24px;font-weight:500;line-height:32px;margin-bottom:40px}.sdk-img{align-self:center}.light .sdk-img{content:url(../img/graphics/sdk-white.png)}.light .ref-book-illustration{content:url(../img/graphics/ref-book-light.png)}.light .tutorial-illustration{content:url(../img/graphics/tutorials-illustration-light.png)}.light .concepts-doc-illustration{content:url(../img/graphics/concepts-docs-light.png)}.light .use-cases .wallet-illustration{content:url(../img/graphics/wallet-light.svg)}.light .use-cases .token-illustration{content:url(../img/graphics/tokens-light.png)}.light .use-cases .connections-illustration{content:url(../img/graphics/nodes-light.svg)}.light .quickstart-image{content:url(../img/graphics/getting-started-pages-light.png)}.light .dev-tools-img{content:url(../img/graphics/dev-tools-light.svg)}.light .dev-tools-link:hover p{color:#000}.dark .sdk-img{content:url(../img/graphics/sdk-black.png)}.dark .ref-book-illustration{content:url(../img/graphics/ref-book.png)}.dark .tutorial-illustration{content:url(../img/graphics/tutorials-illustration.png)}.dark .concepts-doc-illustration{content:url(../img/graphics/concepts-doc.png)}.dark .use-cases .wallet-illustration{content:url(../img/graphics/wallet-dark.png)}.dark .use-cases .token-illustration{content:url(../img/graphics/tokens-dark.png)}.dark .use-cases .connections-illustration{content:url(../img/graphics/nodes-dark.png)}.dark .quickstart-image{content:url(../img/graphics/getting-started-pages-dark.svg)}.dark .dev-tools-img{content:url(../img/graphics/dev-tools-dark.png)}.dark .dev-tools-link:hover p{color:#fff}.dark .flat-card-grid .nav-link:hover{color:#e0e0e1}.get-started-img,.flat-card{max-width:100%;max-height:100%}.faded-text{font-family:"Work Sans";font-style:normal;font-weight:400;font-size:15.5667px;line-height:23px}.page-docs-index section{padding-top:64px;padding-bottom:64px}.page-docs-index .dev-tools-link h6::before{margin-top:-20px;height:20px}.page-docs-index .dev-tools-link h6:hover{text-decoration:underline;text-decoration-color:#9a52ff;background:none !important}.page-docs-index .dev-tools-link:hover p{text-decoration:none !important;background:none !important;display:inline-block}.page-docs-index .dev-tools-link a:hover{color:#9a52ff;text-decoration:none !important}.page-docs-index .dev-tools-link .btn-arrow::after{content:url(../img/icons/arrow-right-purple.svg);width:1.5rem;height:1.5rem}.page-docs-index .langs>a{display:block}.page-docs-index .langs h5:hover{text-decoration:underline;text-decoration-color:#9a52ff;background:none !important}.page-docs-index .langs a:hover{text-decoration:none !important}.page-docs-index .langs .btn-arrow::after{content:url(../img/icons/arrow-right-purple.svg);vertical-align:baseline;width:1.5rem;height:1.5rem}.page-docs-index .langs h5{margin-block-start:0 !important}.page-docs-index .langs h5::before{margin-top:0;height:0}.page-docs-index h1{font-size:3.875rem}.page-docs-index .arrow-purple::after{content:url(../img/icons/arrow-right-purple.svg)}.page-docs-index .documentation-index:hover,.page-docs-index .documentation-index::after{color:#9a52ff;text-decoration:none !important;background:none !important}@media(max-width: 765px){.page-docs-index h1{font-size:3rem}.page-docs-index .flat-card-grid{grid-gap:24px}.page-docs-index .flat-card-grid .flat-card{padding:32px 12px}.page-docs-index::before{display:none}}#langs-cards{grid-gap:40px}@media(max-width: 991.98px){.page-docs-index .langs-cards{grid-template-columns:1fr 1fr;grid-auto-rows:auto}}.dev-tools-img{max-width:100%;max-height:100%;margin:auto}.page-docs .h4::before{margin-top:0;height:0}.page-docs .row{margin-right:0;margin-left:0}.page-docs .video-grid{grid-gap:35px}.page-docs .title-space{margin-bottom:16px}.page-docs .circled-logo{margin-left:.1rem}.flat-card-grid{grid-gap:15px;max-width:100%;min-height:384px}.flat-card-grid .flat-card{padding:32px 50px;height:100%;width:100%;box-shadow:none}.flat-card-grid .flat-card-padding{margin-bottom:75px}.flat-card-grid img{width:auto;height:115px;margin-left:auto;margin-right:auto}.flat-card-grid .nav-link{border:none !important}.flat-card-grid .nav-link:hover{text-decoration:underline;text-decoration-color:#9a52ff}.flat-card-grid .nav-link::after{content:none !important}@media(max-width: 991.98px){.flat-card-grid .flat-card-padding{margin-bottom:0}.flat-card-grid .nav-link::after{content:" " !important}.flat-card-grid .flat-card .btn{display:none}}.float-up-on-hover{transition:all .35s ease-out;cursor:pointer}.float-up-on-hover:hover{-webkit-transform:translateY(-16px);-moz-transform:translateY(-16px);-ms-transform:translateY(-16px);-o-transform:translateY(-16px);transform:translateY(-16px)}.float-up-on-hover .video-image:hover{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}@media(min-width: 992px){.align-button-on-bottom .btn-primary{position:absolute;bottom:0}}.center-image{display:flex;justify-content:center}.quickstart-card .quickstart-image{margin-left:-20px;margin-right:-20px;margin-bottom:-20px}@media(min-width: 992px){.quickstart-card{margin-left:-32px;margin-right:-32px;margin-bottom:-32px;width:calc(100% + 64px)}}.explore-links .card-grid{grid-gap:40px}.full-documentation-link{margin-top:-35px}button.MarkpromptFloatingTrigger{bottom:4.5rem;border-radius:4px;right:16px;border:1px solid transparent;color:var(--markprompt-primaryForeground);background-color:var(--markprompt-primary)}@media(min-width: 992px){button.MarkpromptFloatingTrigger{right:32px}}html.light .MarkpromptContentDialog a{color:#7919ff}html.light .MarkpromptContentDialog h3:not(.chip){color:#000}.MarkpromptExtendedFeedbackTextInput{background-color:#fff;color:#000}.MarkpromptOverlay{z-index:20}.osano-cm-close{box-sizing:content-box !important}.osano-cm-switch{box-sizing:content-box !important}.osano-cm-widget{right:16px;width:50px;height:50px;border:1px solid transparent}@media(min-width: 992px){.osano-cm-widget{right:32px}}html.light article p code,html.light article table code,html.light article li>code{background-color:#e0e0e1;color:#111112}html.light body{background-color:#f5f5f7;color:#000}html.light #topnav-theme .custom-theme-toggle .custom-control-label::before{background-color:transparent;background-position:bottom right;transform:rotate(-15deg)}html.light h1:not(.chip),html.light h2:not(.chip),html.light h3:not(.chip),html.light h4:not(.chip),html.light h5:not(.chip),html.light h6:not(.chip),html.light .h1:not(.chip),html.light .h2:not(.chip),html.light .h3:not(.chip),html.light .h4:not(.chip),html.light .h5:not(.chip),html.light .h6:not(.chip){color:#000}html.light h1.green-500,html.light h2.green-500,html.light h3.green-500,html.light h4.green-500,html.light h5.green-500,html.light h6.green-500,html.light .h1.green-500,html.light .h2.green-500,html.light .h3.green-500,html.light .h4.green-500,html.light .h5.green-500,html.light .h6.green-500{color:#28b86a;text-shadow:#fff 0 0 2px,#fff -1px -1px 2px,#fff 1px 1px 2px}html.light .bg-grey-800{background-color:#fcfcfd}html.light .grey-400{color:#454549}html.light .text-muted{color:#232325 !important}html.light .longform{color:#232325}html.light .numbers{color:#000}html.light .stat-highlight,html.light .eyebrow{color:#111112}html.light .invertible-img{filter:invert(100%)}html.light .arrow-link::after{content:url("../img/lightmode/icon-long-arrow.svg")}html.light .search .input-group-text,html.light .input-group .input-group-text,html.light .form-group .input-group-text{background-color:#e0e0e1;color:#232325}html.light .search label .input-group-text,html.light .search .form-control:not(.btn),html.light .input-group label .input-group-text,html.light .input-group .form-control:not(.btn),html.light .form-group label .input-group-text,html.light .form-group .form-control:not(.btn){color:#000;background-color:#e0e0e1;border-color:#e0e0e1}html.light .search .ds-input,html.light .input-group .ds-input,html.light .form-group .ds-input{color:#000;background-color:#e0e0e1;border-color:#e0e0e1}html.light .search .ds-input:focus,html.light .input-group .ds-input:focus,html.light .form-group .ds-input:focus{border-color:#9a52ff}html.light .list-group-item{border-color:#232325;background-color:#f5f5f7}html.light .list-group-item.disabled{color:#a2a2a4}html.light .progress{background-color:#e0e0e1}html.light [data-component-name="Search/SearchIcon"]>path{fill:#000}html.light a,html.light nav a,html.light a:not([role=button]){color:#000}html.light a.btn-primary,html.light nav a.btn-primary,html.light a:not([role=button]).btn-primary{color:#fff}html.light a.btn-primary:hover,html.light nav a.btn-primary:hover,html.light a:not([role=button]).btn-primary:hover{color:#fff}html.light a:hover,html.light a:active,html.light a.active,html.light nav a:hover,html.light nav a:active,html.light nav a.active,html.light a:not([role=button]):hover,html.light a:not([role=button]):active,html.light a:not([role=button]).active{color:#7919ff}html.light a:not(.btn):focus,html.light nav a:not(.btn):focus,html.light a:not([role=button]):not(.btn):focus{background-color:transparent}html.light a.card:hover,html.light:active,html.light.active{color:#000}html.light .landing-table tbody td{color:#232325}html.light .btn-outline-secondary,html.light article a.button,html.light .navbar-dark .navbar-nav .nav-link.btn-outline-secondary{color:#111112;border-color:#111112}html.light .btn-outline-secondary:not(:disabled):not(.disabled):hover,html.light .btn-outline-secondary:not(:disabled):not(.disabled):active,html.light article a.button:not(:disabled):not(.disabled):hover,html.light article a.button:not(:disabled):not(.disabled):active,html.light .navbar-dark .navbar-nav .nav-link.btn-outline-secondary:not(:disabled):not(.disabled):hover,html.light .navbar-dark .navbar-nav .nav-link.btn-outline-secondary:not(:disabled):not(.disabled):active{color:#9a52ff;border-color:#9a52ff;background-color:transparent}html.light .breadcrumb{background:#f5f5f7}html.light .breadcrumb-item a{color:#454549}html.light .breadcrumb-item a:hover{color:#9a52ff}html.light .top-nav{background:#f5f5f7}html.light .top-nav #topnav-pages .nav-link{color:#000}html.light .top-nav .navbar-brand .logo{content:url(../img/XRPLedger_DevPortal-black.svg);height:40px}html.light .top-nav #dropdown-hero-for-docs>img{content:url(../img/icons/lightmode/docs.svg)}html.light .top-nav #dropdown-hero-for-community>img{content:url(../img/icons/lightmode/contribute.svg)}html.light .top-nav .dropdown-menu{background-color:#f5f5f7;border-color:#f5f5f7;box-shadow:0px 5px 20px 0px #c1c1c2}html.light .top-nav .dropdown-menu a:hover,html.light .top-nav .dropdown-menu a.active{color:#7919ff}html.light .top-nav .dropdown-menu .dropdown-item.dropdown-hero>img{background-color:#fcfcfd}html.light .top-nav .dropdown-menu .dropdown-item.dropdown-hero p{color:#343437}html.light .top-nav .dropdown-menu .dropdown-item.active{color:#7919ff}html.light .top-nav .dropdown-menu h5{color:#454549}html.light .top-nav .dropdown-menu .col-for-get_started{background-color:#e0e0e1}html.light .top-nav #topnav-button{background-color:#e0e0e1}@media(max-width: 991.98px){html.light .top-nav .navbar-toggler .navbar-toggler-icon::after,html.light .top-nav .navbar-toggler .navbar-toggler-icon::before,html.light .top-nav .navbar-toggler .navbar-toggler-icon div{background-color:#111112}html.light .top-nav .navbar-nav .nav-link,html.light .top-nav .navbar-collapse>.nav-item{background:#e0e0e1}html.light .top-nav #top-main-nav{background-color:#c1c1c2}}html.light aside .sidenav_cat_title{color:#000}html.light .page-toc .level-1 a,html.light .command-list .separator{color:#000}html.light aside a:hover,html.light aside .sidenav_cat_title:hover,html.light aside a.active,html.light aside a.active:hover,html.light aside .active>a,html.light aside .active>a:hover{color:#7919ff}html.light .dactyl-tree-nav nav{border-left:1px solid #000}html.light .dactyl-tree-nav nav .nav-link:hover,html.light .dactyl-tree-nav nav .nav-link:active{border-left-color:#7919ff}html.light .dactyl-tree-nav nav .active>.nav-link{border-left-color:#7919ff}html.light .page-toc,html.light .command-list{border-left:1px solid #000}html.light .page-toc .level-3,html.light .command-list .level-3{border-left:1px solid #000}html.light .page-toc li a:hover,html.light .page-toc li a .active,html.light .command-list li a:hover,html.light .command-list li a .active{border-left-color:#7919ff}html.light .footer-brand .logo{filter:invert(100%)}html.light .copyright-license{text-shadow:#fff 0px 0px 2px,#fff 1px 1px 2px,#fff 2px 2px 3px,#fff 2px 2px 4px,#fff 2px 2px 5px,#fff 2px 2px 6px,#fff -1px -1px 2px,#fff -2px -2px 3px,#fff -2px -2px 4px}html.light a.osano-cm-link{color:#fff}html.light article .card,html.light .landing .card,html.light .cta-card,html.light aside .card{color:#000;background-color:#fcfcfd;box-shadow:0px 5px 20px 0px #c1c1c2}html.light #code-samples-deck .card{box-shadow:0px 5px 20px 0px #c1c1c2}html.light #code-samples-deck .card-header{border-bottom:none;background-color:#fcfcfd}html.light #code-samples-deck .card-footer{background-color:#fcfcfd}html.light .page-faq.landing-builtin-bg::before,html.light .mini-faq.landing-builtin-bg::before{opacity:.6}html.light .page-faq .q-wrapper,html.light .mini-faq .q-wrapper{background-color:#fcfcfd;color:#000;box-shadow:0px 5px 20px 0px #c1c1c2}html.light .page-faq .q-wrapper>h4 a.expander:hover,html.light .mini-faq .q-wrapper>h4 a.expander:hover{color:#000}html.light .page-community .com-card{background:#fff}html.light .page-community .project-description{color:#343437}html.light .page-community #platform-stack-overflow{content:url("../img/logos/lightmode/stack-overflow.svg")}html.light .page-community #platform-discord{content:url("../img/logos/lightmode/discord.svg")}html.light .status.not_enabled{color:#aeb200}html.light .pg-category{color:#454549}html.light .landing .nav .nav-link{color:#232325;border-bottom-color:#c1c1c2}html.light .landing .circled-logo{background-color:#e0e0e1}html.light .landing .circled-logo img[src="assets/img/logos/globe.svg"]{filter:invert(100%)}html.light .landing p a,html.light .landing .longform a{color:#7919ff}html.light .devportal-callout.caution,html.light .devportal-callout.注意{border-color:#aeb200}html.light .devportal-callout.caution>strong:first-child::before,html.light .devportal-callout.注意>strong:first-child::before{color:#aeb200}html.light .devportal-callout.tip,html.light .devportal-callout.ヒント{border-color:#2dcf78}html.light .devportal-callout.tip>strong:first-child::before,html.light .devportal-callout.ヒント>strong:first-child::before{color:#2dcf78}html.light code{color:#000}html.light pre code,html.light pre{background-color:#e0e0e1}html.light .multicode a{color:#000}html.light .multicode a.current{color:#fff}html.light .multicode a:hover{text-decoration:none;background-color:#e0e0e1;color:#fff}html.light .multicode a:focus{background-color:#232325}html.light .codehilite .btn-outline-secondary{background-color:#232325;color:#f5f5f7;border-color:#f5f5f7}html.light .interactive-block .breadcrumb-item.done a::after{color:#145c35}html.light .modal-content{background-color:#fcfcfd}html.light .rpc-tool pre .toggle{color:#fff}html.light .rpc-tool pre .toggle:hover{color:#b480ff}html.light .page-home #home-hero-graphic{content:url("../img/lightmode/home-hero.svg")}html.light .page-home #benefits-list #public{content:url("../img/icons/lightmode/public.svg")}html.light .page-home #benefits-list #streamlined{content:url("../img/icons/lightmode/streamlined.svg")}html.light .page-home #benefits-list #performance{content:url("../img/icons/lightmode/performance.svg")}html.light .page-home #benefits-list #low-cost{content:url("../img/icons/lightmode/low-cost.svg")}html.light .page-home #benefits-list #community{content:url("../img/icons/lightmode/community.svg")}html.light .page-home #benefits-list #reliability{content:url("../img/icons/lightmode/reliability.svg")}html.light #validator-graphic{content:url("../img/lightmode/validators.svg")}html.light #wallets #wallet-xumm{content:url("../img/wallets/lightmode/xumm.svg")}html.light #wallets #wallet-bitfrost{content:url("../img/wallets/lightmode/bitfrost.png")}html.light #wallets #wallet-towo{content:url("../img/wallets/lightmode/towo.svg")}html.light #wallets #wallet-keystone{content:url("../img/wallets/lightmode/keystone.svg")}html.light #wallets #wallet-dcent{content:url("../img/wallets/lightmode/dcent.svg")}html.light #wallets #wallet-coin{content:url("../img/wallets/lightmode/coin.svg")}html.light #top-exchanges #exch-bitstamp{content:url("../img/exchanges/lightmode/bitstamp.svg")}html.light #top-exchanges #exch-cex-io{content:url("../img/exchanges/lightmode/cex-io.svg")}html.light #top-exchanges #exch-liquid{content:url("../img/exchanges/lightmode/liquid.svg")}html.light #top-exchanges #exch-bitfinex{content:url("../img/exchanges/lightmode/bitfinex.svg")}html.light #top-exchanges #exch-bittrex{content:url("../img/exchanges/lightmode/bittrex.png")}html.light #top-exchanges #exch-currency-com{content:url("../img/exchanges/lightmode/currency-com.png")}html.light #top-exchanges #exch-ftx{content:url("../img/exchanges/lightmode/ftx.png")}html.light #top-exchanges #exch-lmax{content:url("../img/exchanges/lightmode/lmax.png")}html.light .timeline-dot{background-color:#f5f5f7}html.light .page-uses .card-body{background:#fff;color:#343437}html.light .page-uses .modal-footer,html.light .page-uses .modal-header{background-color:#fcfcfd}html.light .page-uses #infrastructure{content:url("../img/icons/usecases/lightmode/ic_infrastructure.png")}html.light .page-uses #developer_tooling{content:url("../img/icons/usecases/lightmode/ic_developer_tooling.png")}html.light .page-uses #interoperability{content:url("../img/icons/usecases/lightmode/ic_interoperability.png")}html.light .page-uses #wallet{content:url("../img/icons/usecases/lightmode/ic_wallet.png")}html.light .page-uses #nfts{content:url("../img/icons/usecases/lightmode/ic_nfts.png")}html.light .page-uses #exchanges{content:url("../img/icons/usecases/lightmode/ic_exchanges.png")}html.light .page-uses #gaming{content:url("../img/icons/usecases/lightmode/ic_gaming.png")}html.light .page-uses #security{content:url("../img/icons/usecases/lightmode/ic_security.png")}html.light .page-uses #payments{content:url("../img/icons/usecases/lightmode/ic_payments.png")}html.light .page-uses #web_monetization{content:url("../img/icons/usecases/lightmode/ic_web_monetization.png")}html.light .page-uses #sustainability{content:url("../img/icons/usecases/lightmode/ic_sustainability.png")}html.light .page-uses #cbdc{content:url("../img/icons/usecases/lightmode/ic_cbdc.png")}html.light .page-uses #custody{content:url("../img/icons/usecases/lightmode/ic_custody.png")}html.light .page-uses #other{content:url("../img/icons/usecases/lightmode/ic_other.png")}html.light .page-uses #carbon_markets{content:url("../img/icons/usecases/lightmode/ic_carbon_markets.png")}html.light .page-uses #defi{content:url("../img/icons/usecases/lightmode/ic_defi.png")}html.light .page-uses .category-header{color:#343437}html.light .page-uses .category_count{background:#d2b2ff;color:#350080}html.light .page-uses .section-text-title{color:#000}html.light .page-uses #use_case_companies_list #bitgo .biz-logo{max-height:40px;content:url("../img/uses/lightmode/bitgo.svg")}html.light .page-uses #use_case_companies_list #sologenic-nft .biz-logo{max-height:40px;content:url("../img/uses/lightmode/sologenic-nft.svg")}html.light .page-uses #use_case_companies_list #carbonland-trust .biz-logo{max-height:40px;content:url("../img/uses/lightmode/carbonland-trust.svg")}html.light .page-uses #use_case_companies_list #futureverse .biz-logo{max-height:40px;content:url("../img/uses/lightmode/futureverse.png")}html.light .page-uses #use_case_companies_list #moai-finance .biz-logo{max-height:40px;content:url("../img/uses/lightmode/moai-finance.svg")}html.light .page-uses #use_case_companies_list #orchestra-finance .biz-logo{max-height:40px;content:url("../img/uses/lightmode/orchestra-finance.svg")}html.light .page-uses #use_case_companies_list #x-tokenize .biz-logo{max-height:40px;content:url("../img/uses/lightmode/x-tokenize.svg")}html.light .page-uses #use_case_companies_list #casino-coin .biz-logo{max-height:40px;content:url("../img/uses/lightmode/casino-coin.svg")}html.light .page-uses #use_case_companies_list #xrp-cafe .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrp-cafe.svg")}html.light .page-uses #use_case_companies_list #coil .biz-logo{max-height:40px;content:url("../img/uses/lightmode/coil.svg")}html.light .page-uses #use_case_companies_list #xrp-toolkit .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrp-toolkit.svg")}html.light .page-uses #use_case_companies_list #first-ledger-bot .biz-logo{max-height:40px;content:url("../img/uses/lightmode/first-ledger-bot.svg")}html.light .page-uses #use_case_companies_list #cryptum .biz-logo{max-height:40px;content:url("../img/uses/lightmode/cryptum.svg")}html.light .page-uses #use_case_companies_list #xrpl-org-ledger-explorer .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrpl-org-ledger-explorer.svg")}html.light .page-uses #use_case_companies_list #evernode .biz-logo{max-height:40px;content:url("../img/uses/lightmode/evernode.svg")}html.light .page-uses #use_case_companies_list #xrpl-rosetta .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrpl-rosetta.svg")}html.light .page-uses #use_case_companies_list #ripples-cbdc-platform .biz-logo{max-height:40px;content:url("../img/uses/lightmode/ripples-cbdc-platform.svg")}html.light .page-uses #use_case_companies_list #xrpscan .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xrpscan.svg")}html.light .page-uses #use_case_companies_list #ripples-on-demand-liquidity .biz-logo{max-height:40px;content:url("../img/uses/lightmode/ripples-on-demand-liquidity.svg")}html.light .page-uses #use_case_companies_list #xumm-wallet .biz-logo{max-height:40px;content:url("../img/uses/lightmode/xumm-wallet.svg")}html.light .page-uses #use_case_companies_list #sologenic-dex .biz-logo{max-height:40px;content:url("../img/uses/lightmode/sologenic-dex.svg")}html.light .page-uses #use_case_companies_list #Crossmark .biz-logo{max-height:40px;content:url("../img/uses/lightmode/Crossmark.png")}html.light .page-uses #use_case_companies_list #threezy .biz-logo{max-height:40px;content:url("../img/uses/lightmode/threezy.png")}html.light .page-uses .modal-content-uses .first-ledger-bot{content:url("../img/uses/lightmode/first-ledger-bot.svg")}html.light .page-uses .modal-content-uses .moai-finance{content:url("../img/uses/lightmode/moai-finance.svg")}html.light .page-uses .modal-content-uses .orchestra-finance{max-height:52px;margin:0;content:url("../img/uses/lightmode/orchestra-finance.svg")}html.light .page-uses #bitpay .biz-logo,html.light .page-uses #forte .biz-logo,html.light .page-uses #xrplorer .biz-logo,html.light .page-uses #gatehub .biz-logo{filter:invert(100%)}html.light .landing-bg{opacity:.4}@media(min-width: 768px){html.light .landing-bg{opacity:1}}html.light .landing-builtin-bg::before{opacity:.4}@media(min-width: 768px){html.light .landing-builtin-bg::before{opacity:1}}html.light #feedback-content .widget-form-wrapper{background-color:#fff !important}html.light #feedback-content .widget-form-wrapper div{background-color:#fff !important}html.light #feedback-content .widget-form-wrapper textarea{background-color:#f5f5f7 !important}html.light #feedback-content .widget-form-wrapper .widget-header-title{color:#111112 !important}html.light #feedback-content .widget-form-wrapper .cancel{color:#7919ff !important}html.light #feedback-content .widget-helpful .widget-header{background-color:#fff !important}html.light #feedback-content .widget-helpful .widget-header-title{color:#111112 !important}html.light #feedback-content .widget-helpful .widget-header-icon{filter:invert(100%)}html.light .page-docs-index #software-and-sdks .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/lightmode/4col-green.svg)}html.light .page-docs-index #software-and-sdks .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue.svg)}html.light .page-docs-index #software-and-sdks .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/lightmode/4col-yellow.svg)}html.light .page-docs-index #doc-types .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue-2.svg)}html.light .page-docs-index .funding-text,html.light .page-community .funding-text{color:#232325}html.light .page-docs-index .stat .small-text,html.light .page-community .stat .small-text{color:#232325}html.light .page-docs-index .project-card,html.light .page-community .project-card{background-color:transparent}html.light .page-docs-index .card-details,html.light .page-community .card-details{background-color:transparent}html.light .page-docs-index .card-image,html.light .page-community .card-image{background:#e0e0e1}html.light .page-docs-index #community-table tr,html.light .page-community #community-table tr{border-bottom:1px solid #34343740}html.light .page-docs-index .card-description,html.light .page-community .card-description{color:#343437 !important}html.light .page-docs-index .card-subtitle,html.light .page-community .card-subtitle{color:#111112 !important}html.light .page-docs-index .card-title,html.light .page-community .card-title{color:#111112 !important}html.light .page-docs-index .main-title,html.light .page-community .main-title{color:#111112}html.light .page-docs-index .event-location,html.light .page-community .event-location{color:#232325 !important}html.light .page-docs-index .event-details,html.light .page-community .event-details{color:#232325 !important}html.light .page-docs-index .upcoming-event .event-name,html.light .page-community .upcoming-event .event-name{color:#111112}html.light .page-docs-index .upcoming-label,html.light .page-community .upcoming-label{color:#232325 !important}html.light .page-docs-index .description,html.light .page-community .description{color:#232325}html.light .page-docs-index .events-text,html.light .page-community .events-text{color:#111112}html.light .page-docs-index .discord-icon,html.light .page-community .discord-icon{content:url(../img/community/ic_discord_light.png)}html.light .page-docs-index .twitter-icon,html.light .page-community .twitter-icon{content:url(../img/community/ic_twitter_light.png)}html.light .page-docs-index .youtube-icon,html.light .page-community .youtube-icon{content:url(../img/community/ic_youtube_light.png)}html.light .page-docs-index .xrpl-icon,html.light .page-community .xrpl-icon{content:url(../img/community/ic_xrpl_light.png)}html.light .page-docs-index .github-icon,html.light .page-community .github-icon{content:url(../img/community/ic_github_light.png)}html.light .page-docs-index .stackoverflow-icon,html.light .page-community .stackoverflow-icon{content:url(../img/community/ic_stackoverflow_light.png)}html.light .page-docs-index #run-a-network-node .card-deck .card:nth-child(4) .card-footer,html.light .page-community #run-a-network-node .card-deck .card:nth-child(4) .card-footer{background-image:url(../img/cards/lightmode/4col-light-green.svg)}html.light .page-docs-index #run-a-network-node .text-cards a,html.light .page-community #run-a-network-node .text-cards a{color:#000}html.light .page-docs-index #xrpl-blog .blog-graphic,html.light .page-community #xrpl-blog .blog-graphic{content:url(../img/community/lightmode/community-blog@2x.png)}html.light .page-docs-index #xrpl-events .text-light,html.light .page-community #xrpl-events .text-light{color:#000 !important}html.light .page-docs-index #xrplGrantsDark g,html.light .page-docs-index #xrplGrantsDark-small g,html.light .page-docs-index #careersDark g,html.light .page-docs-index #careersDark-small g,html.light .page-community #xrplGrantsDark g,html.light .page-community #xrplGrantsDark-small g,html.light .page-community #careersDark g,html.light .page-community #careersDark-small g{filter:invert(100%) brightness(0.8)}html.light #find-us-on-platforms .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue-3.svg)}html.light .page-references #refs-types .card-deck .card:nth-child(2) .card-footer{background-image:url(../img/cards/lightmode/3col-green-2.svg)}html.light .page-references #xrpl-protocol .card-deck .card:nth-child(1) .card-footer{background-image:url(../img/cards/lightmode/4col-light-blue-4.svg)}html.light ::-webkit-input-placeholder{color:#454549}html.light :-ms-input-placeholder{color:#454549}html.light ::-moz-placeholder{color:#454549;opacity:1}html.light :-moz-placeholder{color:#454549;opacity:1}html.light .page-events label{color:#111112}html.light .page-events .event-card{color:#000;background-color:#fcfcfd;box-shadow:0px 5px 20px 0px #c1c1c2}html.light .page-events a.event-card:hover{color:#000}html.light .page-events .event-hero{color:#111112}html.light .page-events .event-save-date{color:#111112}html.light .page-events .event-small-gray{color:#454549}html.light .page-events #event-hero-image{height:100%;min-height:209px;background:url(../img/events/event-hero1-light@2x.png);background-size:contain;background-repeat:no-repeat;background-position:center}html.light .page-events .icon-date::before{background:url(../img/events/event-date-light.svg)}html.light .page-events .icon-location::before{background:url(../img/events/event-location-light.svg)}html.light .page-events .events-filter[type=checkbox]::before{background-color:#f5f5f7}html.light .page-events .events-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/events/event-check.svg);background-repeat:no-repeat;background-position:center;background-color:#5f00e5;border-width:2px;border-style:solid;border-color:#5f00e5;border-radius:4px}html.light .page-events .events-filter[type=checkbox]:not(:disabled):hover::before{background-color:#f5f5f7}html.light .page-events .events-filter[type=checkbox]:not(:disabled):hover::after{background-color:#f5f5f7}html.light .page-ambassadors #benefits-list #benefits-01{content:url("../img/ambassadors/lightmode/benefits-01.svg")}html.light .page-ambassadors #benefits-list #benefits-02{content:url("../img/ambassadors/lightmode/benefits-02.svg")}html.light .page-ambassadors #benefits-list #benefits-03{content:url("../img/ambassadors/lightmode/benefits-03.svg")}html.light .page-ambassadors #benefits-list #benefits-04{content:url("../img/ambassadors/lightmode/benefits-04.svg")}html.light .page-ambassadors #benefits-list #benefits-05{content:url("../img/ambassadors/lightmode/benefits-05.svg")}html.light .page-ambassadors #benefits-list #benefits-06{content:url("../img/ambassadors/lightmode/benefits-06.svg")}html.light .page-ambassadors #eligibility-list #eligibility-01{content:url("../img/ambassadors/lightmode/eligibility-01.svg")}html.light .page-ambassadors #eligibility-list #eligibility-02{content:url("../img/ambassadors/lightmode/eligibility-02.svg")}html.light .page-ambassadors #eligibility-list #eligibility-03{content:url("../img/ambassadors/lightmode/eligibility-03.svg")}html.light .page-ambassadors #eligibility-list #eligibility-04{content:url("../img/ambassadors/lightmode/eligibility-04.svg")}html.light .page-ambassadors #eligibility-list #eligibility-05{content:url("../img/ambassadors/lightmode/eligibility-05.svg")}html.light .page-funding .funding-list #funding-01{content:url("../img/funding/lightmode/funding-01.svg")}html.light .page-funding .funding-list #funding-02{content:url("../img/funding/lightmode/funding-02.svg")}html.light .page-funding .funding-list #funding-03{content:url("../img/funding/lightmode/funding-03.svg")}html.light .page-funding .funding-list #funding-04{content:url("../img/funding/lightmode/funding-04.svg")}html.light .page-funding #xrplGrantsDark{filter:invert(100%) brightness(0.8)}html.light .page-impact .connect-list #connect-01{content:url("../img/impact/lightmode/connect-01.svg")}html.light .page-impact .connect-list #connect-02{content:url("../img/impact/lightmode/connect-02.svg")}html.light .page-impact .connect-list #connect-03{content:url("../img/impact/lightmode/connect-03.svg")}html.light .page-impact .connect-list #connect-04{content:url("../img/impact/lightmode/connect-04.svg")}html.light .page-impact #map-light{display:block}html.light .page-impact #map-dark{display:none}html.light main article .card-grid{color:#000}html.light main article .card-grid code{background-color:#d6fae7}html.light main article .card-grid .card-icon-container,html.light main article .card-grid.card-grid-3xN .card-icon-container{background:#c1c1c2}html.light [data-component-name="Footer/Footer"] [data-component-name="Footer/FooterColumn"]{text-shadow:#f5f5f7 0px 0px 2px,#f5f5f7 1px 1px 2px,#f5f5f7 2px 2px 3px,#f5f5f7 2px 2px 4px,#f5f5f7 2px 2px 5px,#f5f5f7 2px 2px 6px,#f5f5f7 -1px -1px 2px,#f5f5f7 -2px -2px 3px,#f5f5f7 -2px -2px 4px}html.light .dev-blog .text-bg{background-color:#fff}html.light .dev-blog #card-date{color:#454549}html.light .dev-blog .category-header{color:#111112}html.light .dev-blog label{color:#343437}html.light .dev-blog .blog-filter[type=checkbox]::before{background:#f5f5f7}html.light .dev-blog .blog-filter[type=checkbox]:checked::before{background:#f5f5f7}html.light .dev-blog .blog-filter[type=checkbox]:not(:disabled):checked:hover::after{background-image:url(../img/blog/blog-check-light-mode.svg)}html.light .dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::before{background:#f5f5f7}html.light .dev-blog .blog-filter[type=checkbox]:not(:disabled):hover::after{background:#f5f5f7}html.light .dev-blog .post-date{text-decoration:overline solid #145c35 10%}html.light .dev-blog #general-badge{background-color:#fff;color:#343437}html.light .dev-blog #release_notes-badge{background-color:#32e685;color:#145c35}html.light .dev-blog #advisories-badge{background-color:#ff6719;color:#4c1a00}html.light .dev-blog #amendments-badge{background-color:#faff19;color:#4b4c00}html.light .dev-blog #development-badge{background-color:#7919ff;color:#20004c}html.light .dev-blog #developer_reflections-badge{background-color:#19a3ff;color:#002e4c}html.light .dev-blog #gateway_bulletins-badge{background-color:#d919ff;color:#40004c}html.light .dev-blog #features-badge{background-color:#32e685;color:#145c35}html.light .dev-blog #security-badge{background-color:#ff198b;color:#4c0026}html.light .dev-blog .dropdown-btn{color:#111112;background-color:#e0e0e1;border-color:#e0e0e1}html.light .dev-blog .dropdown-btn img{content:url("../img/icons/lightmode/chevron-arrow-down.svg")}html.light .dev-blog .dropdown-content{background-color:#e0e0e1}html.light .page-tokenization .project-cards .project-logo{filter:invert(100%)}html.light .page-tokenization .article-card{background-color:#fff}html.light .page-tokenization .article-card-background{filter:drop-shadow(0px 1px 18px rgba(24, 24, 24, 0.5))}html.light .page-tokenization .evernode{content:url("../img/logos/evernode.svg")}html.light .page-tokenization .prev img{content:url("../img/icons/prev_light.svg")}html.light .page-tokenization .next img{content:url("../img/icons/prev_light.svg");transform:scaleX(-1)}html.light .page-tokenization .arrow-button{background-color:#e0e0e1} diff --git a/static/img/backgrounds/tokenization-illustration.svg b/static/img/backgrounds/tokenization-illustration.svg new file mode 100644 index 0000000000..5c460418f3 --- /dev/null +++ b/static/img/backgrounds/tokenization-illustration.svg @@ -0,0 +1,819 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/events/DemoDay.png b/static/img/events/DemoDay.png new file mode 100644 index 0000000000..4ee1629be5 Binary files /dev/null and b/static/img/events/DemoDay.png differ diff --git a/static/img/events/LedgerEvent.png b/static/img/events/LedgerEvent.png new file mode 100644 index 0000000000..b52857de26 Binary files /dev/null and b/static/img/events/LedgerEvent.png differ diff --git a/static/img/events/Luxemberg.png b/static/img/events/Luxemberg.png new file mode 100644 index 0000000000..2ed8c2c380 Binary files /dev/null and b/static/img/events/Luxemberg.png differ diff --git a/static/img/icons/next-purple.svg b/static/img/icons/next-purple.svg new file mode 100644 index 0000000000..e53a45a3a3 --- /dev/null +++ b/static/img/icons/next-purple.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/icons/prev.svg b/static/img/icons/prev.svg new file mode 100644 index 0000000000..9b4589d4ba --- /dev/null +++ b/static/img/icons/prev.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/icons/prev_light.svg b/static/img/icons/prev_light.svg new file mode 100644 index 0000000000..7603b47813 --- /dev/null +++ b/static/img/icons/prev_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/logos/amy.svg b/static/img/logos/amy.svg new file mode 100644 index 0000000000..c3946e49b4 --- /dev/null +++ b/static/img/logos/amy.svg @@ -0,0 +1,8 @@ + + + diff --git a/static/img/logos/carbonland.svg b/static/img/logos/carbonland.svg new file mode 100644 index 0000000000..56e588e5ee --- /dev/null +++ b/static/img/logos/carbonland.svg @@ -0,0 +1,24 @@ + + + diff --git a/static/img/logos/evernode.svg b/static/img/logos/evernode.svg new file mode 100644 index 0000000000..fbfe6ca929 --- /dev/null +++ b/static/img/logos/evernode.svg @@ -0,0 +1,7 @@ + + + diff --git a/static/img/logos/nautilus.svg b/static/img/logos/nautilus.svg new file mode 100644 index 0000000000..0871b28d40 --- /dev/null +++ b/static/img/logos/nautilus.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logos/onXRP.svg b/static/img/logos/onXRP.svg new file mode 100644 index 0000000000..6a1d02f38c --- /dev/null +++ b/static/img/logos/onXRP.svg @@ -0,0 +1,22 @@ + + + diff --git a/static/img/logos/raised-in-space.svg b/static/img/logos/raised-in-space.svg new file mode 100644 index 0000000000..7622d3eacc --- /dev/null +++ b/static/img/logos/raised-in-space.svg @@ -0,0 +1,20 @@ + + + diff --git a/static/img/logos/sologenic.svg b/static/img/logos/sologenic.svg new file mode 100644 index 0000000000..c91547d4b8 --- /dev/null +++ b/static/img/logos/sologenic.svg @@ -0,0 +1,15 @@ + + + diff --git a/static/img/logos/xaman-labs.svg b/static/img/logos/xaman-labs.svg new file mode 100644 index 0000000000..16866d28b9 --- /dev/null +++ b/static/img/logos/xaman-labs.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/img/logos/xrpcafe.svg b/static/img/logos/xrpcafe.svg new file mode 100644 index 0000000000..5826affb68 --- /dev/null +++ b/static/img/logos/xrpcafe.svg @@ -0,0 +1,17 @@ + + + diff --git a/static/img/uses/first-ledger-bot.svg b/static/img/uses/first-ledger-bot.svg new file mode 100644 index 0000000000..24ad4580c6 --- /dev/null +++ b/static/img/uses/first-ledger-bot.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/uses/futureverse.svg b/static/img/uses/futureverse.svg new file mode 100755 index 0000000000..57ff58aa44 --- /dev/null +++ b/static/img/uses/futureverse.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/img/uses/lightmode/first-ledger-bot.svg b/static/img/uses/lightmode/first-ledger-bot.svg new file mode 100644 index 0000000000..48485d6fda --- /dev/null +++ b/static/img/uses/lightmode/first-ledger-bot.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/static/img/uses/lightmode/moai-finance.svg b/static/img/uses/lightmode/moai-finance.svg new file mode 100644 index 0000000000..087fe8c495 --- /dev/null +++ b/static/img/uses/lightmode/moai-finance.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/img/uses/lightmode/orchestra-finance.svg b/static/img/uses/lightmode/orchestra-finance.svg new file mode 100644 index 0000000000..9f14a63410 --- /dev/null +++ b/static/img/uses/lightmode/orchestra-finance.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/uses/moai-finance.svg b/static/img/uses/moai-finance.svg new file mode 100644 index 0000000000..3ed5abb585 --- /dev/null +++ b/static/img/uses/moai-finance.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/img/uses/orchestra-finance.svg b/static/img/uses/orchestra-finance.svg new file mode 100644 index 0000000000..2305bbaa2d --- /dev/null +++ b/static/img/uses/orchestra-finance.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/uses/zerpmon.png b/static/img/uses/zerpmon.png new file mode 100644 index 0000000000..21736ff980 Binary files /dev/null and b/static/img/uses/zerpmon.png differ diff --git a/static/js/interactive-tutorial.js b/static/js/interactive-tutorial.js index 765b587f52..6898fc9974 100644 --- a/static/js/interactive-tutorial.js +++ b/static/js/interactive-tutorial.js @@ -10,7 +10,7 @@ LOCALES = { "Secret:": "シード:", "Balance:": "残高:", "Complete all previous steps first": "前の手順をすべて完了して下さい", - "Conection to the XRP Ledger required": "XRP Ledgerの接続が必要です", + "Connection to the XRP Ledger required": "XRP Ledgerの接続が必要です", "Error:": "エラー:", "Populated this page's examples with these credentials.": "このページの例にこのアドレスとシードを入力しました。", "There was an error connecting to the Faucet. Please try again.": "テストネットワークFaucetにエラーが発生しました。もう一度試してください。", @@ -235,7 +235,7 @@ function setup_generate_step() { /** * Get the address from the Generate step (snippet), or display an error in * the relevant interactive block if it fails—usually because the user hasn't - * cliked the "Get Credentials" button yet. + * clicked the "Get Credentials" button yet. * @return {String, undefined} The address, if available, or undefined if not */ function get_address(event) { @@ -251,7 +251,7 @@ function get_address(event) { /** * Get the Wallet from the Generate step (snippet), or display an error in * the relevant interactive block if it fails—usually because the user hasn't - * cliked the "Get Credentials" button yet. + * clicked the "Get Credentials" button yet. * @return {Wallet, undefined} The Wallet instance, if available, or undefined if not */ function get_wallet(event) { @@ -274,7 +274,7 @@ function get_wallet(event) { * Helper for calling the Testnet/Devnet faucet. * @param {String} faucet_url The URL of the faucet to call, for example: * https://faucet.altnet.rippletest.net/accounts - * @param {String} destination The account to fund, if undefined, the facuet will create one + * @param {String} destination The account to fund, if undefined, the faucet will create one * @param {Object} event The event object to get memo data from * */ async function call_faucet(faucet_url, destination, event) { @@ -533,7 +533,7 @@ function add_memo(event, tx_json) { * transaction's final results. Gets important information from data * attributes defined on the button that triggers the event: * data-tx-blob-from="{jQuery selector}" A selector for an element whose .text() - * is the blob to submt. + * is the blob to submit. * data-wait-step-name="{String}" The exact name of the wait step where this * transaction's results should be reported, as * defined in start_step(step_name) as the MD diff --git a/static/js/modal.js b/static/js/modal.js index 0f043b58b4..e69de29bb2 100644 --- a/static/js/modal.js +++ b/static/js/modal.js @@ -1,245 +0,0 @@ -$(document).ready(() => { - // Note: Use lowercase filenames here to avoid case inconsistency between - // dev environments like macOS and Windows which are not case-sensitive, - // and production Linux servers which use case-sensitive file systems. - const logos = { - infrastructure: [ - "xrp-ledger", - "gatehub", - "towolabs", - "xrpscan", - "xrp-toolkit", - "bithomp", - "onthedex", - ], - developer_tooling: [ - "cryptum", - "evernode", - "threezy", - "tokenize", - ], - interoperability: ["multichain"], - wallet: [ - "bitfrost", - "crossmark", - "edge", - "gem-wallet", - "xumm", - ], - nfts: [ - "aesthetes", - "audiotarky", - "nftmaster", - "peerkat", - "sologenic_dex", - "xrp-cafe", - "xrp-oval", - ], - exchanges: ["sologenic_dex", "xpmarket"], - gaming: [ - "forte", - "ledger-city", - ], - security: ["anchain"], - payments: ["ripple", "supermojo"], - cbdc: ["ripple"], - sustainability: ["carbonland-trust"], - custody: ["gatehub", "bitgo"], - }; - // Helper function to create a logo element - function createLogoElement(logoSrc, title, id) { - const logoElem = document.createElement("div"); - logoElem.alt = `${title} logo`; - logoElem.classList.add(`logo-item`); - logoElem.classList.add(`${logoSrc}`); - return logoElem; - } - // Add two new constiables for arrow buttons - const leftArrow = document.getElementById("leftArrow"); - const rightArrow = document.getElementById("rightArrow"); - // Handle arrow button clicks - function handleArrowClick(direction) { - // Get the current data index - const currentIndex = parseInt(modal.getAttribute("data-index")); - - // Calculate the new index based on the direction - const newIndex = direction === "left" ? currentIndex - 1 : currentIndex + 1; - - // Update the modal content with the new data - updateModalContent(useCaseData[newIndex]); - - // Update the modal's data-index attribute - modal.setAttribute("data-index", newIndex); - - // Show or hide the arrow buttons based on the new index - leftArrow.style.display = newIndex === 0 ? "none" : "block"; - rightArrow.style.display = - newIndex === useCaseData.length - 1 ? "none" : "block"; - } - - // Add click event listeners for arrow buttons - leftArrow.addEventListener("click", () => handleArrowClick("left")); - rightArrow.addEventListener("click", () => handleArrowClick("right")); - const modal = document.getElementById("myModal"); - const openModalBtns = document.querySelectorAll("li.open-modal"); - const useCaseData = []; - - // Populate the useCaseData array with data from the li elements - openModalBtns.forEach(function (btn) { - const id = btn.getAttribute("data-id"); - const title = btn.getAttribute("data-title"); - const description = btn.getAttribute("data-description"); - const number = btn.getAttribute("data-number"); - const src = btn.getAttribute("data-src"); - - useCaseData.push({ id, title, number, src, description }); - }); - - // Get the elements in the modal that will be updated - const modalImage = document.querySelector(".modal .section-image"); - const modalTextDescription = document.querySelector( - ".modal .section-text-description" - ); - const modalTextTitle = document.querySelector(".modal .section-text-title"); - const modalLogos = document.querySelector(".modal .section-logos"); - // Add a function to update the modal content - function updateModalContent({ id, title, number, src, description, index }) { - const arrowContainer = document.getElementById("arrows-container"); - modalImage.src = src; - modalImage.id = id; - modalImage.alt = title + " logo"; - modalTextDescription.textContent = description; - modalTextTitle.textContent = title; - modalLogos.innerHTML = ""; - const logoArray = logos[id] || []; - // Reset styles and classes for modalLogos - modalLogos.removeAttribute("style"); - modalLogos.className = ""; - - if (logoArray.length > 0) { - const topRowDiv = document.createElement("div"); - topRowDiv.className = "top-row"; - const bottomRowDiv = document.createElement("div"); - bottomRowDiv.className = "bottom-row"; - - if (logoArray.length === 7) { - // 4 on top, 3 on bottom - for (let i = 0; i < 4; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - topRowDiv.appendChild(logoElem); - } - for (let i = 4; i < 7; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - bottomRowDiv.appendChild(logoElem); - } - }else if (logoArray.length === 8) { - // 4 on top, 4 on bottom - for (let i = 0; i < 4; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - topRowDiv.appendChild(logoElem); - } - for (let i = 4; i < 8; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - bottomRowDiv.appendChild(logoElem); - } - } else if (logoArray.length === 6) { - // Special case: 3 on top, 3 on bottom - for (let i = 0; i < 3; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - topRowDiv.appendChild(logoElem); - } - for (let i = 3; i < 6; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - bottomRowDiv.appendChild(logoElem); - } - } else if (logoArray.length === 5) { - // Special case: 3 on top, 2 on bottom - for (let i = 0; i < 3; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - topRowDiv.appendChild(logoElem); - } - for (let i = 3; i < 5; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - bottomRowDiv.appendChild(logoElem); - } - bottomRowDiv.style.justifyContent = "center"; // Center the logos - } else if (logoArray.length === 4) { - // Special case: 2 on top, 2 on bottom - for (let i = 0; i < 2; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - topRowDiv.appendChild(logoElem); - } - for (let i = 2; i < 4; i++) { - const logoElem = createLogoElement(logoArray[i], title, id); - bottomRowDiv.appendChild(logoElem); - } - bottomRowDiv.style.justifyContent = "center"; // Center the logos - } else { - // Default case - logoArray.forEach((logoSrc) => { - const logoElem = createLogoElement(logoSrc, title, id); - topRowDiv.appendChild(logoElem); - }); - } - - modalLogos.appendChild(topRowDiv); - if (bottomRowDiv.hasChildNodes()) { - modalLogos.appendChild(bottomRowDiv); - } - } else { - modalLogos.className = "flex-center"; - } - if (id === "infrastructure") { - arrowContainer.style.justifyContent = "end"; - } else { - arrowContainer.style.justifyContent = "space-between"; - } - } - openModalBtns.forEach(function (btn, index) { - btn.onclick = function () { - const arrowContainer = document.getElementById("arrows-container"); - // Read the data-* attributes from the clicked li - const id = btn.getAttribute("data-id"); - const title = btn.getAttribute("data-title"); - const description = btn.getAttribute("data-description"); - const number = btn.getAttribute("data-number"); - const src = btn.getAttribute("data-src"); - // Update the modal content with the data from the clicked li - modalImage.id = id; - modalImage.alt = title + " logo"; - modalTextDescription.textContent = description; - modalTextTitle.textContent = title; - - // Set the data index on the modal - modal.setAttribute("data-index", index); - - // Update the modal content with the data from the clicked li - updateModalContent({ id, title, number, src, description, index }); - - // Show or hide the arrow buttons based on the index - leftArrow.style.display = index === 0 ? "none" : "block"; - rightArrow.style.display = - index === useCaseData.length - 1 ? "none" : "block"; - - modal.style.display = "block"; - - if (id === "infrastructure") { - arrowContainer.style.justifyContent = "end"; - } else { - arrowContainer.style.justifyContent = "space-between"; - } - }; - }); - - window.onclick = function (event) { - if (event.target == modal) { - modal.style.display = "none"; - } - }; - - document.addEventListener("keydown", function (event) { - if (event.key === "Escape") { - modal.style.display = "none"; - } - }); -}); diff --git a/static/js/osano.js b/static/js/osano.js new file mode 100644 index 0000000000..a2eec33589 --- /dev/null +++ b/static/js/osano.js @@ -0,0 +1,15 @@ +window.dataLayer = window.dataLayer || []; +function gtag() { + dataLayer.push(arguments); +} +gtag("consent", "default", { + ad_storage: "denied", + analytics_storage: "denied", + ad_user_data: "denied", + ad_personalization: "denied", + personalization_storage: "denied", + functionality_storage: "granted", + security_storage: "granted", + wait_for_update: 500, +}); +gtag("set", "ads_data_redaction", true); diff --git a/static/js/xrpl-guard.tsx b/static/js/xrpl-guard.tsx index 6b707cb15d..953d052ed1 100644 --- a/static/js/xrpl-guard.tsx +++ b/static/js/xrpl-guard.tsx @@ -1,4 +1,4 @@ -import { useTranslate } from '@portal/hooks'; +import { useThemeHooks } from '@redocly/theme/core/hooks'; import { isFunction } from './type-helpers' import { FC } from 'react' import { useEffect, useState } from 'react' @@ -63,7 +63,7 @@ export const XRPLGuard: FC<{ testCheck?: () => boolean, children }> = ({ testCheck, children, }) => { - + const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); const isXRPLLoaded = useThrottledCheck( testCheck ?? (() => typeof xrpl === 'object'), diff --git a/styles/_cards.scss b/styles/_cards.scss index ade1ca9ea8..17037f2628 100644 --- a/styles/_cards.scss +++ b/styles/_cards.scss @@ -125,7 +125,7 @@ main a.card { } a.card:hover, a:hover .card-new, -[data-component-name="Markdown/MarkdownWrapper"] a.card { +[data-component-name="Markdown/Markdown"] a.card { text-decoration: none !important; } a.card:hover h3 { @@ -310,3 +310,9 @@ main article .card-grid { text-align: center; background-color: $gray-800; } + +.card-subhead { + font-size: 1rem; + margin-bottom: 0.25rem; + margin-top: 0.5rem; +} diff --git a/styles/_content.scss b/styles/_content.scss index 6c34c7d151..c536d99322 100644 --- a/styles/_content.scss +++ b/styles/_content.scss @@ -1,6 +1,6 @@ /* Content text styling (applies mostly to Markdown-generated content)------- */ -[data-component-name="Markdown/MarkdownWrapper"] article { +[data-component-name="Markdown/Markdown"] article { padding-bottom: 50px; p code, diff --git a/styles/_pages.scss b/styles/_pages.scss index 1ae69e9a2b..3fdfff00d4 100644 --- a/styles/_pages.scss +++ b/styles/_pages.scss @@ -94,8 +94,6 @@ position: absolute; top: 0; left: 0; - bottom: 0; - right: 0; // background-image set on the page-* classes background-repeat: no-repeat; background-position-x: left; @@ -367,6 +365,10 @@ "xp-market": "svg", "ledger-city": "svg", "forte": "svg", + "futureverse": "svg", + 'first-ledger-bot': 'svg', + "moai-finance": "svg", + "orchestra-finance": "svg", "anchain-ai": "svg", "coil": "svg", "carbonland-trust": "svg", @@ -376,6 +378,7 @@ "ripples-on-demand-liquidity": "svg", "ripples-cbdc-platform": "svg", "momento": "svg", + "zerpmon": "png", "Crossmark": "png", "Edge": "png" @@ -389,6 +392,22 @@ } } } + .orchestra-finance{ + max-height: 52px !important; + margin: 0 !important; + } + #use_case_companies_list { + #first-ledger-bot { + .biz-logo { + max-height: 81px !important; + } + } + #zerpmon { + .biz-logo { + max-height: 81px !important; + } + } + } @include media-breakpoint-up(lg) { h1 { @@ -967,8 +986,8 @@ border-radius: $border-radius-sm; padding: 2rem; padding-right: 3rem; // don't overlap chevron - // margin-bottom: 1.5rem; // this is enough space when a banner isn't active - margin-bottom: 3.5rem; // give space so anchor-fix doesn't block clicks + margin-bottom: 1.5rem; // this is enough space when a banner isn't active + // margin-bottom: 3.5rem; // give space so anchor-fix doesn't block clicks position: relative; z-index: 5; width: 100%; diff --git a/styles/_top-nav.scss b/styles/_top-nav.scss index 61b308a587..e5081b5a87 100644 --- a/styles/_top-nav.scss +++ b/styles/_top-nav.scss @@ -1,8 +1,8 @@ /* Top navigation ----------------------------------------------------------- */ $nav-height: 80px; -$banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. +$banner-height: 0; // Apex 2024 banner was 46px. 0 for no pencil banner. -[data-component-name="Layout/RootLayout"] { +[data-component-name="layouts/RootLayout"] { padding-top: $nav-height + $banner-height; } @@ -383,21 +383,13 @@ $banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. .navbar-nav { align-items: unset !important; // Undo "browser-entry.css" rule - #topnav-theme { - background-color: $gray-900; - padding: 1rem; - } - #topnav-button { background-color: $gray-900; padding: 1rem 1.5rem; } #topnav-search { - background-color: $gray-900; - - [data-component-name="Search/MobileSearchTrigger"] { - padding: 2rem; + [data-component-name="Search/SearchTrigger"] { cursor: pointer; } } @@ -525,9 +517,9 @@ $banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. // Move search to top of mobile menu --------------------------------------- #top-main-nav { - padding-top: 72px; + background-color: $gray-800; + padding-top: 32px; position: relative; - transition: padding-top 0.2s ease; // Hide search and other sub-menus when one sub-menu is expanded // (js required to add the class on the dropdown event) @@ -538,7 +530,9 @@ $banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. display: none; } - #topnav-search { + #topnav-search, + #topnav-language, + #topnav-theme { // display: none; height: 0; overflow: clip; @@ -550,9 +544,7 @@ $banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. #topnav-search { position: absolute; top: 0; - width: 100%; - height: 72px; - transition: all 0.2s ease; + right: 105px; .input-group { flex-wrap: nowrap; // Fix search bar splitting into two lines on iPhone 5 @@ -560,6 +552,10 @@ $banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. } #topnav-language { + position: absolute; + top: 0; + right: 65px; + hr { border-top: 1px solid $gray-800; margin-top: 0.25rem; @@ -567,6 +563,12 @@ $banner-height: 46px; // Apex 2024 banner size. Set to 0 if no pencil banner. display: static; } } + + #topnav-theme { + position: absolute; + top: 0; + right: 26px; + } } // end mobile specific styles ---------------------------------------------- } @@ -587,7 +589,7 @@ article h6:before, pointer-events: none; } article h1:first-of-type:before { - margin-top: -60px; // Don't add extra space to page title + margin-top: -40px; // Add less space to page title (but don't overlap Edit button) } // Animated chevron (e.g. for language dropdown) ------------------------------- diff --git a/styles/_use-cases.scss b/styles/_use-cases.scss index a965d40ef7..9618bec66f 100644 --- a/styles/_use-cases.scss +++ b/styles/_use-cases.scss @@ -1,13 +1,13 @@ /* Use Cases ---------------------------------------------------------------- */ // Define each category's logos -$infrastructure-logos: "xrp-ledger", "gatehub", "towolabs", "xrpscan", "xrp-toolkit", "bithomp", "onthedex"; +$infrastructure-logos: "xrp-ledger", "gatehub", "towolabs", "xrpscan", "xrp-toolkit", "bithomp", "onthedex"; $developer-tooling-logos: "cryptum", "evernode", "threezy", "tokenize"; $interoperability-logos: "multichain"; -$wallet-logos: "crossmark", "edge", "gem-wallet", "xumm"; +$wallet-logos: "crossmark", "edge", "gem-wallet", "xumm"; $nfts-logos: "aesthetes", "audiotarky", "nftmaster", "peerkat", "sologenic_dex", "xrp-cafe", "xrp-oval"; -$exchanges-logos: "sologenic_dex", "xpmarket"; -$gaming-logos: "forte", "ledger-city"; +$exchanges-logos: "sologenic_dex", "xpmarket", "orchestra-finance", "moai-finance", "first-ledger-bot"; +$gaming-logos: "forte", "ledger-city", "futureverse", "zerpmon"; $security-logos: "anchain"; $payments-logos: "ripple", "supermojo"; $cbdc-logos: "ripple"; @@ -28,6 +28,40 @@ $custody-logos: "gatehub", "bitgo"; } } } + +.modal-content-uses { + .first-ledger-bot{ + min-height: 80px !important; + position: relative; + bottom: 20px; + content: url("../img/uses/first-ledger-bot.svg"); + } + .orchestra-finance{ + content: url("../img/uses/orchestra-finance.svg"); + } + .moai-finance{ + min-height: 80px !important; + position: relative; + bottom: 20px; + content: url("../img/uses/moai-finance.svg"); + } + .ledger-city{ + margin: 0px !important; + position: relative; + bottom: 4px; + left: 6px; + max-height: 47px !important; + } + .zerpmon { + margin: 0px; + min-width: 80px; + min-height: 84px; + position: relative; + bottom: 13px; + content: url("../img/uses/zerpmon.png") !important; + } +} + #use_case_companies_list { #threezy { .biz-logo { @@ -35,9 +69,11 @@ $custody-logos: "gatehub", "bitgo"; content: url("../img/uses/modallogos/threezy.png"); } } + } -html.light{ - .cryptum{ + +html.light { + .cryptum { content: url(../img/uses/lightmode/cryptum.jpg) !important; height: 58px; max-width: max-content; @@ -47,6 +83,7 @@ html.light{ padding-bottom: 10px; } } + // Use the mixin for each category @include create-logo-classes($infrastructure-logos); @include create-logo-classes($developer-tooling-logos); @@ -69,6 +106,11 @@ html.light{ content: url(../img/uses/right-arrow.svg); } +.right-arrow-button.right-arrow img { + background-color: transparent; + border: none; + cursor: pointer; +} .html.light { .arrow-button.left-arrow img { @@ -98,6 +140,7 @@ html.light{ display: flex; justify-content: space-between; z-index: 10; + @media only screen and (max-width: 768px) { top: 30px; } @@ -116,6 +159,7 @@ html.light{ .left-arrow { margin-left: 40px; + @media only screen and (max-width: 768px) { margin-left: 0px; } @@ -123,6 +167,7 @@ html.light{ .right-arrow { margin-right: 40px; + @media only screen and (max-width: 768px) { margin-right: 0px; } @@ -164,12 +209,14 @@ html.light{ left: 0; width: 100%; height: 1px; - background: linear-gradient(90deg, - #b480ff -0.32%, - #5f00e6 32.7%, - #1aa4ff 61.53%, - #19ff83 100.32%, - #19ff83 100.32%); + background: linear-gradient( + 90deg, + #b480ff -0.32%, + #5f00e6 32.7%, + #1aa4ff 61.53%, + #19ff83 100.32%, + #19ff83 100.32% + ); } .content-section { @@ -278,6 +325,7 @@ html.light{ .bottom-row { display: flex; justify-content: center; + @media only screen and (max-width: 768px) { flex-wrap: wrap; } @@ -289,7 +337,6 @@ html.light{ margin: 10px 11px; } - .close { color: #aaaaaa; float: right; @@ -305,6 +352,20 @@ html.light{ cursor: pointer; } +#use-case-card-grid { + grid-template-columns: repeat(2, 1fr); + + @include media-breakpoint-up(md) { + grid-template-columns: repeat(3, 1fr); + } + + @include media-breakpoint-up(lg) { + grid-template-columns: repeat(4, 1fr); + } +} + + + .use-case-circle { display: flex; align-items: center; @@ -332,7 +393,6 @@ html.light{ .use-case-circle:hover { border-color: #838386; - } .circle-content { @@ -388,11 +448,13 @@ html.light{ font-weight: 400; font-size: 32px; line-height: 38px; - background: linear-gradient(90deg, - #feff01 0%, - #ff2d9a 30.82%, - #e24cff 64.01%, - #9a52ff 100%); + background: linear-gradient( + 90deg, + #feff01 0%, + #ff2d9a 30.82%, + #e24cff 64.01%, + #9a52ff 100% + ); -webkit-background-clip: text; -webkit-text-fill-color: transparent; @@ -409,7 +471,7 @@ html.light{ html.light { .section-separator { - background: #C1C1C2; + background: #c1c1c2; } .section-text-description { @@ -449,11 +511,13 @@ html.light { font-weight: 400; font-size: 32px; line-height: 38px; - background: linear-gradient(90deg, - #b480ff -0.32%, - #5f00e6 32.7%, - #1aa4ff 61.53%, - #19ff83 100.32%); + background: linear-gradient( + 90deg, + #b480ff -0.32%, + #5f00e6 32.7%, + #1aa4ff 61.53%, + #19ff83 100.32% + ); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; @@ -543,3 +607,343 @@ html.light { padding-left: 0; transition: all 0.2s ease-in-out; } + +.page-tokenization { + .tokenization-graphic { + content: url('../img/backgrounds/tokenization-illustration.svg'); + width: 100%; + height: 100%; + } + + .show-md { + display: none; + @include media-breakpoint-down(md) { + display: block; + } + } + + .hide-md { + display: block; + @include media-breakpoint-down(md) { + display: none; + } + } + + .tokenization-use-case { + font-size: 12px; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 1px solid $gray-600; + } + + .tokenization-use-case .arrow-button img { + width: 15px; + height: 15px; + } + + .tokenization-stats { + width: 100%; + height: 250px; + border-radius: 8px; + background: linear-gradient(88deg, #9A52FF -14.32%, #32E685 45.35%, #19A3FF 100.76%); + padding: 4rem 2rem; + display: grid; + grid-template-columns: repeat(4, 1fr); + @include media-breakpoint-down(md) { + display: block; + height: 100%; + width: 100%; + padding: 0 25%; + } + } + + .stat-container { + color: $black; + text-align: center; + border-right: 2px solid black; + + @include media-breakpoint-down(md) { + border-right: none; + padding-bottom: 3rem; + padding-top: 2rem; + border-bottom: 2px solid black; + } + + } + + .stat-container:last-child { + border: none; + } + + .stat-container .stat { + font-size: 3rem; + font-weight: 300; + } + + .stat-container p { + font-weight: 400; + } + + /* Work-around for border gradient and radius */ + .security-card { + position: relative; + border-radius: 0.5rem; + background-color: transparent; + white-space: normal; + box-sizing: border-box; + } + + .security-card::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; + padding: 1px; + background: linear-gradient(90deg, #d91aff 26.41%, #1aa4ff 100.32%); + mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + mask-composite: exclude; + -webkit-mask-composite: xor; + z-index: -1; + } + + .security-card p { + margin-bottom: 0 !important; + } + + .security-card .h6 { + @include media-breakpoint-down(sm) { + font-size: 1.25rem; + } + } + + .security-card-grid { + gap: 1rem; + grid-template-columns: repeat(2, 1fr); + + @media (min-width: 1200px) { + grid-template-columns: repeat(4, 1fr); + } + + @media (max-width: 768px) { + grid-template-columns: repeat(1, 1fr); + } + } + + .video-external-link .link-text { + margin-left: 0.25rem; + } + + .video-external-link { + margin-bottom: 9px; + } + + .tokenization-color-bar { + align-self: stretch; + height: 0.25rem; + border-radius: 2rem; + background: var(--Gradient-3, linear-gradient(90deg, #FEFF01 0%, #FF2D9A 30.82%, #E24CFF 64.01%, #9A52FF 100%)); + } + + .project-cards-container { + gap: 3rem; + } + + .project-cards { + width: 100%; + } + + .project-cards .project-name { + word-break: break-word; + } + + .project-cards .card { + min-height: 240px; + } + + .project-cards .col::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 0.25rem; + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; + } + + .project-cards .col.odd::before { + background: linear-gradient(90deg, #D91AFF 26.41%, #1AA4FF 100.32%); + } + + .project-cards .col.even::before { + background: linear-gradient(90deg, #4BB7FF -0.32%, #32E685 30.61%); + } + + .project-cards .project-logo { + width: 100%; + height: 50px; + vertical-align: center; + padding: 0 0.5rem; + } + + .project-cards img { + max-width: 100%; + height: auto; + display: block; + box-sizing: border-box; + } + + .amy { + content: url("../img/logos/amy.svg"); + } + + .carbonland { + content: url("../img/logos/carbonland.svg"); + } + + .evernode { + content: url("../img/logos/evernode.svg"); + } + + .nautilus { + content: url("../img/logos/nautilus.svg"); + } + + .onXRP { + content: url("../img/logos/onXRP.svg"); + } + + .raised-in-space { + content: url("../img/logos/raised-in-space.svg"); + } + + .sologenic { + content: url("../img/logos/sologenic.svg"); + } + + .xaman { + content: url("../img/logos/xaman-labs.svg"); + } + + .xrpcafe { + content: url("../img/logos/xrpcafe.svg"); + } + + .prev img { + content: url("../img/icons/prev.svg"); + } + + .next img { + content: url("../img/icons/prev.svg"); + transform: scaleX(-1); + } + + .arrow-wrapper { + gap: 1rem; + } + + .arrow-button { + background-color: #232325; + border-radius: 0.25rem; + align-items: center; + justify-content: center; + } + + .next.hover-color:hover img { + content: url("../img/icons/next-purple.svg"); + transform: scaleX(1); + } + + .prev.hover-color:hover img { + content: url("../img/icons/next-purple.svg"); + transform: scaleX(-1); + } + + .related-articles { + gap: 2.5rem; + } + + .related-articles .col { + background-color: $black; + padding: 2rem !important; + border-radius: 0.5rem; + } + + .related-articles .time { + position: relative; + padding-top: 0.5rem; + } + + .related-articles .time::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 50px; + height: 4px; + background-color: #32E685; + } + + .project-cards a, + .related-articles a { + text-decoration: none; + } + + .project-cards a:hover{ + .project-name{ + color: $purple; + } + } + + .related-articles a:hover { + .h5 { + color: $purple; + } + } + + .article-card-container { + position: relative; + width: 100%; + + &:nth-child(1) .article-card-background { + background-image: linear-gradient(86deg, #B20058 -21.16%, #E24CFF 31.78%, #9A52FF 101.64%); + } + + &:nth-child(2) .article-card-background { + background-image: linear-gradient(22deg, #B480FF -6.54%, #5F00E5 50.87%, #1AA4FF 114.16%); + } + + &:nth-child(3) .article-card-background { + background-image: linear-gradient(162deg, #B480FF -11.11%, #1AA4FF 56.26%, #2DCF78 112.84%); + } + } + + .article-card-background { + height: calc(100% + 1.5rem); + width: 100%; + z-index: 1; + background-size: cover; + position: absolute; + top: -0.75rem; + border-radius: 0.5rem; + } + + .article-card { + width: 100%; + height: 100%; + position: relative; + top: 0; + left: 0.75rem; + z-index: 2; + display: block; + } +} diff --git a/styles/_xrplai.scss b/styles/_xrplai.scss index 74ab24012a..7b39e614c8 100644 --- a/styles/_xrplai.scss +++ b/styles/_xrplai.scss @@ -3,6 +3,8 @@ button.MarkpromptFloatingTrigger { border-radius: $border-radius-sm; right: 16px; border: 1px solid transparent; + color: var(--markprompt-primaryForeground); + background-color: var(--markprompt-primary); @include media-breakpoint-up(lg) { right: 32px; diff --git a/styles/light/_light-theme.scss b/styles/light/_light-theme.scss index 0225e49474..f617eb57ab 100644 --- a/styles/light/_light-theme.scss +++ b/styles/light/_light-theme.scss @@ -117,166 +117,8 @@ h6, background-color: $light-form-bg; } -// Algolia search results -.xrp-ledger-dev-portal { - .DocSearch-Modal { - background: $white; - } - - .DocSearch-Prefill { - color: $blue-purple-500; - } - - .DocSearch-Button { - background: var(--docsearch-searchbox-background); - } - - .DocSearch-Button:hover { - box-shadow: inset 0 0 0 2px $blue-purple-500; - border-radius: 40px; - background: var(--docsearch-searchbox-background); - - .DocSearch-Button-Placeholder { - color: var(--docsearch-text-color); - } - } - - .DocSearch-Search-Icon { - color: var(--docsearch-text-color) !important; - } - - .DocSearch-Input { - color: $gray-900; - } - - .DocSearch-Hit-Select-Icon { - color: $gray-900; - } - - .DocSearch-Form { - box-shadow: inset 0 0 0 2px $blue-purple-500; - background-color: var(--docsearch-searchbox-focus-background); - } - - .DocSearch-Hit-source { - color: $blue-purple-500; - background: $white; - } - - .DocSearch-Hits mark { - color: $blue-purple-500; - } - - .DocSearch-Hit-Container { - background: $white; - } - - .DocSearch-Hit a { - background-color: $white; - } - - .DocSearch-Hit-content-wrapper { - .DocSearch-Hit-title { - color: $black !important; - } - - .DocSearch-Hit-path { - color: $black-60 !important; - } - } - - .DocSearch-Logo svg { - - .cls-1, - .cls-2 { - fill: var(--docsearch-logo-color); - ; - } - } - - .DocSearch-Hit-title, - .DocSearch-Hit-path, - .DocSearch-Label, - .DocSearch-Help { - color: $black-60 !important; - } - - .DocSearch-Hit[aria-selected="true"] a { - background: $black-10; - - .DocSearch-Hit-Container { - background-color: $black-10; - } - - .DocSearch-Hit-content-wrapper { - .DocSearch-Hit-title { - color: $black !important; - } - - .DocSearch-Hit-path { - color: $black-60 !important; - } - } - - .DocSearch-Hit-icon svg { - color: $black !important; - } - - .DocSearch-Hit-action .DocSearch-Hit-action-button svg { - color: $black !important; - } - - mark { - color: $blue-purple-500 !important; - } - } - - .DocSearch-Footer { - background: var(--docsearch-footer-background); - } - - // The extra specificity makes this override the default Algolia styles. - .algolia-autocomplete { - .ds-dropdown-menu [class^="ds-dataset-"] { - background-color: $light-standout-bg; - } - - .ds-dropdown-menu::before { - background-color: $light-standout-bg; - } - - .algolia-docsearch-suggestion { - background-color: $light-standout-bg; - } - - .algolia-docsearch-suggestion--category-header { - color: $black; - border-bottom-color: $blue-purple-500; - } - - .algolia-docsearch-suggestion--subcategory-column { - color: $black; - } - - .algolia-docsearch-suggestion--title { - color: $black; - } - - .algolia-docsearch-suggestion--text { - color: $light-fg-muted; - } - - .algolia-docsearch-suggestion--highlight { - color: $black; - background-color: $gray-300; - } - - .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight, - .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight, - .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { - background-color: $gray-300; - } - } +[data-component-name="Search/SearchIcon"] > path { + fill: black; } // Navigation ------------------------------------------------------------------ @@ -422,11 +264,13 @@ article a.button, } .navbar-nav .nav-link, - .navbar-collapse>.nav-item, - .navbar-nav #topnav-theme, - .navbar-nav #topnav-search { + .navbar-collapse>.nav-item { background: $gray-200; } + + #top-main-nav { + background-color: $gray-300; + } } } @@ -799,11 +643,15 @@ pre code, pre { @each $company, $type in ('bitgo': 'svg', 'sologenic-nft': 'svg', 'carbonland-trust': 'svg', + 'futureverse': 'png', + "moai-finance": "svg", + "orchestra-finance": "svg", 'x-tokenize': 'svg', 'casino-coin': 'svg', 'xrp-cafe': 'svg', 'coil': 'svg', 'xrp-toolkit': 'svg', + 'first-ledger-bot': 'svg', 'cryptum': 'svg', 'xrpl-org-ledger-explorer': 'svg', 'evernode': 'svg', @@ -833,8 +681,19 @@ pre code, pre { } } } - - +.modal-content-uses{ + .first-ledger-bot{ + content: url("../img/uses/lightmode/first-ledger-bot.svg"); + } + .moai-finance{ + content: url("../img/uses/lightmode/moai-finance.svg"); + } + .orchestra-finance{ + max-height: 52px ; + margin: 0; + content: url("../img/uses/lightmode/orchestra-finance.svg"); + } +} // Monochrome logos; invert. #bitpay, @@ -1339,3 +1198,34 @@ main article .card-grid { background-color: $gray-200; } } + +.page-tokenization { + .project-cards .project-logo { + filter: invert(100%); + } + + .article-card { + background-color: $white; + } + + .article-card-background { + filter: drop-shadow(0px 1px 18px rgba(24, 24, 24, 0.50)); + } + + .evernode { + content: url("../img/logos/evernode.svg"); + } + + .prev img { + content: url("../img/icons/prev_light.svg"); + } + + .next img { + content: url("../img/icons/prev_light.svg"); + transform: scaleX(-1); + } + + .arrow-button { + background-color: $gray-200; + } +} diff --git a/top-nav.yaml b/top-nav.yaml index 6b7062c44a..a0cebb5b23 100644 --- a/top-nav.yaml +++ b/top-nav.yaml @@ -9,23 +9,42 @@ groupTranslationKey: theme.navbar.about items: - group: XRP Ledger + groupTranslationKey: topnav.about.xrp-ledger items: - page: ./about/index.page.tsx + label: XRPL Overview + labelTranslationKey: topnav.about.xrpl-overview - page: ./about/uses.page.tsx + label: Use Cases & Featured Projects + labelTranslationKey: topnav.about.use-cases-featured-projects - page: ./about/history.page.tsx + label: History + labelTranslationKey: topnav.about.history - group: XRP + groupTranslationKey: topnav.about.xrp items: - page: ./about/xrp.page.tsx + label: XRP Overview + labelTranslationKey: topnav.about.xrp-overview - group: Sustainability + groupTranslationKey: topnav.about.sustainability items: - page: ./about/impact.page.tsx + label: Impact + labelTranslationKey: topnav.about.impact - group: About + groupTranslationKey: topnav.about.about items: - label: XRPL Foundation + labelTranslationKey: topnav.about.xrpl-foundation href: https://foundation.xrpl.org/ external: true - page: ./about/faq.md + label: FAQ + labelTranslationKey: topnav.about.faq - page: ./about/privacy-policy.md + label: Privacy Policy + labelTranslationKey: topnav.about.privacy-policy - group: Docs groupTranslationKey: theme.navbar.docs @@ -36,19 +55,34 @@ labelTranslationKey: topnav.docs.title || topnav.docs.description page: ./docs/index.page.tsx - group: Article Types + groupTranslationKey: topnav.docs.article-types items: - page: ./docs/concepts/index.md + label: Concepts + labelTranslationKey: topnav.docs.concepts - page: ./docs/tutorials/index.md label: Tutorials - labelTranslationKey: sidebar.docs.tutorials + labelTranslationKey: topnav.docs.tutorials - page: ./docs/references/index.md + label: References + labelTranslationKey: topnav.docs.references - page: ./docs/infrastructure/index.md + label: Infrastructure + labelTranslationKey: topnav.docs.infrastructure - group: Use Cases + groupTranslationKey: topnav.docs.use-cases items: - page: ./docs/use-cases/payments/index.md - - page: ./docs/use-cases/tokenization/index.md + label: Payments + labelTranslationKey: topnav.docs.payments + - page: ./docs/use-cases/tokenization/index.page.tsx + label: Tokenization + labelTranslationKey: topnav.docs.tokenization - page: ./docs/use-cases/defi/index.md + label: Decentralized Finance + labelTranslationKey: topnav.docs.defi - group: Get Started + groupTranslationKey: topnav.docs.get-started items: - page: ./docs/tutorials/javascript/index.md - page: ./docs/tutorials/python/index.md @@ -60,14 +94,20 @@ groupTranslationKey: theme.navbar.resources items: - group: Development + groupTranslationKey: topnav.resources.development items: - label: Code Samples + labelTranslationKey: topnav.resources.code-samples href: /resources/code-samples - page: ./resources/dev-tools/index.page.tsx + label: Dev Tools + labelTranslationKey: topnav.resources.dev-tools - label: XRPL Learning Portal + labelTranslationKey: topnav.resources.xrpl-learning-portal href: https://learn.xrpl.org/ external: true - label: XRPL Brand Kit + labelTranslationKey: topnav.resources.xrpl-brand-kit href: /XRPL_Brand_Kit.zip - group: Current Status groupTranslationKey: topnav.resources.current-status @@ -77,12 +117,16 @@ href: https://livenet.xrpl.org/ external: true - label: Known Amendments + labelTranslationKey: topnav.resources.known-amendments href: /resources/known-amendments - group: Join In + groupTranslationKey: topnav.resources.join-in items: - label: Contribute Code + labelTranslationKey: topnav.resources.contribute-code href: /resources/contribute-code - label: Contribute Documentation + labelTranslationKey: topnav.resources.contribute-documentation href: /resources/contribute-documentation - group: Community @@ -93,19 +137,32 @@ labelTranslationKey: topnav.community.title || topnav.community.description href: /community/ - group: Get Involved + groupTranslationKey: topnav.community.get-involved items: - page: ./community/events.page.tsx + label: Events + labelTranslationKey: topnav.community.events - page: ./community/ambassadors.page.tsx + label: Ambassadors + labelTranslationKey: topnav.community.ambassadors - page: ./community/developer-funding.page.tsx + label: Developer Funding + labelTranslationKey: topnav.community.developer-funding - label: XRPL Jobs + labelTranslationKey: topnav.community.xrpl-jobs href: https://jobs.xrpl.org/ external: true - label: Dev Blog + labelTranslationKey: topnav.community.dev-blog href: /blog/ - label: XRPL Grants + labelTranslationKey: topnav.community.xrpl-grants href: https://xrplgrants.org/ external: true - label: GitHub + labelTranslationKey: topnav.community.github href: https://github.com/XRPLF/ external: true - page: ./community/report-a-scam.md + label: Report a Scam + labelTranslationKey: topnav.community.report-a-scam diff --git a/translations.yaml b/translations.yaml index d1d51fa936..2f4491cb9b 100644 --- a/translations.yaml +++ b/translations.yaml @@ -1,2 +1,14 @@ -theme.page.previousButton: "Previous: {{label}}" -theme.page.nextButton: "Next: {{label}}" \ No newline at end of file +# Samples for @i18n/[lang]/translations.yaml +# theme.page.previousButton: "Previous page" +# theme.page.nextButton: "Next page" +# theme.page.lastUpdated.timeago: Last updated +# theme.markdown.editPage.text: Edit +# theme.toc.header: On this page +# theme.search.label: "Search docs" +# theme.search.navbar.label: Search +# theme.search.recent: Recent searches +# theme.search.keys.navigate: "to navigate" +# theme.search.keys.select: "to select" +# theme.search.keys.exit: "to exit" +# theme.feedback.settings.label: Was this helpful? +# theme.footer.copyrightText: © 2024 XRP Ledger. Open Source. diff --git a/tsconfig.json b/tsconfig.json index becea77446..2c2fe16505 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,14 +4,7 @@ "baseUrl": ".", "jsx": "react-jsx", "resolveJsonModule": true, - "paths": { - "@theme/*": [ - "./@theme/*", - "./node_modules/@redocly/theme/src/*" - ], - "@portal/*": [ - "./node_modules/@redocly/realm/dist/client/app/*" - ] - }, + "module": "es2015", + "moduleResolution": "bundler" } }