diff --git a/CONTRIBUTING.ja.md b/CONTRIBUTING.ja.md index 1964521068..3448ff256c 100644 --- a/CONTRIBUTING.ja.md +++ b/CONTRIBUTING.ja.md @@ -1,204 +1,3 @@ # コントリビューション -XRP Ledger開発者ポータルへのコントリビューションをご検討いただきありがとうございます。 - -ぜひ、皆様の力をお貸しくださいますようお願いいたします。ご協力いただくことで、XRP Ledger(XRPL)への理解を深めることができます。 - -また、XRPLと併せて、[インターレジャープロトコル(ILP)](https://interledger.org/)を学習することもおすすめいたします。ILPも[RippleX開発者エコシステム](https://ripplex.io)の一部です。 - -皆様からのプルリクエストをお待ちしております。プルリクエストのレビュー工程をできるだけ円滑に進めるためにも、本ドキュメントをお読みいただき、記載されているガイドラインに従ってください。 - -ご提供いただいたコードは、XRP Ledgerプロジェクトの著作物となり、MIT[ライセンス](LICENSE)に基づいて提供いたします。 - -## このサイトについて - -XRPL開発者ポータルは、XRP Ledgerに関するドキュメントを幅広く提供します。これには、開発者がビルドを始めるためのサンプルコードなどの情報も含まれます。 - -## リポジトリーのレイアウト - -- [assets/](assets/) - サイトのテンプレートに使用する静的ファイル。 -- [content/](content/) - ドキュメントのビルドに使用するソースファイル。主にMarkdownです。 - - [content/\_code-samples/](content/_code-samples/) - ドキュメントに使用するか、ドキュメントで参照するコードサンプル。可能であれば、完全に機能するか実行可能なスクリプトです。 - - [content/\_img-sources/](content/_img-sources/) - ドキュメントで使用する画像のソースファイル。`.uxf`ファイルはすべて、[Umlet](https://www.umlet.com/)で作成された図です。 - - [content/\_snippets/](content/_snippets/) - 再利用可能なMarkdownテキストのまとまり。Dactylプリプロセッサーを使用して他のコンテンツファイルに組み込みます。 -- [img/](img/) - ドキュメントのコンテンツに使用する画像。 -- [tool/](tool/) - テンプレート、スタイルチェッカーのルール、その他スクリプト。 -- [`dactyl-config.yml`](dactyl-config.yml) - メインの設定ファイル。すべてのドキュメントのメタデータが含まれます。規約についての詳細は、[設定の書式](#設定の書式)を参照してください。 - -## プルリクエストを成功させるための要件 - -プルリクエストがレビューまたはマージの対象になるためには、各プルリクエストが以下を満たしている必要があります。 - -- 継続的インティグレーションテストに合格している。 -- レビューの準備ができるまでは[ドラフトのマークが付けられている](https://github.blog/2019-02-14-introducing-draft-pull-requests/)。 -- このリポジトリーの[行動規範](CODE_OF_CONDUCT.md)に従っている。 - -## Dactylのセットアップ - -このポータルは、[Dactyl](https://github.com/ripple/dactyl)を使用して構築されています。 - -Dactylには[Python 3](https://python.org/)が必要です。以下のようにして[pip](https://pip.pypa.io/en/stable/)でインストールしてください。 - -`sudo pip3 install dactyl` - -## サイトのビルド - -このリポジトリーでは、[**Dactyl**](https://github.com/ripple/dactyl)を使用して、すべてのドキュメントのHTML表示のバージョンをビルドできます。[Dactylのセットアップ](#dactylのセットアップ)が完了したら、プロジェクトのルートディレクトリーから以下のコマンドを使用してドキュメントをビルドできます。 - -``` -dactyl_build -``` - -生成されたコンテンツが`out/`ディレクトリーに出力されます。これらのコンテンツは、ウェブブラウザーでファイルとして開くことも、ウェブサーバーで静的コンテンツとして提供することもできます。 - -同様に、ルートディレクトリーからリンクチェックやスタイルチェックを実行することもできます。 - -リンクチェックは、出力フォルダーを空にし、ドキュメントをビルドしてから実行する必要があります。 - -``` -dactyl_link_checker -``` - -スタイルチェックは試験的なものです。 - -``` -dactyl_style_checker -``` - -### 日本語サイトのビルド - -ターゲットと出力先を指定してビルドしてください。 - -``` -dactyl_build -t ja -o out/ja -``` - -日本語サイトの場合、生成されたコンテンツをウェブブラウザーでファイルとして開くことができません。ローカルHTTPサーバーやエディターの拡張機能(VSCodeであればLive Serverなど)を利用してください。 - -##### ローカルでHTTPサーバを利用する方法 - -1. `out`直下で次のコマンドを実施しサーバーを起動する - -``` -python -m http.server -``` - -2. ウェブブラウザーから`localhost`にアクセスする。 -サーバー起動時にアサインされたポート番号を利用してください。 - -## 設定の書式 - -このリポジトリー内のテンプレートは`dactyl-config.yml`ファイルのメタデータを使用して、生成されたサイトをナビゲートする際のページ階層を生成します。ナビゲーションを正しく生成するには、ページの定義に適切なフィールドを含める必要があります。以下の例に、すべてのフィールドを指定したページを示します。 -``` -- md: concept-authorized-trust-lines.md - funnel: Docs - doc_type: Concepts - category: Payment System - subcategory: Accounts - targets: - - local -``` - -ナビゲーションには、フィールド`funnel`、`doc_type`、`category`、および`subcategory`をこの順序(広範から詳細へ)で使用します。各階層では、新しい値が最初に記載されるページが、その階層の親かランディングとなります。(例えば、「Accounts」サブカテゴリーの親には`subcategory: Accounts`フィールドがあり、子より前に記載されている必要があります。)ランディングページの場合は、下位階層フィールドを省きます。(例えば、「Concepts」doc_typeのランディングページには、`doc_type`フィールドは必要ですが、`category`フィールドは不要です。) - -**警告:** いずれかのフィールドに入力ミスがあると、ページがナビゲーションに表示されないか、誤った場所に表示されるおそれがあります。 - -規約として、親ページには、親である階層と同じ名前が必要です。(例えば、`Payment System`カテゴリーのランディングページの名前は`Payment System`である必要があります。)`md`をソースとするファイルの名前は、そのファイルの最初の行のヘッダーによって自動的に決まります。 - -Markdownソースコンテンツのないページの場合は、`md`行を省き、代わりに以下のフィールドを記載します。 - -| フィールド | 内容 | -|:----------|:----------| -| `name` | 人間が読めるページ名(プレーンテキストのみ) | -| `html` | ページの出力ファイル名`.html`で終わり、ターゲット内で一意である必要があります。 | - -## 翻訳 - -XRP Ledger開発者ポータルは主に英語で記載されているため、通常は英語版が最新かつ正確なバージョンです。しかし、XRP Ledgerのソフトウェアとコミュニティーの利用者を拡大するため、このリポジトリーには翻訳版のドキュメントも含まれています。他の言語を理解するコミュニティーのメンバーの皆様には、どうか開発者ポータルのコンテンツを母国語に翻訳していただけますようお願いいたします。 - -`dactyl-config.yml`には、使用可能な各言語の「ターゲット」項目が含まれます。(2019年11月18日現在、使用可能な言語は英語と日本語です。)この項目には、テンプレートファイルで使用する文字列の辞書が含まれています。例: - -```yaml -- name: en - lang: en - display_name: XRP Ledger Dev Portal - # These github_ fields are used by the template's "Edit on GitHub" link. - # Override them with --vars to change which fork/branch to edit. - github_forkurl: https://github.com/XRPLF/xrpl-dev-portal - github_branch: master - strings: - blog: "Blog" - search: "Search site with Google..." - bc_home: "Home" - # ... -``` - -サポート対象の各言語のプロパティーをいくつか定義する最上位の`languages`リストもあります。各言語のショートコードは、[IETF BCP47](https://tools.ietf.org/html/bcp47)に沿ったものである必要があります。例えば、英語は「en」、スペイン語は「es」、日本語は「ja」、簡体字中国語は「zh-CN」、繁体字中国語(台湾で使用)は「zh-TW」になります。`display_name`フィールドでは、言語名をその言語で記載して定義します。`prefix`フィールドでは、その言語版のサイトへのハイパーリンクに使用されるプレフィックスを定義します。`languages`のサンプルの定義を以下に示します。 - -```yaml -languages: - - code: en - display_name:English - prefix: "/" - - code: ja - display_name:日本語 - prefix: "/ja/" -``` - -同じ`dactyl-config.yml`ファイルに、XRP Ledger開発者ポータルの各コンテンツページの項目が記載されています。ページが翻訳されている場合は、翻訳ごとに別個の項目があり、その翻訳「ターゲット」にリンクされています。ページがまだ翻訳されていない場合は、すべての対象に英語版が使用されます。各ページで、HTMLファイル名(`html`フィールド)とナビゲーションフィールド(`funnel`、`doc_type`、`supercategory`、`category`、および`subcategory`。それぞれ、指定される場合)は、どの言語版のページでも同じである必要があります。翻訳版のページで内容の異なるフィールドは、以下のとおりです(いずれの場合においても、そのフィールドが項目で使用される場合に限ります)。 - -- **`name`** - ページのタイトル。通常は、Markdownソースファイルを使用しないランディングページや、[開発者用ツール](https://xrpl.org/dev-tools.html)などの独自のテンプレートを使用する特殊なページでのみ指定されます。通常、Markdownのファイルではこのフィールドが省かれます。Dactylはファイルの最初の行のヘッダーからタイトルを引き出すためです。 -- **`md`** - ページのソースコンテンツとして使用するMarkdownファイル。規約として、翻訳したMarkdownソースファイルには英語版と同じファイル名を使用する必要があります。ただし、ファイルの拡張子は英語版のように`.md`のみでなく、`.{language code}.md`とする必要があります。例えば、日本語の翻訳ファイルは`.ja.md`で終わります。 -- **`blurb`** - ページの要約。このテキストは主にcategoryランディングページで使用されます。 - -以下の例に、`server_info`メソッドページの英語の項目と日本語の項目を示します。 - -```yaml - - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.md - html: server_info.html - funnel: Docs - doc_type: References - supercategory: rippled API - category: Public rippled Methods - subcategory: Server Info Methods - blurb: Retrieve status of the server in human-readable format. - targets: - - en - - - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.ja.md - html: server_info.html - funnel: Docs - doc_type: References - supercategory: rippled API - category: Public rippled Methods - subcategory: Server Info Methods - blurb: rippledサーバーについての各種情報を、人間が読めるフォーマットでサーバーに要求します。 - targets: - - ja -``` - -翻訳されていないページの項目の例は以下のとおりです。 - -```yaml - - md: concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md - html: source-and-destination-tags.html - funnel: Docs - doc_type: Concepts - category: Payment System Basics - subcategory: Transaction Basics - blurb: Use source and destination tags to indicate specific purposes for payments from and to multi-purpose addresses. - targets: - - en - - ja -``` - -### 最初にすべきこと - -XRP Ledger開発者ポータルを任意の母国語に翻訳いただける場合は、XRP Ledgerの主要なプロパティーと機能について説明する[XRP Ledgerの概要ファイル](https://github.com/XRPLF/xrpl-dev-portal/blob/master/content/concepts/introduction/xrp-ledger-overview.md)から始めてください。 - -ファイル名は`xrp-ledger-overview.{language code}.md`で保存してください。`{language code}`は[IETF BCP47](https://tools.ietf.org/html/bcp47)の言語コードです。(例えば、スペイン語は「es」、日本語は「ja」、簡体字中国語は「zh-CN」、台湾で使用される繁体字中国語は「zh-TW」などです。)その後、このリポジトリーにファイルを追加する[プルリクエスト](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests)を開きます。リポジトリーのメンテナーが、サイトに言語を追加するために必要なその他のセットアップについてお手伝いします。 - -Markdownコンテンツのファイルについては、以下の規則に従ってください。 - -- 改行には改行文字(`\n`)のみを使用します(Unix形式)。復帰改行文字(`\r`)は使用しないでください(Windows形式)。 -- UTF-8エンコーディングを使用します。バイトオーダーマークは使用しないでください。 +コントリビューションの情報には[「ドキュメントへの貢献」](https://xrpl.org/ja/contribute-documentation.html)をご覧ください。 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 093196a9d2..29f4d15984 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,260 +1,3 @@ # Contributing -Thanks for considering a contribution to the XRP Ledger Developer Portal! - - -We're thrilled you're interested and your help is greatly appreciated. Contributing is a great way to learn about the XRP Ledger (XRPL). - - -We are happy to review your pull requests. To make the process as smooth as possible, please read this document and follow the stated guidelines. - -Contributions become copyright the XRP Ledger Project and are provided under the MIT [LICENSE](LICENSE). - - -## About This Site - -The XRPL Dev Portal provides comprehensive documentation of the the XRP Ledger, including sample code and other information for developers to start building. - -## Repository Layout - -- [assets/](assets/) - Static files used by the site's templates. -- [content/](content/) - Source files used to build the documentation. Mostly in Markdown. - - [content/\_code-samples/](content/_code-samples/) - Code samples used or referenced by the documentation. Where possible, these are fully functional / executable scripts. - - [content/\_img-sources/](content/_img-sources/) - Source files for images used in the documentation. Any `.uxf` files are diagrams made with [Umlet](https://www.umlet.com/). - - [content/\_snippets/](content/_snippets/) - Reusable chunks of Markdown text that are included in other content files, using the Dactyl preprocessor. -- [img/](img/) - Images used by the documentation contents. -- [template/](template/) - Template files for building the HTML outputs. -- [tool/](tool/) - Filters, style-checker rules, and other scripts. -- [styles/](styles/) - Source files (SCSS) to generate the CSS files in the assets folder. -- [`dactyl-config.yml`](dactyl-config.yml) - Main config file, which contains the metadata for the site. For information on our conventions, see [Config Formatting](#config-formatting). - -## Requirements for a Successful Pull Request - -Before being considered for review or merging, each pull request must: -- Pass continuous integration tests. -- Be [marked as drafts](https://github.blog/2019-02-14-introducing-draft-pull-requests/) until they are ready for review. -- Adhere to the [code of conduct](CODE_OF_CONDUCT.md) for this repository. - -## Dactyl Setup - -The portal is built using [Dactyl](https://github.com/ripple/dactyl). - -Dactyl requires [Python 3](https://python.org/). Install it with [pip](https://pip.pypa.io/en/stable/): - -`sudo pip3 install dactyl -` - -## Building the Site - -This repo uses [**Dactyl**](https://github.com/ripple/dactyl) to build HTML display versions of all the documentation. After you've done the [Dactyl Setup](#dactyl-setup), you can build the site from the project root directory: - -``` -dactyl_build -``` - -This outputs the generated contents to the `out/` directory. These contents can be opened in a web browser as files or served as static content by a web server. - -You can also run link checking or style checking from the root directory. - -Link checking should be run after emptying the output folder and then building: - -``` -dactyl_link_checker -``` - -Style checking is experimental: - -``` -dactyl_style_checker -``` - -## Config Formatting - -The templates in this repository use metadata from the `dactyl-config.yml` file as well as the pages' [frontmatter](https://dactyl.link/frontmatter.html) to generate navigation elements in the site, including header, footer, sidebars, and breadcrumbs. - -If you add a new page, you must add it to the appropriate page in the pages array of the `dactyl-config.yml` file. An example entry looks like this: - -```yaml - - md: concepts/the-rippled-server/the-rippled-server.md - targets: - - en - - ja # Include in all targets unless you have a translation -``` - -The Markdown file itself should start with a frontmatter stanza such as the following: - -```yaml ---- -html: the-rippled-server.html -parent: concepts.html -template: pagetype-category.html.jinja -blurb: 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. ---- -``` - -At a minimum, most pages should have `html`, `parent` and `blurb` fields (plus the `md` and `targets` fields in the config file). You can put any key-value pairs here or in the config file entry for the page, but the following ones are relevant: - - -| Field | Type | Contents | -|:---------------------|:-----------------|:-----------------------------------| -| `html` | String | Output filename for the page. Should end in `.html` and MUST be unique within the target. For translated pages, leave the filename the same as the English version page. | -| `parent` | String | The exact, unique `html` value of this page's "parent" page. Indicates where this page should appear in the navigation. | -| `blurb` | String | Human-readable summary of the page. (Plain text only.) Should be about 1 sentence long. This appears in various places, including landing pages and metadata used in unfurling links on social media. | -| `name` | String | Human-readable page name. (Plain text only.) For files with Markdown content, you should omit this so that Dactyl can automatically detect it from a header on the first line of the contents instead. This is usually only provided on landing pages or other special pages with no Markdown source file. | -| `template` | String | The filename of a template file to use (in the `template/` directory) for this page. Most pages should use the default template. The `pagetype-category.html.jinja` template shows a list of child pages at the end. Pages with special or particularly unique layouts may need individual templates (conventionally, starting with `page-`). | -| `status` | String | Use the value `not_enabled` on pages relating to an amendment that is not yet enabled on the XRP Ledger mainnet. This displays a "flask" badge with a tooltip next to the page in the navigation. | -| `nav_omit` | Boolean | Use `true` to cause this page not to appear in any navigation elements. | -| `top_nav_omit` | Boolean | Use `true` to cause this page not to appear in the page top dropdown navigation. | -| `top_nav_level` | Number | Adjust the indentation level for the page in the top nav dropdowns. Level `2` is indented to appear like a child of the page above it in the dropdown. | -| `sidebar` | String | Use `disabled` to hide the left and right sidebars (if the page uses a template derived from the base template) | -| `fb_card` | String | Filename of an image (in `assets/img/`) to use when unfurling links to this page on Facebook. | -| `twitter_card` | String | Filename of an image (in `assets/img/`) to use when unfurling links to this page on Twitter. | -| `redirect_url` | String | Use with `template: pagetype-redirect.html.jinja` only. Automatically redirect the user to the provided URL when they navigate to this page. | -| `cta_text` | String | Text to appear in "call to action" buttons that link to this page (on special landings). | -| `curated_anchors` | Array of Objects | A set of anchors in this page to show, similar to child pages, in landings. Each object in the array should have a human-readable `name` field (such as `"Available Modes"`) and an `anchor` field with the HTML ID to link to (such as `"#available-modes"`). | -| `skip_spell_checker` | Boolean | Use `true` to make the Dactyl's style checker skip spell-checking this page. | -| `filters` | Array of Strings | A list of additional filters to use on this page. [Filters](https://github.com/ripple/dactyl/blob/master/README.md#filters) are Python scripts that provide additional pre- or post-processing of page contents. | -| `canonical_url` | String | Provides the canonical URL for a page that takes query parameters. Search engines and other tools may use this when linking to the page. | -| `embed_xrpl_js` | Boolean | Use `true` to have the latest version of [xrpl.js](https://js.xrpl.org) loaded on the page. | - -### Conventions - -Use the following conventions when creating a page: - -- The HTML filename and MD filename should match exactly except for the file extension. -- The filenames should closely match the title of the page, including words like "and" and "the", but should be in all lowercase with hyphens instead of spaces and punctuation. For example, `cash-a-check-for-an-exact-amount.md`. If you change the title of a page, change the filename too. (If it has already been published at another URL, leave a redirect from the old URL.) -- Always start a page with a h1 header. -- Don't link to the top h1 anchor of a page, link to the page itself without an anchor. This helps prevent broken links in translation. It's OK to link to later headers. -- Don't use any formatting (like _italics_ or `code font`) in the title of the page. -- Don't hard-wrap text in Markdown files. -- For code samples, try to keep lines no longer than 80 columns wide. -- When in doubt, follow [Ciro Santilli's Markdown Style Guide (Writability Profile)](https://cirosantilli.com/markdown-style-guide/). -- Landing pages should be in subfolders and should have the same filename as the folder. For example, the landing page of the "Accounts" page group should be `accounts/accounts.md` with the HTML filename `accounts.html`. **Don't** use `index.md`. -- Don't use tab characters for indentation in Markdown or code samples. Use **4 spaces per indent**, except in **JavaScript** code samples, which should use 2 spaces per indent. - -### Terminology - -Use the following words and phrases as described: - -| Term | Terms to Avoid | Notes | -|-------------------|----------------|-------| -| API, APIs | API's, RPC | Application Programming Interface, a set of functions and definitions for software to connect to other software. | -| core server, core XRP Ledger server | `rippled` | The `rippled` name is probably going to be retired in the near future, so it's better to refer to it by the more generic name. When necessary, refer to `rippled` in all lowercase and code font. (It's pronounced "ripple dee", and the "d" stands for "daemon" per UNIX tradition.) -| financial institution | bank, FI, PSP (payment services provider) | This term encompasses a wider range of businesses than just _bank_ or other terms and does not rely on an understanding of industry jargon. | -| ledger entry | ledger object, node | A single object inside the state data of the XRP Ledger. The term _ledger object_ could refer to one of these or to the whole ledger. The term _node_ was sometimes used for this case because the ledger's state data can be envisioned as a graph, but this is confusing because _node_ has other uses. | -| liquidity provider | market maker | A business or individual who offers to exchange between two currencies or assets, often deriving income from the price differential between trades. The term _market maker_ has a specific legal definition in some jurisdictions and may not apply in all the same circumstances. | -| malicious actor | hacker | A person, organization, or even an automated tool which might attempt to acquire secrets, break encryption, deny service, or otherwise attack a secure resource. | -| a NFToken | NFT, an NFToken | A NFToken object in the XRP Ledger tracks or represents a non-fungible token. Pronounced "nif-token" and written _a NFToken_ rather than _an NFToken_ | -| PostgreSQL | Postgres | A specific brand of relational database software. Always use the full name, not an informal short version. | -| order book | orderbook, offer book | A collection of trade orders waiting to be matched and executed, typically sorted by exchange rate. Use two words. | -| server | node | A server is software and/or hardware, especially the ones that connect to the XRP Ledger peer-to-peer network. The term _node_ is sometimes used for this purpose but is also overloaded with other meanings including entries in a graph and Node.js, a JavaScript interpreter. | -| stablecoin issuer | gateway | An issuer is the organization that issues a token in the XRP Ledger. A stablecoin is a token where the issuer promises that it is fully backed by some outside asset (such as fiat currency), with the stablecoin issuer providing deposit and withdraw operations to convert between the two (possibly for a fee). Previously the term _gateway_ was used (especially by Ripple, the company) to describe this use case, but the rest of the industry adopted _stablecoin issuer_ instead. | -| transaction cost | transaction fee | The amount of XRP burnt to send a transaction in the XRP Ledger. Even though this is specified in the `Fee` field of transactions, the term _fee_ implies that the money is paid to someone, so _cost_ is preferable. |_ -| trust line | trustline | Use two words. A trust line is a relationship between two accounts in the XRP Ledger that tracks a balance of tokens between those accounts. | -| tokens | IOUs, issuances, issues, issued currencies | A token in the XRP ledger may not represent money owed outside of the ledger as the name _IOU_ implies. Specify _fungible tokens_ if necessary to distinguish from non-fungible tokens. | -| wallet | wallet | Depending on the context, _wallet_ could refer to hardware, software, a cryptographic key pair, or an online service. Be sure to provide enough context that the meaning is clear, or use an alternative such as _key pair_ or _client application_. | -| WebSocket | web socket, Websockets | A two way protocol for communication on the web. Always singular and in CamelCase. | -| XRP | XRPs, ripples | The native digital asset, or cryptocurrency, of the XRP Ledger. XRP is not a token. | -| the XRP Ledger | XRP Ledger (no the), Ripple, Ripple Network, RCL | The XRP Ledger was called _the Ripple network_ and the _Ripple Consensus Ledger_ or _RCL_ at various times in the past. These names were confusing and have been retired because of their similarity to the name of the company, Ripple (formerly Ripple Labs) which develops the reference implementation of the core server. | -| XRPL | XRPL | Short for _XRP Ledger_. As much as possible, spell out _XRP Ledger_ instead; _XRPL_ is cryptic and looks like it could be a typo for _XRP_. | - - -## Translations - -The XRP Ledger Dev Portal is mostly written in English, so the English version is generally the most up-to-date and accurate version. However, to broaden the reach of the XRP Ledger software and community, this repository also contains translated versions of the documentation. We strongly encourage members of the community who understand other languages to contribute translations of the dev portal contents in their native languages. - -The `dactyl-config.yml` contains a "target" entry for each available language. (As of 2019-11-18, the available languages are English and Japanese.) This entry includes a dictionary of strings used in the template files. For example: - -```yaml -- name: en - lang: en - display_name: XRP Ledger Dev Portal - # These github_ fields are used by the template's "Edit on GitHub" link. - # Override them with --vars to change which fork/branch to edit. - github_forkurl: https://github.com/XRPLF/xrpl-dev-portal - github_branch: master - strings: - blog: "Blog" - search: "Search site with Google..." - bc_home: "Home" - # ... -``` - -There is also a top-level `languages` listing that defines some properties for each supported language. The short code for each language should be short code according to [IETF BCP47](https://tools.ietf.org/html/bcp47). For example, "en" for English, "es" for Spanish, "ja" for Japanese, "zh-CN" for Simplified Chinese, "zh-TW" for Traditional Chinese (as used in Taiwan), and so on. The `display_name` field defines the language's name as written natively in that language. The `prefix` field defines a prefix to be used in hyperlinks to that language's version of the site. Example `languages` definition: - -```yaml -languages: - - code: en - display_name: English - prefix: "/" - - code: ja - display_name: 日本語 - prefix: "/ja/" -``` - -The same `dactyl-config.yml` file contains an entry for each content page in the XRP Ledger Dev Portal. If a page has been translated, there is a separate entry for each translation, linked to the "target" for that translation. If a page has not yet been translated, the English version is used across all targets. - -By convention, a page's the HTML filename (`html` field) should be the same across all language versions of a page. Translated Markdown source files should use the same filename as the English-language version except that the file extension should be `.{language code}.md` instead of only `.md` for English. For example, Japanese translated files end in `.ja.md` -- **`blurb`** - a short summary of the page. This text is mostly used on category landing pages. - -Example of English and Japanese entries for the `server_info` method page: - -```yaml - - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.md - targets: - - en - - - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.ja.md - targets: - - ja -``` - -Example entry for a page that isn't translated: - -```yaml - - md: concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md - targets: - - en - - ja -``` - -### Where to Start - -If you want to translate the XRP Ledger Dev Portal into your native language of choice, start with the [XRP Ledger Overview file](https://github.com/XRPLF/xrpl-dev-portal/blob/master/content/concepts/introduction/xrp-ledger-overview.md), which describes the core properties and functions of the XRP Ledger. - -Save the file as `xrp-ledger-overview.{language code}.md`, where `{language code}` is the [IETF BCP47](https://tools.ietf.org/html/bcp47) language code. (For example, "es" for Spanish, "ja" for Japanese, "zh-CN" for Simplified Chinese, "zh-TW" for Traditional Chinese as used in Taiwan, and so on.) Then open a [pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) adding your file to this repository. One of the repository's maintainers can help with the other necessary setup to add the language to the site. - -For the Markdown content files, please use the following conventions: - -- Line-feed newline characters (`\n`) only (Unix style). Do not use carriage return (`\r`) characters (Windows style). -- Use UTF-8 encoding. Avoid the use of Byte-order marks. - - -## Theme-Aware Diagrams - -The site contains code to automatically recolor SVG diagrams for light and dark mode. This is more than just inverting images. The recoloring keeps gradients going the same direction (so that things don't look bottom-lit) and replaces colors with equivalents that fit with the theme rather than their inverse. For example, "Ripple blue" gets recolored to XRPL green, not its inverse orange. Example: - -![Comparison of invert and theme-aware recoloring](./theme-aware-recolor.png) - -Theme-aware recoloring uses a single source file in SVG format for diagrams, and produces diagrams that are recolored to match the current theme (light/dark) using CSS. If the user changes their theme, the diagrams immediately change to match it. - -To include a theme-aware diagram in a document, use the `include_svg` filter with syntax such as the following: - -```jinja -{{ include_svg("img/anatomy-of-a-ledger-complete.svg", "Figure 1: XRP Ledger Elements") }} -``` - -Leave empty lines before and after this syntax. The SVG file in question should be in the [`img/`](./img/) folder at the top level of the repo, or a subfolder of it. The second argument is _title text_, which appears when the user hovers their mouse over the diagram, and can also be used by other software (such as screen readers) to caption the diagram. - -The resulting SVG file is inlined directly into the Markdown file. One limitation is that you can't use it inside other Markdown structures such as bulleted lists or tables. - -> **Note:** The filter source code is [`tool/filter_include_svg.py`](./tool/filter_include_svg.py). This is also the reason that `lxml` is one of the dependencies for building the site. - -### Making Diagrams - -You have to take care when creating diagrams so that the recoloring applies correctly; otherwise, some elements might be invisible (white-on-white or black-on-black, for example) when recolored for the other theme. The theme-aware diagrams code supports diagrams created using either [Umlet](https://www.umlet.com/) or [Google Draw](https://docs.google.com/drawings/) and exported as SVG. Additionally, you should follow these guidelines when making diagrams: - -0. Create diagrams for light mode by default. Use a transparent background color. -0. Only use colors that the theme-aware diagrams code has mappings for. The code for this, including the full list of colors, is in [`styles/_diagrams.scss`](./styles/_diagrams.scss). If needed, you can add new colors by extending the SCSS code. (Don't forget to re-export the CSS when you're done. See the [styles README](./styles/README.md).) -0. Use actual vector shapes instead of embedded icons/images whenever possible. If you need to put text on top of an image, add a solid background to the text element and use one of the colors the theme has mappings for. -0. Don't layer transparent elements containing text on top of elements with different background colors. Apply a background color directly to the element that contains the text. +For information about how to contribute to this repository, see [Contribute Documentation (XRPL.org)](https://xrpl.org/contribute-documentation.html). \ No newline at end of file diff --git a/assets/css/devportal2022-v23.css b/assets/css/devportal2022-v23.css index 9c0e853ce0..8077e77362 100644 --- a/assets/css/devportal2022-v23.css +++ b/assets/css/devportal2022-v23.css @@ -3,4 +3,4 @@ * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 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: #fff;--gray: #454549;--gray-dark: #232325;--primary: #9A52FF;--secondary: #E0E0E1;--success: #32E685;--info: #19A3FF;--warning: #FAFF19;--danger: #FF198B;--light: #fff;--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:-.25em}sup{top:-.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,0.1)}small,.small{font-size:80%;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:80%;color:#454549}.blockquote-footer::before{content:"\2014\00A0"}.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,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,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-sm,.container-md,.container-lg,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{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-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.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,0.05)}.table-hover tbody tr:hover{color:#E0E0E1;background-color:rgba(0,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,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,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,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.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 rgba(0,0,0,0);border-radius:4px;box-shadow:none;transition:border-color 0.15s ease-in-out,box-shadow 0.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,0.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(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.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 + .5rem + 2px);padding:.25rem .5rem;font-size:.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:80%;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:.875rem;line-height:1.5;color:#111112;background-color:rgba(50,230,133,0.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(.3125em + .5rem) center;background-size:calc(.625em + 1rem) calc(.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,0.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(.3125em + .5rem) right calc(.3125em + .5rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#32E685;padding-right:calc(.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(.625em + 1rem) calc(.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,0.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,0.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,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;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:.875rem;line-height:1.5;color:#fff;background-color:rgba(255,25,139,0.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(.3125em + .5rem) center;background-size:calc(.625em + 1rem) calc(.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,0.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(.3125em + .5rem) right calc(.3125em + .5rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#FF198B;padding-right:calc(.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(.625em + 1rem) calc(.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,0.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,0.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,0.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:.875rem;line-height:1.25;border-radius:4px;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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:.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 0.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 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{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:rgba(0,0,0,0)}.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:.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 rgba(0,0,0,0);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 + .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:.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;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;box-shadow:}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:none,0 0 0 .2rem rgba(154,82,255,0.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;box-shadow:}.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:#838386 solid 1px;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='%23fff' 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;box-shadow:}.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='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(154,82,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(154,82,255,0.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='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(154,82,255,0.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(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#838386;border-radius:.5rem;transition:transform 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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(.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(154,82,255,0.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 rgba(0,0,0,0);border-radius:4px;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075);appearance:none}.custom-select:focus{border-color:#e4d2ff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 0 .2rem rgba(154,82,255,0.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 + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.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,0.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 rgba(0,0,0,0);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,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#9A52FF;border:0;border-radius:1rem;box-shadow:0 0.1rem 0.25rem rgba(0,0,0,0.1);transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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 0.25rem 0.25rem rgba(0,0,0,0.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#9A52FF;border:0;border-radius:1rem;box-shadow:0 0.1rem 0.25rem rgba(0,0,0,0.1);transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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 0.25rem 0.25rem rgba(0,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 0.1rem 0.25rem rgba(0,0,0,0.1);transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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 0.25rem 0.25rem rgba(0,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 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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;border:1px solid transparent;border-top-left-radius:4px;border-top-right-radius:4px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{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{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,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,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,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,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,0.9)}.navbar-light .navbar-toggler{color:#454549;border-color:rgba(0,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,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,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,0.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,0.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='%23fff' 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,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,0.03);border-bottom:1px solid rgba(0,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,0.03);border-top:1px solid rgba(0,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,0.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:.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 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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:.75rem;background-color:#111112;border-radius:4px;box-shadow:inset 0 0.1rem 0.1rem rgba(0,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 0.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:.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,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,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.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 0.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 0.25rem 0.5rem rgba(0,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 0.5rem 1rem rgba(0,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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:8px;box-shadow:0 0.25rem 0.5rem rgba(0,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(-.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,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(-.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,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(-.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,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:-.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(-.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,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 0.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='%23fff' 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='%23fff' 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 0.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:-.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:-.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.85714%}.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 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,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:-.25rem !important}.mt-n1,.my-n1{margin-top:-.25rem !important}.mr-n1,.mx-n1{margin-right:-.25rem !important}.mb-n1,.my-n1{margin-bottom:-.25rem !important}.ml-n1,.mx-n1{margin-left:-.25rem !important}.m-n2{margin:-.5rem !important}.mt-n2,.my-n2{margin-top:-.5rem !important}.mr-n2,.mx-n2{margin-right:-.5rem !important}.mb-n2,.my-n2{margin-bottom:-.5rem !important}.ml-n2,.mx-n2{margin-left:-.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:-.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:-.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem !important}.m-md-n2{margin:-.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-.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:-.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:-.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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,0.5) !important}.text-white-50{color:rgba(255,255,255,0.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:0.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:0.875rem}.text-smaller{font-size:0.75rem}.text-smallest{font-size:0.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 .github-edit-wrap .github-edit,.lang-ja .navbar .navbar-nav .nav-link,.lang-ja .content .children-display li a,.lang-ja .right-sidebar .level-1 a,.lang-ja .right-sidebar .separator,.lang-ja .use-case-step-num{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:0.5rem 0.5rem 0.5rem 1rem;line-height:1.5}.search .ds-input{background-color:#232325;border-radius:0 4px 4px 0;padding:0.75rem 1rem 0.75rem 0.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:white}.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:0.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}#main_content_wrapper{margin-top:80px}.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-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.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}}.xrp-ledger-dev-portal.sidebar-primary .main{z-index:5;padding:2rem;min-height:700px}.left-sidebar{padding:2rem}.left-sidebar .external-link::after{background-position:left 6px bottom 1px;width:2rem}.left-sidebar:hover::after{transform:translate(3px, -3px)}@media (min-width: 992px){.left-sidebar{position:sticky;max-height:calc(100vh - 80px);top:80px;left:0;overflow:auto;border:0}}.right-sidebar{padding:2rem;border:1px solid #454549}@media (min-width: 992px){.right-sidebar{position:sticky;max-height:calc(100vh - 80px);top:80px;right:0;overflow:auto;border:0}}@media (max-width: 991.98px){.right-sidebar .card{padding-left:0}#page-toc-wrapper{position:static;clear:both;overflow-y:inherit;max-width:100%;max-height:inherit;word-break:break-all}.main{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}}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:0.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:0.25rem 1rem;font-size:0.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}.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:0.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}}.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,.content a.button,.content .btn{font-weight:bold;cursor:pointer;text-decoration:none;transition:0.2s;padding:0.5rem 1rem;line-height:16px}.content a.button{padding:.5rem 1rem;margin:0 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 0.3s ease-out;-moz-transition:transform 0.3s ease-out;-ms-transition:transform 0.3s ease-out;-o-transition:transform 0.3s ease-out;transition:transform 0.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:"\00a0";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 0.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}.content table{clear:right;margin-bottom:48px}.content table code{word-break:normal;white-space:nowrap}th{border-bottom:2px solid #E0E0E1}tr{border-bottom:1px solid #E0E0E1}th,td{padding:0.2em;vertical-align:text-top}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:0.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 0.75rem}@media (max-width: 991.98px){#overview-table{font-size:0.875rem}#overview-table thead .h4{font-size:1.125rem}}.content table{clear:right;margin-bottom:48px}.content table code{word-break:normal;white-space:nowrap}th{border-bottom:2px solid #E0E0E1}tr{border-bottom:1px solid #E0E0E1}th,td{padding:0.2em;vertical-align:text-top}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:0.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 0.75rem}@media (max-width: 991.98px){#overview-table{font-size:0.875rem}#overview-table thead .h4{font-size:1.125rem}}.related-tasks-links a{color:#454549;text-decoration:none}.related-tasks-links a:hover{color:#000}.use-case-external-link{border:1px solid #C1C1C2}.content .use-case-external-link a{text-decoration:none;color:#000}.use-case-step-num{margin-top:64px;margin-bottom:24px;color:#eae7e6;font-size:5.16em;font-weight:400;font-family:'Space Mono', sans-serif}.use-case-step-length{float:right;color:#888;font-size:1rem}.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}.github-edit-wrap .github-edit{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");background-size:24px 24px;background-position:left 12px center;background-repeat:no-repeat;padding-left:48px;text-decoration:none;margin-bottom:1rem;margin-top:0}.top-nav{background-color:#111112;height:80px;padding:0}.top-nav .navbar-brand{text-decoration:none;white-space:pre;-webkit-transition:opacity 0.2s ease, color 0.2s ease;transition:opacity 0.2s ease, color 0.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:0.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:0.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:0.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-popular-pages,.top-nav .dropdown-menu .col-for-人気ページ{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_xrp-ledger-overviewhtml{grid-template-columns:180px 180px 180px}.top-nav .dropdown-menu.show#topnav_dd_docshtml{grid-template-columns:180px 180px 260px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_contributehtml{grid-template-columns:200px}.top-nav .dropdown-menu.show .dropdown-hero{grid-row:1;grid-column:1 / 4}.top-nav .dropdown-menu.show #dropdown-hero-for-documentation,.top-nav .dropdown-menu.show #dropdown-hero-for-ドキュメント{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{grid-column:2}.top-nav .dropdown-menu.show .col-for-about{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-online-tools{grid-column:1;grid-row:3}.top-nav .dropdown-menu.show .col-for-online-tools .external-link{white-space:nowrap}.top-nav .dropdown-menu.show .col-for-get-started{grid-column:2;grid-row:2 / 4}.top-nav .dropdown-menu.show .col-for-popular-pages,.top-nav .dropdown-menu.show .col-for-人気ページ{grid-column:3;grid-row:1 / 4;margin:-40px -40px -40px 0;padding:40px}.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: 1030px){.top-nav #topnav-pages .nav-link{padding:1rem 1.6rem}}@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: 1200px){.top-nav #topnav-search{margin-left:4rem;margin-right:0.5rem}}@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 0.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 .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 0.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_docshtml{display:grid;grid-template-columns:minmax(187px, 1fr) minmax(187px, 1fr);gap:1px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .dropdown-hero{grid-column:1 / 3;grid-row:1}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-article-types{grid-column:1;grid-row:2}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-online-tools{grid-column:1;grid-row:3;padding-bottom:32px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-get-started{grid-column:2;grid-row:2 / 4;padding-bottom:32px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-popular-pages,.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-人気ページ{grid-column:1 / 3;grid-row:4;margin:-1px;padding-top:33px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-questions,.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-質問{grid-column:1 / 3;grid-row:5;margin:-1px;padding-bottom:32px}.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:0.75rem;transition:all 0.2s ease;overflow:clip;width:1rem}.top-nav .dropdown-toggle:not(.with-caret)::before{content:"\f053";display:inline-block;margin-bottom:-5px}.top-nav .dropdown-toggle:not(.with-caret)::after{content:"\f054";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 0.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 0.2s ease}.top-nav #topnav-search .input-group{flex-wrap:nowrap}.top-nav #topnav-language hr{border-top:1px solid #232325;margin-top:0.25rem;margin-bottom:0.25rem;display:static}}.top-nav #top-nav-hero-docs{content:url("../img/icons/docs.svg")}.top-nav #top-nav-hero-contribute{content:url("../img/icons/contribute.svg")}.main h1:before,.main h2:before,.main h3:before,.main h4:before,.main h5:before,.main h6:before,#main_content_wrapper:before,.interactive-block:before{display:block;content:" ";margin-top:-80px;height:80px;visibility:hidden}a{z-index:1}.chevron{position:relative;display:inline-block;width:0.75rem;height:0.5625rem}.chevron span{position:absolute;top:0.25rem;display:inline-block;width:0.5rem;height:0.15rem;background-color:#9A52FF;transition:all 0.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)}.custom-theme-toggle .custom-control-label{padding:1rem;cursor:pointer}.custom-theme-toggle .custom-control-label::before,.custom-theme-toggle .custom-control-input:checked ~ .custom-control-label::before{position:static;display:inline-block;content:" ";cursor:pointer;border:0;background-image:url("../img/sun-moon.svg");background-size:3rem;background-color:transparent;transform-origin:center;margin-left:-0.5rem;margin-right:0.5rem;transition:transform 0.4s ease, background-position 0.4s ease;transform:rotate(15deg);background-position:top left}.custom-theme-toggle .custom-control-label::after{display:none}@media (max-width: 991.98px){.navbar-collapse,.dropdown-menu{box-shadow:0px 25px 40px -20px #000}}.content{padding-bottom:50px}.content p code,.content table code,.content ul code,.content ol code{background-color:#0A2E1B;color:#5BEB9D}.content a,.blurb a{text-decoration:underline}.content h1{font-size:3rem;margin-top:32px;line-height:1.2;font-weight:700}.content h1:first-child,.landing section:first-of-type h1:first-child{margin-top:0;line-height:1.2}.content h1:first-child:before{margin-top:-80px}.content h2{margin-top:2.5rem;margin-bottom:1.5rem;font-size:2.5rem;font-weight:600;line-height:1.2}.content h3{font-size:2.125rem;margin-top:2rem;margin-bottom:1rem;line-height:1.2}.content h4{font-size:1.75rem;margin-top:1.5rem;margin-bottom:0.5rem;line-height:1.2}.content h5{font-size:1.25rem;margin-top:1.25rem;line-height:1.2;font-weight:700}.content h6{font-size:1rem;margin-top:1rem;line-height:1.2;font-weight:700}.content li{margin:6px;margin-top:24px}.content li p{margin:0}.content a[title="Source"]{float:right;padding-left:20px}.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}.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:0.625rem}.multicode .btn{z-index:10}.multicode .codetabs{position:relative;z-index:10}.clipboard-btn{z-index:10;margin-right:10px}.js_interactive .codehilite>.btn-group{display:none}.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}.CodeMirror{font-family:"Space Mono",monospace;height:300px;background-color:#232325;margin:16px 0;border-radius:4px}.CodeMirror-scroll{overflow:auto}.CodeMirror-lines{padding:2rem 0}.CodeMirror pre{padding:0 2rem 0 1rem}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:#000}.CodeMirror-gutters{background-color:#232325;white-space:nowrap}.CodeMirror div.CodeMirror-cursor{border-left:1px solid #fff;z-index:3}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid #838386}.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#838386;z-index:1}.cm-tab{display:inline-block}.cm-s-default .cm-keyword{color:#FF6719}.cm-s-default .cm-atom{color:#FF6719}.cm-s-default .cm-number{color:#19A3FF}.cm-s-default .cm-def{color:#19A3FF}.cm-s-default .cm-variable{color:#fff}.cm-s-default .cm-variable-2{color:#fff}.cm-s-default .cm-variable-3{color:#fff}.cm-s-default .cm-property{color:#fff}.cm-s-default .cm-operator{color:#fff}.cm-s-default .cm-comment{color:#838386}.cm-s-default .cm-string{color:#28B86A}.cm-s-default .cm-string-2{color:#28B86A}.cm-s-default .cm-meta{color:#838386}.cm-s-default .cm-qualifier{color:#838386}.cm-s-default .cm-builtin{color:#28B86A}.cm-s-default .cm-bracket{color:#fff}.cm-s-default .cm-tag{color:#fff}.cm-s-default .cm-attribute{color:#fff}.cm-s-default .cm-header{color:#19A3FF}.cm-s-default .cm-quote{color:#28B86A}.cm-s-default .cm-hr{color:#838386}.cm-s-default .cm-link{color:#B2E0FF}.cm-negative{color:#fff}.cm-positive{color:#fff}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-s-default .cm-error{color:#FF198B}.cm-invalidchar{color:#FF198B}div.CodeMirror span.CodeMirror-matchingbracket{color:#7919FF}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#FAFF19}.CodeMirror-activeline-background{background:#232325}.CodeMirror{line-height:1;position:relative;overflow:hidden;background:#232325;color:#fff}.CodeMirror-scroll{margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;padding-right:30px;height:100%;outline:none;position:relative;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-sizer{position:relative}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;padding-bottom:30px;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;-moz-box-sizing:content-box;box-sizing:content-box;padding-bottom:30px;margin-bottom:-32px;display:inline-block;*zoom:1;*display:inline}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-lines{cursor:text}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-code pre{border-right:30px solid transparent;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.CodeMirror-wrap .CodeMirror-code pre{border-right:none;width:auto}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-wrap .CodeMirror-scroll{overflow-x:hidden}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;visibility:hidden;border-right:none;width:0}.CodeMirror-focused div.CodeMirror-cursor{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,0.4)}.CodeMirror span{*vertical-align:text-bottom}@media print{.CodeMirror div.CodeMirror-cursor{visibility:hidden}}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid black;border-radius:4px 4px 4px 4px;color:black;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")}.CodeMirror-lint-mark-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=")}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-multiple{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.content img{max-width:100%;height:auto}.content img .dactyl_badge{width:initial}.content svg{max-width:100%}html:not(.light) .content svg[fill="black"]{fill:#fff;stroke:#fff}html:not(.light) .content svg[fill="black"] *[fill="white"]{fill:#000}html:not(.light) .content svg[fill="black"] *[stroke="white"]{stroke:#000}html:not(.light) .content svg[fill="black"] *[fill="black"]{fill:#fff}html:not(.light) .content svg[fill="black"] *[stroke="black"]{stroke:#fff}html:not(.light) .content svg[fill="black"] g[fill="blue"]{fill:#19A3FF}html:not(.light) .content svg[fill="black"] g[stroke="blue"]{stroke:#19A3FF}html:not(.light) .content svg[fill="black"] g[fill="rgb(120,120,120)"]{fill:#E0E0E1}html:not(.light) .content svg[fill="black"] g[stroke="rgb(120,120,120)"]{stroke:#E0E0E1}html:not(.light) .content svg[fill="black"] g[fill="rgb(200,200,200)"]{fill:#343437}html:not(.light) .content svg[fill="black"] g[fill="rgb(70,70,70)"]{fill:#838386}html:not(.light) .content svg[fill="black"] g[stroke="rgb(70,70,70)"]{stroke:#838386}html:not(.light) .content svg[fill="black"] g[fill="rgb(29,180,255)"]{fill:#9A52FF}html:not(.light) .content svg[fill="black"] g[stroke="rgb(29,180,255)"]{stroke:#9A52FF}html:not(.light) .content svg[fill="black"] rect[stroke="rgb(245,247,249)"]{stroke:#000}html:not(.light) .content svg[fill="black"] g[fill="lime"],html:not(.light) .content svg[fill="black"] g[fill="rgb(0,255,0)"]{fill:#9A52FF}html:not(.light) .content svg[fill="black"] g[stroke="lime"],html:not(.light) .content svg[fill="black"] g[stroke="rgb(0,255,0)"]{stroke:#9A52FF}html:not(.light) .content svg[fill="black"] g[fill="yellow"],html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"]{fill:#FAFF19}html:not(.light) .content svg[fill="black"] g[fill="yellow"] path[stroke="black"],html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"] path[stroke="black"]{stroke:#000}html:not(.light) .content svg[fill="black"] g[fill="red"],html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"]{fill:#FF198B}html:not(.light) .content svg[fill="black"] g[stroke="red"],html:not(.light) .content svg[fill="black"] g[stroke="rgb(255,255,0)"]{stroke:#FF198B}html:not(.light) .content svg[fill="black"] g[fill="yellow"]+g text,html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"]+g text{fill:#000}html:not(.light) .content svg[fill="black"] g[fill="lime"]+g text{fill:#000}html:not(.light) .content svg[fill="none"] path[fill="#000000"]{fill:#fff}html:not(.light) .content svg[fill="none"] path[stroke="#000000"]{stroke:#fff}html:not(.light) .content svg[fill="none"] path[fill="#ffffff"]{fill:#000}html:not(.light) .content svg[fill="none"] path[stroke="#ffffff"]{stroke:#000}html:not(.light) .content svg[fill="none"] path[fill="#23292f"],html:not(.light) .content svg[fill="none"] path[fill="#23282f"]{fill:#fff}html:not(.light) .content svg[fill="none"] path[stroke="#23292f"],html:not(.light) .content svg[fill="none"] path[stroke="#23282f"]{stroke:#fff}html:not(.light) .content svg[fill="none"] path[fill="#2c3e50"],html:not(.light) .content svg[fill="none"] path[fill="#2b3e51"]{fill:#E0E0E1}html:not(.light) .content svg[fill="none"] path[stroke="#2c3e50"],html:not(.light) .content svg[fill="none"] path[stroke="#2b3e51"]{stroke:#E0E0E1}html:not(.light) .content svg[fill="none"] path[fill="#1c2835"]{fill:#F5F5F7}html:not(.light) .content svg[fill="none"] path[stroke="#1c2835"]{stroke:#F5F5F7}html:not(.light) .content svg[fill="none"] path[fill="#21aa47"]{fill:#32E685}html:not(.light) .content svg[fill="none"] path[stroke="#21aa47"]{stroke:#32E685}html:not(.light) .content svg[fill="none"] path[fill="#e64b3b"]{fill:#dc3545}html:not(.light) .content svg[fill="none"] path[stroke="#e64b3b"]{stroke:#dc3545}html:not(.light) .content svg[fill="none"] path[stroke="#27a2db"],html:not(.light) .content svg[fill="none"] path[stroke="#00aae4"]{stroke:#9A52FF}html:not(.light) .content svg[fill="none"] path[fill="#27a2db"],html:not(.light) .content svg[fill="none"] path[fill="#00aae4"]{fill:#9A52FF}html:not(.light) .content svg[fill="none"] path[fill="#e6e7e8"]{fill:#232325}html:not(.light) .content svg[fill="none"] path[stroke="#e6e7e8"]{stroke:#232325}html:not(.light) .content svg[fill="none"] path[stroke="#ffbf27"]{stroke:#D919FF}html:not(.light) .content svg[fill="none"] path[fill="#00ff00"]{fill:#32E685}html:not(.light) .content svg[fill="none"] path[stroke="#00ff00"]{stroke:#32E685}html:not(.light) .content svg[fill="none"] path[fill="#ff00ff"]{fill:#FF198B}html:not(.light) .content svg[fill="none"] path[stroke="#ff00ff"]{stroke:#FF198B}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#ffffff"]{stop-color:#343437}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#e6e7e8"]{stop-color:#232325}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#dbdcdd"]{stop-color:#000}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#b1b3b5"]{stop-color:#111112}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#29a1da"]{stop-color:#2DCF78}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#2789b9"]{stop-color:#5BEB9D}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#6bc1ec"]{stop-color:#ADF5CE}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#8ad6f4"]{stop-color:#84F0B6}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#fab913"]{stop-color:#F2B2FF}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#fad26b"]{stop-color:#EA80FF}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#f8a136"]{stop-color:#E24CFF}html:not(.light) .content 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}.external-link::after{content:"\00a0";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:"\00a0";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 -.1rem;transition:background-position 100ms ease-in-out}.li-links a:hover::after{background-position:left .2rem bottom .1rem}.xrpl-footer{padding:7.5rem 2rem}.xrpl-footer .footer-nav .nav-item{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){.xrpl-footer{background-image:url(../img/backgrounds/footer.svg);background-size:cover;background-repeat:no-repeat;background-position:bottom right}}@media (max-width: 991.98px){.xrpl-footer .col-lg:not(:first-child){margin-top:4rem}}.xrpl-footer h5{font-size:1rem;font-weight:600;color:#A2A2A4}.xrpl-footer .nav-link{padding:.75rem 0;line-height:1}.xrpl-footer .absolute-bottom-footer{font-size:10px;line-height:1rem}@media (max-width: 991.98px){.xrpl-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:"\f058";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.note>strong:first-child:before{content:"\f05a";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.caution>strong:first-child:before{content:"\f071";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.warning>strong:first-child:before{content:"\f057";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.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}a.card{border:0;color:#fff}a.card:hover,a:hover .card-new{text-decoration:none}a.card:hover h3{text-decoration:underline}.circled-logo{background-color:#454549;border-radius:50%;padding:.65rem;width:50px;height:50px;margin-bottom:0.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 0.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:0.75rem 0.75rem 5rem 0.75rem;max-width:calc(100% - 1.5rem)}.card-deck.row-cols-2 .card{margin:.75rem;max-width:calc(50% - 1.5rem)}}.cta-card{text-align:center;background-color:#232325}.breadcrumbs-wrap{position:relative;z-index:11;padding:0 2rem 2rem 2rem}.interactive-block .breadcrumbs-wrap{padding:0}.breadcrumb-item+.breadcrumb-item:before{content:"\f105";font-family:FontAwesome;padding-right:5px}.breadcrumbs-wrap .breadcrumb{padding:0;margin-bottom:0;font-size:0.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 .content .children-display>ul>li,.landing .content .curated-links>ul>li{margin-top:24px}.landing .content .children-display li a,.landing .content .curated-links li a{font-weight:700;font-size:1.25rem;text-decoration:none}.landing .content .children-display li a:hover,.landing .content .curated-links li a:hover{text-decoration:underline}.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}.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:white;background-color:#006BB2;border-width:0}.alert-info a{text-decoration:underline;color:white}.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:"\f058";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:"\f02c";font-family:FontAwesome;font-size:1.5rem}.labels-wrap .list-inline-item{margin-top:0.5rem}.pg-category{color:#A2A2A4}.pg-category::after{content:"\f105";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:0.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.chip-yellow{background-color:#FDFFB2;color:#7D8000}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.chip-yellow .badge-pill{color:#FDFFB2;background-color:#7D8000}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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.chip-magenta:hover .badge-pill{color:#FF80BF;background-color:#4C0026}.tag-cloud .list-inline-item{margin-top:1.5rem}#tx-sender-history .list-group-item{font-size:small;color:#454549}.response-metadata .timestamp{color:#454549;position:relative;top:16px}.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}#pp_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}.content a[title="Source"]{float:none}header,footer,aside{display:none !important}.navbar{display:none !important}.content,#main_content_body{position:static;display:block;width:auto;height:auto;color:black !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:black}.interactive-block{display:none}.container{margin-top:1rem !important}#main_content_wrapper{margin-top:0}#main_content_body::before{display:none}.xrp-ledger-dev-portal.sidebar-primary .main{border:0}.sidebar-primary .row{display:block}#feedback-content{display:none !important}.jump-to-top{display:none !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:0.6}@media (min-width: 768px){.landing-bg{opacity:1.0}}.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:0.6}@media (min-width: 768px){.landing-builtin-bg::before{opacity:1.0}}#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")}#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:0.75rem;flex-direction:column;flex-wrap:wrap}.page-uses .card-title{margin-bottom:0.5rem;line-height:26px}.page-uses .card-uses{padding:16px;margin:0;text-decoration:none;transition:all 0.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 .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{padding:0px 8px;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 #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")}@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 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 0.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)}#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 0.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,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 .content{max-width:704px;margin-left:auto;margin-right:auto}}.page-faq .content 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 .content h6:first-of-type .hover_anchor{display:none}@media (min-width: 992px){.page-faq .content h6:first-of-type{margin-top:6.5rem}}.page-faq .content h1:first-of-type{font-size:2.625rem;line-height:1.2;margin-top:0;margin-bottom:5rem;text-align:center}.page-faq .content h1:first-of-type .hover_anchor{display:none}@media (min-width: 992px){.page-faq .content 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:-80px;height:80px;visibility:hidden}.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-image:url(../../img/backgrounds/docs-splash.svg);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:2.5rem;padding-bottom:5rem;padding-left:1rem}@media (min-width: 992px){.page-docs-index #community-heading,.page-community #community-heading{padding-top:5rem;padding-bottom:15rem;padding-left:0}}@media (min-width: 1200px){.page-docs-index #community-heading,.page-community #community-heading{padding-bottom:25rem}}.page-docs-index #community-heading .parallax,.page-community #community-heading .parallax{position:absolute;-webkit-transition:all 0.1s ease;-moz-transition:all 0.1s ease;-ms-transition:all 0.1s ease;-o-transition:all 0.1s ease;transition:all 0.1s ease}.page-docs-index #community-heading .one,.page-community #community-heading .one{top:160px;left:0%}.page-docs-index #community-heading .two,.page-community #community-heading .two{top:439px;left:22%}.page-docs-index #community-heading .three,.page-community #community-heading .three{top:517px;left:52%}.page-docs-index #community-heading .four,.page-community #community-heading .four{top:322px;left:71%}.page-docs-index #community-heading .five,.page-community #community-heading .five{top:120px;right:0%}.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 0.3s ease-out;-moz-transition:transform 0.3s ease-out;-ms-transition:transform 0.3s ease-out;-o-transition:transform 0.3s ease-out;transition:transform 0.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:0.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")}.rpc-tool #result{display:none}.rpc-tool #log{font-weight:700}.rpc-tool .content .json li{margin-top:0}.rpc-tool .json .name{color:#fff}.rpc-tool .json ul{margin:0;display:none}.rpc-tool .json li{padding:0;list-style-type:none}.rpc-tool .json .type-string .val{color:#28B86A}.rpc-tool .json .type-number .val{color:#19A3FF}.rpc-tool .json a.toggle:hover{text-decoration:none}.rpc-tool .json>a.toggle{display:none}.rpc-tool .json a.toggle:after{content:" +\0000a0";cursor:pointer}.rpc-tool .json>ul,.rpc-tool .json .expanded>ul{display:block}.rpc-tool .json .ellipsis{color:#838386}.rpc-tool .json>.ellipsis,.rpc-tool .json .expanded>.ellipsis{display:none}.rpc-tool .json .expanded>a.toggle:after{content:" \2212\0000a0"}.rpc-tool .json .indentafter{display:none}.rpc-tool .json .expanded>.indentafter{display:inline}.rpc-tool .tools{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;font-size:0.8em;margin:0 0 10px}.rpc-tool .tools>li>a{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 .labels-wrap{display:inline-block}.dev-blog a.badge-primary{text-decoration:none}.dev-blog a.badge-primary:hover{text-decoration:none}#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 0.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:#ffffff;opacity:0.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:"\00a0";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}}@keyframes pulsate{}.banner-container,html.light .banner-container{display:flex;width:100%;position:relative;background-color:#013;color:#fff;overflow:hidden;height:36px}@media (min-width: 992px){.banner-container,html.light .banner-container{height:48px}}.banner-container>img,html.light .banner-container>img{height:36px}@media (min-width: 992px){.banner-container>img,html.light .banner-container>img{height:3rem}}.banner-container>div,html.light .banner-container>div{line-height:36px;font-family:Work Sans;font-weight:600;font-size:3vw}@media (min-width: 992px){.banner-container>div,html.light .banner-container>div{font-size:22px;line-height:3rem}}@media (min-width: 1400px){.banner-container .d-xxl-block,html.light .banner-container .d-xxl-block{display:block !important}}.banner-container .apex-reg,html.light .banner-container .apex-reg{text-align:center}@media (min-width: 768px){.banner-container .apex-reg,html.light .banner-container .apex-reg{padding:0 1rem}}.banner-container .apex-highlight,html.light .banner-container .apex-highlight{color:#00FF76}.banner-container .apex-circled,html.light .banner-container .apex-circled{padding:0 1rem;text-transform:uppercase;white-space:nowrap;transition:border-color 0.5s ease;border:2px solid #fff;height:36px;line-height:32px;border-radius:32px;font-size:2vw}@media (min-width: 992px){.banner-container .apex-circled,html.light .banner-container .apex-circled{border-width:3px;height:48px;line-height:42px;border-radius:40px;font-size:16px}}@media (min-width: 1200px){.banner-container .apex-circled,html.light .banner-container .apex-circled{font-size:19px}}.banner-container:hover,html.light .banner-container:hover{text-decoration:none;color:#fff}.banner-container:hover .apex-highlight,html.light .banner-container:hover .apex-highlight{color:#00FF76}.banner-container:hover .highlight-yellow,html.light .banner-container:hover .highlight-yellow{border-color:#FAFF19}.banner-container:hover .highlight-purple,html.light .banner-container:hover .highlight-purple{border-color:#FF198B}.banner-container:active,.banner-container:focus,html.light .banner-container:active,html.light .banner-container:focus{background-color:#013 !important;color:#fff}.token-banner-container,html.light .token-banner-container{display:flex;width:100%;position:relative;background-color:#013;color:#fff;height:48px}@media (min-width: 992px){.token-banner-container,html.light .token-banner-container{height:60px}}.token-banner-container>img,html.light .token-banner-container>img{height:36px}.token-banner-container>div,html.light .token-banner-container>div{font-family:Work Sans;font-weight:600}@media (min-width: 992px){.token-banner-container>div,html.light .token-banner-container>div{font-size:22px}}@media (min-width: 1400px){.token-banner-container .d-xxl-block,html.light .token-banner-container .d-xxl-block{display:block !important}}.token-banner-container .token-reg,html.light .token-banner-container .token-reg{text-align:center;line-height:48px;font-size:16px;padding:0 1rem}@media (min-width: 992px){.token-banner-container .token-reg,html.light .token-banner-container .token-reg{line-height:60px}}@media (min-width: 1400px){.token-banner-container .token-reg,html.light .token-banner-container .token-reg{font-size:22px}}.token-banner-container .token-highlight,html.light .token-banner-container .token-highlight{color:#00FF76}@media (min-width: 576px){.token-banner-container .token-highlight,html.light .token-banner-container .token-highlight{line-height:3rem}}.token-banner-container .token-circled,html.light .token-banner-container .token-circled{padding:0 1rem;text-transform:uppercase;white-space:nowrap;transition:border-color 0.5s ease;border:2px solid #fff;height:36px;line-height:32px;border-radius:32px;font-size:8px;margin-top:6px}@media (min-width: 576px){.token-banner-container .token-circled,html.light .token-banner-container .token-circled{font-size:2vw}}@media (min-width: 992px){.token-banner-container .token-circled,html.light .token-banner-container .token-circled{border-width:3px;height:48px;line-height:42px;border-radius:40px;font-size:16px}}@media (min-width: 1200px){.token-banner-container .token-circled,html.light .token-banner-container .token-circled{font-size:22px}}.token-banner-container:hover,html.light .token-banner-container:hover{text-decoration:none;color:#fff}.token-banner-container:hover .token-highlight,html.light .token-banner-container:hover .token-highlight{color:#00FF76}.token-banner-container:hover .highlight-yellow,html.light .token-banner-container:hover .highlight-yellow{border-color:#FAFF19}.token-banner-container:hover .highlight-purple,html.light .token-banner-container:hover .highlight-purple{border-color:#FF198B}.token-banner-container:active,.token-banner-container:focus,html.light .token-banner-container:active,html.light .token-banner-container:focus{background-color:#013 !important;color:#fff}.token-banner-container .js-clock,html.light .token-banner-container .js-clock{padding-top:3px}@media (min-width: 992px){.token-banner-container .js-clock,html.light .token-banner-container .js-clock{padding-top:8px}}.token-banner-container .js-clock .box,html.light .token-banner-container .js-clock .box{display:inline-block;margin-right:10px;font-size:14px;line-height:22px}.token-banner-container .js-clock .box:last-child,html.light .token-banner-container .js-clock .box:last-child{margin-right:0}.token-banner-container .js-clock .clock-number,html.light .token-banner-container .js-clock .clock-number{font-variant-numeric:tabular-nums}@media (max-width: 1199.98px){.token-banner-container .highlight-purple,html.light .token-banner-container .highlight-purple{display:none}}@media (max-width: 767.98px){.token-banner-container .token-highlight,html.light .token-banner-container .token-highlight{margin-right:10px}}.top-banner{height:46px;background:url(../img/backgrounds/bg-apex-banner.svg);background-position:left;background-size:cover;background-color:#7919FF;color:#fff;text-align:center;font-size:16px;font-weight:bold;line-height:24px}.top-banner .btn{margin-left:4px;font-size:12px;color:#fff;padding:2px 4px;border:1px solid #fff;border-radius:2px}@media (min-width: 768px){.top-banner .btn{margin-top:9px;margin-left:16px;font-size:16px;padding:4px 8px;border:1.5px solid #fff;border-radius:4px}}.top-banner .btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#111112;background-color:#fff}.top-banner p{font-size:12px;line-height:20px;text-align:center;margin:auto}@media (min-width: 768px){.top-banner p{padding-top:11px;font-size:16px;width:initial;line-height:24px}}.top-nav{position:sticky;width:100%}@media (min-width: 992px){.right-sidebar,.left-sidebar{top:100px}}.floating-nav{top:146px}.main h1:before,.main h2:before,.main h3:before,.main h4:before,.main h5:before,.main h6:before,#main_content_wrapper:before,.interactive-block:before{margin-top:-146px;height:146px}.content h1:first-child:before{margin-top:-146px}#main_content_wrapper{margin-top:53px}html.light .top-banner .btn-outline-secondary{color:#fff;border-color:#fff}html.light .top-banner .btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#111112;background-color:#fff;border-color:#fff}.toml-checker #result{display:none}.toml-checker #verify-domain-result{display:none}.tutorial-content #beginner-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #servers-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #servers-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #servers-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #servers-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #servers-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #servers-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #servers-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #servers-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #servers-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #servers-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-card-grid{grid-gap:16px !important;row-gap:0 !important}.tutorial-card-grid.card-grid.card-grid-3xN{grid-template-columns:1fr;grid-auto-rows:auto}@media (min-width: 1200px){.tutorial-card-grid.card-grid.card-grid-3xN{grid-template-columns:1fr 1fr 1fr}}.tutorial-card-grid.card-grid .card{margin-bottom:2.5rem;background-position:bottom;background-repeat:no-repeat;background-size:contain;padding:0;min-height:0}.tutorial-card-grid.card-grid .card .card-body{padding:32px}.tutorial-card-grid.card-grid .card .card-title{margin-bottom:16px;margin-top:0}.tutorial-card-grid.card-grid .card .card-title.external-link::after{background-size:0.9rem;vertical-align:middle;margin-left:12px;margin-bottom:12px;margin-right:10px;width:1.5rem}.tutorial-card-grid.card-grid .card .card-title.nav-link{padding:0}.tutorial-card-grid.card-grid .card .card-footer{font-size:0;padding:1rem;background-position:bottom;background-repeat:no-repeat;background-size:cover;border-top:0}.tutorial-card-grid.card-grid a{text-decoration:none}.tutorial-card-grid.card-grid code{color:#2DCF78;background-color:#0A2E1B;border-radius:4px;padding-left:4px;padding-right:4px}.tutorial-card-grid.card-grid .card-icon-container{width:50px;height:50px;background:#454549;display:flex;justify-content:center;align-items:center;border-radius:50%;margin-bottom:12px}.tutorial-card-grid.card-grid .card-icon-container img{width:70%;height:70%}.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 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 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:0.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 0.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}html.light .content p code,html.light .content table code,html.light .content ul code,html.light .content ol 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:white 0 0 2px, white -1px -1px 2px, white 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{color:#000}html.light a.btn-primary,html.light nav a.btn-primary{color:#fff}html.light a.btn-primary:hover,html.light nav a.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{color:#7919FF}html.light a:not(.btn):focus,html.light nav a: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 .content 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 .content a.button:not(:disabled):not(.disabled):hover,html.light .content 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 #top-nav-hero-docs{content:url(../img/icons/lightmode/docs.svg)}html.light .top-nav #top-nav-hero-contribute{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-popular-pages,html.light .top-nav .dropdown-menu .col-for-人気ページ,html.light .top-nav .dropdown-menu .col-for-questions,html.light .top-nav .dropdown-menu .col-for-質問{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 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:white 0px 0px 2px, white 1px 1px 2px, white 2px 2px 3px, white 2px 2px 4px, white 2px 2px 5px, white 2px 2px 6px, white -1px -1px 2px, white -2px -2px 3px, white -2px -2px 4px}html.light a.osano-cm-link{color:#ffffff}html.light .card,html.light .cta-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:0.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 #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{color:#FCFCFD}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 #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 #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 #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 #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:0.4}@media (min-width: 768px){html.light .landing-bg{opacity:1}}html.light .landing-builtin-bg::before{opacity:0.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 #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,html.light .page-docs-index #xrplGrantsDark-small,html.light .page-docs-index #careersDark,html.light .page-docs-index #careersDark-small,html.light .page-community #xrplGrantsDark,html.light .page-community #xrplGrantsDark-small,html.light .page-community #careersDark,html.light .page-community #careersDark-small{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 .tutorial-card-grid code{background-color:#D6FAE7}html.light .tutorial-card-grid .card-icon-container{background:#C1C1C2}html.light .footer-nav .nav-item{text-shadow:white 0px 0px 2px, white 1px 1px 2px, white 2px 2px 3px, white 2px 2px 4px, white 2px 2px 5px, white 2px 2px 6px, white -1px -1px 2px, white -2px -2px 3px, white -2px -2px 4px} + */:root{--blue: #19A3FF;--indigo: #6610f2;--purple: #9A52FF;--pink: #FF198B;--red: #dc3545;--orange: #FF6719;--yellow: #FAFF19;--green: #32E685;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #454549;--gray-dark: #232325;--primary: #9A52FF;--secondary: #E0E0E1;--success: #32E685;--info: #19A3FF;--warning: #FAFF19;--danger: #FF198B;--light: #fff;--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:-.25em}sup{top:-.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,0.1)}small,.small{font-size:80%;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:80%;color:#454549}.blockquote-footer::before{content:"\2014\00A0"}.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,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,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-sm,.container-md,.container-lg,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{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-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@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.33333%;max-width:33.33333%}.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.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.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,0.05)}.table-hover tbody tr:hover{color:#E0E0E1;background-color:rgba(0,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,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,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,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.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 rgba(0,0,0,0);border-radius:4px;box-shadow:none;transition:border-color 0.15s ease-in-out,box-shadow 0.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,0.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(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.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 + .5rem + 2px);padding:.25rem .5rem;font-size:.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:80%;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:.875rem;line-height:1.5;color:#111112;background-color:rgba(50,230,133,0.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(.3125em + .5rem) center;background-size:calc(.625em + 1rem) calc(.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,0.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(.3125em + .5rem) right calc(.3125em + .5rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#32E685;padding-right:calc(.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(.625em + 1rem) calc(.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,0.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,0.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,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;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:.875rem;line-height:1.5;color:#fff;background-color:rgba(255,25,139,0.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(.3125em + .5rem) center;background-size:calc(.625em + 1rem) calc(.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,0.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(.3125em + .5rem) right calc(.3125em + .5rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#FF198B;padding-right:calc(.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(.625em + 1rem) calc(.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,0.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,0.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,0.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:.875rem;line-height:1.25;border-radius:4px;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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:.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 0.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 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{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:rgba(0,0,0,0)}.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:.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 rgba(0,0,0,0);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 + .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:.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;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;box-shadow:}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:none,0 0 0 .2rem rgba(154,82,255,0.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;box-shadow:}.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:#838386 solid 1px;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='%23fff' 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;box-shadow:}.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='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(154,82,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(154,82,255,0.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='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(154,82,255,0.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(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#838386;border-radius:.5rem;transition:transform 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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(.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(154,82,255,0.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 rgba(0,0,0,0);border-radius:4px;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075);appearance:none}.custom-select:focus{border-color:#e4d2ff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 0 .2rem rgba(154,82,255,0.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 + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.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,0.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 rgba(0,0,0,0);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,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #111112,0 0 0 .2rem rgba(154,82,255,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#9A52FF;border:0;border-radius:1rem;box-shadow:0 0.1rem 0.25rem rgba(0,0,0,0.1);transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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 0.25rem 0.25rem rgba(0,0,0,0.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#9A52FF;border:0;border-radius:1rem;box-shadow:0 0.1rem 0.25rem rgba(0,0,0,0.1);transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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 0.25rem 0.25rem rgba(0,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 0.1rem 0.25rem rgba(0,0,0,0.1);transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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 0.25rem 0.25rem rgba(0,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 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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;border:1px solid transparent;border-top-left-radius:4px;border-top-right-radius:4px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{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{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,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,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,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,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,0.9)}.navbar-light .navbar-toggler{color:#454549;border-color:rgba(0,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,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,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,0.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,0.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='%23fff' 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,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,0.03);border-bottom:1px solid rgba(0,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,0.03);border-top:1px solid rgba(0,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,0.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:.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 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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,0.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:.75rem;background-color:#111112;border-radius:4px;box-shadow:inset 0 0.1rem 0.1rem rgba(0,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 0.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:.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,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,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.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 0.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 0.25rem 0.5rem rgba(0,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 0.5rem 1rem rgba(0,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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:8px;box-shadow:0 0.25rem 0.5rem rgba(0,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(-.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,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(-.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,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(-.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,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:-.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(-.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,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 0.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='%23fff' 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='%23fff' 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 0.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:-.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:-.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.85714%}.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 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,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:-.25rem !important}.mt-n1,.my-n1{margin-top:-.25rem !important}.mr-n1,.mx-n1{margin-right:-.25rem !important}.mb-n1,.my-n1{margin-bottom:-.25rem !important}.ml-n1,.mx-n1{margin-left:-.25rem !important}.m-n2{margin:-.5rem !important}.mt-n2,.my-n2{margin-top:-.5rem !important}.mr-n2,.mx-n2{margin-right:-.5rem !important}.mb-n2,.my-n2{margin-bottom:-.5rem !important}.ml-n2,.mx-n2{margin-left:-.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:-.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:-.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem !important}.m-md-n2{margin:-.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-.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:-.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:-.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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,0.5) !important}.text-white-50{color:rgba(255,255,255,0.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:0.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:0.875rem}.text-smaller{font-size:0.75rem}.text-smallest{font-size:0.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 .github-edit-wrap .github-edit,.lang-ja .navbar .navbar-nav .nav-link,.lang-ja .content .children-display li a,.lang-ja .right-sidebar .level-1 a,.lang-ja .right-sidebar .separator,.lang-ja .use-case-step-num{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:0.5rem 0.5rem 0.5rem 1rem;line-height:1.5}.search .ds-input{background-color:#232325;border-radius:0 4px 4px 0;padding:0.75rem 1rem 0.75rem 0.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:white}.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:0.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}#main_content_wrapper{margin-top:80px}.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-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.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}}.xrp-ledger-dev-portal.sidebar-primary .main{z-index:5;padding:2rem;min-height:700px}.left-sidebar{padding:2rem}.left-sidebar .external-link::after{background-position:left 6px bottom 1px;width:2rem}.left-sidebar:hover::after{transform:translate(3px, -3px)}@media (min-width: 992px){.left-sidebar{position:sticky;max-height:calc(100vh - 80px);top:80px;left:0;overflow:auto;border:0}}.right-sidebar{padding:2rem;border:1px solid #454549}@media (min-width: 992px){.right-sidebar{position:sticky;max-height:calc(100vh - 80px);top:80px;right:0;overflow:auto;border:0}}@media (max-width: 991.98px){.right-sidebar .card{padding-left:0}#page-toc-wrapper{position:static;clear:both;overflow-y:inherit;max-width:100%;max-height:inherit;word-break:break-all}.main{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}}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:0.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:0.25rem 1rem;font-size:0.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}.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:0.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}}.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,.content a.button,.content .btn{font-weight:bold;cursor:pointer;text-decoration:none;transition:0.2s;padding:0.5rem 1rem;line-height:16px}.content a.button{padding:.5rem 1rem;margin:0 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 0.3s ease-out;-moz-transition:transform 0.3s ease-out;-ms-transition:transform 0.3s ease-out;-o-transition:transform 0.3s ease-out;transition:transform 0.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:"\00a0";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 0.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}.content table{clear:right;margin-bottom:48px}.content table code{word-break:normal;white-space:nowrap}th{border-bottom:2px solid #E0E0E1}tr{border-bottom:1px solid #E0E0E1}th,td{padding:0.2em;vertical-align:text-top}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:0.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 0.75rem}@media (max-width: 991.98px){#overview-table{font-size:0.875rem}#overview-table thead .h4{font-size:1.125rem}}.content table{clear:right;margin-bottom:48px}.content table code{word-break:normal;white-space:nowrap}th{border-bottom:2px solid #E0E0E1}tr{border-bottom:1px solid #E0E0E1}th,td{padding:0.2em;vertical-align:text-top}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:0.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 0.75rem}@media (max-width: 991.98px){#overview-table{font-size:0.875rem}#overview-table thead .h4{font-size:1.125rem}}.related-tasks-links a{color:#454549;text-decoration:none}.related-tasks-links a:hover{color:#000}.use-case-external-link{border:1px solid #C1C1C2}.content .use-case-external-link a{text-decoration:none;color:#000}.use-case-step-num{margin-top:64px;margin-bottom:24px;color:#eae7e6;font-size:5.16em;font-weight:400;font-family:'Space Mono', sans-serif}.use-case-step-length{float:right;color:#888;font-size:1rem}.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}.github-edit-wrap .github-edit{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");background-size:24px 24px;background-position:left 12px center;background-repeat:no-repeat;padding-left:48px;text-decoration:none;margin-bottom:1rem;margin-top:0}.top-nav{background-color:#111112;height:80px;padding:0}.top-nav .navbar-brand{text-decoration:none;white-space:pre;-webkit-transition:opacity 0.2s ease, color 0.2s ease;transition:opacity 0.2s ease, color 0.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:0.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:0.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:0.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-popular-pages,.top-nav .dropdown-menu .col-for-人気ページ{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_xrp-ledger-overviewhtml{grid-template-columns:180px 180px 180px}.top-nav .dropdown-menu.show#topnav_dd_docshtml{grid-template-columns:180px 180px 260px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_contributehtml{grid-template-columns:200px}.top-nav .dropdown-menu.show#topnav_dd_resourceshtml{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-documentation,.top-nav .dropdown-menu.show #dropdown-hero-for-ドキュメント{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{grid-column:2}.top-nav .dropdown-menu.show .col-for-about{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-online-tools{grid-column:1;grid-row:3}.top-nav .dropdown-menu.show .col-for-online-tools .external-link{white-space:nowrap}.top-nav .dropdown-menu.show .col-for-get-started{grid-column:2;grid-row:2 / 4}.top-nav .dropdown-menu.show .col-for-popular-pages,.top-nav .dropdown-menu.show .col-for-人気ページ{grid-column:3;grid-row:1 / 4;margin:-40px -40px -40px 0;padding:40px}.top-nav .dropdown-menu.show .col-for-development,.top-nav .dropdown-menu.show .col-for-開発{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{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:0.5rem}}@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 0.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 .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 0.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_docshtml{display:grid;grid-template-columns:minmax(187px, 1fr) minmax(187px, 1fr);gap:1px;left:-200px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .dropdown-hero{grid-column:1 / 3;grid-row:1}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-article-types{grid-column:1;grid-row:2}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-online-tools{grid-column:1;grid-row:3;padding-bottom:32px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-get-started{grid-column:2;grid-row:2 / 4;padding-bottom:32px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-popular-pages,.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-人気ページ{grid-column:1 / 3;grid-row:4;margin:-1px;padding-top:33px}.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-questions,.top-nav .dropdown-menu.show#topnav_dd_docshtml .col-for-質問{grid-column:1 / 3;grid-row:5;margin:-1px;padding-bottom:32px}.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:0.75rem;transition:all 0.2s ease;overflow:clip;width:1rem}.top-nav .dropdown-toggle:not(.with-caret)::before{content:"\f053";display:inline-block;margin-bottom:-5px}.top-nav .dropdown-toggle:not(.with-caret)::after{content:"\f054";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 0.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 0.2s ease}.top-nav #topnav-search .input-group{flex-wrap:nowrap}.top-nav #topnav-language hr{border-top:1px solid #232325;margin-top:0.25rem;margin-bottom:0.25rem;display:static}}.top-nav #top-nav-hero-docs{content:url("../img/icons/docs.svg")}.top-nav #top-nav-hero-contribute{content:url("../img/icons/contribute.svg")}.main h1:before,.main h2:before,.main h3:before,.main h4:before,.main h5:before,.main h6:before,#main_content_wrapper:before,.interactive-block:before{display:block;content:" ";margin-top:-80px;height:80px;visibility:hidden}a{z-index:1}.chevron{position:relative;display:inline-block;width:0.75rem;height:0.5625rem}.chevron span{position:absolute;top:0.25rem;display:inline-block;width:0.5rem;height:0.15rem;background-color:#9A52FF;transition:all 0.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)}.custom-theme-toggle .custom-control-label{padding:1rem;cursor:pointer}.custom-theme-toggle .custom-control-label::before,.custom-theme-toggle .custom-control-input:checked ~ .custom-control-label::before{position:static;display:inline-block;content:" ";cursor:pointer;border:0;background-image:url("../img/sun-moon.svg");background-size:3rem;background-color:transparent;transform-origin:center;margin-left:-0.5rem;margin-right:0.5rem;transition:transform 0.4s ease, background-position 0.4s ease;transform:rotate(15deg);background-position:top left}.custom-theme-toggle .custom-control-label::after{display:none}@media (max-width: 991.98px){.navbar-collapse,.dropdown-menu{box-shadow:0px 25px 40px -20px #000}}.content{padding-bottom:50px}.content p code,.content table code,.content ul code,.content ol code{background-color:#0A2E1B;color:#5BEB9D}.content a,.blurb a{text-decoration:underline}.content h1{font-size:3rem;margin-top:32px;line-height:1.2;font-weight:700}.content h1:first-child,.landing section:first-of-type h1:first-child{margin-top:0;line-height:1.2}.content h1:first-child:before{margin-top:-80px}.content h2{margin-top:2.5rem;margin-bottom:1.5rem;font-size:2.5rem;font-weight:600;line-height:1.2}.content h3{font-size:2.125rem;margin-top:2rem;margin-bottom:1rem;line-height:1.2}.content h4{font-size:1.75rem;margin-top:1.5rem;margin-bottom:0.5rem;line-height:1.2}.content h5{font-size:1.25rem;margin-top:1.25rem;line-height:1.2;font-weight:700}.content h6{font-size:1rem;margin-top:1rem;line-height:1.2;font-weight:700}.content li{margin:6px;margin-top:24px}.content li p{margin:0}.content a[title="Source"]{float:right;padding-left:20px}.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:0.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}.CodeMirror{font-family:"Space Mono",monospace;height:300px;background-color:#232325;margin:16px 0;border-radius:4px}.CodeMirror-scroll{overflow:auto}.CodeMirror-lines{padding:2rem 0}.CodeMirror pre{padding:0 2rem 0 1rem}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:#000}.CodeMirror-gutters{background-color:#232325;white-space:nowrap}.CodeMirror div.CodeMirror-cursor{border-left:1px solid #fff;z-index:3}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid #838386}.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#838386;z-index:1}.cm-tab{display:inline-block}.cm-s-default .cm-keyword{color:#FF6719}.cm-s-default .cm-atom{color:#FF6719}.cm-s-default .cm-number{color:#19A3FF}.cm-s-default .cm-def{color:#19A3FF}.cm-s-default .cm-variable{color:#fff}.cm-s-default .cm-variable-2{color:#fff}.cm-s-default .cm-variable-3{color:#fff}.cm-s-default .cm-property{color:#fff}.cm-s-default .cm-operator{color:#fff}.cm-s-default .cm-comment{color:#838386}.cm-s-default .cm-string{color:#28B86A}.cm-s-default .cm-string-2{color:#28B86A}.cm-s-default .cm-meta{color:#838386}.cm-s-default .cm-qualifier{color:#838386}.cm-s-default .cm-builtin{color:#28B86A}.cm-s-default .cm-bracket{color:#fff}.cm-s-default .cm-tag{color:#fff}.cm-s-default .cm-attribute{color:#fff}.cm-s-default .cm-header{color:#19A3FF}.cm-s-default .cm-quote{color:#28B86A}.cm-s-default .cm-hr{color:#838386}.cm-s-default .cm-link{color:#B2E0FF}.cm-negative{color:#fff}.cm-positive{color:#fff}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-s-default .cm-error{color:#FF198B}.cm-invalidchar{color:#FF198B}div.CodeMirror span.CodeMirror-matchingbracket{color:#7919FF}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#FAFF19}.CodeMirror-activeline-background{background:#232325}.CodeMirror{line-height:1;position:relative;overflow:hidden;background:#232325;color:#fff}.CodeMirror-scroll{margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;padding-right:30px;height:100%;outline:none;position:relative;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-sizer{position:relative}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;padding-bottom:30px;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;-moz-box-sizing:content-box;box-sizing:content-box;padding-bottom:30px;margin-bottom:-32px;display:inline-block;*zoom:1;*display:inline}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-lines{cursor:text}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-code pre{border-right:30px solid transparent;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.CodeMirror-wrap .CodeMirror-code pre{border-right:none;width:auto}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-wrap .CodeMirror-scroll{overflow-x:hidden}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;visibility:hidden;border-right:none;width:0}.CodeMirror-focused div.CodeMirror-cursor{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,0.4)}.CodeMirror span{*vertical-align:text-bottom}@media print{.CodeMirror div.CodeMirror-cursor{visibility:hidden}}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid black;border-radius:4px 4px 4px 4px;color:black;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")}.CodeMirror-lint-mark-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=")}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=")}.CodeMirror-lint-marker-multiple{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.content img{max-width:100%;height:auto}.content img .dactyl_badge{width:initial}.content svg{max-width:100%}.content .floating-diagram{margin:0.5rem;float:left}.content li{clear:left}html:not(.light) .content svg[fill="black"]{fill:#fff;stroke:#fff}html:not(.light) .content svg[fill="black"] *[fill="white"]{fill:#000}html:not(.light) .content svg[fill="black"] *[stroke="white"]{stroke:#000}html:not(.light) .content svg[fill="black"] *[fill="black"]{fill:#fff}html:not(.light) .content svg[fill="black"] *[stroke="black"]{stroke:#fff}html:not(.light) .content svg[fill="black"] g[fill="blue"]{fill:#19A3FF}html:not(.light) .content svg[fill="black"] g[stroke="blue"]{stroke:#19A3FF}html:not(.light) .content svg[fill="black"] g[fill="rgb(120,120,120)"]{fill:#E0E0E1}html:not(.light) .content svg[fill="black"] g[stroke="rgb(120,120,120)"]{stroke:#E0E0E1}html:not(.light) .content svg[fill="black"] g[fill="rgb(200,200,200)"]{fill:#343437}html:not(.light) .content svg[fill="black"] g[fill="rgb(70,70,70)"]{fill:#838386}html:not(.light) .content svg[fill="black"] g[stroke="rgb(70,70,70)"]{stroke:#838386}html:not(.light) .content svg[fill="black"] g[fill="rgb(29,180,255)"]{fill:#9A52FF}html:not(.light) .content svg[fill="black"] g[stroke="rgb(29,180,255)"]{stroke:#9A52FF}html:not(.light) .content svg[fill="black"] rect[stroke="rgb(245,247,249)"]{stroke:#000}html:not(.light) .content svg[fill="black"] g[fill="lime"],html:not(.light) .content svg[fill="black"] g[fill="rgb(0,255,0)"]{fill:#9A52FF}html:not(.light) .content svg[fill="black"] g[stroke="lime"],html:not(.light) .content svg[fill="black"] g[stroke="rgb(0,255,0)"]{stroke:#9A52FF}html:not(.light) .content svg[fill="black"] g[fill="yellow"],html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"]{fill:#FAFF19}html:not(.light) .content svg[fill="black"] g[fill="yellow"] path[stroke="black"],html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"] path[stroke="black"]{stroke:#000}html:not(.light) .content svg[fill="black"] g[fill="red"],html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"]{fill:#FF198B}html:not(.light) .content svg[fill="black"] g[stroke="red"],html:not(.light) .content svg[fill="black"] g[stroke="rgb(255,255,0)"]{stroke:#FF198B}html:not(.light) .content svg[fill="black"] g[fill="yellow"]+g text,html:not(.light) .content svg[fill="black"] g[fill="rgb(255,255,0)"]+g text{fill:#000}html:not(.light) .content svg[fill="black"] g[fill="lime"]+g text{fill:#000}html:not(.light) .content svg[fill="none"] path[fill="#000000"]{fill:#fff}html:not(.light) .content svg[fill="none"] path[stroke="#000000"]{stroke:#fff}html:not(.light) .content svg[fill="none"] path[fill="#ffffff"]{fill:#000}html:not(.light) .content svg[fill="none"] path[stroke="#ffffff"]{stroke:#000}html:not(.light) .content svg[fill="none"] path[fill="#23292f"],html:not(.light) .content svg[fill="none"] path[fill="#23282f"]{fill:#fff}html:not(.light) .content svg[fill="none"] path[stroke="#23292f"],html:not(.light) .content svg[fill="none"] path[stroke="#23282f"]{stroke:#fff}html:not(.light) .content svg[fill="none"] path[fill="#2c3e50"],html:not(.light) .content svg[fill="none"] path[fill="#2b3e51"]{fill:#E0E0E1}html:not(.light) .content svg[fill="none"] path[stroke="#2c3e50"],html:not(.light) .content svg[fill="none"] path[stroke="#2b3e51"]{stroke:#E0E0E1}html:not(.light) .content svg[fill="none"] path[fill="#1c2835"]{fill:#F5F5F7}html:not(.light) .content svg[fill="none"] path[stroke="#1c2835"]{stroke:#F5F5F7}html:not(.light) .content svg[fill="none"] path[fill="#21aa47"]{fill:#32E685}html:not(.light) .content svg[fill="none"] path[stroke="#21aa47"]{stroke:#32E685}html:not(.light) .content svg[fill="none"] path[fill="#e64b3b"]{fill:#dc3545}html:not(.light) .content svg[fill="none"] path[stroke="#e64b3b"]{stroke:#dc3545}html:not(.light) .content svg[fill="none"] path[stroke="#27a2db"],html:not(.light) .content svg[fill="none"] path[stroke="#00aae4"]{stroke:#9A52FF}html:not(.light) .content svg[fill="none"] path[fill="#27a2db"],html:not(.light) .content svg[fill="none"] path[fill="#00aae4"]{fill:#9A52FF}html:not(.light) .content svg[fill="none"] path[fill="#e6e7e8"]{fill:#232325}html:not(.light) .content svg[fill="none"] path[stroke="#e6e7e8"]{stroke:#232325}html:not(.light) .content svg[fill="none"] path[stroke="#ffbf27"]{stroke:#D919FF}html:not(.light) .content svg[fill="none"] path[fill="#00ff00"]{fill:#32E685}html:not(.light) .content svg[fill="none"] path[stroke="#00ff00"]{stroke:#32E685}html:not(.light) .content svg[fill="none"] path[fill="#ff00ff"]{fill:#FF198B}html:not(.light) .content svg[fill="none"] path[stroke="#ff00ff"]{stroke:#FF198B}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#ffffff"]{stop-color:#343437}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#e6e7e8"]{stop-color:#232325}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#dbdcdd"]{stop-color:#000}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#b1b3b5"]{stop-color:#111112}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#29a1da"]{stop-color:#2DCF78}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#2789b9"]{stop-color:#5BEB9D}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#6bc1ec"]{stop-color:#ADF5CE}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#8ad6f4"]{stop-color:#84F0B6}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#fab913"]{stop-color:#F2B2FF}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#fad26b"]{stop-color:#EA80FF}html:not(.light) .content svg[fill="none"] linearGradient stop[stop-color="#f8a136"]{stop-color:#E24CFF}html:not(.light) .content 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:"\00a0";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:"\00a0";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 -.1rem;transition:background-position 100ms ease-in-out}.li-links a:hover::after{background-position:left .2rem bottom .1rem}.xrpl-footer{padding:7.5rem 2rem}.xrpl-footer .footer-nav .nav-item{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){.xrpl-footer{background-image:url(../img/backgrounds/footer.svg);background-size:cover;background-repeat:no-repeat;background-position:bottom right}}@media (max-width: 991.98px){.xrpl-footer .col-lg:not(:first-child){margin-top:4rem}}.xrpl-footer h5{font-size:1rem;font-weight:600;color:#A2A2A4}.xrpl-footer .nav-link{padding:.75rem 0;line-height:1}.xrpl-footer .absolute-bottom-footer{font-size:10px;line-height:1rem}@media (max-width: 991.98px){.xrpl-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:"\f058";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.note>strong:first-child:before{content:"\f05a";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.caution>strong:first-child:before{content:"\f071";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.devportal-callout.warning>strong:first-child:before{content:"\f057";font-family:FontAwesome;margin-left:-20px;padding-right:5px}.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}a.card{border:0;color:#fff}a.card:hover,a:hover .card-new{text-decoration:none}a.card:hover h3{text-decoration:underline}.circled-logo{background-color:#454549;border-radius:50%;padding:.65rem;width:50px;height:50px;margin-bottom:0.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 0.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:0.75rem 0.75rem 5rem 0.75rem;max-width:calc(100% - 1.5rem)}.card-deck.row-cols-2 .card{margin:.75rem;max-width:calc(50% - 1.5rem)}}.cta-card{text-align:center;background-color:#232325}.breadcrumbs-wrap{position:relative;z-index:11;padding:0 2rem 2rem 2rem}.interactive-block .breadcrumbs-wrap{padding:0}.breadcrumb-item+.breadcrumb-item:before{content:"\f105";font-family:FontAwesome;padding-right:5px}.breadcrumbs-wrap .breadcrumb{padding:0;margin-bottom:0;font-size:0.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 .content .children-display>ul>li,.landing .content .curated-links>ul>li{margin-top:24px}.landing .content .children-display li a,.landing .content .curated-links li a{font-weight:700;font-size:1.25rem;text-decoration:none}.landing .content .children-display li a:hover,.landing .content .curated-links li a:hover{text-decoration:underline}.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}.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:white;background-color:#006BB2;border-width:0}.alert-info a{text-decoration:underline;color:white}.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:"\f058";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:"\f02c";font-family:FontAwesome;font-size:1.5rem}.labels-wrap .list-inline-item{margin-top:0.5rem}.pg-category{color:#A2A2A4}.pg-category::after{content:"\f105";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:0.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.chip-yellow{background-color:#FDFFB2;color:#7D8000}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.chip-yellow .badge-pill{color:#FDFFB2;background-color:#7D8000}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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.chip-magenta:hover .badge-pill{color:#FF80BF;background-color:#4C0026}.tag-cloud .list-inline-item{margin-top:1.5rem}#tx-sender-history .list-group-item{font-size:small;color:#454549}.response-metadata .timestamp{color:#454549;position:relative;top:16px}.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}#pp_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}.content a[title="Source"]{float:none}header,footer,aside{display:none !important}.navbar{display:none !important}.content,#main_content_body{position:static;display:block;width:auto;height:auto;color:black !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:black}.interactive-block{display:none}.container{margin-top:1rem !important}#main_content_wrapper{margin-top:0}#main_content_body::before{display:none}.xrp-ledger-dev-portal.sidebar-primary .main{border:0}.sidebar-primary .row{display:block}#feedback-content{display:none !important}.jump-to-top{display:none !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:0.6}@media (min-width: 768px){.landing-bg{opacity:1.0}}.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:0.6}@media (min-width: 768px){.landing-builtin-bg::before{opacity:1.0}}#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")}#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:0.75rem;flex-direction:column;flex-wrap:wrap}.page-uses .card-title{margin-bottom:0.5rem;line-height:26px}.page-uses .card-uses{padding:16px;margin:0;text-decoration:none;transition:all 0.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 .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{padding:0px 8px;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 #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")}@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 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 0.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)}#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 0.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,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 .content{max-width:704px;margin-left:auto;margin-right:auto}}.page-faq .content 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 .content h6:first-of-type .hover_anchor{display:none}@media (min-width: 992px){.page-faq .content h6:first-of-type{margin-top:6.5rem}}.page-faq .content h1:first-of-type{font-size:2.625rem;line-height:1.2;margin-top:0;margin-bottom:5rem;text-align:center}.page-faq .content h1:first-of-type .hover_anchor{display:none}@media (min-width: 992px){.page-faq .content 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:-80px;height:80px;visibility:hidden}.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-image:url(../../img/backgrounds/docs-splash.svg);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:2.5rem;padding-bottom:5rem;padding-left:1rem}@media (min-width: 992px){.page-docs-index #community-heading,.page-community #community-heading{padding-top:5rem;padding-bottom:15rem;padding-left:0}}@media (min-width: 1200px){.page-docs-index #community-heading,.page-community #community-heading{padding-bottom:25rem}}.page-docs-index #community-heading .parallax,.page-community #community-heading .parallax{position:absolute;-webkit-transition:all 0.1s ease;-moz-transition:all 0.1s ease;-ms-transition:all 0.1s ease;-o-transition:all 0.1s ease;transition:all 0.1s ease}.page-docs-index #community-heading .one,.page-community #community-heading .one{top:160px;left:0%}.page-docs-index #community-heading .two,.page-community #community-heading .two{top:439px;left:22%}.page-docs-index #community-heading .three,.page-community #community-heading .three{top:517px;left:52%}.page-docs-index #community-heading .four,.page-community #community-heading .four{top:322px;left:71%}.page-docs-index #community-heading .five,.page-community #community-heading .five{top:120px;right:0%}.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 0.3s ease-out;-moz-transition:transform 0.3s ease-out;-ms-transition:transform 0.3s ease-out;-o-transition:transform 0.3s ease-out;transition:transform 0.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:0.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")}.rpc-tool #result{display:none}.rpc-tool #log{font-weight:700}.rpc-tool .content .json li{margin-top:0}.rpc-tool .json .name{color:#fff}.rpc-tool .json ul{margin:0;display:none}.rpc-tool .json li{padding:0;list-style-type:none}.rpc-tool .json .type-string .val{color:#28B86A}.rpc-tool .json .type-number .val{color:#19A3FF}.rpc-tool .json a.toggle:hover{text-decoration:none}.rpc-tool .json>a.toggle{display:none}.rpc-tool .json a.toggle:after{content:" +\0000a0";cursor:pointer}.rpc-tool .json>ul,.rpc-tool .json .expanded>ul{display:block}.rpc-tool .json .ellipsis{color:#838386}.rpc-tool .json>.ellipsis,.rpc-tool .json .expanded>.ellipsis{display:none}.rpc-tool .json .expanded>a.toggle:after{content:" \2212\0000a0"}.rpc-tool .json .indentafter{display:none}.rpc-tool .json .expanded>.indentafter{display:inline}.rpc-tool .tools{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;font-size:0.8em;margin:0 0 10px}.rpc-tool .tools>li>a{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 .labels-wrap{display:inline-block}.dev-blog a.badge-primary{text-decoration:none}.dev-blog a.badge-primary:hover{text-decoration:none}#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 0.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:#ffffff;opacity:0.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:"\00a0";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}}@keyframes pulsate{}.banner-container,html.light .banner-container{display:flex;width:100%;position:relative;background-color:#013;color:#fff;overflow:hidden;height:36px}@media (min-width: 992px){.banner-container,html.light .banner-container{height:48px}}.banner-container>img,html.light .banner-container>img{height:36px}@media (min-width: 992px){.banner-container>img,html.light .banner-container>img{height:3rem}}.banner-container>div,html.light .banner-container>div{line-height:36px;font-family:Work Sans;font-weight:600;font-size:3vw}@media (min-width: 992px){.banner-container>div,html.light .banner-container>div{font-size:22px;line-height:3rem}}@media (min-width: 1400px){.banner-container .d-xxl-block,html.light .banner-container .d-xxl-block{display:block !important}}.banner-container .apex-reg,html.light .banner-container .apex-reg{text-align:center}@media (min-width: 768px){.banner-container .apex-reg,html.light .banner-container .apex-reg{padding:0 1rem}}.banner-container .apex-highlight,html.light .banner-container .apex-highlight{color:#00FF76}.banner-container .apex-circled,html.light .banner-container .apex-circled{padding:0 1rem;text-transform:uppercase;white-space:nowrap;transition:border-color 0.5s ease;border:2px solid #fff;height:36px;line-height:32px;border-radius:32px;font-size:2vw}@media (min-width: 992px){.banner-container .apex-circled,html.light .banner-container .apex-circled{border-width:3px;height:48px;line-height:42px;border-radius:40px;font-size:16px}}@media (min-width: 1200px){.banner-container .apex-circled,html.light .banner-container .apex-circled{font-size:19px}}.banner-container:hover,html.light .banner-container:hover{text-decoration:none;color:#fff}.banner-container:hover .apex-highlight,html.light .banner-container:hover .apex-highlight{color:#00FF76}.banner-container:hover .highlight-yellow,html.light .banner-container:hover .highlight-yellow{border-color:#FAFF19}.banner-container:hover .highlight-purple,html.light .banner-container:hover .highlight-purple{border-color:#FF198B}.banner-container:active,.banner-container:focus,html.light .banner-container:active,html.light .banner-container:focus{background-color:#013 !important;color:#fff}.token-banner-container,html.light .token-banner-container{display:flex;width:100%;position:relative;background-color:#013;color:#fff;height:48px}@media (min-width: 992px){.token-banner-container,html.light .token-banner-container{height:60px}}.token-banner-container>img,html.light .token-banner-container>img{height:36px}.token-banner-container>div,html.light .token-banner-container>div{font-family:Work Sans;font-weight:600}@media (min-width: 992px){.token-banner-container>div,html.light .token-banner-container>div{font-size:22px}}@media (min-width: 1400px){.token-banner-container .d-xxl-block,html.light .token-banner-container .d-xxl-block{display:block !important}}.token-banner-container .token-reg,html.light .token-banner-container .token-reg{text-align:center;line-height:48px;font-size:16px;padding:0 1rem}@media (min-width: 992px){.token-banner-container .token-reg,html.light .token-banner-container .token-reg{line-height:60px}}@media (min-width: 1400px){.token-banner-container .token-reg,html.light .token-banner-container .token-reg{font-size:22px}}.token-banner-container .token-highlight,html.light .token-banner-container .token-highlight{color:#00FF76}@media (min-width: 576px){.token-banner-container .token-highlight,html.light .token-banner-container .token-highlight{line-height:3rem}}.token-banner-container .token-circled,html.light .token-banner-container .token-circled{padding:0 1rem;text-transform:uppercase;white-space:nowrap;transition:border-color 0.5s ease;border:2px solid #fff;height:36px;line-height:32px;border-radius:32px;font-size:8px;margin-top:6px}@media (min-width: 576px){.token-banner-container .token-circled,html.light .token-banner-container .token-circled{font-size:2vw}}@media (min-width: 992px){.token-banner-container .token-circled,html.light .token-banner-container .token-circled{border-width:3px;height:48px;line-height:42px;border-radius:40px;font-size:16px}}@media (min-width: 1200px){.token-banner-container .token-circled,html.light .token-banner-container .token-circled{font-size:22px}}.token-banner-container:hover,html.light .token-banner-container:hover{text-decoration:none;color:#fff}.token-banner-container:hover .token-highlight,html.light .token-banner-container:hover .token-highlight{color:#00FF76}.token-banner-container:hover .highlight-yellow,html.light .token-banner-container:hover .highlight-yellow{border-color:#FAFF19}.token-banner-container:hover .highlight-purple,html.light .token-banner-container:hover .highlight-purple{border-color:#FF198B}.token-banner-container:active,.token-banner-container:focus,html.light .token-banner-container:active,html.light .token-banner-container:focus{background-color:#013 !important;color:#fff}.token-banner-container .js-clock,html.light .token-banner-container .js-clock{padding-top:3px}@media (min-width: 992px){.token-banner-container .js-clock,html.light .token-banner-container .js-clock{padding-top:8px}}.token-banner-container .js-clock .box,html.light .token-banner-container .js-clock .box{display:inline-block;margin-right:10px;font-size:14px;line-height:22px}.token-banner-container .js-clock .box:last-child,html.light .token-banner-container .js-clock .box:last-child{margin-right:0}.token-banner-container .js-clock .clock-number,html.light .token-banner-container .js-clock .clock-number{font-variant-numeric:tabular-nums}@media (max-width: 1199.98px){.token-banner-container .highlight-purple,html.light .token-banner-container .highlight-purple{display:none}}@media (max-width: 767.98px){.token-banner-container .token-highlight,html.light .token-banner-container .token-highlight{margin-right:10px}}.top-banner{height:46px;background:url(../img/backgrounds/bg-apex-banner.svg);background-position:left;background-size:cover;background-color:#7919FF;color:#fff;text-align:center;font-size:16px;font-weight:bold;line-height:24px}.top-banner .btn{margin-left:4px;font-size:12px;color:#fff;padding:2px 4px;border:1px solid #fff;border-radius:2px}@media (min-width: 768px){.top-banner .btn{margin-top:9px;margin-left:16px;font-size:16px;padding:4px 8px;border:1.5px solid #fff;border-radius:4px}}.top-banner .btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#111112;background-color:#fff}.top-banner p{font-size:12px;line-height:20px;text-align:center;margin:auto}@media (min-width: 768px){.top-banner p{padding-top:11px;font-size:16px;width:initial;line-height:24px}}.top-nav{position:sticky;width:100%}@media (min-width: 992px){.right-sidebar,.left-sidebar{top:100px}}.floating-nav{top:146px}.main h1:before,.main h2:before,.main h3:before,.main h4:before,.main h5:before,.main h6:before,#main_content_wrapper:before,.interactive-block:before{margin-top:-146px;height:146px}.content h1:first-child:before{margin-top:-146px}#main_content_wrapper{margin-top:53px}html.light .top-banner .btn-outline-secondary{color:#fff;border-color:#fff}html.light .top-banner .btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#111112;background-color:#fff;border-color:#fff}.toml-checker #result{display:none}.toml-checker #verify-domain-result{display:none}.tutorial-content #beginner-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #beginner-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #sdk-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #use-cases-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #servers-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #servers-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #servers-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #servers-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #servers-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #servers-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #servers-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #servers-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #servers-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #servers-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+1) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+2) .card-footer{background-image:url("../img/cards/3col-magenta-orange.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+3) .card-footer{background-image:url("../img/cards/3col-green-blue.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+4) .card-footer{background-image:url("../img/cards/3col-orange.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+5) .card-footer{background-image:url("../img/cards/3col-purple.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+6) .card-footer{background-image:url("../img/cards/3-col-green-purple.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+7) .card-footer{background-image:url("../img/cards/3col-magenta.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+8) .card-footer{background-image:url("../img/cards/3col-light-green.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+9) .card-footer{background-image:url("../img/cards/3col-orange-yellow.svg")}.tutorial-content #businesses-cards .card:nth-child(9n+10) .card-footer{background-image:url("../img/cards/3-col-dark-blue.svg")}.tutorial-card-grid{grid-gap:16px !important;row-gap:0 !important}.tutorial-card-grid.card-grid.card-grid-3xN{grid-template-columns:1fr;grid-auto-rows:auto}@media (min-width: 1200px){.tutorial-card-grid.card-grid.card-grid-3xN{grid-template-columns:1fr 1fr 1fr}}.tutorial-card-grid.card-grid .card{margin-bottom:2.5rem;background-position:bottom;background-repeat:no-repeat;background-size:contain;padding:0;min-height:0}.tutorial-card-grid.card-grid .card .card-body{padding:32px}.tutorial-card-grid.card-grid .card .card-title{margin-bottom:16px;margin-top:0}.tutorial-card-grid.card-grid .card .card-title.external-link::after{background-size:0.9rem;vertical-align:middle;margin-left:12px;margin-bottom:12px;margin-right:10px;width:1.5rem}.tutorial-card-grid.card-grid .card .card-title.nav-link{padding:0}.tutorial-card-grid.card-grid .card .card-footer{font-size:0;padding:1rem;background-position:bottom;background-repeat:no-repeat;background-size:cover;border-top:0}.tutorial-card-grid.card-grid a{text-decoration:none}.tutorial-card-grid.card-grid code{color:#2DCF78;background-color:#0A2E1B;border-radius:4px;padding-left:4px;padding-right:4px}.tutorial-card-grid.card-grid .card-icon-container{width:50px;height:50px;background:#454549;display:flex;justify-content:center;align-items:center;border-radius:50%;margin-bottom:12px}.tutorial-card-grid.card-grid .card-icon-container img{width:70%;height:70%}.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 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 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:0.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 0.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}html.light .content p code,html.light .content table code,html.light .content ul code,html.light .content ol 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:white 0 0 2px, white -1px -1px 2px, white 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{color:#000}html.light a.btn-primary,html.light nav a.btn-primary{color:#fff}html.light a.btn-primary:hover,html.light nav a.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{color:#7919FF}html.light a:not(.btn):focus,html.light nav a: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 .content 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 .content a.button:not(:disabled):not(.disabled):hover,html.light .content 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 #top-nav-hero-docs{content:url(../img/icons/lightmode/docs.svg)}html.light .top-nav #top-nav-hero-contribute{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-popular-pages,html.light .top-nav .dropdown-menu .col-for-人気ページ,html.light .top-nav .dropdown-menu .col-for-questions,html.light .top-nav .dropdown-menu .col-for-質問{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 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:white 0px 0px 2px, white 1px 1px 2px, white 2px 2px 3px, white 2px 2px 4px, white 2px 2px 5px, white 2px 2px 6px, white -1px -1px 2px, white -2px -2px 3px, white -2px -2px 4px}html.light a.osano-cm-link{color:#ffffff}html.light .card,html.light .cta-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:0.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 #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{color:#FCFCFD}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 #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 #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 #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 #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:0.4}@media (min-width: 768px){html.light .landing-bg{opacity:1}}html.light .landing-builtin-bg::before{opacity:0.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 #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,html.light .page-docs-index #xrplGrantsDark-small,html.light .page-docs-index #careersDark,html.light .page-docs-index #careersDark-small,html.light .page-community #xrplGrantsDark,html.light .page-community #xrplGrantsDark-small,html.light .page-community #careersDark,html.light .page-community #careersDark-small{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 .tutorial-card-grid code{background-color:#D6FAE7}html.light .tutorial-card-grid .card-icon-container{background:#C1C1C2}html.light .footer-nav .nav-item{text-shadow:white 0px 0px 2px, white 1px 1px 2px, white 2px 2px 3px, white 2px 2px 4px, white 2px 2px 5px, white 2px 2px 6px, white -1px -1px 2px, white -2px -2px 3px, white -2px -2px 4px} diff --git a/assets/js/js-editor.js b/assets/js/js-editor.js deleted file mode 100644 index 51ae747ac8..0000000000 --- a/assets/js/js-editor.js +++ /dev/null @@ -1,82 +0,0 @@ -// Interactive JavaScript editor code - -let js_interactives = {}; - -$(document).ready(()=> { - $(".js_interactive").each((i, el) => { - const wrapper = $(el); - const interactive_id = wrapper.attr("id"); - - const code_blocks = wrapper.find("pre code"); - const code_ex0 = code_blocks.eq(0); // First code block is the default - const og_text = code_ex0.text().trim(); - - const cm = CodeMirror(wrapper.find(".editor").get(0), { - mode: 'javascript', - json: false, - smartIndent: false, - gutters: ["CodeMirror-lint-markers"], - lint: CodeMirror.lint.javascript - }); - cm.setValue(og_text); - code_ex0.parent().hide(); - - wrapper.find(".reset-button").click((evt) => { - cm.setValue(og_text); - wrapper.find(".response").empty(); - }); - - wrapper.find(".run-button").click((evt) => { - // Wipe the results area and make a new response CodeMirror - const resp = wrapper.find(".response"); - resp.empty().append("

Output

"); - // TODO: make "Response" translatable - const cm_resp = CodeMirror(resp.get(0), { - mode: 'javascript', - json: false, - readOnly: true, - gutters: ["CodeMirror-lint-markers"] - }); - - const oldconsole = console; - console = { - log: (...args) => { - oldconsole.log(...args); - cm_resp.setValue(args.map(x => JSON.stringify(x, null, 2)).join(" ")); - }, - warn: (...args) => { - oldconsole.warn(...args); - cm_resp.setValue(args.map(x => JSON.stringify(x, null, 2)).join(" ")); - }, - error: (...args) => { - oldconsole.error(...args); - cm_resp.setValue(args.map((x) => { - if (x instanceof Error) return x.toString(); - return JSON.stringify(x, null, 2); - }).join(" ")); - } - } - try { - Function(cm.getValue())(); - } catch(error) { - console.error(error); - } - - }); - - js_interactives[interactive_id] = {} - code_blocks.slice(1).each((i, el) => { - // Turn each additional code block into a function that fills in the - // editor with the provided text example. - // Example: js_interactives.some_unique_id.ex_1() - const code_ex = $(el); - const ex_text = code_ex.text().trim(); - js_interactives[interactive_id]["ex_"+(i+1)] = function() { - // - cm.setValue(ex_text); - $("html").animate({scrollTop: wrapper.offset().top}, 500); - } - code_ex.parent().hide(); - }); - }) -}); diff --git a/content/_code-samples/escrow/js/cancel-escrow-v2.js b/content/_code-samples/escrow/js/cancel-escrow-v2.js new file mode 100644 index 0000000000..b1e2f7bea3 --- /dev/null +++ b/content/_code-samples/escrow/js/cancel-escrow-v2.js @@ -0,0 +1,42 @@ +// Code in progress. + +const xrpl = require("xrpl") + +async function main() { + + // Create a client and connect to the network. + const client = new xrpl.Client("wss://xrplcluster.com/") + await client.connect() + + // Query the most recently validated ledger for info. + const ledger = await client.request({ + "command": "ledger", + "ledger_index": "validated", + }) + const ledgerCloseTime = ledger["result"]["ledger"]["close_time"] + + // Check the `CancelAfter` time of the escrow. + // For this example, we have the identifying hash of the `EscrowCreate` transaction. + const escrowInfo = await client.request({ + "command": "tx", + "transaction": "3DC728E4DB4120AD26DD41997C42FF5AD46C0073D8692AFB8F59660D058D87A3", + }) + const escrowAccountSender = escrowInfo["result"]["Account"] + const escrowCancelAfter = escrowInfo["result"]["CancelAfter"] + const escrowSequence = escrowInfo["result"]["Sequence"] + + // Submit an `EscrowCancel` transaction if the cancel after time is smaller than the ledger close time. + // Any valid account can submit an escrow cancel transaction. + if (escrowCancelAfter < ledgerCloseTime) { + client.submitAndWait({ + "Account": escrowAccountSender, + "TransactionType": "EscrowCancel", + "Owner": escrowAccountSender, + "OfferSequence": escrowSequence + }) + } + + client.disconnect() +} + +main() diff --git a/content/_code-samples/secure-signing/README.md b/content/_code-samples/secure-signing/README.md index 9672644d9c..505c72756e 100644 --- a/content/_code-samples/secure-signing/README.md +++ b/content/_code-samples/secure-signing/README.md @@ -2,4 +2,4 @@ Sign transactions from the security of your own machine. -For more information and more options, see [Set Up Secure Signing](https://xrpl.org/set-up-secure-signing.html). +For more information and more options, see [Set Up Secure Signing](https://xrpl.org/secure-signing.html). diff --git a/content/_snippets/checkcash-prereqs.ja.md b/content/_snippets/checkcash-prereqs.ja.md index 829de66f2a..cc94d48018 100644 --- a/content/_snippets/checkcash-prereqs.ja.md +++ b/content/_snippets/checkcash-prereqs.ja.md @@ -5,5 +5,5 @@ Checkを換金するための前提条件は、正確な金額を換金する場 - Checkに記載されている受取人の**アドレス**と**秘密鍵**。このアドレスは、Checkオブジェクトの`Destination`アドレスと一致している必要があります。 - 発行済み通貨用のCheckの場合は、ご自身(受取人)にイシュアーに対するトラストラインがある必要があります。このトラストライン上のご自身の限度額は、受け取る金額を追加するための残高より十分高くなければなりません。 - トラストラインと限度額について詳しくは、[発行済み通貨](issued-currencies.html)および[トラストラインと発行](trust-lines-and-issuing.html)を参照してください。 -- [トランザクションに安全に署名できる手段](set-up-secure-signing.html)。 +- [トランザクションに安全に署名できる手段](secure-signing.html)。 - XRP Ledgerに接続できる[クライアントライブラリ](client-libraries.html)か、それとも[HTTPライブラリ、WebSocketライブラリなど](get-started-using-http-websocket-apis.html)。 diff --git a/content/_snippets/checkcash-prereqs.md b/content/_snippets/checkcash-prereqs.md index e7d9f4e111..e29521dacd 100644 --- a/content/_snippets/checkcash-prereqs.md +++ b/content/_snippets/checkcash-prereqs.md @@ -4,5 +4,5 @@ The prerequisites for cashing a check are the same whether you are cashing it fo - For example, the ID of one Check in these examples is `838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334`, although you must use a different ID to go through these steps yourself. - The **address** and **secret key** of the Check's stated recipient. The address must match the `Destination` address in the Check object. - If the Check is for a [token](tokens.html), you (the recipient) must have a [trust line](trust-lines-and-issuing.html) to the issuer. Your limit on that trust line must be high enough to hold your previous balance plus the amount you would receive. -- A [secure way to sign transactions](set-up-secure-signing.html). +- A [secure way to sign transactions](secure-signing.html). - A [client library](client-libraries.html) that can connect to the XRP Ledger, or [any HTTP or WebSocket client](get-started-using-http-websocket-apis.html). diff --git a/content/_snippets/data_types/account_sequence.ja.md b/content/_snippets/data_types/account_sequence.ja.md index 7e349f67dd..f7d98a2dd7 100644 --- a/content/_snippets/data_types/account_sequence.ja.md +++ b/content/_snippets/data_types/account_sequence.ja.md @@ -1,6 +1,6 @@ シーケンス番号とは、32ビットの符号なし整数であり、指定された送金元からのトランザクションが正しい順序で1回だけ実行されるようにするために使用されます。 -すべての[XRP Ledgerアカウント](accounts.html)には、`Sequence`フィールドに1つのシーケンス番号があり、アカウントがトランザクションを送信し、そのトランザクションが[検証済みレジャー](ledgers.html)に記録されるたびに、1ずつ増加します。シーケンス番号は各[トランザクション](transaction-basics.html)の`Sequence`フィールドにもあり、そのトランザクションが実行される際にアカウントの現在のシーケンス番号と一致している必要があります。各アカウントで、各シーケンス番号は番号順に一度だけ使用できます。 +すべての[XRP Ledgerアカウント](accounts.html)には、`Sequence`フィールドに1つのシーケンス番号があり、アカウントがトランザクションを送信し、そのトランザクションが[検証済みレジャー](ledgers.html)に記録されるたびに、1ずつ増加します。シーケンス番号は各[トランザクション](transactions.html)の`Sequence`フィールドにもあり、そのトランザクションが実行される際にアカウントの現在のシーケンス番号と一致している必要があります。各アカウントで、各シーケンス番号は番号順に一度だけ使用できます。 [DeletableAccounts Amendment](known-amendments.html#deletableaccounts) を適用する場合、アカウントの`Sequence`番号の始まりが、アカウントが作成されたレジャーバージョンの[レジャーインデックス][]と一致します。DeletableAccountsを適用しない場合、どのアカウントの`Sequence`番号も1で始まります。 diff --git a/content/_snippets/data_types/account_sequence.md b/content/_snippets/data_types/account_sequence.md index d2db518246..1284b2efb0 100644 --- a/content/_snippets/data_types/account_sequence.md +++ b/content/_snippets/data_types/account_sequence.md @@ -1,6 +1,6 @@ A sequence number is a 32-bit unsigned integer that is used to make sure transactions from a given sender execute only once each, and in the correct order. -Every [account in the XRP Ledger](accounts.html) has a sequence number in its `Sequence` field, which increases by 1 whenever that account sends a transaction and that transaction gets included in a [validated ledger](ledgers.html). Each [transaction](transaction-basics.html) also has a sequence number in its `Sequence` field, which must match the account's current sequence number when the transaction executes. For each account, each sequence number can only be used once, in numerical order. +Every [account in the XRP Ledger](accounts.html) has a sequence number in its `Sequence` field, which increases by 1 whenever that account sends a transaction and that transaction gets included in a [validated ledger](ledgers.html). Each [transaction](transactions.html) also has a sequence number in its `Sequence` field, which must match the account's current sequence number when the transaction executes. For each account, each sequence number can only be used once, in numerical order. [Tickets](tickets.html) make some exceptions from these rules so that it is possible to send transactions out of the normal order. Tickets represent sequence numbers reserved for later use; a transaction can use a Ticket instead of a normal sequence number. diff --git a/content/_snippets/data_types/address.ja.md b/content/_snippets/data_types/address.ja.md index c2b727a29a..4e2c09533a 100644 --- a/content/_snippets/data_types/address.ja.md +++ b/content/_snippets/data_types/address.ja.md @@ -3,7 +3,7 @@ XRP Ledgerのアカウントは、XRP Ledgerの[base58][]フォーマットの * 長さは25から35文字です * 文字`r`で始まります - **注記:** XRPコミュニティは、取引所およびウォレットで[宛先タグ](https://xrpl.org/source-and-destination-tags.html)の代わりに使用できる新しいフォーマット、**X**アドレスを[提案](https://github.com/XRPLF/XRPL-Standards/issues/6)(これをサポートする[コーデック](https://github.com/xrp-community/xrpl-tagged-address-codec)も開発)しました。これらの「パック化」したアドレスは、`r`ではなく`X`で開始します。詳細は、[𝗫-address format](https://xrpaddress.info/)のサイトを参照してください。 + **注記:** XRPコミュニティは、取引所およびウォレットで[宛先タグ](source-and-destination-tags.html)の代わりに使用できる新しいフォーマット、**X**アドレスを[提案](https://github.com/XRPLF/XRPL-Standards/issues/6)(これをサポートする[コーデック](https://github.com/xrp-community/xrpl-tagged-address-codec)も開発)しました。これらの「パック化」したアドレスは、`r`ではなく`X`で開始します。詳細は、[𝗫-address format](https://xrpaddress.info/)のサイトを参照してください。 * 英数字を使用します(数字「`0`」、大文字「`O`」、大文字「`I`」、小文字「`l`」を除く) * 大/小文字を区別します diff --git a/content/_snippets/data_types/address.md b/content/_snippets/data_types/address.md index f6d099ee31..2edc68cc88 100644 --- a/content/_snippets/data_types/address.md +++ b/content/_snippets/data_types/address.md @@ -6,7 +6,7 @@ Accounts in the XRP Ledger are identified by an address in the XRP Ledger's [bas * Case-sensitive * Includes a 4-byte checksum so that the probability of generating a valid address from random characters is approximately 1 in 232 -> **Note:** The XRP community has [proposed](https://github.com/XRPLF/XRPL-Standards/issues/6) an **X**-address format that "packs" a [destination tag](source-and-destination-tags.html) into the address. These addresses start with an `X` (for the mainnet) or a `T` (for the [testnet](parallel-networks.html)). Exchanges and wallets can use X-addresses to represent all the data a customer needs to know in one value. For more information, see the [X-address format site](https://xrpaddress.info/) and [codec](https://github.com/xrp-community/xrpl-tagged-address-codec). +> **Note:** There is also an **X**-address format that "packs" a [destination tag](source-and-destination-tags.html) into the address. These addresses start with an `X` (for Mainnet) or a `T` (for [test networks](parallel-networks.html)). Exchanges and wallets can use X-addresses to represent all the data a customer needs to know in one value. For more information, see the [X-address format site](https://xrpaddress.info/) and [codec](https://github.com/xrp-community/xrpl-tagged-address-codec). > > The XRP Ledger protocol only supports "classic" addresses natively, but many [client libraries](client-libraries.html) support X-addresses too. diff --git a/content/_snippets/rippled-api-links.md b/content/_snippets/rippled-api-links.md index 7f6f15fd6c..9917247100 100644 --- a/content/_snippets/rippled-api-links.md +++ b/content/_snippets/rippled-api-links.md @@ -15,8 +15,8 @@ [XRPのdrop数]: basic-data-types.html#通貨額の指定 [Hash]: basic-data-types.html#hashes [ハッシュ]: basic-data-types.html#ハッシュ -[identifying hash]: transaction-basics.html#identifying-transactions -[識別用ハッシュ]: transaction-basics.html#トランザクションの識別 +[identifying hash]: transactions.html#identifying-transactions +[識別用ハッシュ]: transactions.html#トランザクションの識別 [Internal Type]: serialization.html [内部の型]: serialization.html [Ledger Index]: basic-data-types.html#ledger-index diff --git a/content/_snippets/string-number-formatting.md b/content/_snippets/string-number-formatting.md index 07f0fd5c71..eb3230ba60 100644 --- a/content/_snippets/string-number-formatting.md +++ b/content/_snippets/string-number-formatting.md @@ -1,4 +1,4 @@ -XRP Ledger APIs generally use strings, rather than native JSON numbers, to represent numeric amounts of currency for both [XRP](xrp.html) and [tokens](tokens.html). This protects against a loss of precision when using JSON parsers, which may automatically try to represent all JSON numbers in a floating-point format. Within the String value, the numbers are serialized in the same way as native JSON numbers: +XRP Ledger APIs generally use strings, rather than native JSON numbers, to represent numeric amounts of currency for both [XRP](what-is-xrp.html) and [tokens](tokens.html). This protects against a loss of precision when using JSON parsers, which may automatically try to represent all JSON numbers in a floating-point format. Within the String value, the numbers are serialized in the same way as native JSON numbers: * Base-10. * Non-zero-prefaced. diff --git a/content/_snippets/tutorial-sign-step.md b/content/_snippets/tutorial-sign-step.md index 4adf3e23cc..9a0497b592 100644 --- a/content/_snippets/tutorial-sign-step.md +++ b/content/_snippets/tutorial-sign-step.md @@ -1,3 +1,3 @@ -The most secure way to sign a transaction is to [sign locally with a client library](set-up-secure-signing.html#local-signing-example). Alternatively, if you run your own `rippled` node you can sign the transaction using the [sign method](sign.html), but this must be done through a trusted and encrypted connection, or through a local (same-machine) connection. +The most secure way to sign a transaction is to [sign locally with a client library](secure-signing.html#local-signing-example). Alternatively, if you run your own `rippled` node you can sign the transaction using the [sign method](sign.html), but this must be done through a trusted and encrypted connection, or through a local (same-machine) connection. In all cases, note the signed transaction's identifying hash for later. diff --git a/content/_snippets/tx-metadata-field-table.md b/content/_snippets/tx-metadata-field-table.md index 82a18169de..81028a920e 100644 --- a/content/_snippets/tx-metadata-field-table.md +++ b/content/_snippets/tx-metadata-field-table.md @@ -1,7 +1,7 @@ | Field | Value | Description | |:----------------------------------------|:--------------------|:-------------| -| `AffectedNodes` | Array | List of [ledger objects](ledger-object-types.html) that were created, deleted, or modified by this transaction, and specific changes to each. | +| `AffectedNodes` | Array | List of [ledger entries](ledger-object-types.html) that were created, deleted, or modified by this transaction, and specific changes to each. | | `DeliveredAmount` | [Currency Amount][] | _(May be omitted)_ For a [partial payment](partial-payments.html), 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](transaction-results.html) indicating whether the transaction succeeded or how it failed. | -| [`delivered_amount`](transaction-metadata.html#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](partial-payments.html). See [this description](transaction-metadata.html#delivered_amount) for details. [New in: rippled 0.27.0][] | +| [`delivered_amount`](transaction-metadata.html#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](partial-payments.html). See [this description](transaction-metadata.html#delivered_amount) for details. | diff --git a/content/concepts/tokens/issuing-and-operational-addresses.ja.md b/content/concepts/accounts/account-types.ja.md similarity index 98% rename from content/concepts/tokens/issuing-and-operational-addresses.ja.md rename to content/concepts/accounts/account-types.ja.md index ee04830a37..0e5e908289 100644 --- a/content/concepts/tokens/issuing-and-operational-addresses.ja.md +++ b/content/concepts/accounts/account-types.ja.md @@ -1,6 +1,6 @@ --- -html: issuing-and-operational-addresses.html -parent: tokens.html +html: account-types.html +parent: accounts.html blurb: XRP Ledgerで自動的にトランザクションを送信するビジネスは、リスクを最小限に抑えるために目的ごとに別のアドレスを設定することをおすすめします。 labels: - トークン @@ -63,7 +63,7 @@ XRP LedgerのXRP以外の残高はすべて、2つのXRP Ledgerアドレス間 - [アカウント](accounts.html) - [暗号鍵](cryptographic-keys.html) - **チュートリアル:** - - [XRP Ledgerゲートウェイの開設](become-an-xrp-ledger-gateway.html) + - [XRP Ledgerゲートウェイの開設](stablecoin-issuer.html) - [レギュラーキーペアの割り当て](assign-a-regular-key-pair.html) - [レギュラーキーペアの変更または削除](change-or-remove-a-regular-key-pair.html) - **リファレンス:** diff --git a/content/concepts/tokens/issuing-and-operational-addresses.md b/content/concepts/accounts/account-types.md similarity index 97% rename from content/concepts/tokens/issuing-and-operational-addresses.md rename to content/concepts/accounts/account-types.md index ddc1069fee..abbf27be0b 100644 --- a/content/concepts/tokens/issuing-and-operational-addresses.md +++ b/content/concepts/accounts/account-types.md @@ -1,12 +1,12 @@ --- -html: issuing-and-operational-addresses.html -parent: tokens.html +html: account-types.html +parent: accounts.html blurb: Businesses sending transactions on the XRP Ledger automatically should set up separate addresses for different purposes to minimize risk. labels: - Tokens - Security --- -# Issuing and Operational Addresses +# Account Types {% include '_snippets/issuing-and-operational-addresses-intro.md' %} @@ -73,7 +73,6 @@ If a standby address is compromised, the consequences are like an operational ad - [Accounts](accounts.html) - [Cryptographic Keys](cryptographic-keys.html) - **Tutorials:** - - [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html) - [Assign a Regular Key Pair](assign-a-regular-key-pair.html) - [Change or Remove a Regular Key Pair](change-or-remove-a-regular-key-pair.html) - **References:** diff --git a/content/concepts/payment-system-basics/accounts/accounts.ja.md b/content/concepts/accounts/accounts.ja.md similarity index 95% rename from content/concepts/payment-system-basics/accounts/accounts.ja.md rename to content/concepts/accounts/accounts.ja.md index c71c3c761f..8feed9de74 100644 --- a/content/concepts/payment-system-basics/accounts/accounts.ja.md +++ b/content/concepts/accounts/accounts.ja.md @@ -1,6 +1,6 @@ --- html: accounts.html -parent: payment-system-basics.html +parent: concepts.html blurb: XRP Ledgerのアカウントについて説明します。アカウントはトランザクションを送信でき、XRPを保有できます。 labels: - アカウント @@ -12,12 +12,12 @@ XRP Ledgerの「アカウント」は、XRPの所有者と[トランザクショ - 識別用の**アドレス**。例えば、`rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn` - **注記:** XRPコミュニティは、取引所およびウォレットで[宛先タグ](https://xrpl.org/source-and-destination-tags.html)の代わりに使用できる新しいフォーマット、**X**アドレスを[提案](https://github.com/XRPLF/XRPL-Standards/issues/6)(これをサポートする[コーデック](https://github.com/xrp-community/xrpl-tagged-address-codec)も開発)しました。これらの「パック化」したアドレスは、`r`ではなく`X`で開始します。詳細は、[XRPL 𝗫-address format](https://xrpaddress.info/)のサイトを参照してください。 + **注記:** XRPコミュニティは、取引所およびウォレットで[宛先タグ](source-and-destination-tags.html)の代わりに使用できる新しいフォーマット、**X**アドレスを[提案](https://github.com/XRPLF/XRPL-Standards/issues/6)(これをサポートする[コーデック](https://github.com/xrp-community/xrpl-tagged-address-codec)も開発)しました。これらの「パック化」したアドレスは、`r`ではなく`X`で開始します。詳細は、[XRPL 𝗫-address format](https://xrpaddress.info/)のサイトを参照してください。 - **XRPの残高**。このXRPの一部は、[準備金](reserves.html)用に確保されています。 - **シーケンス番号**。このアカウントから送信されるトランザクションがすべて、正しい順序で、それぞれ1回のみ適用されるようにします。トランザクションを実行するには、トランザクションのシーケンス番号と送金元のシーケンス番号が一致する必要があります。その後も、トランザクションが適用されている限り、アカウントのシーケンス番号は1ずつ増加します。(関連項目: [基本的なデータタイプ: アカウントシーケンス](basic-data-types.html#アカウントシーケンス)) - このアカウントと残高に影響を及ぼした**取引の履歴**。 -- [トランザクションの承認](transaction-basics.html#トランザクションの承認)方法。以下に例を示します。 +- [トランザクションの承認](transactions.html#トランザクションの承認)方法。以下に例を示します。 - アカウント固有のマスターキーのペア。([無効](accountset.html)にできますが、変更はできません。) - [ローテーションで使用](setregularkey.html)できる「レギュラー」キーペア。 - [マルチシグ](multi-signing.html)の署名者のリスト。(アカウントのコアデータとは別に保存されます。) @@ -169,7 +169,7 @@ XRP Ledgerのアドレスは、[base58][]_形式のディクショナリ_`rpshna - **コンセプト:** - [準備金](reserves.html) - [暗号鍵](cryptographic-keys.html) - - [発行アドレスと運用アドレス](issuing-and-operational-addresses.html) + - [発行アドレスと運用アドレス](account-types.html) - **リファレンス:** - [account_infoメソッド][] - [wallet_proposeメソッド][] diff --git a/content/concepts/accounts/accounts.md b/content/concepts/accounts/accounts.md new file mode 100644 index 0000000000..e714896a34 --- /dev/null +++ b/content/concepts/accounts/accounts.md @@ -0,0 +1,71 @@ +--- +html: accounts.html +parent: concepts.html +blurb: Learn about accounts in the XRP Ledger. Accounts can send transactions and hold XRP. +labels: + - Accounts + - Payments +--- +# Accounts + +An "Account" in the XRP Ledger represents a holder of XRP and a sender of [transactions](transaction-formats.html). + +An account consists of an address, an XRP balance, a sequence number, and a history of its transactions. To be able to send transactions, the owner also needs one or more cryptographic key pairs associated with the account. + + +## Account Structure + + The core elements of an account are: + +- An identifying **address**, such as `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn`. +- An **XRP balance**. Some of this XRP is set aside for the [Reserve](reserves.html). +- A **sequence number**, which helps make sure any transactions this account sends are applied in the correct order and only once. To execute a transaction, the transaction's sequence number and its sender's sequence number must match. Then, as part of applying the transaction, the account's sequence number increases by 1. (See also: [Basic Data Types: Account Sequence](basic-data-types.html#account-sequence).) +- A **history of transactions** that affected this account and its balances. +- One or more ways to [authorize transactions](transactions.html#authorizing-transactions), possibly including: + - A master key pair intrinsic to the account. (This can be disabled but not changed.) + - A "regular" key pair that can be rotated. + - A signer list for [multi-signing](multi-signing.html). (Stored separately from the account's core data.) + +An account's core data is stored in an [AccountRoot](accountroot.html) ledger entry. An account can also be the owner (or partial owner) of several other types of ledger entry. + +**Tip:** An "Account" in the XRP Ledger is somewhere between the financial usage (like "bank account") and the computing usage (like "UNIX account"). Non-XRP currencies and assets aren't stored in an XRP Ledger Account itself; each such asset is stored in an accounting relationship called a "Trust Line" that connects two parties. + + +## Creating Accounts + +There is not a dedicated "create account" transaction. The [Payment transaction][] automatically creates a new account if the payment sends enough XRP to a mathematically-valid address that does not already have an account. This is called _funding_ an account, and creates an [AccountRoot entry](accountroot.html) in the ledger. No other transaction can create an account. + +**Caution:** Funding an account **does not** give you any special privileges over that account. Whoever has the secret key corresponding to the account's address has full control over the account and all XRP it contains. For some addresses, it's possible that no one has the secret key, in which case the account is a [black hole](addresses.html#special-addresses) and the XRP is lost forever. + +The typical way to get an account in the XRP Ledger is as follows: + +1. Generate a key pair from a strong source of randomness and calculate the address of that key pair. + +2. Have someone who already has an account in the XRP Ledger send XRP to the address you generated. + + - For example, you can buy XRP in a private exchange, then withdraw XRP from the exchange to the address you specified. + + **Caution:** The first time you receive XRP at your own XRP Ledger address, you must pay the [account reserve](reserves.html) (currently 10 XRP), which locks up that amount of XRP indefinitely. In contrast, private exchanges usually hold all their customers' XRP in a few shared XRP Ledger accounts, so customers don't have to pay the reserve for individual accounts at the exchange. Before withdrawing, consider whether having your own account directly on the XRP Ledger is worth the price. + + + +## See Also + +- **Concepts:** + - [Reserves](reserves.html) + - [Cryptographic Keys](cryptographic-keys.html) + - [Issuing and Operational Addresses](account-types.html) +- **References:** + - [account_info method][] + - [wallet_propose method][] + - [AccountSet transaction][] + - [Payment transaction][] + - [AccountRoot object](accountroot.html) +- **Tutorials:** + - [Manage Account Settings (Category)](manage-account-settings.html) + - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/accounts/addresses.md b/content/concepts/accounts/addresses.md new file mode 100644 index 0000000000..dcf78d0829 --- /dev/null +++ b/content/concepts/accounts/addresses.md @@ -0,0 +1,89 @@ +--- +html: addresses.html +parent: accounts.html +blurb: Addresses uniquely identify XRP Ledger accounts, using base58 format. +labels: + - Accounts +--- +# Addresses + +{% include '_snippets/data_types/address.md' %} + +Any valid address can [become an account in the XRP Ledger](accounts.html#creating-accounts) by being funded. You can also use an address that has not been funded to represent a [regular key](cryptographic-keys.html) or a member of a [signer list](multi-signing.html). Only a funded account can be the sender of a transaction. + +Creating a valid address is a strictly mathematical task starting with a key pair. You can generate a key pair and calculate its address entirely offline without communicating to the XRP Ledger or any other party. The conversion from a public key to an address involves a one-way hash function, so it is possible to confirm that a public key matches an address but it is impossible to derive the public key from the address alone. (This is part of the reason why signed transactions include the public key _and_ the address of the sender.) + + +## Special Addresses + +Some addresses have special meaning, or historical uses, in the XRP Ledger. In many cases, these are "black hole" addresses, meaning the address is not derived from a known secret key. Since it is effectively impossible to guess a secret key from only an address, any XRP possessed by black hole addresses is lost forever. + + +| Address | Name | Meaning | Black Hole? | +|-------------------------------|------|---------|-------------| +| `rrrrrrrrrrrrrrrrrrrrrhoLvTp` | ACCOUNT\_ZERO | An address that is the XRP Ledger's [base58][] encoding of the value `0`. In peer-to-peer communications, `rippled` uses this address as the issuer for XRP. | Yes | +| `rrrrrrrrrrrrrrrrrrrrBZbvji` | ACCOUNT\_ONE | An address that is the XRP Ledger's [base58][] encoding of the value `1`. In the ledger, [RippleState entries](ripplestate.html) use this address as a placeholder for the issuer of a trust line balance. | Yes | +| `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` | The genesis account | When `rippled` starts a new genesis ledger from scratch (for example, in stand-alone mode), this account holds all the XRP. This address is generated from the seed value `masterpassphrase` which is [hard-coded](https://github.com/ripple/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184). | No | +| `rrrrrrrrrrrrrrrrrNAMEtxvNvQ` | Ripple Name reservation black-hole | In the past, Ripple asked users to send XRP to this account to reserve Ripple Names.| Yes | +| `rrrrrrrrrrrrrrrrrrrn5RM1rHd` | NaN Address | Previous versions of [ripple-lib](https://github.com/XRPLF/xrpl.js) generated this address when encoding the value [NaN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN) using the XRP Ledger's [base58][] string encoding format. | Yes | + + +## Address Encoding + +**Tip:** These technical details are only relevant for people building low-level library software for XRP Ledger compatibility! + +[[Source]](https://github.com/ripple/rippled/blob/35fa20a110e3d43ffc1e9e664fc9017b6f2747ae/src/ripple/protocol/impl/AccountID.cpp#L109-L140 "Source") + +XRP Ledger addresses are encoded using [base58][] with the _dictionary_ `rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz`. Since the XRP Ledger encodes several types of keys with base58, it prefixes the encoded data with a one-byte "type prefix" (also called a "version prefix") to distinguish them. The type prefix causes addresses to usually start with different letters in base58 format. + +The following diagram shows the relationship between keys and addresses: + +{{ include_svg("img/address-encoding.svg", "Master Public Key + Type Prefix → Account ID + Checksum → Address") }} + +The formula for calculating an XRP Ledger address from a public key is as follows. For the complete example code, see [`encode_address.js`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/content/_code-samples/address_encoding/js/encode_address.js). For the process of deriving a public key from a passphrase or seed value, see [Key Derivation](cryptographic-keys.html#key-derivation). + +1. Import required algorithms: SHA-256, RIPEMD160, and base58. Set the dictionary for 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. Start with a 33-byte ECDSA secp256k1 public key, or a 32-byte Ed25519 public key. For Ed25519 keys, prefix the key with the byte `0xED`. + + const pubkey_hex = + 'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32'; + const pubkey = Buffer.from(pubkey_hex, 'hex'); + assert(pubkey.length == 33); + +3. Calculate the [RIPEMD160](https://en.wikipedia.org/wiki/RIPEMD) hash of the SHA-256 hash of the public key. This value is the "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. Calculate the SHA-256 hash of the SHA-256 hash of the Account ID; take the first 4 bytes. This value is the "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. Concatenate the payload and the checksum. Calculate the base58 value of the concatenated buffer. The result is the address. + + const dataToEncode = Buffer.concat([payload, checksum]); + const address = base58.encode(dataToEncode); + console.log(address); + // rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN + + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/payment-system-basics/accounts/cryptographic-keys.ja.md b/content/concepts/accounts/cryptographic-keys.ja.md similarity index 96% rename from content/concepts/payment-system-basics/accounts/cryptographic-keys.ja.md rename to content/concepts/accounts/cryptographic-keys.ja.md index 2e71627b16..a6368b67c1 100644 --- a/content/concepts/payment-system-basics/accounts/cryptographic-keys.ja.md +++ b/content/concepts/accounts/cryptographic-keys.ja.md @@ -8,7 +8,7 @@ labels: --- # 暗号鍵 -XRP Ledgerでは、[トランザクション](transaction-basics.html)による一連の具体的なアクションの実行が承認されていることを、デジタル署名によって証明します。署名されたトランザクションのみがネットワークに送信され、検証済みレジャーに含まれます。 +XRP Ledgerでは、[トランザクション](transactions.html)による一連の具体的なアクションの実行が承認されていることを、デジタル署名によって証明します。署名されたトランザクションのみがネットワークに送信され、検証済みレジャーに含まれます。 すべてのデジタル署名は、トランザクションの送信側アカウントに関連付けられている暗号鍵ペアに基づいています。キーペアはXRP Ledgerでサポートされている[暗号化署名アルゴリズム](#署名アルゴリズム)を使用して生成できます。キーペアの生成に使用されたアルゴリズムの種類にかかわらず、キーペアは[マスターキーペア](#マスターキーペア)、[レギュラーキーペア](#レギュラーキーペア)、または[署名者リスト](multi-signing.html)のメンバーとして使用できます。 @@ -42,7 +42,7 @@ _図: 暗号鍵の値の関係を簡略化した図_ ### シード -_シード_ 値は、アカウントの実際の秘密鍵と公開鍵を[導出](#鍵導出)するために使用される、コンパクトな値です。[wallet_proposeメソッド][]のレスポンスでは、`master_key`, `master_seed`, `master_seed_hex` はすべて同一のシード値を様々な形式で表現します。これらの形式はいずれも、[`rippled` API](http-websocket-apis.html) やいくつかの [他のXRP Ledgerソフトウェア](software-ecosystem.html) で [トランザクションの署名] (transaction-basics.html#signing-and-submitting-transactions) に使用することができます。`master_`という接頭辞がついていますが、このシードが表す鍵は必ずしもアカウントのマスターキーではありません。この鍵ペアはレギュラーキーとして、あるいはマルチシグリストのメンバーとして使用することもできます。 +_シード_ 値は、アカウントの実際の秘密鍵と公開鍵を[導出](#鍵導出)するために使用される、コンパクトな値です。[wallet_proposeメソッド][]のレスポンスでは、`master_key`, `master_seed`, `master_seed_hex` はすべて同一のシード値を様々な形式で表現します。これらの形式はいずれも、[`rippled` API](http-websocket-apis.html) やいくつかの [他のXRP Ledgerソフトウェア](software-ecosystem.html) で [トランザクションの署名] (transactions.html#signing-and-submitting-transactions) に使用することができます。`master_`という接頭辞がついていますが、このシードが表す鍵は必ずしもアカウントのマスターキーではありません。この鍵ペアはレギュラーキーとして、あるいはマルチシグリストのメンバーとして使用することもできます。 シード値は秘密情報であるため、非常に厳重に保管する必要があります。あるアドレスのシード値を知っている人は、そのアドレスを実質的に完全にコントロールすることができます。 @@ -82,7 +82,7 @@ XRP Ledgerは、複数の[暗号署名アルゴリズム](#署名アルゴリズ マスターキーペアは、秘密鍵と公開鍵で構成されています。アカウントのアドレスは、そのアカウントのマスターキーペアから得られるので、両者は[本質的な関係](accounts.html#アドレスのエンコード)となります。マスターキーペアの変更・削除はできませんが、無効にすることはできます。 -[wallet_proposeメソッド][]は、マスターキーペアを生成する方法の1つです。このメソッドからの応答には、アカウントのシード、アドレス、マスター公開鍵が一緒に表示されます。マスターキーペアを設定する他の方法については、[安全な署名の設定](set-up-secure-signing.html) を参照してください。 +[wallet_proposeメソッド][]は、マスターキーペアを生成する方法の1つです。このメソッドからの応答には、アカウントのシード、アドレス、マスター公開鍵が一緒に表示されます。マスターキーペアを設定する他の方法については、[安全な署名の設定](secure-signing.html) を参照してください。 **注意:** 悪意のある行為者があなたのマスター秘密鍵(またはシード)を知った場合、マスター鍵ペアが無効化されていない限り、彼らはあなたのアカウントを完全にコントロールすることができます。彼らはあなたのアカウントが保持している全ての資金を盗み、その他の回復不能な損害を与えることができます。秘密鍵は慎重に扱ってください! @@ -94,7 +94,7 @@ XRP Ledgerは、複数の[暗号署名アルゴリズム](#署名アルゴリズ **マスターキーペア**のみが、ある特定の処理を行うトランザクションを承認することができます。 -- アカウントの最初のトランザクションを送信する。アカウントはその他の方法で[トランザクションを承認](transaction-basics.html#authorizing-transactions)して初期化することができないからです。 +- アカウントの最初のトランザクションを送信する。アカウントはその他の方法で[トランザクションを承認](transactions.html#トランザクションの承認)して初期化することができないからです。 - マスターキーペアを無効化する。 @@ -241,7 +241,7 @@ XRP Ledgerアカウントキーでのsecp256k1鍵導出に、Ed25519鍵導出よ ## 関連項目 - **コンセプト:** - - [発行アドレスと運用アドレス](issuing-and-operational-addresses.html) + - [発行アドレスと運用アドレス](account-types.html) - **チュートリアル:** - [レギュラーキーペアの割り当て](assign-a-regular-key-pair.html) - [レギュラーキーペアの変更または削除](change-or-remove-a-regular-key-pair.html) diff --git a/content/concepts/payment-system-basics/accounts/cryptographic-keys.md b/content/concepts/accounts/cryptographic-keys.md similarity index 94% rename from content/concepts/payment-system-basics/accounts/cryptographic-keys.md rename to content/concepts/accounts/cryptographic-keys.md index 8952dacb2d..0a8e7c6494 100644 --- a/content/concepts/payment-system-basics/accounts/cryptographic-keys.md +++ b/content/concepts/accounts/cryptographic-keys.md @@ -8,7 +8,7 @@ labels: --- # Cryptographic Keys -In the XRP Ledger, a digital signature _authorizes_ a [transaction](transaction-basics.html) to do a specific set of actions. Only signed transactions can be submitted to the network and included in a validated ledger. +In the XRP Ledger, a digital signature _authorizes_ a [transaction](transactions.html) to do a specific set of actions. Only signed transactions can be submitted to the network and included in a validated ledger. To make a digital signature, you use a cryptographic key pair associated with the transaction's sending account. A key pair may be generated using any of the XRP Ledger's supported [cryptographic signing algorithms](#signing-algorithms). A key pair can be used as a [master key pair](#master-key-pair), [regular key pair](#regular-key-pair) or a member of a [signer list](multi-signing.html), regardless of what algorithm was used to generate it. @@ -42,7 +42,7 @@ The passphrase is secret information, so you must protect it very carefully. Any ### Seed -A _seed_ value is a compact value that is used to [derive](#key-derivation) the actual private and public keys for an account. In a [wallet_propose method][] response, the `master_key`, `master_seed`, and `master_seed_hex` all represent the same seed value, in various formats. Any of these formats can be used to [sign transactions](transaction-basics.html#signing-and-submitting-transactions) in the [`rippled` APIs](http-websocket-apis.html) and some [other XRP Ledger software](software-ecosystem.html). Despite being prefixed with `master_`, the keys this seed represents are not necessarily the master keys for an account; you can use a key pair as a regular key or a member of a multi-signing list as well. +A _seed_ value is a compact value that is used to [derive](#key-derivation) the actual private and public keys for an account. In a [wallet_propose method][] response, the `master_key`, `master_seed`, and `master_seed_hex` all represent the same seed value, in various formats. Any of these formats can be used to sign transactions. Despite being prefixed with `master_`, the keys this seed represents are not necessarily the master keys for an account; you can use a key pair as a regular key or a member of a multi-signing list as well. The seed value is secret information, so you must protect it very carefully. Anyone who knows an address's seed value has effectively full control over that address. @@ -81,9 +81,9 @@ The `key_type` field in the [wallet_propose method][] refers to the cryptographi ## Master Key Pair -The master key pair consists of a private key and a public key. The address of an account is derived from the account's master key pair, so they are [intrinsically related](accounts.html#address-encoding). You cannot change or remove the master key pair, but you can disable it. +The master key pair consists of a private key and a public key. The address of an account is derived from the account's master key pair, so they are intrinsically related. You cannot change or remove the master key pair, but you can disable it. -The [wallet_propose method][] is one way of generating a master key pair. The response from this method shows the account's seed, address, and master public key together. For some other ways of setting up master key pairs, see [Set Up Secure Signing](set-up-secure-signing.html). +The [wallet_propose method][] is one way of generating a master key pair. The response from this method shows the account's seed, address, and master public key together. For some other ways of setting up master key pairs, see [Secure Signing](secure-signing.html). **Warning:** If a malicious actor learns your master private key (or seed), they have full control over your account, unless your master key pair is disabled. They can take all the money your account holds and do other irreparable harm. Treat your secret values with care! @@ -97,7 +97,7 @@ Keeping your master key pair offline means not putting the secret information (p **Only** the master key pair can authorize transactions to do certain things: -- Send an account's very first transaction, because accounts cannot be initialized with another way of [authorizing transactions](transaction-basics.html#authorizing-transactions). +- Send an account's very first transaction, because accounts cannot be initialized with another way of [authorizing transactions](transactions.html#authorizing-transactions). - Disable the master key pair. @@ -105,7 +105,7 @@ Keeping your master key pair offline means not putting the secret information (p - Send a special [key reset transaction](transaction-cost.html#key-reset-transaction) with a transaction cost of 0 XRP. -A regular key or [multi-signature](multi-signing.html) can do anything else the same as the master key pair. Notably, after you have disabled the master key pair, you can re-enable it using a regular key pair or multi-signature. You can also [delete an account](accounts.html#deletion-of-accounts) if it meets the requirements for deletion. +A regular key or [multi-signature](multi-signing.html) can do anything else the same as the master key pair. Notably, after you have disabled the master key pair, you can re-enable it using a regular key pair or multi-signature. You can also [delete an account](deleting-accounts.html) if it meets the requirements for deletion. ## Regular Key Pair @@ -134,7 +134,7 @@ The XRP Ledger supports the following cryptographic signing algorithms: When you generate a key pair with the [wallet_propose method][], you can specify the `key_type` to choose which cryptographic signing algorithm to use to derive the keys. If you generated a key type other than the default, you must also specify the `key_type` when signing transactions. -The supported types of key pairs can be used interchangeably throughout the XRP Ledger as master key pairs, regular key pairs, and members of signer lists. The process of [deriving an address](accounts.html#address-encoding) is the same for secp256k1 and Ed25519 key pairs. +The supported types of key pairs can be used interchangeably throughout the XRP Ledger as master key pairs, regular key pairs, and members of signer lists. The process of [deriving an address](addresses.html#address-encoding) is the same for secp256k1 and Ed25519 key pairs. ### Future Algorithms @@ -237,13 +237,13 @@ The steps to derive the XRP Ledger's secp256k1 account key pair from a seed valu 6. When serializing an account's public key to its [base58][] format, use the account public key prefix, `0x23`. - See [Address Encoding](accounts.html#address-encoding) for information and sample code to convert from an account's public key to its address. + See [Address Encoding](addresses.html#address-encoding) for information and sample code to convert from an account's public key to its address. ## See Also - **Concepts:** - - [Issuing and Operational Addresses](issuing-and-operational-addresses.html) + - [Issuing and Operational Addresses](account-types.html) - **Tutorials:** - [Assign a Regular Key Pair](assign-a-regular-key-pair.html) - [Change or Remove a Regular Key Pair](change-or-remove-a-regular-key-pair.html) diff --git a/content/concepts/accounts/deleting-accounts.md b/content/concepts/accounts/deleting-accounts.md new file mode 100644 index 0000000000..d2d95cbc52 --- /dev/null +++ b/content/concepts/accounts/deleting-accounts.md @@ -0,0 +1,40 @@ +--- +html: deleting-accounts.html +parent: accounts.html +blurb: About deleting an XRP Ledger account. +labels: + - Accounts +--- +## Deleting Accounts + +The owner of an account can send an [AccountDelete transaction][] to deletes the account and related entries from the ledger, sending most of the account's remaining XRP balance to another account. To discourage wasteful creation and deletion of accounts, deleting an account requires burning a higher than usual amount of XRP as the [transaction cost](transaction-cost.html). + +Some types of associated ledger entries block an account from being deleted. For example, the issuer of a fungible token can't be deleted while anyone holds a nonzero balance of that token. + +After an account has been deleted, it can be re-created in the ledger through the normal method of [creating accounts](accounts.html#creating-accounts). An account that has been deleted and re-created is no different than an account that has been created for the first time. + +## Requirements + +To be deleted, an account must meet the following requirements: + +- The account's `Sequence` number plus 256 must be less than the current [Ledger Index][]. +- The account must not be linked to any of the following types of [ledger objects](ledger-object-types.html) (as a sender or receiver): + - `Escrow` + - `PayChannel` + - `RippleState` + - `Check` +- The account must own fewer than 1000 objects in the ledger. +- The transaction must pay a special [transaction cost][] equal to at least the [owner reserve](reserves.html) for one item (currently 2 XRP). + +## Cost of Deleting + +**Warning:** The [AccountDelete transaction][]'s transaction cost always applies when the transaction is included in a validated ledger, even if the transaction failed because the account does not meet the requirements to be deleted. To greatly reduce the chances of paying the high transaction cost if the account cannot be deleted, use the `fail_hard` option when submitting an AccountDelete transaction. + +Unlike Bitcoin and many other cryptocurrencies, each new version of the XRP Ledger's public ledger chain contains the full state of the ledger, which increases in size with each new account. For that reason, you should not create new XRP Ledger accounts unless necessary. You can recover some of an account's 10 XRP [reserve](reserves.html) by deleting the account, but you must still destroy at least 2 XRP to do so. + +Institutions who send and receive value on behalf of many users can use [**Source Tags** and **Destination Tags**](source-and-destination-tags.html) to distinguish payments from and to their customers while only using one (or a handful) of accounts in the XRP Ledger. + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/payment-system-basics/accounts/depositauth.ja.md b/content/concepts/accounts/depositauth.ja.md similarity index 96% rename from content/concepts/payment-system-basics/accounts/depositauth.ja.md rename to content/concepts/accounts/depositauth.ja.md index 7408e6c080..9a52f5ea16 100644 --- a/content/concepts/payment-system-basics/accounts/depositauth.ja.md +++ b/content/concepts/accounts/depositauth.ja.md @@ -105,7 +105,7 @@ DepositPreauthトランザクションの処理が完了すると、承認済み - [`rippled` API](http-websocket-apis.html)の[deposit_authorizedメソッド][]。 - [Authorized Trust Lines](authorized-trust-lines.html)機能(`RequireAuth`フラグ)により、アカウントが発行したXRP以外の通貨を保有できる取引相手が制限されます。 - `DisallowXRP`フラグは、アカウントがXRPを受領してはならないことを示します。これはDeposit Authorizationよりもソフトな保護機能であり、XRP Ledgerにより強制されません。(クライアントアプリケーションはこのフラグに従うか、または少なくともこのフラグについて警告します。) -- 送信トランザクションが[Destinationタグ](become-an-xrp-ledger-gateway.html#source-and-destination-tags)を指定している場合には、`RequireDest`フラグは、アカウントが通貨額のみを受領できることを示します。これにより、ユーザーが支払の目的を指定し忘れることがなくなりますが、恣意的な送金先タグを作成できる不明な送金元から受取人が保護されるわけではありません。 +- 送信トランザクションが[Destinationタグ](source-and-destination-tags.html)を指定している場合には、`RequireDest`フラグは、アカウントが通貨額のみを受領できることを示します。これにより、ユーザーが支払の目的を指定し忘れることがなくなりますが、恣意的な送金先タグを作成できる不明な送金元から受取人が保護されるわけではありません。 - [Partial Payment](partial-payments.html)により、アカウントは不要な支払を返金できます。この際、[送金手数料](transfer-fees.html)と為替レートは送金額には追加されず、送金された金額から差し引かれます。 diff --git a/content/concepts/payment-system-basics/accounts/depositauth.md b/content/concepts/accounts/depositauth.md similarity index 97% rename from content/concepts/payment-system-basics/accounts/depositauth.md rename to content/concepts/accounts/depositauth.md index 2d7644436d..8ba24916de 100644 --- a/content/concepts/payment-system-basics/accounts/depositauth.md +++ b/content/concepts/accounts/depositauth.md @@ -108,7 +108,7 @@ You can use the [deposit_authorized method][] to see if an account is authorized - The [deposit_authorized method][] of the [`rippled` API](http-websocket-apis.html). - The [Authorized Trust Lines](authorized-trust-lines.html) feature (`RequireAuth` flag) limits which counterparties can hold non-XRP currencies issued by an account. - The `DisallowXRP` flag indicates that an account should not receive XRP. This is a softer protection than Deposit Authorization, and is not enforced by the XRP Ledger. (Client applications should honor this flag or at least warn about it.) -- The `RequireDest` flag indicates that an account can only receive currency amounts if the sending transaction specifies a [Destination Tag](become-an-xrp-ledger-gateway.html#source-and-destination-tags). This protects users from forgetting to indicate the purpose of a payment, but does not protect recipients from unknown senders, who can make up arbitrary destination tags. +- The `RequireDest` flag indicates that an account can only receive currency amounts if the sending transaction specifies a [Destination Tag](source-and-destination-tags.html). This protects users from forgetting to indicate the purpose of a payment, but does not protect recipients from unknown senders, who can make up arbitrary destination tags. - [Partial Payments](partial-payments.html) provide a way for accounts to return unwanted payments while subtracting [transfer fees](transfer-fees.html) and exchange rates from the amount delivered instead of adding them to the amount sent. diff --git a/content/concepts/payment-system-basics/accounts/reserves.ja.md b/content/concepts/accounts/reserves.ja.md similarity index 100% rename from content/concepts/payment-system-basics/accounts/reserves.ja.md rename to content/concepts/accounts/reserves.ja.md diff --git a/content/concepts/payment-system-basics/accounts/reserves.md b/content/concepts/accounts/reserves.md similarity index 96% rename from content/concepts/payment-system-basics/accounts/reserves.md rename to content/concepts/accounts/reserves.md index 5aaa575329..0752b1eb8e 100644 --- a/content/concepts/payment-system-basics/accounts/reserves.md +++ b/content/concepts/accounts/reserves.md @@ -11,7 +11,7 @@ top_nav_grouping: Popular Pages The XRP Ledger applies _reserve requirements_, in XRP, to protect the shared global ledger from growing excessively large as the result of spam or malicious usage. The goal is to constrain the growth of the ledger to match improvements in technology so that a current commodity-level machine can always fit the current ledger in RAM. -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](accounts.html#deletion-of-accounts). +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.html). The reserve requirement changes from time to time due to the [Fee Voting](fee-voting.html) process, where validators can agree to new reserve settings. @@ -60,7 +60,7 @@ To calculate an address's total reserve requirement, multiply `OwnerCount` by `r During transaction processing, the [transaction cost](transaction-cost.html) destroys some of the sending address's XRP balance. This can cause an address's XRP to go below the reserve requirement. You can even destroy _all_ of your XRP this way. -When your account holds less XRP than its current reserve requirement, you cannot send XRP to others, or create new objects that would increase your account's reserve requirement. Even so, the account continues to exist in the ledger and you can still send transactions that don't do these things, as long as you have enough XRP to pay the transaction cost. You can go back above the reserve requirement by receiving enough XRP, or if the [reserve requirement decreases](#changing-the-reserve-requirements) below the amount you have. +When your account holds less XRP than its current reserve requirement, you cannot send XRP to others, or create new objects that would increase your account's reserve requirement. Even so, the account continues to exist in the ledger and you can still send transactions that don't do these things, as long as you have enough XRP to pay the transaction cost. You can go back above the reserve requirement by receiving enough XRP, or if the reserve requirement decreases below the amount you have. **Tip:** If your address is below the reserve requirement, you can send an [OfferCreate transactions][] to acquire more XRP and get back above the reserve requirement. However, since you cannot create an [Offer entry in the ledger](offer.html) while you are below the reserve, this transaction can only consume Offers that are already in the order books. diff --git a/content/concepts/consensus-network/consensus-principles-and-rules.ja.md b/content/concepts/consensus-protocol/consensus-principles-and-rules.ja.md similarity index 99% rename from content/concepts/consensus-network/consensus-principles-and-rules.ja.md rename to content/concepts/consensus-protocol/consensus-principles-and-rules.ja.md index 7a7a20d00d..4df52e6630 100644 --- a/content/concepts/consensus-network/consensus-principles-and-rules.ja.md +++ b/content/concepts/consensus-protocol/consensus-principles-and-rules.ja.md @@ -1,6 +1,6 @@ --- html: consensus-principles-and-rules.html -parent: consensus-network.html +parent: consensus.html blurb: XRP Ledgerは世界規模の決済システムで、ユーザーはメールを送るときのようにスムーズに国境を越えて送金することができます。 labels: - ブロックチェーン diff --git a/content/concepts/consensus-network/consensus-principles-and-rules.md b/content/concepts/consensus-protocol/consensus-principles-and-rules.md similarity index 99% rename from content/concepts/consensus-network/consensus-principles-and-rules.md rename to content/concepts/consensus-protocol/consensus-principles-and-rules.md index 4eb50796b2..1440414662 100644 --- a/content/concepts/consensus-network/consensus-principles-and-rules.md +++ b/content/concepts/consensus-protocol/consensus-principles-and-rules.md @@ -1,6 +1,6 @@ --- html: consensus-principles-and-rules.html -parent: consensus-network.html +parent: consensus.html blurb: The rules and principles of the consensus algorithm that allow users to transfer funds (including fiat currencies, digital currencies and other forms of value) across national boundaries as seamlessly as sending an email. labels: - Blockchain @@ -113,7 +113,7 @@ The XRP Ledger's consensus algorithm provides a robust alternative to proof of w ## See Also - **Concepts:** - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - [Consensus Research](consensus-research.html) - [XRPL Consensus Mechanism Video](https://www.youtube.com/watch?v=k6VqEkqRTmk&list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi&index=2) - **Tutorials:** diff --git a/content/concepts/consensus-network/consensus-protections.ja.md b/content/concepts/consensus-protocol/consensus-protections.ja.md similarity index 94% rename from content/concepts/consensus-network/consensus-protections.ja.md rename to content/concepts/consensus-protocol/consensus-protections.ja.md index d8dbdf748f..9ca7e42ad1 100644 --- a/content/concepts/consensus-network/consensus-protections.ja.md +++ b/content/concepts/consensus-protocol/consensus-protections.ja.md @@ -1,6 +1,6 @@ --- html: consensus-protections.html -parent: consensus-network.html +parent: consensus.html blurb: Learn how the XRP Ledger Consensus Protocol is protected against various problems and attacks that may occur in a decentralized financial system. #TODO: translate labels: - ブロックチェーン @@ -9,7 +9,7 @@ labels: XRP Ledgerコンセンサスプロトコルは、 _ビザンチンフォールトトレラント性_ のあるコンセンサスメカニズムです。つまり、あらゆる不適切な状況(参加者が信頼できないオープンネットワークを利用して通信している場合や、不正使用者が常にシステムを乗っ取ろうとしているかまたは中断しようとしている場合など)が発生しても動作するように設計されています。さらに、XRP Ledgerコンセンサスプロトコルの参加者が事前に判明していない場合や、時間の経過とともに変わる場合があります。 -[ネットワークに求められる特性](intro-to-consensus.html#コンセンサスプロトコルの特性)を維持しつつ、トランザクションをタイミングよく承認する作業は複雑であり、また完璧なシステムを構築することは不可能です。XRP Ledgerコンセンサスプロトコルは、ほとんどの状況で機能し、機能できない状況では可能な限り安全に失敗するように設計されています。 +[ネットワークに求められる特性](consensus.html#コンセンサスプロトコルの特性)を維持しつつ、トランザクションをタイミングよく承認する作業は複雑であり、また完璧なシステムを構築することは不可能です。XRP Ledgerコンセンサスプロトコルは、ほとんどの状況で機能し、機能できない状況では可能な限り安全に失敗するように設計されています。 このページでは、XRP Ledgerコンセンサスプロトコルのいくつかの課題のタイプとその対処について説明します。 @@ -68,7 +68,7 @@ XRP Ledgerのすべての参加者が何を検証済みとみなすかについ ## 関連項目 -- コンセンサスの**入門レベルの概要**については、[コンセンサスについて](intro-to-consensus.html)を参照してください。 +- コンセンサスの**入門レベルの概要**については、[コンセンサスについて](consensus.html)を参照してください。 - コンセンサスプロトコルの**詳細な説明**については、[コンセンサス](consensus.html)を参照してください。 - コンセンサスプロトコルの**設計に関する決定と背景**については、[コンセンサスの原理とルール](consensus-principles-and-rules.html)を参照してください。 - コンセンサスプロトコルの特性と制約に関する**学術研究**については、[コンセンサスの研究](consensus-research.html)を参照してください。 diff --git a/content/concepts/consensus-network/consensus-protections.md b/content/concepts/consensus-protocol/consensus-protections.md similarity index 93% rename from content/concepts/consensus-network/consensus-protections.md rename to content/concepts/consensus-protocol/consensus-protections.md index 7635822a4d..d0b3db54e1 100644 --- a/content/concepts/consensus-network/consensus-protections.md +++ b/content/concepts/consensus-protocol/consensus-protections.md @@ -1,6 +1,6 @@ --- html: consensus-protections.html -parent: consensus-network.html +parent: consensus.html blurb: Learn how the XRP Ledger Consensus Protocol is protected against various problems and attacks that may occur in a decentralized financial system. labels: - Blockchain @@ -9,7 +9,7 @@ labels: The XRP Ledger Consensus Protocol is a _byzantine fault tolerant_ consensus mechanism, which means it's designed to work even if all kinds of things can go wrong: participants depend on an unreliable open network to communicate, and malicious actors may be attempting to control or interrupt the system at any given time. On top of that, the set of participants in the XRP Ledger Consensus Protocol isn't known in advance and can change over time. -Confirming transactions quickly while maintaining [the desired properties of the network](intro-to-consensus.html#consensus-protocol-properties) is a complex challenge, and it's impossible to build a perfect system. The XRP Ledger Consensus Protocol is designed to work as well as it can in most situations, and to fail as gracefully as possible in the situations where it can't. +Confirming transactions quickly while maintaining the desired properties of the network is a complex challenge, and it's impossible to build a perfect system. The XRP Ledger Consensus Protocol is designed to work as well as it can in most situations, and to fail as gracefully as possible in the situations where it can't. This page describes some of the types of challenges that the XRP Ledger Consensus Protocol faces and how it handles them. @@ -68,7 +68,6 @@ Research is ongoing to design an improved consensus protocol that allows more he ## See Also -- For an **intro-level overview** of consensus, see [Intro to Consensus](intro-to-consensus.html). - For a **detailed description** of the consensus protocol, see [Consensus](consensus.html). - For an explanation of the **design decisions and background** behind the consensus protocol, see [Consensus Principles and Rules](consensus-principles-and-rules.html). - For **academic research** exploring the properties and limitations of the protocol, see [Consensus Research](consensus-research.html). diff --git a/content/concepts/consensus-network/consensus-research.ja.md b/content/concepts/consensus-protocol/consensus-research.ja.md similarity index 97% rename from content/concepts/consensus-network/consensus-research.ja.md rename to content/concepts/consensus-protocol/consensus-research.ja.md index 9b79859bbb..122ca47d79 100644 --- a/content/concepts/consensus-network/consensus-research.ja.md +++ b/content/concepts/consensus-protocol/consensus-research.ja.md @@ -1,6 +1,6 @@ --- html: consensus-research.html -parent: consensus-network.html +parent: consensus.html blurb: コンセンサスアルゴリズムに関する学術論文と関連研究。 labels: - ブロックチェーン diff --git a/content/concepts/consensus-network/consensus-research.md b/content/concepts/consensus-protocol/consensus-research.md similarity index 97% rename from content/concepts/consensus-network/consensus-research.md rename to content/concepts/consensus-protocol/consensus-research.md index 6c88d440ea..83cdb60c24 100644 --- a/content/concepts/consensus-network/consensus-research.md +++ b/content/concepts/consensus-protocol/consensus-research.md @@ -1,6 +1,6 @@ --- html: consensus-research.html -parent: consensus-network.html +parent: consensus.html blurb: Scholarly articles on consensus algorithms and related research. labels: - Blockchain diff --git a/content/concepts/consensus-network/consensus.ja.md b/content/concepts/consensus-protocol/consensus-structure.ja.md similarity index 99% rename from content/concepts/consensus-network/consensus.ja.md rename to content/concepts/consensus-protocol/consensus-structure.ja.md index cb83c4f4d4..e0dbc1f7db 100644 --- a/content/concepts/consensus-network/consensus.ja.md +++ b/content/concepts/consensus-protocol/consensus-structure.ja.md @@ -1,6 +1,6 @@ --- -html: consensus.html -parent: consensus-network.html +html: consensus-structure.html +parent: consensus.html blurb: XRP Ledgerにおけるコンセンサスの役割について理解を深めましょう。 labels: - ブロックチェーン @@ -170,7 +170,7 @@ XRP Ledgerに送信されたトランザクションはすぐには処理され ## 関連項目 - **コンセプト:** - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - [コンセンサスの研究](consensus-research.html) - [Rippleコンセンサスの動画](https://www.youtube.com/watch?v=pj1QVb1vlC0) - **チュートリアル:** diff --git a/content/concepts/consensus-network/consensus.md b/content/concepts/consensus-protocol/consensus-structure.md similarity index 99% rename from content/concepts/consensus-network/consensus.md rename to content/concepts/consensus-protocol/consensus-structure.md index b6365f308a..7b63bd7c01 100644 --- a/content/concepts/consensus-network/consensus.md +++ b/content/concepts/consensus-protocol/consensus-structure.md @@ -1,11 +1,11 @@ --- -html: consensus.html -parent: consensus-network.html +html: consensus-structure.html +parent: consensus.html blurb: Understand the role of consensus in the XRP Ledger. labels: - Blockchain --- -# Consensus +# Consensus Structure _Written by Dave Cohen, David Schwartz, and Arthur Britto._ @@ -173,7 +173,6 @@ Best practices for applications submitting transactions include: ## See Also - **Concepts:** - - [Introduction to Consensus](intro-to-consensus.html) - [Consensus Research](consensus-research.html) - [The Consensus Mechanism (YouTube)](https://www.youtube.com/watch?v=k6VqEkqRTmk&list=PLJQ55Tj1hIVZtJ_JdTvSum2qMTsedWkNi&index=2) - **Tutorials:** diff --git a/content/concepts/introduction/intro-to-consensus.ja.md b/content/concepts/consensus-protocol/consensus.ja.md similarity index 92% rename from content/concepts/introduction/intro-to-consensus.ja.md rename to content/concepts/consensus-protocol/consensus.ja.md index ab7545a9f4..f6afb3ca96 100644 --- a/content/concepts/introduction/intro-to-consensus.ja.md +++ b/content/concepts/consensus-protocol/consensus.ja.md @@ -1,12 +1,12 @@ --- -html: intro-to-consensus.html -parent: introduction.html +html: consensus.html +parent: concepts.html blurb: XRP Ledgerのコンセンサスメカニズムについて基本的な理解を深めましょう。 labels: - ブロックチェーン top_nav_grouping: 人気ページ --- -# コンセンサスについて +# コンセンサスプロトコル _コンセンサス_ は、分散型決済システムの最も重要な特性です。従来の中央集権型決済システムでは、権限のある1人の管理者が決済の方法とタイミングについて最終的な決定権を持ちます。分散型システムでは、その名が示すとおり、そのような管理者は存在しません。その代わりに、XRP Ledgerのような分散型システムでは、参加者は定められた一連のルールに従うことになっているため、同じ一連のイベントとその結果についていつでも合意することができます。この一連のルールは、 _コンセンサスプロトコル_ と呼ばれます。 @@ -58,15 +58,6 @@ XRP Ledgerのコンセンサスメカニズムは、小さな信頼が大きな XRP Ledger コンセンサスプロトコルで、さまざまな課題や攻撃、失敗の事例にどのように対応するかについての詳細な説明については、[攻撃と失敗モードに対するコンセンサスの保護](consensus-protections.html)を参照してください。 - -## 関連項目 - -- XRP Ledger コンセンサスプロトコルの仕組みの詳細に関する記事は、[コンセンサスネットワークの概念](consensus-network.html)を参照してください。 -- 独自のバリデータを実行する手順については、[バリデータとしての`rippled`の実行](run-rippled-as-a-validator.html)を参照してください。 -- XRP Ledgerの分散化に関するRippleの目標および計画については、[分散化戦略についてのアップデート (Ripple Dev Blog)](https://ripple.com/dev-blog/decentralization-strategy-update/)を参照してください。 - - - ---- ## 脚注 diff --git a/content/concepts/introduction/intro-to-consensus.md b/content/concepts/consensus-protocol/consensus.md similarity index 84% rename from content/concepts/introduction/intro-to-consensus.md rename to content/concepts/consensus-protocol/consensus.md index 78c580c8e6..4379dd4cb9 100644 --- a/content/concepts/introduction/intro-to-consensus.md +++ b/content/concepts/consensus-protocol/consensus.md @@ -1,14 +1,16 @@ --- -html: intro-to-consensus.html -parent: introduction.html -blurb: Develop a basic understanding of the XRP Ledger's consensus mechanism. +html: consensus.html +parent: concepts.html +blurb: Consensus is how new blocks of transactions get confirmed by the XRP Ledger blockchain. labels: - Blockchain top_nav_grouping: Popular Pages --- -# Introduction to Consensus +# Consensus Protocol -_Consensus_ is the most important property of any decentralized payment system. In traditional centralized payment systems, one authoritative administrator gets the final say in how and when payments occur. Decentralized systems, by definition, don't have an administrator to do that. Instead, decentralized systems like the XRP Ledger define a set of rules all participants follow, so every participant can agree on the exact same series of events and their outcome at any point in time. We call this set of rules a _consensus protocol_. +This topic explains how the decentralized XRP Ledger confirms new transactions and ledger versions, forming a blockchain. + +Consensus is the most important property of any decentralized payment system. In traditional centralized payment systems, one authoritative administrator gets the final say in how and when payments occur. Decentralized systems, by definition, don't have an administrator to do that. Instead, decentralized systems like the XRP Ledger define a set of rules all participants follow, so every participant can agree on the exact same series of events and their outcome at any point in time. We call this set of rules a _consensus protocol_. ## Consensus Protocol Properties @@ -58,14 +60,6 @@ It's OK if a small proportion of validators don't work properly all the time. As For a longer exploration of how the XRP Ledger Consensus Protocol responds to various challenges, attacks, and failure cases, see [Consensus Protections Against Attacks and Failure Modes](consensus-protections.html). -## See Also - -- [Consensus Network Concepts](consensus-network.html) for several articles describing the mechanics of the XRP Ledger Consensus Protocol in greater depth. -- [Run `rippled` as a Validator](run-rippled-as-a-validator.html) for instructions on running your own validator. -- [Decentralization Strategy Update (Ripple Dev Blog)](https://xrpl.org/blog/2017/decent-strategy-update.html) for a description of Ripple's goals and plans for decentralizing the XRP Ledger. - - - ---- ## Footnotes diff --git a/content/concepts/consensus-network/fee-voting.ja.md b/content/concepts/consensus-protocol/fee-voting.ja.md similarity index 99% rename from content/concepts/consensus-network/fee-voting.ja.md rename to content/concepts/consensus-protocol/fee-voting.ja.md index 6561f41ecf..11da6a3c8e 100644 --- a/content/concepts/consensus-network/fee-voting.ja.md +++ b/content/concepts/consensus-protocol/fee-voting.ja.md @@ -1,6 +1,6 @@ --- html: fee-voting.html -parent: consensus-network.html +parent: consensus.html blurb: トランザクションコストと必要準備金の変更投票について。 labels: - 手数料 diff --git a/content/concepts/consensus-network/fee-voting.md b/content/concepts/consensus-protocol/fee-voting.md similarity index 99% rename from content/concepts/consensus-network/fee-voting.md rename to content/concepts/consensus-protocol/fee-voting.md index 213f355169..7c1bdfc271 100644 --- a/content/concepts/consensus-network/fee-voting.md +++ b/content/concepts/consensus-protocol/fee-voting.md @@ -1,6 +1,6 @@ --- html: fee-voting.html -parent: consensus-network.html +parent: consensus.html blurb: How validators vote on fees (transaction cost and reserve requirements). labels: - Fees diff --git a/content/concepts/consensus-network/invariant-checking.ja.md b/content/concepts/consensus-protocol/invariant-checking.ja.md similarity index 99% rename from content/concepts/consensus-network/invariant-checking.ja.md rename to content/concepts/consensus-protocol/invariant-checking.ja.md index 73edfe6b1e..9d2a2979d9 100644 --- a/content/concepts/consensus-network/invariant-checking.ja.md +++ b/content/concepts/consensus-protocol/invariant-checking.ja.md @@ -1,6 +1,6 @@ --- html: invariant-checking.html -parent: consensus-network.html +parent: consensus.html blurb: 不変性チェックとは何か、なぜ存在するのか、どのように機能するのか、どのような不変性チェックが有効なのかを理解することができます。 labels: - ブロックチェーン @@ -146,7 +146,6 @@ XRP Ledgerは、各トランザクションについて、以下のすべての - **その他:** - [Authorized Trust Lines](authorized-trust-lines.html) - - [XRPの特性](xrp.html#xrpの特性) - [トランザクションの残高変化の計算](https://xrpl.org/blog/2015/calculating-balance-changes-for-a-transaction.html#calculating-balance-changes-for-a-transaction) diff --git a/content/concepts/consensus-network/invariant-checking.md b/content/concepts/consensus-protocol/invariant-checking.md similarity index 99% rename from content/concepts/consensus-network/invariant-checking.md rename to content/concepts/consensus-protocol/invariant-checking.md index 26b732b176..47aa449351 100644 --- a/content/concepts/consensus-network/invariant-checking.md +++ b/content/concepts/consensus-protocol/invariant-checking.md @@ -1,6 +1,6 @@ --- html: invariant-checking.html -parent: consensus-network.html +parent: consensus.html blurb: Understand what invariant checking is, why it exists, how it works, and what invariant checks are active. labels: - Blockchain @@ -166,7 +166,6 @@ The XRP Ledger checks all the following invariants on each transaction: - **Other:** - [Authorized Trust Lines](authorized-trust-lines.html) - - [XRP Properties](xrp.html#xrp-properties) - [Calculating Balance Changes for a Transaction](https://xrpl.org/blog/2015/calculating-balance-changes-for-a-transaction.html#calculating-balance-changes-for-a-transaction) diff --git a/content/concepts/consensus-network/negative-unl.ja.md b/content/concepts/consensus-protocol/negative-unl.ja.md similarity index 95% rename from content/concepts/consensus-network/negative-unl.ja.md rename to content/concepts/consensus-protocol/negative-unl.ja.md index dcc8ca8479..a3b81f72c5 100644 --- a/content/concepts/consensus-network/negative-unl.ja.md +++ b/content/concepts/consensus-protocol/negative-unl.ja.md @@ -1,6 +1,6 @@ --- html: negative-unl.html -parent: consensus-network.html +parent: consensus.html blurb: ネガティブUNLが部分的な停止時に台帳の耐障害性を向上させることを理解する。 labels: - ブロックチェーン @@ -72,7 +72,7 @@ Vaは、サーバー側のコンセンサス見解と一致した過 1. 前のフラグレジャーで予定されていたネガティブUNLの変更は、次のレジャーバージョンから有効となる。このフラグレジャーの検証のための合意プロセスそのものは、予定されていた変更を利用しない。 - **注記:** これは、[トランザクション](transaction-basics.html)や[疑似トランザクション](pseudo-transaction-types.html)を行わずにレジャーの状態データを変更する唯一の機会です。 + **注記:** これは、[トランザクション](transactions.html)や[疑似トランザクション](pseudo-transaction-types.html)を行わずにレジャーの状態データを変更する唯一の機会です。 2. ネガティブUNLが満杯でない場合、各サーバーは信頼度50%未満のバリデータの中から、**最大1つ**のバリデータをネガティブUNLに追加することを提案する。 3. ネガティブUNLが空でない場合、各サーバーはネガティブUNLから**最大1つ**のバリデータを削除することを提案する。サーバーがバリデータをネガティブUNLから削除することを提案できる理由は2つある。 @@ -110,7 +110,7 @@ Vaは、サーバー側のコンセンサス見解と一致した過 ### 検証のフィルタリング -[コンセンサスプロセスの検証ステップ](consensus.html#検証)では、親レジャーのネガティブUNLのバリデータを無効化します。各サーバーは無効化されたバリデータを取り除いた設定済みUNLからなる"有効UNL"を計算し、定足数を再計算します。(定足数は常に有効UNLの80%以上、かつ設定UNLの60%以上です)。無効化されたバリデータが検証票を送信した場合、サーバーは無効化されたバリデータの信頼性を計算するためにその票を追跡するが、あるバージョンのレジャーが合意に達したかどうかを判断するためにその票を使うことはありません。 +[コンセンサスプロセスの検証ステップ](consensus-structure.html#検証)では、親レジャーのネガティブUNLのバリデータを無効化します。各サーバーは無効化されたバリデータを取り除いた設定済みUNLからなる"有効UNL"を計算し、定足数を再計算します。(定足数は常に有効UNLの80%以上、かつ設定UNLの60%以上です)。無効化されたバリデータが検証票を送信した場合、サーバーは無効化されたバリデータの信頼性を計算するためにその票を追跡するが、あるバージョンのレジャーが合意に達したかどうかを判断するためにその票を使うことはありません。 **注記:** ネガティブUNLは、定足数を直接計算するのではなく、定足数の計算元となる信頼できるバリデータの合計を調整するものです。定足数はパーセンテージですが、投票数は整数であるため、信頼できるバリデータの合計を減らしても、定足数に達するために必要な投票数が変わるとは限りません。たとえば、総バリデータが15人である場合、80%はちょうど12人のバリデータである。これを14人に減らすと、80%は11.2人となり、定足数に達するには依然として12人の有効投票者が必要である。 diff --git a/content/concepts/consensus-network/negative-unl.md b/content/concepts/consensus-protocol/negative-unl.md similarity index 95% rename from content/concepts/consensus-network/negative-unl.md rename to content/concepts/consensus-protocol/negative-unl.md index 5fd532c698..a0b9c6282c 100644 --- a/content/concepts/consensus-network/negative-unl.md +++ b/content/concepts/consensus-protocol/negative-unl.md @@ -1,6 +1,6 @@ --- html: negative-unl.html -parent: consensus-network.html +parent: consensus.html blurb: Understand how Negative UNL improves the ledger's resilience during partial outages. labels: - Blockchain @@ -73,7 +73,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](transaction-basics.html) or [pseudo-transaction](pseudo-transaction-types.html). + **Note:** This is one of the only times a ledger's state data is modified without a [transaction](transactions.html) or [pseudo-transaction](pseudo-transaction-types.html). 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: @@ -111,7 +111,7 @@ This mechanism has several useful properties: ### Filtering Validations -During [the validation step of the consensus process](consensus.html#validation), validators in the parent ledger's Negative UNL are disabled. Each server calculates an "effective UNL" consisting of its configured UNL with the disabled validators removed, and recalculates its quorum. (The quorum is always at least 80% of the effective UNL and at least 60% of the configured UNL.) If a disabled validator sends validation votes, servers track those votes for purposes of calculating the disabled validator's reliability measurement, but they do not use those votes towards determining whether a ledger version has achieved a consensus. +During [the validation step of the consensus process](consensus-structure.html#validation), validators in the parent ledger's Negative UNL are disabled. Each server calculates an "effective UNL" consisting of its configured UNL with the disabled validators removed, and recalculates its quorum. (The quorum is always at least 80% of the effective UNL and at least 60% of the configured UNL.) If a disabled validator sends validation votes, servers track those votes for purposes of calculating the disabled validator's reliability measurement, but they do not use those votes towards determining whether a ledger version has achieved a consensus. **Note:** The Negative UNL adjusts the _total_ trusted validators that the quorum is calculated from, not the quorum directly. The quorum is a percentage but the number of votes is a whole number, so reducing the total trusted validators does not always change the number of votes required to reach a quorum. For example, if there are 15 total validators, 80% is 12 validators exactly. If you reduce the total to 14 validators, 80% is 11.2 validators, which means that it still requires 12 validators to reach a quorum. diff --git a/content/concepts/decentralized-exchange/autobridging.md b/content/concepts/decentralized-exchange/autobridging.md deleted file mode 100644 index 519c72f2fa..0000000000 --- a/content/concepts/decentralized-exchange/autobridging.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -html: autobridging.html -parent: decentralized-exchange.html -blurb: Autobriding automatically connects order books using XRP as an intermediary when it reduces costs. -labels: - - XRP - - Decentralized Exchange ---- -# Auto-Bridging - -Any [Offer](offers.html) in the XRP Ledger's [decentralized exchange](decentralized-exchange.html) that would exchange two non-XRP currencies could potentially use [XRP](xrp.html) as an intermediary currency in a synthetic order book. This is because of _auto-bridging_, which serves to improve liquidity across all currency pairs by using XRP when doing so is cheaper than trading those currencies 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 currency 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](payment.html) _do not_ use auto-bridging by default, but path-finding can find [paths](paths.html) that have the same effect. - -## See Also - -- [Dev Blog: Introducing Autobridging](https://xrpl.org/blog/2014/introducing-offer-autobridging.html) - -- [Offer Preference](offers.html#offer-preference) - -- [Payment Paths](paths.html) - - - -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} -{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/introduction/crypto-wallets.md b/content/concepts/introduction/crypto-wallets.md new file mode 100644 index 0000000000..6d0f608f68 --- /dev/null +++ b/content/concepts/introduction/crypto-wallets.md @@ -0,0 +1,48 @@ +--- +html: crypto-wallets.html +parent: intro-to-xrpl.html +blurb: Wallets provide a convenient way of managing your XRP on the XRP Ledger. +labels: + - Blockchain +--- +# Crypto Wallets + +Crypto wallets provide a way to manage your account and funds on the XRP Ledger. There are many wallets to choose from. Choosing the right wallet ultimately comes down to your needs and comfort working with XRP. + + +## Custodial vs Non-custodial Wallets + +A major factor when choosing a wallet is if you want a custodial or non-custodial wallet. + +A custodial wallet means a third party holds your funds, typically on an account they manage on the XRP Ledger. A custodial wallet can be thought of like a bank, where you're trusting another entity to keep your money secure. Many centralized exchanges offer custodial wallets, so when you create an account with them and use their app, you don't technically have an account on the ledger. + +For day-to-day payments, this may be preferable, since these types of wallets are user-friendly: if you forget your password, you can typically have it reset. Also, if you don't have an individual XRP Ledger account, the ledger's reserve requirement doesn't apply to you. The custodian acts a buffer to any issues you run into on the XRP Ledger, and may offer support or assistance if you're not sure how to do something. + +![Custodial vs. Non-custodial Wallets](img/introduction15-custodial-non-custodial.png) + +A non-custodial wallet, such as [XUMM](https://xumm.app/), is one where you have the secret keys to your account. This means you're ultimately responsible for managing the security of your account. + +**Caution:** If you lose your keys, you are locked out of your XRP Ledger account and there are no recovery options. + +Non-custodial wallets allow more freedom. Since you're interacting directly with the XRP Ledger yourself, you can handle any type of transaction you want without anyone restricting your options. If the ledger allows it, you can do it. Non-custodial wallets also don't require you to trust an institution with your money, which can insulate you from market factors outside your control. + +Users of both custodial and non-custodial wallets have to protect themselves from malicious users who might try to steal their funds. With a custodial wallet, you have to manage your login and password to the app or site; with a non-custodial wallet, you have to manage your secret keys to your on-ledger account. In both cases, the wallet provider's own security practices are also important to protect you from vulnerabilities like supply-chain attacks, where an attacker loads malicious code into the wallet through software updates or dependencies. However, custodial wallets can be a bigger target for attackers since they have immediate access to multiple customers' funds. + + +## Hardware vs Software Wallets + +Another deciding factor when choosing a wallet is picking between a hardware or software wallet. + +Hardware wallets are physical devices that store your private/secret keys. The main benefit of using hardware wallets is that you can secure your information by disconnecting it from the internet when it's not in use; hardware wallets totally isolate your keys from easier-to-hack computers or smartphones. + +![Hardware vs. Software Wallets](img/introduction16-hardware-software.png) + +Software wallets on the other hand, are entirely digital. While this makes them easier to use, it also makes them the less secure method of the two, but they usually come with additional features to enhance your experience. Ultimately, the decision between the two will come down to your comfort level and how important ease-of-use is to you. + + +## Creating Your Own Wallet + +The XRP Ledger is an opensource project with publicly available client libraries and API methods. While you can technically interact with the ledger using HTTP/WebSocket tools, it isn't practical for day-to-day use. You can create your own wallet to interact with the ledger, but you'll need to understand exactly how accounts, transactions, and the ledger work together before committing to this option. + + +Next: [Transactions and Requests](txn-and-requests.html) diff --git a/content/concepts/introduction/software-ecosystem.ja.md b/content/concepts/introduction/software-ecosystem.ja.md index fc6b1b9b66..b33f782319 100644 --- a/content/concepts/introduction/software-ecosystem.ja.md +++ b/content/concepts/introduction/software-ecosystem.ja.md @@ -11,7 +11,7 @@ XRP Ledgerは、「価値のインターネット」を推進および実現可 [![4層からなるエコシステムの図: 最下層にはXRP Ledgerのピアツーピアネットワーク、その上にプログラミングライブラリー、次にミドルウェア、そして最上層にアプリとサービスがあります。](img/ecosystem.ja.png)](img/ecosystem.ja.png) -- [XRP Ledgerの基盤](#rippled-コアサーバー)は、トランザクションを共有し、[コンセンサスプロセス](consensus.html)に関与し、[トランザクション](transaction-basics.html)を処理する常時接続のサーバーのピアツーピアネットワークです。XRP Ledgerエコシステム内の他のすべてのものが、最終的にこのピアツーピアネットワーク上に直接、または間接的に構築されます。 +- [XRP Ledgerの基盤](#rippled-コアサーバー)は、トランザクションを共有し、[コンセンサスプロセス](consensus.html)に関与し、[トランザクション](transactions.html)を処理する常時接続のサーバーのピアツーピアネットワークです。XRP Ledgerエコシステム内の他のすべてのものが、最終的にこのピアツーピアネットワーク上に直接、または間接的に構築されます。 - [_プログラミングライブラリー_](#プログラミングライブラリー)は、さらに上位のソフトウェアに存在し、プログラムコードに直接インポートされます。また、XRP Ledgerにアクセスするためのルーチンの実装があらかじめ作成され、組み込まれています。 @@ -47,7 +47,7 @@ XRP Ledger上のミドルウェアサービスの例として、[Data API](data- ### アプリとサービス -最上層は、最もエキサイティングなことが起こる場所です。アプリとサービスは、XRP Ledgerに接続するための手段をユーザーとデバイスに提供します。この層では、[取引所がXRPを上場](list-xrp-as-an-exchange.html)したり、分散型取引所で使用するために[ゲートウェイが他の通貨を発行](become-an-xrp-ledger-gateway.html)したり、あるいはXRPを購入、売却、または単にHODLing保持するためにウォレットがユーザーインターフェイスを提供したりします。さらに高階層にサービスを追加するなど、他にも多くの可能性があります。 +最上層は、最もエキサイティングなことが起こる場所です。アプリとサービスは、XRP Ledgerに接続するための手段をユーザーとデバイスに提供します。この層では、[取引所がXRPを上場](list-xrp-as-an-exchange.html)したり、分散型取引所で使用するために[ゲートウェイが他の通貨を発行](stablecoin-issuer.html)したり、あるいはXRPを購入、売却、または単にHODLing保持するためにウォレットがユーザーインターフェイスを提供したりします。さらに高階層にサービスを追加するなど、他にも多くの可能性があります。 XRPだけでなく、通貨価値を表す他のさまざまな方法と互換性のあるアプリケーションを構築するには、XRPでの決済に[Interledger Protocol][]を使用するのが最適です。 diff --git a/content/concepts/introduction/software-ecosystem.md b/content/concepts/introduction/software-ecosystem.md index 5c25ff18bc..5cdc3e2a27 100644 --- a/content/concepts/introduction/software-ecosystem.md +++ b/content/concepts/introduction/software-ecosystem.md @@ -7,60 +7,60 @@ labels: --- # Software Ecosystem -The XRP Ledger is home to a deep, layered ecosystem of software projects powering and enabling an Internet of Value. It's impossible to list every project, tool, and business that interacts with the XRP Ledger, so this page only lists a few categories and highlights some central projects that are documented here on [xrpl.org](https://xrpl.org). +The XRP Ledger is home to a deep, layered ecosystem of software projects powering and enabling an Internet of Value. It's impossible to list every project, tool, and business that interacts with the XRP Ledger, so this page only lists a few categories and highlights some central projects that are documented on this website. +![The XRPL Ecosystem](img/ecosystem-apps-and-services.svg) ## Stack Levels -{{ include_svg("img/ecosystem.svg", "Ecosystem diagram with the four layers: XRP Ledger peer-to-peer network on the bottom, Programming Libraries above that, Middleware next, and Apps and Services at the top") }} +- [_Core Servers_](#core-servers) form the basis of the XRP Ledger, a peer-to-peer network relaying and processing transactions at all times. -- The [basis of the XRP Ledger](#rippled-the-core-server) is a peer-to-peer network of always-on servers sharing transactions, engaging in the [consensus process](consensus.html) and processing [transactions](transaction-basics.html). Everything else in the XRP Ledger ecosystem is ultimately built on top of this peer-to-peer network, directly or indirectly. - -- [_Programming Libraries_](#programming-libraries) exist in higher level software, where they are imported directly into program code, and contain methods to access the XRP Ledger. +- [_Client Libraries_](#client-libraries) exist in higher level software, where they are imported directly into program code, and contain methods to access the XRP Ledger. - [_Middleware_](#middleware) provides indirect access to XRP Ledger data. Applications in this layer often have their own data storage and processing. - [_Apps and Services_](#apps-and-services) provide user-level interaction with the XRP Ledger, or provide a basis for even higher-level apps and services. -### rippled: The Core Server +### Core Servers -The peer-to-peer network at the heart of the XRP Ledger requires a highly-reliable, efficient server to enforce the rules of consensus and transaction processing. XRPL Foundation manages and publishes a reference implementation of this server software, called [**`rippled`**](xrpl-servers.html) (pronounced "ripple-dee"). The server is available under [a permissive open-source license](https://github.com/ripple/rippled/blob/develop/LICENSE.md), so anyone can inspect and modify their own instance of the server, and re-publish with few restrictions. +The peer-to-peer network at the heart of the XRP Ledger requires a highly-reliable, efficient server to enforce the rules of consensus and transaction processing. The XRP Ledger Foundation publishes a reference implementation of this server software, called [**`rippled`**](xrpl-servers.html) (pronounced "ripple-dee"). The server is available under [a permissive open-source license](https://github.com/XRPLF/rippled/blob/develop/LICENSE.md), so anyone can inspect and modify their own instance of the server, and re-publish with few restrictions. -Every instance of `rippled` syncs to the same network (unless it's configured to follow a [parallel network such as a test net](parallel-networks.html)) and has access to all communications across the network. Every `rippled` server on the network keeps a complete copy of the latest state data for the entire XRP Ledger, along with a slice of recent transactions and a record of the changes those transactions made, and every server processes every transaction independently while verifying that its outcome matches the rest of the network. Servers can be configured to keep more [ledger history](ledger-history.html) and to participate in the consensus process as a [validator](rippled-server-modes.html#validators). +![Core Servers](img/ecosystem-peer-to-peer.svg) -This server exposes [`rippled` APIs](http-websocket-apis.html) for users to look up data, administer the server, and submit transactions. +Every core server syncs to the same network (unless it's configured to follow a [test network](parallel-networks.html)) and has access to all communications across the network. Every server on the network keeps a complete copy of the latest state data for the entire XRP Ledger, along with recent transactions and a record of the changes those transactions made, and every server processes every transaction independently while verifying that its outcome matches the rest of the network. Servers can be configured to keep more [ledger history](ledger-history.html) and to participate in the consensus process as a [validator](rippled-server-modes.html#validators). -### Programming Libraries +Core servers expose [HTTP / WebSocket APIs](http-websocket-apis.html) for users to look up data, administer the server, and submit transactions. Some servers also serve HTTP / WebSocket APIs but don't connect directly to the peer-to-peer network and don't process transactions or participate in consensus. These servers, such as `rippled` servers running in Reporting Mode and Clio servers, rely on a core server in P2P mode to process transactions. -[Programming libraries](client-libraries.html) are not strictly required to access XRP Ledger data, since you can use HTTP or WebSocket to connect to the [`rippled` APIs](http-websocket-apis.html) directly. Libraries simplify some of the common work of accessing the `rippled` APIs, and convert the data into forms that are easier to understand and program with in the programming language of the library. -[xrpl.js for JavaScript](get-started-using-javascript.html) (formerly called "ripple-lib") is the longest-standing, most well-supported library for accessing the XRP Ledger. Many [middleware services](#middleware) use programming libraries like this internally. +### Client Libraries + +Libraries simplify some of the common work of accessing the XRP Ledger, usually through the HTTP / WebSocket APIs. They convert the data into forms that are more familiar and convenient for various programming languages, and include implementations of common operations. + +![Client Libraries](img/ecosystem-client-libraries.svg) + +One core feature of most client libraries is signing transactions locally, so users never have to send their private key across any network. + +Many middleware services use client libraries internally. + +See [Client Libraries](client-libraries.html) for some information about currently available client libraries. + ### Middleware Middleware services are programs that consume the XRP Ledger APIs on one side and provide their own APIs on the other side. They provide a layer of abstraction to make it easier to build higher-level applications by providing some common functionality as a service. -Unlike [programming libraries](#programming-libraries), which are instantiated fresh and shut down with the program that imports them, middleware services typically stay running indefinitely, and may have their own databases (relational SQL databases or otherwise) and configuration files. +![Middleware](img/ecosystem-middleware.svg) -The [Data API](data-api.html) is an example of a middleware service on top of the XRP Ledger. The Data API collects and transforms XRP Ledger data, so that you can query by time, filter by data type, or perform data analysis. - -[XRP-API](xrp-api.html) is another middleware service. XRP-API manages secret keys and provides a more convenient RESTful interface to the XRP Ledger for apps in any programming language. +Unlike client libraries, which are instantiated fresh and shut down with the program that imports them, middleware services typically stay running indefinitely, and may have their own databases (relational SQL databases or otherwise) and configuration files. Some are available as cloud services with various pricing or usage limitations. ### Apps and Services -Atop the stack is where the truly exciting things happen. Apps and services provide a way for users and devices to connect to the XRP Ledger. At this level, [exchanges list XRP](list-xrp-as-an-exchange.html), [gateways issue other currencies](become-an-xrp-ledger-gateway.html) for use in the decentralized exchange, and wallets provide user interfaces for buying, selling, or HODLing holding XRP. Many other possibilities exist, including additional services layered even higher. +Atop the stack is where the truly exciting things happen. Apps and services provide a way for users and devices to connect to the XRP Ledger. Services like private exchanges, token issuers, marketplaces, interfaces to the decentralized exchange, and wallets provide user interfaces for buying, selling, and trading various assets including XRP and tokens of all kinds. Many other possibilities exist, including additional services layered even higher. -A great way to build applications that are compatible with not only XRP but lots of other ways of denominating value is to use the [Interledger Protocol][] with settlement in XRP. +![Apps and Services](img/ecosystem-apps-and-services.svg) -There are many other examples of projects using XRP and adjacent technologies to interact with users. For some examples, see [Businesses](businesses.html), [Exchanges](exchanges.html), and [Wallets](wallets.html). - - -## See Also - -- [RippleX](https://ripplex.io/) -- [Technical FAQ](technical-faq.html) -- [XRPChat Links & Resources](https://www.xrpchat.com/links/) - Includes updated lists of gateways and exchanges, wallets and storage, apps, and more. +See [Use Cases](use-cases.html) for some examples that can be built at or above this layer. {% include '_snippets/rippled-api-links.md' %} diff --git a/content/concepts/introduction/txn-and-requests.md b/content/concepts/introduction/txn-and-requests.md new file mode 100644 index 0000000000..326f99850e --- /dev/null +++ b/content/concepts/introduction/txn-and-requests.md @@ -0,0 +1,115 @@ +--- +html: txn-and-requests.html +parent: intro-to-xrpl.html +blurb: All interactions with the ledger are either transactions or requests. +labels: + - Blockchain +--- + +# Transactions and Requests + +Most interactions with the XRP Ledger involve either sending a transaction that makes changes to the ledger or sending a request for information from the ledger. You can also subscribe to monitor continual notifications of interest. + +## How Do Transactions Work? + +Use transactions to make changes on the ledger such as transferring XRP and other tokens between accounts; minting and burning NFTs; and creating, accepting, and cancelling offers. You execute a transaction by sending a command to the XRP Ledger and watching for confirmation that the transaction is complete. The command syntax format is the same for every transaction. + +- You must always provide the _TransactionType_ and the public address of the _Account_ making the transaction. + +- Two required fields are the _Fee_ for the transaction and the next _Sequence_ number for transactions from the account. These fields can be filled in automatically. + +- Transactions can also have required fields specific to the transaction type. For example, a _Payment_ transaction requires an _Amount_ value (in _drops_, or millionths of an XRP) and a _Destination_ public address to which the funds are credited. + +Here is a sample transaction in JSON format. This transaction transfers 1 XRP from account _rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn_ to destination account _ra5nK24KXen9AHvsdFTKHSANinZseWnPcX_. + +```json +{ + "TransactionType": "Payment", + "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + "Amount": "1000000", + "Destination": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX" +} +``` + +Optional fields are available for all transactions, with additional fields available for specific transactions. You can include as many optional fields as you need, but do not have to include every field in every transaction. + +You send the transaction to the ledger as a command from JavaScript, Python, the command line, or any compatible service. The rippled servers propose transactions to the XRPL. + +![Proposed Transacations](img/introduction17-gather-txns.png) + +When 80% of the validators approve a current set of proposed transactions, they are recorded as part of the permanent ledger. The rippled server returns the results of the transaction you sent. + +For more information on Transactions, see [Transactions](transactions.html). + +## How Do Requests Work? + +Requests are used to get information from the ledger, but they do not make changes to the ledger. The information is freely available to anyone to view, so there is no need to sign in with your account information. + +The fields you send vary with the type of information you request. They typically have several optional fields, but only a few required fields. + +When you submit your request, it might be processed by a rippled server or by a Clio server, a server that is dedicated to responding to requests. + +![Clio Server](img/introduction19-clio.png) + +Clio servers take some of the load off the other rippled servers on the XRPL to improve processing speed and reliability. + +This is a sample request in JSON format. This request gets the current account information for the account number you provide. + +```json +{ + "command": "account_info", + "account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn" +} +``` + +The request returns a wealth of information. Here is an example response for an account information request in JSON format. + +```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 + }, + ... (trimmed for length) ... + { + "LastLedgerSequence": 10, + "auth_change": true, + "fee": "100", + "fee_level": "2560", + "max_spend_drops": "100", + "seq": 10 + } + ], + "txn_count": 5 + }, + "status": "success", + "validated": false + } +} +``` +For information on the fields in an Account record, see [Accounts](accounts.html). + +Next: [Software Ecosystem](software-ecosystem.html) + diff --git a/content/concepts/introduction/what-is-the-xrp-ledger.md b/content/concepts/introduction/what-is-the-xrp-ledger.md new file mode 100644 index 0000000000..b29ff97bbd --- /dev/null +++ b/content/concepts/introduction/what-is-the-xrp-ledger.md @@ -0,0 +1,69 @@ +--- +html: what-is-the-xrp-ledger.html +parent: introduction.html +blurb: Learn about the XRP Ledger (XRPL) blockchain. +labels: + - Blockchain +--- +# What is the XRP Ledger? + +The XRP Ledger is a decentralized blockchain that uses its own digital currency to process and record financial transactions. + + +## What Is a Blockchain? + +A blockchain is a continuously growing list of records. The blockchain starts with a block of data. + +![A block of data](img/introduction2-data-block.png) + +A group of trusted validator nodes reach consensus that the data is valid. + +![Validator nodes](img/introduction3-validators.png) + +The block is uniquely identified with a very elaborate, complicated, computer-generated, cryptographic Hash number that is 64 hexadecimal characters long. + +![Crypto hash](img/introduction4-hash.png) + +The block is also identified by a timestamp with its creation time. + +![Timestamp](img/introduction5-time-stamp.png) + +Each validator node gets its own copy of the data block. There is no single central authority. All copies are equally valid. + +![Validators with valid copies](img/introduction6-valid-copies.png) + +Each block contains a hash pointer as a link to the previous block. It also has a timestamp, new data, and its own unique hash number. + +![Hash pointer](img/introduction7-two-blocks.png) + +Using this structure, each block has a clear position in the chain, linking back to the previous data block. This creates an immutable chain of blocks. You can always verify all current information on the chain by tracing back through the previous blocks. + +![Three data blocks](img/introduction8-3-blocks.png) + +By design, blockchains are resistant to modification of the data. Every ledger node gets an exact copy of the blockchain. + +![Two validators with identical copies of the blockchain](img/introduction9-2-sets-of-3.png) + +This creates an open, distributed ledger that records transactions between parties efficiently and in a verifiable and permanent way. + +Once recorded, the data in any given block cannot be altered retroactively, unless a majority of the validators agree to the change. If so, all subsequent blocks are changed in the same way (a very rare and extreme occurrence). + +### How Does the Federated Consensus Process Work? + +Most of the rippled servers in the XRPL monitor or propose transactions. An important subset of servers are run as validators. These trusted servers accumulate lists of new transactions into a new possible ledger instance (a new block in the block chain). + +![Gathering Transactions](img/introduction17-gather-txns.png) + +They share their lists with all of the other validators. The validators incorporate proposed changes from one another and distribute a new version of the ledger proposal. + +![80% Consensus](img/introduction18-80-percent-consensus.png) + +When 80% of the validators agree on a set of transactions, they create a new ledger instance at the end of the chain and start the process again. This consensus process takes 4-6 seconds. You can monitor as ledger instances are created in real time by visiting [https://livenet.xrpl.org/](https://livenet.xrpl.org/). + +### What Networks Are Available? + +The XRPL is open to anyone who wants to set up their own instance of the rippled server and connect. The node can monitor the network, perform transactions, or become a validator. The active XRPL network is typically referred to as _Mainnet_. + +For developers or new users who want to try out the features of XRPL without investing their own funds, there are two developer environments, _Testnet_ and _Devnet_. Users can create an account funded with 1,000 (fake) XRP and connect to either environment to interact with the XRPL. + +Next: [What is XRP?](what-is-xrp.html) diff --git a/content/concepts/introduction/what-is-xrp.md b/content/concepts/introduction/what-is-xrp.md new file mode 100644 index 0000000000..8e19da4aad --- /dev/null +++ b/content/concepts/introduction/what-is-xrp.md @@ -0,0 +1,73 @@ +--- +html: what-is-xrp.html +parent: introduction.html +blurb: Learn about XRP, the cryptocurrency traded on the XRP Ledger. +labels: + - Blockchain +--- +# What is XRP? + +XRP is the cryptocurrency supported by the XRP Ledger. + +## What Is Cryptocurrency? + +A cryptocurrency is a digital or virtual currency that is secured by cryptography and tracked using a blockchain. The security and integrity of cryptocurrency makes it nearly impossible to counterfeit or double-spend. + +![XRP on the blockchain](img/introduction10-xrp-on-chain.png) + +Cryptocurrencies, digital currencies, and digital assets all fall into the same general category. Cryptocurrencies are: + +- digitally native (meaning they are built for the internet) +- programmable +- fast to transfer at a low cost +- open and transparent +- not restricted by borders or governments (so no need for nostro accounts that hold funds in another country) +- not subject to counterfeit +- do not require a bank account or infrastructure to settle payments. + +![Advantages of cryptocurrencies](img/introduction11-all-the-things.png) + +Cryptocurrencies are _fungible tokens_. _Fungible_ means that you can replace one token with other tokens of equal value. Postage is an example of a fungible token: if it costs 50 cents to mail a letter, you can use 2 25-cent stamps or 5 10-cent stamps for the postage, because postage stamps are fungible (consistent in relative value and interchangeable). + +Cryptocurrencies are also decentralized. There’s no central authority governing the currency. Once a transaction is on the blockchain you cannot change it. It is difficult to censor cryptocurrency: so long as the system is sufficiently decentralized, no one can roll back transactions, freeze balances, or block someone from using a decentralized digital asset. Rules do not change without significant coordination among all participants. + +Cryptocurrencies are compelling for investors and developers because no single entity can “pull the plug” on them and have them disappear. + +## But Why Is It Valuable? + +![Advantages of cryptocurrencies](img/introduction12-diamond.png) + +It might seem strange that cryptocurrency is based solely on computer data, and not on any sort of tangible commodity such as precious metal. Traditionally, currencies have been based on cattle, sea shells, rare metals, stones, or other physical objects. But these items have value only because there was agreement between people in a culture. + +While it might seem safer to have something “real” in your hand, many people wouldn’t know fool’s gold from the actual thing, or cubic zirconia from a genuine diamond. Paper money can be counterfeit. You can forget you have a $10 bill in your pocket and ruin it in the wash. It is costly to safely store and transport valuable items for payment. + +The value of cryptocurrency comes from the faith that holders place in the currency. Given the distributed nature of the records and the cryptographic safeguards to secure the funds, cryptocurrency could be considered a much more robust, secure, and convenient form of currency than traditional fiat currencies. + + +## XRP is Cryptocurrency + +The XRP Ledger was built over 2011 – early 2012 by Jed McCaleb, Arthur Britto and David Schwartz. At the time of its creation, there were 100 billion XRP. In September 2012, Jed and Arthur, along with Chris Larsen formed Ripple (the company, called OpenCoin Inc. at the time) and decided to gift 80 billion XRP to Ripple in exchange for Ripple developing on the XRP Ledger. + +![One Hundred Billion with a "B"](img/introduction14-hundred-billion.png) + +Since then, the company has regularly sold XRP, used it to strengthen XRP markets and improve network liquidity, and incentivized development of the greater ecosystem. In 2017, the company placed [55 billion XRP in 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) to ensure that the amount entering the general supply [grows predictably](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) for the foreseeable future. Ripple's [XRP Market Performance site](https://ripple.com/xrp/?__hstc=78174987.8aa695b6d0420a940041f1842edfd8a6.1692378128025.1692644550213.1692652561840.8&__hssc=78174987.3.1692652561840&__hsfp=3379522993) reports how much XRP the company has available and locked in escrow at present. + +![Man with one XRP](img/introduction13-x-prefix.png) + + +### Naming + +Originally, the XRP Ledger was called "Ripple" for the way the technology allowed payments [to ripple through multiple hops and currencies](rippling.html). For the native asset built into the ledger, the creators chose the ticker symbol "XRP" from the term "ripple credits" or "ripples" and the X prefix for non-national currencies in the [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) standard. The company registered itself as "Ripple Labs". The name "XRP" came to be used to refer to the asset in all contexts, to avoid confusion with the similar names for the technology and company, and eventually the company shortened its own name to "Ripple". In May 2018, [the community selected a new "X" symbol](https://twitter.com/xrpsymbol/status/1006925937571713025) to represent XRP to differentiate it from the triskelion logo that had previously been used for both the company and the digital asset. + +| XRP "X" Logo | Ripple triskelion | +|:---------------------------------------|:------------------------------------| +| !["X" logo](assets/img/xrp-x-logo.png) | ![Triskelion](img/ripple-triskelion.png) | + + +### Trademark + +"XRP" is a registered trademark of the XRPL Foundation in the U.S.A. and other countries like China and Estonia. + +The trademark application was registered with the United States Patent and Trademark Office (USPTO) in 2013 with OpenCoin Inc and Ripple Labs Inc as assignees. In 2022, the trademark assignment was updated and is now assigned to the MITTETULUNDUSÜHING XRP LEDGER TRUST (“XRPLF”). + +Next: [Crypto Wallets](crypto-wallets.html) \ No newline at end of file diff --git a/content/concepts/introduction/xrp-ledger-overview.ja.md b/content/concepts/introduction/xrp-ledger-overview.ja.md deleted file mode 100644 index f4c6790a1a..0000000000 --- a/content/concepts/introduction/xrp-ledger-overview.ja.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -html: xrp-ledger-overview.html -parent: introduction.html -blurb: XRP Ledgerの基本機能を簡単に紹介します。 -labels: - - ブロックチェーン - - XRP ---- -# XRP Ledgerの概要 - -**XRP Ledger**は、ピアツーピア・サーバーのネットワーク機能を備えた分散型の暗号台帳です。XRP Ledgerは**XRP**の土台となるものであり、世界中で使用されている様々な通貨の橋渡しをするために設計されたデジタル資産です。RippleはXRP Ledgerの開発を主導し、_「価値のインターネット」_(情報が移動するようにお金が移動する世界)の実現に向けて鍵となる役割を果たすと期待されるXRPを推進しています。 - -## 決済のためのデジタル資産 - -XRPはXRP Ledger固有のデジタル資産です。暗号鍵を持ち、インターネットに接続できる人は誰でも、XRPを受け取り、保持し、任意の人に送ることができます。XRPは他の通貨での取引をも容易にできる魅力的なブリッジ通貨として開発されました。XRPには次のような多くの特性があり、これにより他の多くのユースケースでも魅力的な資産となっています。 - -- **[耐検閲性のある取引処理][]:** どの特定の個人もXRP取引の成功・不成功を勝手に決定することはできませんし、一度完了した取引を組み戻すこともできません。ネットワークに参加するユーザーは、ネットワークを健全に保っている限り、XRPを数秒で送受信できます。 -- **[高速で効率的なConsensusアルゴリズム][]:** XRP LedgerのConsensusアルゴリズムは、最大1500件/秒のスループットで取引を処理し、4秒から5秒で完了します。これらの特性により、XRPは、他の上位デジタル資産の少なくとも10倍の優位性をもっています。 -- **[限定されたXRP供給量][]:** XRP Ledgerが開始された時、1000億XRPが発行され、今後さらにXRPが発行されることはありません。(各XRPは、小数第6位まで再分割でき、総計10万兆(10の17乗)_drop_(XRPの最小単位)となります。)取引に必要なコストを支払うために少額のXRPが毎回消却され、使用可能なXRPの供給量は時間とともにゆっくりと減少していきます。 -- **[責任あるソフトウェアガバナンス][]:** Rippleでは、世界に通用する技術をもった常勤の開発チームが、XRP Ledgerの基礎となるソフトウェアを保守し、継続的に改良しています。Rippleは、技術の担い手として、さらに技術に対する支援者として、世界中の政府および金融機関と建設的な関係を築いています。 -- **[安全で適応性のある暗号技術][]:** XRP Ledgerは、ECDSA(Bitcoinが使用しているものと同じアルゴリズム)などの業界標準のデジタル署名システムを利用しています。またEd25519などの最新の効率的なアルゴリズムもサポートしています。XRP Ledgerのソフトウェアは拡張性に富み、最先端の暗号技術の進歩に合わせてアルゴリズムを追加したり消却にしたりすることが可能です。 -- **[スマートコントラクト用の最新機能][]:** Escrow、ChecksおよびPayment Channelなどの機能は、[Interledgerプロトコル](https://interledger.org/)を含む最新の金融アプリケーションをサポートしています。この拡張機能のツールボックスには、ネットワークの修正プロセスや、取引の不変性を担保するチェックを分けて行うなどの安全機能が備わっています。 -- **[台帳上の分散型取引所][]:** XRP Ledgerには、それ自体でXRPを便利に使うための機能すべてに加え、ユーザー任意の通貨建ての債務を追跡し取引するための多機能な会計システムや、プロトコルに組み込まれた両替機能などがあります。XRP Ledgerは、通貨間の長い支払いパスや、複数通貨の一元的決済を確実に処理し、XRPを活用することで分散型ネットワークに存在する信頼のギャップを解消しています。 - -## 耐検閲性のある取引処理 -[耐検閲性のある取引処理]: #耐検閲性のある取引処理 - -XRPは、Bitcoinや他の暗号資産と同様に新しい通貨の一種です。 - -- これらの**分散型デジタル資産**はそれぞれのコンピューターシステム上に存在し、これを管理する中央管理者はいません。システムが十分に分散されている限り、取引を組み戻したり、残高を凍結したり、他のユーザーが分散型デジタル資産を使用することを阻止したりすることはできません。これらの資産はもともとデジタルであるため、離れた場所からもオンラインで使用できます。 - -これは物理的な通貨と中央集権型デジタル通貨の良い部分を併せ持っていることを意味します。2009年にBitcoinが発明されるまでは、すべての通貨は次の2つのカテゴリに分類できました。 - -- **物理的な硬貨および紙幣**。これは、中央の管理者を経由せずに、個人が決済するために使用できます。ただし、物理的なものであるためオンラインでは使用できず、長距離のビジネスで使うには時間がかかり不便です。 -- **中央集権型デジタル通貨**。これには、取引を承認する管理者が必要です。管理者には、取引の検閲や組み戻しの権限、また一部の個人がデジタル通貨を使用することを許可しない権限もあります。デジタル通貨の運営者は、誰かが利用規約に違反したことが判明した場合、その個人の通貨を凍結したり没収したりすることもできます。ただし、これらの通貨の残高はデジタルであるためオンラインで使用でき、離れた場所の取引にも便利です。 - -**注記:** XRP Ledgerのユーザーは、XRP Ledgerで発行されたXRP以外の通貨であれば凍結 _できます_ 。詳細は、[凍結についての資料](freezes.html)を参照してください。 - -信頼できるバリデータノードから構成されるXRP Ledgerのシステムでは、人手をほとんどかけることなく、他の分散型システムよりも優れた権限の分散が可能です。不特定多数の参加者間でのConsensusを完全に自動化しているシステムは、議決権の集中のリスクに晒されます。例えば、Bitcoinの採掘は、電気代が安い場所に偏って集中しています。Rippleは、様々な地域の異なる組織によって運営される別個のバリデータリストを管理しています。そのためXRP Ledgerは検閲などの外部の圧力に対してプルーフ・オブ・ワークによる採掘よりも高い耐性を持つことができます。推奨されるバリデータを分散させるためのRippleの対応策の詳細は、[分散化戦略についてのアップデート](https://xrpl.org/blog/2017/decent-strategy-update.html)を参照してください。 - -XRP Ledgerの検閲機能の詳細は、[取引検閲の検知](transaction-censorship-detection.html)を参照してください。 - - -## 高速で効率的なConsensusアルゴリズム -[高速で効率的なConsensusアルゴリズム]: #高速で効率的なconsensusアルゴリズム - -XRP Ledgerが多くの暗号資産と最も異なっている点は、BitcoinやEthereumなど他のほとんどのシステムが行う「採掘」の時間と労力を必要とせず、独自のConsensusアルゴリズムを使用していることです。「プルーフ・オブ・ワーク」または「プルーフ・オブ・ステーク」の代わりに、XRP LedgerのConsensusアルゴリズムでは、すべての参加者が重複する「信頼されるバリデータ」のリストを持ち、どの取引がどの順序で発生したかについて効率的に合意するシステムとなっています。2018年の初めの時点で、Bitcoinネットワークが取引ごとに使用する電力量は、米国の一世帯の住宅で1日に使用される量よりも多く、さらに取引の承認には何時間もかかっています。1つのXRP取引で使用される電力量はごく少量であり、承認には4秒から5秒しかかかりません。 - -さらに、XRP Ledgerのそれぞれの新しい「台帳バージョン」(「ブロック」と同義)には、すべての残高が完全かつ最新の状態で保持されているため、サーバーは、何時間もかけてすべての取引履歴をダウンロードして再処理する必要がなく、数分でネットワークと同期することができます。 - -XRP LedgerのConsensusアルゴリズムの動作方法の詳細は、[XRP Ledger Consensusプロセス](consensus.html)を参照してください。XRP LedgerがこのConsensusアルゴリズムを使用する理由の背景は、[Consensusの原理とルール](consensus-principles-and-rules.html)を参照してください。 - - -## 限定されたXRP供給量 -[限定されたXRP供給量]: #限定されたxrp供給量 - -戦争および政変と並んで、超インフレは通貨が消滅する主な原因の1つです。バリデータが分散しているため、XRPは政治的要因に対してはある程度の耐性があります。一方、超インフレに対しては、XRP Ledgerのルールにより簡潔なソリューションで対応しています。つまりXRPのトータル供給量の限定です。発行量を増やすメカニズムがそもそもないため、XRPが超インフレに悩まされる可能性は非常に低くなります。 - -市場に出回るXRPの供給量は、次のいくつかの要因によって変化 _します_。 - -- XRP Ledgerで取引を送信すると、毎回少額のXRPが消却されます。送信者は消却する額を選択できますが、予想される取引の処理作業とネットワークの混雑度に応じて一定の最低額が設定されています。ネットワークが混み合っている場合、より多くのXRPを消却するよう選択している取引は、取引キューの前に割り込むことができます。これはスパム防止策で、XRP Ledgerネットワークに対する[DDoS](https://en.wikipedia.org/wiki/Denial-of-service_attack)攻撃にかかるコストは極めて高額になります。詳細は、[取引コスト](transaction-cost.html)を参照してください。 -- XRP Ledgerの各アカウントは、少額のXRPを準備しておく必要があります。これもスパム防止策で、台帳データが必要以上に増えてしまうことを防ぎます。XRP Ledgerのバリデータは、実世界でのXRPの価値の変動に対応する目的で、準備金として必要なXRPの金額を変更するために投票決議を行うことができます。(この投票が前回発生したのは2021年の9月であり、このときは[必要な準備金が20 XRPから10 XRPに減少しました](https://xrpl.org/blog/2021/reserves-lowered.html)。)必要な準備金が減少すると、以前は準備金によって使用できなくなっていた部分のXRPが再び使用可能になります。 -- Ripple(会社)は、大量のXRPをEscrowに保有しています。毎月の初めに、Rippleで使用するために10億XRPがEscrowから引き出されます。(RippleはXRPを使用してXRP Ledgerエコシステムの成長を促し、また一部のXRPを機関投資家に売却しています。Rippleはまた、取引所での取引総量のうちのわずかな比率に限定して、プログラムに従って取引所でXRPを売却しています。Rippleは[XRP市場レポート](https://ripple.com/insights/q1-2018-xrp-markets-report/)で四半期ごとに売上高を公開しています。)毎月の終わりに、Rippleが売却や譲渡をせずに残っているXRPがあればEscrowに戻し、54か月保管します。RippleのEscrowポリシーの詳細は、[RippleはXRPの総供給量の確実性を確保するために550億XRPをエスクローに預託することを発表しました](https://ripple.com/insights/ripple-to-place-55-billion-xrp-in-escrow-to-ensure-certainty-into-total-xrp-supply/)を参照してください。Escrow機能の技術的詳細は、[Escrow](escrow.html)を参照してください。 - - - -## 責任あるソフトウェアガバナンス -[責任あるソフトウェアガバナンス]: #責任あるソフトウェアガバナンス - -ソフトウェアの水準は、そのソフトウェアを作成して管理する開発者によって決まります。Rippleは、XRP Ledgerソフトウェア、特にコアサーバーである`rippled`の保守および改良に専念する優秀な常勤エンジニアチームを雇用しています。[`rippled`のソースコード](https://github.com/ripple/rippled/)は、XRP Ledgerエコシステムの他の多くの部分と同様に、一般利用が可能なオープンソースライセンスを有するソフトウェアとして公開されています。Rippleのエンジニアは、次のようなソフトウェアエンジニアリングのベストプラクティスに従っています。 - -- 慎重で徹底的なコードレビュープロセス -- 包括的なコードカバレッジと単体テスト -- 潜在的な脆弱性およびメモリーリークの自動チェックの定期的な実行 -- 専門家組織による外部レビューヘの定期的な委託 - -巨額のXRPを長期にわたって保持する義務がある組織として、Rippleは、XRPが法に準拠して持続的かつ建設的な方法で広く使用されるために努力する強い自発的なインセンティブを持っています。「価値のインターネット」というRippleの理想と同じ目標を持つ企業に対して、Rippleは技術的なサポートを提供します。Rippleはまた、世界中の立法当局や規制当局と協力し、デジタル資産および関連ビジネスを管理する合理的な法律の実施に向けて誘導しています。 - - -## 安全で適応性のある暗号技術 -[安全で適応性のある暗号技術]: #安全で適応性のある暗号技術 - -暗号技術は分散システムにおいて最も重要な部分の1つであり、小さな技術的問題が一瞬にして世界中の悪意あるハッカーによる盗難につながる危険性を秘めています。XRP Ledgerは、取引の署名および検証のための業界標準の技術と、何年もの間、数千億USドルにも相当する価値を保護することに成功してきたアルゴリズムを使用しています。また、XRP Ledgerにはマルチシグ機能が備わっているため、バックアップとして多要素認証や複数のユーザー間で分割キーを使用できます。さらに暗号技術の飛躍的な進歩によって古いアルゴリズムが時代遅れになり、新しいアルゴリズムが導入される場合でも、ユーザーはそのままキーを使い続けることができます。 - -詳細は、[暗号鍵](cryptographic-keys.html)および[マルチシグ](multi-signing.html)を参照してください。 - - -## スマートコントラクト用の最新機能 -[スマートコントラクト用の最新機能]: #スマートコントラクト用の最新機能 - -[XRP決済](direct-xrp-payments.html)による単純な価値の移動に加え、XRP Ledgerには「価値のインターネット」に特化した拡張機能があります。この拡張機能により、XRP上にビルドされたアプリケーションは、以前は実用的でなかったり実現不可能だったりしたサービスや機能を提供できるようになります。ネットワーク自体のなかで「スマートコントラクト」としてのアプリケーションを実行するのではなく、XRP Ledgerでは、コントラクトを処理するためのツールを提供しつつ、実行環境またはコンテナが適切であれば、すべての場所でアプリケーションを実行することができます。この「シンプルにする」というアプローチは、柔軟でスケーラブル、かつ強力です。 - -XRP Ledgerの拡張機能として次のものがあります。 - -- [Payment Channel](use-payment-channels.html)により、非同期の残高を署名の作成、検証とほぼ同時に変更することができます。 -- [Escrow](escrow.html)により、宣言した時間が経過するまで、または暗号条件が満たされるまで、XRPはロックされます。 -- [DepositAuth](depositauth.html)により、ユーザーは自分に対して送金できる相手か、送金できない相手かを決めることができます。 -- [分散型取引所](#台帳上の分散型取引所)により、ユーザーは台帳上で債務およびXRPを取引することができます。 -- [Invariant Checking](https://xrpl.org/blog/2017/invariant-checking.html)により、独立したレイヤーで取引実行時のバグから取引を保護することができます。 -- [Amendment](amendments.html)により、現行機能にスムーズにアップグレードすることができ、移行に際してエコシステムに被害を及ぼしたり、不確定要素を発生させることなく、継続して技術を発展させることができます。 - - -## 台帳上の分散型取引所 -[台帳上の分散型取引所]: #台帳上の分散型取引所 - -XRP Ledgerを他の暗号資産ネットワークとは異なるものにしている最も大きな特徴は、XRP Ledger上に完全な取引機能が含まれている点です。このシステム内で、事業者(通常は「ゲートウェイ」と言います)は希望の通貨を顧客に自由に発行でき、その顧客はその特定ゲートウェイによってXRPに発行された通貨や他のゲートウェイによって発行された通貨を自由に取引できます。このようにXRP Ledgerでは、取引注文によって流動性を確保しつつ、複数通貨間の一元的な取引を実行することができます。 - -分散型取引所がどのように機能するかの詳細は、[分散型取引所](decentralized-exchange.html)を参照してください。ゲートウェイビジネスモデルの詳細は、[Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html)を参照してください。 diff --git a/content/concepts/introduction/xrp-ledger-overview.md b/content/concepts/introduction/xrp-ledger-overview.md deleted file mode 100644 index b6a93e53e1..0000000000 --- a/content/concepts/introduction/xrp-ledger-overview.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -html: xrp-ledger-overview.html -parent: introduction.html -blurb: Get a quick and concise introduction to key features of the XRP Ledger. -labels: - - Blockchain - - XRP ---- -# XRP Ledger Overview - -The **XRP Ledger** is an online system for payments, powered by a community without a central leader. Anyone can connect their computer to the peer-to-peer network that manages the ledger. The XRP Ledger is the home of **XRP**, a digital asset designed to bridge the world's many currencies. The XRP Ledger is one part of the developing _Internet of Value_: a world in which money moves the way information does today. - -## The Digital Asset for Payments - -XRP is a digital asset native to the XRP Ledger. Anyone with a cryptographic key and an internet connection can receive, hold, and send XRP to anyone else. XRP's creators have developed it to be a desirable bridge currency that can enable trades in any other currency. XRP has many properties which make it an appealing asset for many other use cases, too: - -- **[Censorship-Resistant Transaction Processing][]:** No single party decides which XRP transactions succeed or fail, and no one can "roll back" a transaction after it completes. As long as those who choose to participate in the network keep it healthy, they can send and receive XRP in seconds. -- **[Fast, Efficient Consensus Algorithm][]:** The XRP Ledger's consensus algorithm settles transactions in 4 to 5 seconds, and can process up to 1500 transactions per second. These properties put XRP far ahead of other top digital assets. -- **[Finite XRP Supply][]:** When the XRP Ledger began, 100 billion XRP were created, and no more XRP will ever be created. (Each XRP is divisible down to 6 decimal places, for a grand total of 100 quadrillion (10^17) _drops_ of XRP.) The available supply of XRP decreases slowly over time as small amounts are destroyed to pay transaction costs. -- **[Responsible Software Governance][]:** A team of full-time, world-class developers at Ripple maintain and continually improve the XRP Ledger's underlying software. Ripple acts as a steward for the technology and an advocate for its interests, and builds constructive relationships with governments and financial institutions worldwide. -- **[Secure, Adaptable Cryptography][]:** The XRP Ledger relies on industry standard digital signature systems like ECDSA (the same scheme used by Bitcoin) but also supports modern, efficient algorithms like Ed25519. The extensible nature of the XRP Ledger's software makes it possible to add and disable algorithms as the state of the art in cryptography advances. -- **[Modern Features for Smart Contracts][]:** Features like Escrow, Checks, and Payment Channels support cutting-edge financial applications including the [Interledger Protocol](https://interledger.org/). This toolbox of advanced features comes with safety features like a process for amending the network and separate checks against invariant constraints. -- **[On-Ledger Decentralized Exchange][]:** In addition to all the features that make XRP useful on its own, the XRP Ledger also has a fully-functional accounting system for tracking and trading obligations denominated in any way users want, and an exchange built into the protocol. The XRP Ledger can settle long, cross-currency payment paths and exchanges of multiple currencies in atomic transactions, bridging gaps of trust with XRP. - -## Censorship-Resistant Transaction Processing -[Censorship-Resistant Transaction Processing]: #censorship-resistant-transaction-processing - -XRP is part of a new class of money which includes Bitcoin and other cryptocurrencies: - -- These **Decentralized digital assets** exist in computer systems without a central administrator. As long as the system is sufficiently decentralized, no one can roll back transactions, freeze balances, or block someone from using a decentralized digital asset. These assets are natively digital, so they can be used online across any distance. - -This combines qualities of physical and centralized digital money. Prior to the invention of Bitcoin in 2009, all currencies could be divided into those two categories: - -- **Physical coins and paper money**, which individuals can use to do business without going through a central party. As physical objects, they cannot be used online, and doing business long-distance is slow and inconvenient. -- **Centralized digital currencies**, which need an administrator to confirm transactions. The administrator also has the power to censor or roll back transactions, or disallow some individuals from using the digital currency. If the operator of a digital currency decides someone has violated its terms of service, it can freeze or even confiscate that person's money. However, as digital balances, these currencies can be used online and are convenient across long distances. - -**Note:** Users of the XRP Ledger _can_ freeze non-XRP currencies issued in the XRP Ledger. For more information, see the [Freeze documentation](freezes.html). - -The XRP Ledger's system of trusted validators uses a small amount of human interaction to achieve better distribution of authority than other decentralized systems. Fully-automated systems for reaching consensus from an unknown set of participants are vulnerable to concentrations of voting power. For example, Bitcoin mining is disproportionately concentrated in places with cheap electricity. As Ripple curates a list of distinct validators run by different entities in different jurisdictions, the XRP Ledger can become more resistant to censorship and outside pressures than proof-of-work mining. For more information on Ripple's plan to decentralize the recommended set of validators, see the [Decentralization Strategy Update](https://xrpl.org/blog/2017/decent-strategy-update.html). - -For more information about the XRP Ledger's ability to detect censorship, see [Transaction Censorship Detection](transaction-censorship-detection.html). - - -## Fast, Efficient Consensus Algorithm -[Fast, Efficient Consensus Algorithm]: #fast-efficient-consensus-algorithm - -The XRP Ledger's biggest difference from most cryptocurrencies is that it uses a unique consensus algorithm that does not require the time and energy of "mining", the way Bitcoin, Ethereum, and almost all other such systems do. Instead of "proof of work" or even "proof of stake", The XRP Ledger's consensus algorithm uses a system where every participant has an overlapping set of "trusted validators" and those trusted validators efficiently agree on which transactions happen in what order. As of early 2018, the amount of electricity the Bitcoin network uses per transaction is more than a family home in the USA uses in an entire day, and confirming the transaction takes hours. A single XRP transaction uses a negligible amount of electricity, and takes 4 or 5 seconds to confirm. - -Furthermore, each new "ledger version" in the XRP Ledger (the equivalent of a "block") contains the full current state of all balances, so a server can synchronize with the network in minutes instead of spending hours downloading and re-processing the full transaction history. - -For more information on how the XRP Ledger's consensus algorithm works, see [The XRP Ledger Consensus Process](consensus.html). For background on why the XRP Ledger uses this consensus algorithm, see [Consensus Principles and Rules](consensus-principles-and-rules.html). - - -## Finite XRP Supply -[Finite XRP Supply]: #finite-xrp-supply - -Alongside war and political turmoil, hyperinflation is one of the leading causes of death for currencies. While the decentralized system of validators provides XRP with some resistance to political factors, the rules of the XRP Ledger provide a simpler solution to hyperinflation: the total supply of XRP is finite. Without a mechanism to create more, it becomes much less likely that XRP could suffer hyperinflation. - -The supply of XRP available to the general public _does_ change due to a few factors: - -- Sending transactions in the XRP Ledger destroys a small amount of XRP. Senders choose how much to destroy, with the minimum based on the expected work of processing the transaction and how busy the network is. If the network is busy, potential transactions that promise to destroy more XRP can cut in front of the transaction queue. This is an anti-spam measure to make it prohibitively expensive to [DDoS](https://en.wikipedia.org/wiki/Denial-of-service_attack) the XRP Ledger network. For more information, see [Transaction Cost](transaction-cost.html). -- Each account in the XRP Ledger must hold a small amount of XRP in reserve. This is an anti-spam measure to disincentivize making the ledger data occupy too much space. XRP Ledger validators can vote to change the amount of XRP required as a reserve, to compensate for changes in XRP's real-world value. (The last time this happened was in September 2021, when [the reserve requirement decreased from 20 XRP to 10 XRP](https://xrpl.org/blog/2021/reserves-lowered.html).) If the reserve requirement decreases, XRP that was previously locked up by the reserve becomes available again. -- Ripple (the company) holds a large reserve of XRP in escrow. At the start of each month, 1 billion XRP is released from escrow for Ripple to use. (Ripple uses XRP to incentivize growth in the XRP Ledger ecosystem and sells XRP to institutional investors. Ripple also sells XRP programmatically on exchanges, limited to a small percentage of overall exchange volume. Ripple publishes sales figures quarterly in the [XRP Markets Report](https://ripple.com/insights/q1-2018-xrp-markets-report/).) At the end of each month, any remaining XRP the company does not sell or give away is stored into escrow for a 54-month period. For more information on Ripple's escrow policy, see [Ripple Escrows 55 Billion XRP for Supply Predictability](https://ripple.com/insights/ripple-to-place-55-billion-xrp-in-escrow-to-ensure-certainty-into-total-xrp-supply/). For more information on the technical capabilities of the Escrow feature, see [Escrow](escrow.html). - - -## Responsible Software Governance -[Responsible Software Governance]: #responsible-software-governance - -Any piece of software can only be as good as the developers who code and manage it. Ripple employs a team of world-class engineers dedicated full-time to maintaining and improving the XRP Ledger software, especially the core server, `rippled`. The [source code for `rippled`](https://github.com/ripple/rippled/) is available to the public with a permissive open-source license, as are many other parts of the XRP Ledger ecosystem. Ripple engineers follow best practices for software engineering, including: - -- A famously strict and thorough code review process -- Comprehensive code coverage and unit tests -- Regularly running automated checks for potential vulnerabilities and memory leaks -- Regularly commissioning external reviews by professional organizations - -As an entity that is obligated to hold large amounts of XRP for the long term, Ripple has a strong incentive to ensure that XRP is widely used in ways that are legal, sustainable, and constructive. Ripple provides technical support to businesses whose goals align with Ripple's ideal of an Internet of Value. Ripple also cooperates with legislators and regulators worldwide to guide the implementation of sensible laws governing digital assets and associated businesses. - - -## Secure, Adaptable Cryptography -[Secure, Adaptable Cryptography]: #secure-adaptable-cryptography - -Cryptography is one of the hardest parts of any distributed system, and a mistake can lead to money stolen by malicious actors anywhere in the world. The XRP Ledger uses industry-standard schemes for signing and verifying transactions, algorithms that have successfully protected hundreds of billions of US dollars' worth of value for many years. The XRP Ledger also layers multi-signing functionality so you can use multi-factor authorization or split keys across multiple people as a backup, and provides new algorithms with a path to migrate the keys you use if a breakthrough in cryptography makes the old algorithms obsolete. - -For more information, see [Cryptographic Keys](cryptographic-keys.html) and [Multi-Signing](multi-signing.html). - - -## Modern Features for Smart Contracts -[Modern Features for Smart Contracts]: #modern-features-for-smart-contracts - -Besides direct value transfer with [XRP payments](direct-xrp-payments.html), the XRP Ledger has advanced features specialized for the Internet of Value. This allows applications built on XRP to provide services and functionality that would have been impractical or impossible in the past. Rather than running applications as "smart contracts" in the network itself, the XRP Ledger provides tools for settling contracts, while letting the applications themselves run anywhere, in whatever environment or container is appropriate. This "keep it simple" approach is flexible, scalable, and powerful. - -A sample of advanced features in the XRP Ledger: - -- [Payment Channels](use-payment-channels.html) allow asynchronous balance changes as fast as you can create and validate signatures. -- [Escrow](escrow.html) locks up XRP until a declared time passes or cryptographic condition is met. -- [DepositAuth](depositauth.html) lets users decide who can send them money and who can't. -- A [Decentralized Exchange](#on-ledger-decentralized-exchange) lets users trade obligations and XRP on-ledger. -- [Invariant Checking](https://xrpl.org/blog/2017/invariant-checking.html) provides an independent layer of protections against bugs in transaction execution. -- [Amendments](amendments.html) provide smooth upgrades to the existing feature set, so the technology can continue to evolve without fracturing the ecosystem or causing uncertainty around times of transition. - - -## On-Ledger Decentralized Exchange -[On-Ledger Decentralized Exchange]: #on-ledger-decentralized-exchange - -One of the biggest features that sets the XRP Ledger apart from other cryptocurrency networks is that it also contains a full currency exchange that runs on the XRP Ledger. Within this system, businesses (typically called "gateways") can freely issue any currency they want to customers, and those customers can freely trade tokens for XRP or other tokens. The XRP Ledger can execute atomic cross-currency transactions this way, using orders in the exchange to provide liquidity. - -For more information on how the decentralized exchange works, see [Decentralized Exchange](decentralized-exchange.html). For more information on the gateway business model, see the [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html). diff --git a/content/concepts/introduction/xrp.ja.md b/content/concepts/introduction/xrp.ja.md deleted file mode 100644 index ec8220adfe..0000000000 --- a/content/concepts/introduction/xrp.ja.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -html: xrp.html -parent: introduction.html -blurb: 送金のためのデジタルアセットである、XRPの使い方と特性について学びましょう。 -labels: - - XRP ---- -# XRP - -**XRP**は、XRP Ledgerのネイティブ暗号資産です。XRP Ledgerのすべての[アカウント](accounts.html)間で相互にXRPを送金できます。アカウントは、最小限度額のXRPを[準備金](reserves.html)として保有する必要があります。XRP Ledgerアドレス間にてXRPの直接送金が可能で、ゲートウェイや流動性プロバイダーを必要としません。このため、XRPは便利なブリッジ通貨となりました。 - -XRP Ledgerの高度機能の一部([Escrow](escrow.html)や[Payment Channel](use-payment-channels.html)など)は、XRPでのみ使えます。オーダーブックの[オートブリッジング](autobridging.html)は、XRPを使用して、2つの発行済み通貨のオーダーブックをXRPオーダーブックにマージして、合成された一つのオーダーブックを作成することで、分散型取引所の流動性を高めます。(たとえば、オートブリッジングによりUSD:XRPオーダーとXRP:EURオーダーがマッチングされ、USD:EURオーダーブックとなります。) - -XRPはまた、ネットワークのスパムの防御対策としても機能します。すべてのXRP Ledgerアドレスには、XRP Ledger維持管理コストを支払うために少額のXRPが必要です。[トランザクションコスト](transaction-cost.html)と[準備金](reserves.html)は、XRP建ての中立的な手数料であり、どの当事者にも支払われません。レジャーのデータフォーマットで、XRPは[AccountRootオブジェクト](accountroot.html)に保管されます。 - -XRPのユースケース、メリット、最新情報についての詳細は、[XRPポータル](https://ripple.com/xrp/)を参照してください。 - -## XRPの特性 - -一番最初のレジャーにて1000億XRPが発行され、これ以上新しいXRPは作成できません。XRPは、[トランザクションコスト](transaction-cost.html)によって消却されるか、またはキーの所有者がいないアドレスに送金すると失われることがあります。このため、XRPは本質的にはやや[デフレ通貨](https://en.wikipedia.org/wiki/Deflation)です。XRPがなくなることを心配する必要はありません。現時点の消却のペースでは、すべてのXRPが消却されるまでに約7万年かかります。またXRPの総供給量の変化に伴い、XRPの[価格と手数料が調整される可能性があります](fee-voting.html)。 - -技術的には、XRPは0.000001 XRPの単位まで正確に計算され、「Drop」と呼ばれます。[`rippled`API](http-websocket-apis.html)では、XRPの量は常にXRPのdrop単位で指定する必要があります。たとえば1 XRPは`1000000` dropと表されます。詳細については、[通貨フォーマットのリファレンス](currency-formats.html)を参照してください。 diff --git a/content/concepts/introduction/xrp.md b/content/concepts/introduction/xrp.md deleted file mode 100644 index ff4e178ae5..0000000000 --- a/content/concepts/introduction/xrp.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -html: xrp.html -parent: introduction.html -blurb: Learn about the uses and properties of XRP, the digital asset for payments. -labels: - - XRP ---- -# XRP - -**XRP** is the native cryptocurrency of the XRP Ledger. All [accounts](accounts.html) in the XRP Ledger can send XRP among one another and must hold a minimum amount of XRP as a [reserve](reserves.html). XRP can be sent directly from any XRP Ledger address to any other. This helps make XRP a convenient bridge currency. - -Some advanced features of the XRP Ledger, such as [Escrow](escrow.html) and [Payment Channels](use-payment-channels.html), only work with XRP. Order book [auto-bridging](autobridging.html) uses XRP to deepen liquidity for tokens in the decentralized exchange by using XRP as an intermediary when doing so is cheaper. (For example, auto-bridging matches USD:XRP and XRP:EUR orders to augment USD:EUR order books.) - -XRP also serves as a protective measure against spamming the network. All XRP Ledger addresses need a small amount of XRP to offset the costs of maintaining the XRP Ledger. The [transaction cost](transaction-cost.html) and [reserve](reserves.html) are neutral fees denominated in XRP and not paid to any party. In the ledger's data format, XRP is stored in [AccountRoot objects](accountroot.html). - -Some of the desirable properties of XRP come from the nature of the XRP Ledger and its [consensus process](consensus.html). The XRP Ledger does not require mining and the consensus process does not require multiple confirmations for immutability, which makes the XRP Ledger faster and more efficient at processing transactions than Bitcoin and other top cryptocurrencies. - - -## XRP Properties - -The very first ledger contained 100 billion XRP, and no new XRP can be created. XRP can be destroyed by [transaction costs](transaction-cost.html) or lost by sending it to addresses for which no one holds a key, so XRP is slightly [deflationary](https://en.wikipedia.org/wiki/Deflation) by nature. No need to worry about running out, though: at the current rate of destruction, it would take at least 70,000 years to destroy all XRP, and XRP [prices and fees can be adjusted](fee-voting.html) as the total supply of XRP changes. - -In technical contexts, XRP is measured precisely to the nearest 0.000001 XRP, called a "drop" of XRP. The [`rippled` APIs](http-websocket-apis.html) require all XRP amounts to be specified in drops of XRP. For example, 1 XRP is represented as `1000000` drops. For more detailed information, see the [currency format reference](currency-formats.html). - -## History - -### XRP Sales - -The XRP Ledger was built over 2011 – early 2012 by Jed McCaleb, Arthur Britto and David Schwartz. In September 2012, Jed and Arthur, along with Chris Larsen formed Ripple (the company, called OpenCoin Inc. at the time) and decided to gift 80 billion XRP to Ripple in exchange for Ripple developing on the XRP Ledger. Since then, the company has regularly sold XRP, used it to strengthen XRP markets and improve network liquidity, and incentivized development of the greater ecosystem. In 2017, the company [placed 55 billion XRP in escrow](https://ripple.com/insights/ripple-escrows-55-billion-xrp-for-supply-predictability/) to ensure that the amount entering the general supply [grows predictably](https://ripple.com/insights/ripple-to-place-55-billion-xrp-in-escrow-to-ensure-certainty-into-total-xrp-supply/) for the foreseeable future. Ripple's [XRP Market Performance site](https://ripple.com/xrp/market-performance/) reports how much XRP the company has available and locked in escrow at present. - -### Naming - -Originally, the XRP Ledger was called "Ripple" for the way the technology allowed payments [to ripple through multiple hops and currencies](rippling.html). For the native asset built into the ledger, the creators chose the ticker symbol "XRP" from the term "ripple credits" or "ripples" and the X prefix for non-national currencies in the [ISO 4217 standard](https://www.iso.org/iso-4217-currency-codes.html). The company registered itself as "Ripple Labs". The name "XRP" came to be used to refer to the asset in all contexts, to avoid confusion with the similar names for the technology and company, and eventually the company shortened its own name to "Ripple". In May 2018, [the community selected a new "X" symbol](https://twitter.com/xrpsymbol/status/1006925937571713025) to represent XRP to differentiate it from the triskelion logo that had previously been used for both the company and the digital asset. - -| XRP "X" Logo | Ripple triskelion | -|:---------------------------------------|:------------------------------------| -| !["X" logo](assets/img/xrp-x-logo.png) | ![Triskelion](img/ripple-triskelion.png) | - - -The smallest, indivisible unit of XRP was named a "drop" at the suggestion of Ripple forum member ThePiachu. An early alternative term was a "jed", after Jed McCaleb. - -## See Also - -- [Send XRP (Interactive Tutorial)](send-xrp.html) -- [List XRP In Your Exchange](list-xrp-as-an-exchange.html) -- [Currency Formatting in rippled APIs](currency-formats.html#) diff --git a/content/concepts/ledgers/ledger-close-times.md b/content/concepts/ledgers/ledger-close-times.md new file mode 100644 index 0000000000..ef4d06ee2d --- /dev/null +++ b/content/concepts/ledgers/ledger-close-times.md @@ -0,0 +1,40 @@ +--- +html: ledger-close-times.html +parent: ledgers.html +blurb: How the XRP Ledger calculates a unique close time value for each ledger version. +labels: + - Blockchain +--- +# Ledger Close Times + +The time that a ledger version closed is recorded at the `close_time` field of the [ledger header](ledger-header.html). To make it easier for the network to reach a consensus on an exact close time, this value is rounded to a number of seconds based on the close time resolution, currently 10 seconds. If rounding would cause a ledger's close time to be the same as (or earlier than) its parent ledger's, the child ledger has its close time set to the parent's close time plus 1. This guarantees that the close times of validated ledgers are strictly increasing. + +Since new ledger versions usually close about every 3 to 5 seconds, these rules result in a loose pattern where ledgers' close times end in :00, :01, :02, :10, :11, :20, :21, and so on. Times ending in 2 are less common and times ending in 3 are very rare, but both occur randomly when more ledgers randomly happen to close within a 10-second window. + +Generally speaking, the ledger cannot make any time-based measurements that are more precise than the close time resolution. For example, to check if an object has passed an expiration date, the rule is to compare it to the close time of the parent ledger. (The close time of a ledger is not yet known when executing transactions to go into that ledger.) This means that, for example, an [Escrow](escrow.html) could successfully finish at a real-world time that is up to about 10 seconds later than the time-based expiration specified in the Escrow object. + +### Example + +The following examples show the rounding behavior of ledger close times, from the perspective of an example validator, following a ledger with the close time **12:00:00**: + +**Current consensus round** + +1. A validator notes that it was **12:00:03** when the ledger closed and entered consensus. The validator includes this close time in its proposals. +2. The validator observes that most other validators (on its UNL) proposed a close time of 12:00:02, and one other proposed a close time of 12:00:03. It changes its proposed close time to match the consensus of **12:00:02**. +3. The validator rounds this value to the nearest close time interval, resulting in **12:00:00**. +4. Since 12:00:00 is not greater than the previous ledger's close time, the validator adjusts the close time to be exactly 1 second after the previous ledger's close time. The result is an adjusted close time of **12:00:01**. +5. The validator builds the ledger with these details, calculates the resulting hash, and confirms in the validation step that others did the same. + +Non-validating servers do all the same steps, except they don't propose their recorded close times to the rest of the network. + +**Next consensus round** + +1. The next ledger enters consensus at **12:00:04** according to most validators. +2. This rounds down again, to a close time of **12:00:00**. +3. Since this is not greater than the previous ledger's close time of 12:00:01, the adjusted close time is **12:00:02**. + +**Next consensus round after that** + +1. The ledger after that enters consensus at **12:00:05** according to most validators. +2. This rounds up, based on the close time resolution, to **12:00:10**. +3. Since this value is larger than the previous ledger's close time, it does not need to be adjusted. **12:00:10** becomes the official close time. diff --git a/content/concepts/ledgers/ledger-structure.md b/content/concepts/ledgers/ledger-structure.md new file mode 100644 index 0000000000..9efcaa1601 --- /dev/null +++ b/content/concepts/ledgers/ledger-structure.md @@ -0,0 +1,69 @@ +--- +html: ledger-structure.html +parent: ledgers.html +blurb: A closer look at the elements of an individual ledger block. +--- +# Ledger Structure + +The XRP Ledger is a blockchain, which means it consists of a history of data blocks in sequence. A block in the XRP Ledger blockchain is called a _ledger version_ or a _ledger_ for short. + +The consensus protocol takes a previous ledger version as a starting point, forms an agreement among validators on a set of transactions to apply next, then confirms that everyone got the same results from applying those transactions. When this happens successfully, the result is a new _validated_ ledger version. From there, the process repeats to build the next ledger version. + +Each ledger version contains _state data_, a _transaction set_, and a _header_ containing metadata. + +{{ include_svg("img/ledger.svg", "Diagram: A ledger consists of a header, transaction set, and state data.") }} + + +## State Data + +{{ include_svg("img/ledger-state-data.svg", "Diagram: A ledger's state data, in the form of various objects which are sometimes linked like a graph.") }} + +The _state data_ represents a snapshot of all accounts, balances, settings, and other information as of this ledger version. When a server connects to the network, one of the first things it does is download a full set of the current state data so that it can process new transactions and answer queries about the current state. Since every server in the network has a full copy of the state data, all data is public and every copy is equally valid. + +The state data consists of individual objects called _ledger entries_, stored in a tree format. Each ledger entry has a unique 256-bit ID that you can use to look it up in the state tree. + +## Transaction Set + +{{ include_svg("img/ledger-transaction-set.svg", "Diagram: A ledger's transaction set, a group of transactions placed in canonical order.") }} + +Every change made to the ledger is the result of a transaction. Each ledger version contains a _transaction set_ which is a group of transactions that have been newly applied in a specific order. If you take the previous ledger version's state data, and apply this ledger's transaction set on top of it, you get this ledger's state data as a result. + +Every transaction in a ledger's transaction set has both of the following parts: + +- _Transaction instructions_ showing what its sender told the ledger to do. +- _Transaction metadata_ showing exactly how the transaction was processed and how it affected the ledger's state data. + + +## Ledger Header + +The _ledger header_ is a block of data that summarizes a ledger version. Like the cover of a report, it uniquely identifies the ledger version, lists its contents, and shows the time it was created, along with some other notes. The ledger header contains the following information: + + + +- {{include_svg("img/ledger-index-icon.svg", "", classes="floating-diagram")}} The _ledger index_, which identifies the ledger version's position in the chain. It builds on the ledger with an index that is one lower, back to the starting point known as the _genesis ledger_. This forms a public history of all transactions and results. +- {{include_svg("img/ledger-hash-icon.svg", "", classes="floating-diagram")}} The _ledger hash_, which uniquely identifies the ledger's contents. The hash is calculated so that if any detail of the ledger version changes, the hash is completely different, which makes it also like a checksum that shows that none of the data in the ledger has been lost, modified, or corrupted. +- {{include_svg("img/ledger-parent-icon.svg", "", classes="floating-diagram")}} The _parent ledger hash_. A ledger version is largely defined by the difference from the _parent ledger_ that came before it, so the header also contains the unique hash of its parent ledger. +- {{include_svg("img/ledger-timestamp-icon.svg", "", classes="floating-diagram")}} The _close time_, the official timestamp when this ledger's contents were finalized. This number is rounded off by a number of seconds, usually 10. +- {{include_svg("img/ledger-state-data-hash-icon.svg", "", classes="floating-diagram")}} A _state data hash_ which acts as a checksum on this ledger's state data. +- {{include_svg("img/ledger-tx-set-hash-icon.svg", "", classes="floating-diagram")}} A _transaction set hash_ which acts as a checksum on this ledger's transaction set data. +- {{include_svg("img/ledger-notes-icon.svg", "", classes="floating-diagram")}} A few other notes like the total amount of XRP in existence and the amount the close time was rounded by. + +A ledger's transaction set and state data are unlimited in size, but the ledger header is always a fixed size. For the exact data and binary format of a ledger header, see [Ledger Header](ledger-header.html). + + +## Validation Status + +{{ include_svg("img/ledger-validated-mark.svg", "Diagram: A ledger's validation status, which is added on top of the ledger and not part of the ledger itself.") }} + +When a consensus of validators in a server's Unique Node List agree on the contents of a ledger version, that ledger version is marked as validated and immutable. The ledger's contents can only change by subsequent transactions making a new ledger version, continuing the chain. + +When a ledger version is first created, it is not yet validated. Due to differences in when candidate transactions arrive at different servers, the network may build and propose multiple different ledger versions to be the next step in the chain. The [consensus protocol](consensus.html) decides which one of them becomes validated. (Any candidate transactions that weren't in the validated ledger version can typically be included in the next ledger version's transaction set instead.) + + +## Ledger Index or Ledger Hash? + +There are two different ways of identifying a ledger version: its _ledger index_ and its _ledger hash_. These two fields both identify a ledger, but they serve different purposes. The ledger index tells you the ledger's position in the chain, and the ledger hash reflects the ledger's contents. + +Ledgers from different chains can have the same ledger index but different hashes. Also, when dealing with unvalidated ledger versions, there can be multiple candidate ledgers with the same index but different contents and therefore different hashes. + +Two ledgers with the same ledger hash are always completely identical. \ No newline at end of file diff --git a/content/concepts/payment-system-basics/ledgers.ja.md b/content/concepts/ledgers/ledgers.ja.md similarity index 93% rename from content/concepts/payment-system-basics/ledgers.ja.md rename to content/concepts/ledgers/ledgers.ja.md index ce2a5c1011..3ce129f6a2 100644 --- a/content/concepts/payment-system-basics/ledgers.ja.md +++ b/content/concepts/ledgers/ledgers.ja.md @@ -1,6 +1,6 @@ --- html: ledgers.html -parent: payment-system-basics.html +parent: concepts.html blurb: XRP Ledgerは、rippledによって内部データベースに保持されている一連の個別レジャー(レジャーバージョン)で構成されています。これらのレジャーの構造と内容について説明します。 labels: - ブロックチェーン @@ -46,7 +46,7 @@ The `rippled` server makes a distinction between ledger versions that are _open_ Unintuitively, the XRP Ledger never "closes" an open ledger to convert it into a closed ledger. Instead, the server throws away the open ledger, creates a new closed ledger by applying transactions on top of a previous closed ledger, then creates a new open ledger using the latest closed ledger as a base. This is a consequence of [how consensus solves the double-spend problem](consensus-principles-and-rules.html#問題の単純化). -For an open ledger, servers apply transactions in the order those transactions appear, but different servers may see transactions in different orders. Since there is no central timekeeper to decide which transaction was actually first, servers may disagree on the exact order of transactions that were sent around the same time. Thus, the process for calculating a closed ledger version that is eligible for [validation](consensus.html#検証) is different than the process of building an open ledger from proposed transactions in the order they arrive. To create a "closed" ledger, each XRP Ledger server starts with a set of transactions and a previous, or "parent", ledger version. The server puts the transactions in a canonical order, then applies them to the previous ledger in that order. The canonical order is designed to be deterministic and efficient, but hard to game, to increase the difficulty of front-running Offers in the [decentralized exchange](decentralized-exchange.html). +For an open ledger, servers apply transactions in the order those transactions appear, but different servers may see transactions in different orders. Since there is no central timekeeper to decide which transaction was actually first, servers may disagree on the exact order of transactions that were sent around the same time. Thus, the process for calculating a closed ledger version that is eligible for [validation](consensus-structure.html#検証) is different than the process of building an open ledger from proposed transactions in the order they arrive. To create a "closed" ledger, each XRP Ledger server starts with a set of transactions and a previous, or "parent", ledger version. The server puts the transactions in a canonical order, then applies them to the previous ledger in that order. The canonical order is designed to be deterministic and efficient, but hard to game, to increase the difficulty of front-running Offers in the [decentralized exchange](decentralized-exchange.html). Thus, an open ledger is only ever used as a temporary workspace, which is a major reason why transactions' [tentative results may vary from their final results](finality-of-results.html). @@ -68,7 +68,7 @@ The following examples demonstrate the rounding behavior of ledger close times, 2. The validator observes that most other validators (on its UNL) proposed a close time of 12:00:02, and one other proposed a close time of 12:00:03. It changes its proposed close time to match the consensus of **12:00:02**. 3. The validator rounds this value to the nearest close time interval, resulting in **12:00:00**. 4. Since 12:00:00 is not greater than the previous ledger's close time, the validator adjusts the close time to be exactly 1 second after the previous ledger's close time. The result is an adjusted close time of **12:00:01**. -5. The validator builds the ledger with these details, calculates the resulting hash, and confirms in the [validation step](consensus.html#検証) that others did the same. +5. The validator builds the ledger with these details, calculates the resulting hash, and confirms in the [validation step](consensus-structure.html#検証) that others did the same. Non-validating servers do all the same steps, except they don't propose their recorded close times to the rest of the network. diff --git a/content/concepts/ledgers/ledgers.md b/content/concepts/ledgers/ledgers.md new file mode 100644 index 0000000000..603d4d0024 --- /dev/null +++ b/content/concepts/ledgers/ledgers.md @@ -0,0 +1,38 @@ +--- +html: ledgers.html +parent: concepts.html +blurb: Ledgers are the data structure that holds data in the shared XRP Ledger network. A chain of ledgers records the history of transactions and state changes. +labels: + - Blockchain + - Data Retention +--- +# Ledgers + +The XRP Ledger is a shared, global ledger that is open to all. Individual participants can trust the integrity of the ledger without having to trust any single institution to manage it. The XRP Ledger protocol accomplishes this by managing a ledger database that can only be updated according to very specific rules. Each server in the peer-to-peer network keeps a full copy of the ledger database, and the network distributes candidate transactions, which are applied in blocks according to the [consensus process](consensus.html). + +{{ include_svg("img/ledger-changes.svg", "Diagram: Each ledger is the result of applying transactions to the previous ledger version.") }} + +The shared global ledger consists of a series of blocks, called ledger versions or simply _ledgers_. Every ledger version has a [Ledger Index][] which identifies the correct order of ledgers. Each permanent, closed ledger also has a unique, identifying hash value. + +At any given time, each XRP Ledger server has an in-progress _open_ ledger, a number of pending _closed_ ledgers, and a history of _validated_ ledgers that are immutable. + +A single ledger version consists of several parts: + +{{ include_svg("img/anatomy-of-a-ledger-simplified.svg", "Diagram: A ledger has transactions, a state tree, and a header with the close time and validation info") }} + +* A **header** - The [Ledger Index][], hashes of its other contents, and other metadata. +* A **transaction tree** - The [transactions](transaction-formats.html) that were applied to the previous ledger to make this one. +* A **state tree** - All the data in the ledger, as [ledger entries](ledger-object-types.html): balances, settings, and so on. + + + +## See Also + +- For more information about ledger headers, ledger object IDs, and ledger object types, see [Ledger Data Formats](ledger-data-formats.html) +- For information on how servers track the history of changes to ledger state, see [Ledger History](ledger-history.html) + + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/ledgers/open-closed-validated-ledgers.md b/content/concepts/ledgers/open-closed-validated-ledgers.md new file mode 100644 index 0000000000..438aa1336b --- /dev/null +++ b/content/concepts/ledgers/open-closed-validated-ledgers.md @@ -0,0 +1,23 @@ +--- +html: open-closed-validated-ledgers.html +parent: ledgers.html +blurb: Ledger objects have one of three states — open, closed, or validated. +labels: + - Blockchain +--- +## Open, Closed, and Validated Ledgers + +The `rippled` server makes a distinction between ledger versions that are _open_, _closed_, and _validated_. A server has one open ledger, any number of closed but unvalidated ledgers, and an immutable history of validated ledgers. The following table summarizes the difference: + +| Ledger Type: | Open | Closed | Validated | +|:---------------------------------|:----------------------------|:-------------------------------------------|:--| +| **Purpose:** | Temporary workspace | Proposed next state | Confirmed previous state | +| **Number used:** | 1 | Any number, but usually 0 or 1 | One per ledger index, growing over time | +| **Can contents change?** | Yes | No, but the whole ledger could be replaced | Never | +| **Transactions are applied in:** | The order they are received | Canonical order | Canonical order | + +Unintuitively, the XRP Ledger never "closes" an open ledger to convert it into a closed ledger. Instead, the server throws away the open ledger, creates a new closed ledger by applying transactions on top of a previous closed ledger, then creates a new open ledger using the latest closed ledger as a base. This is a consequence of [how consensus solves the double-spend problem](consensus-principles-and-rules.html#simplifying-the-problem). + +For an open ledger, servers apply transactions in the order those transactions appear, but different servers may see transactions in different orders. Since there is no central timekeeper to decide which transaction was actually first, servers may disagree on the exact order of transactions that were sent around the same time. Thus, the process for calculating a closed ledger version that is eligible for [validation](consensus-structure.html#validation) is different than the process of building an open ledger from proposed transactions in the order they arrive. To create a "closed" ledger, each XRP Ledger server starts with a set of transactions and a previous, or "parent", ledger version. The server puts the transactions in a canonical order, then applies them to the previous ledger in that order. The canonical order is designed to be deterministic and efficient, but hard to game, to increase the difficulty of front-running Offers in the [decentralized exchange](decentralized-exchange.html). + +Thus, an open ledger is only ever used as a temporary workspace, which is a major reason why transactions' [tentative results may vary from their final results](finality-of-results.html). diff --git a/content/concepts/consensus-network/amendments/amendments.ja.md b/content/concepts/networks-and-servers/amendments.ja.md similarity index 99% rename from content/concepts/consensus-network/amendments/amendments.ja.md rename to content/concepts/networks-and-servers/amendments.ja.md index 569f6b24c4..59778e092b 100644 --- a/content/concepts/consensus-network/amendments/amendments.ja.md +++ b/content/concepts/networks-and-servers/amendments.ja.md @@ -1,6 +1,6 @@ --- html: amendments.html -parent: consensus-network.html +parent: networks-and-servers.html blurb: Amendmentはトランザクション処理の新しい機能やその他の変更を指します。バリデータはコンセンサスを通して連携し、XRP Ledgerにこれらのアップグレードを順序正しく適用します。 labels: - ブロックチェーン diff --git a/content/concepts/consensus-network/amendments/amendments.md b/content/concepts/networks-and-servers/amendments.md similarity index 98% rename from content/concepts/consensus-network/amendments/amendments.md rename to content/concepts/networks-and-servers/amendments.md index 663c5d9e03..bd09e2880a 100644 --- a/content/concepts/consensus-network/amendments/amendments.md +++ b/content/concepts/networks-and-servers/amendments.md @@ -1,6 +1,6 @@ --- html: amendments.html -parent: consensus-network.html +parent: networks-and-servers.html blurb: Amendments represent new features or other changes to transaction processing. Validators coordinate through consensus to apply these upgrades to the XRP Ledger in an orderly fashion. labels: - Blockchain @@ -73,7 +73,7 @@ The [XRP Ledger Standard 11d](https://github.com/XRPLF/XRPL-Standards/discussion ## See Also - **Concepts:** - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Run rippled as a Validator](run-rippled-as-a-validator.html) - [Configure Amendment Voting](configure-amendment-voting.html) diff --git a/content/concepts/xrpl-servers/clustering.ja.md b/content/concepts/networks-and-servers/clustering.ja.md similarity index 98% rename from content/concepts/xrpl-servers/clustering.ja.md rename to content/concepts/networks-and-servers/clustering.ja.md index fa4d6109eb..d9c94558d4 100644 --- a/content/concepts/xrpl-servers/clustering.ja.md +++ b/content/concepts/networks-and-servers/clustering.ja.md @@ -1,6 +1,6 @@ --- html: clustering.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: 暗号処理の負荷を分散させるためにクラスターでrippledサーバーを運用できます。 labels: - コアサーバー diff --git a/content/concepts/xrpl-servers/clustering.md b/content/concepts/networks-and-servers/clustering.md similarity index 97% rename from content/concepts/xrpl-servers/clustering.md rename to content/concepts/networks-and-servers/clustering.md index 3bc9acbf91..88875d2820 100644 --- a/content/concepts/xrpl-servers/clustering.md +++ b/content/concepts/networks-and-servers/clustering.md @@ -1,6 +1,6 @@ --- html: clustering.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: Run rippled servers in a cluster to share the load of cryptography between them. labels: - Core Server diff --git a/content/concepts/xrpl-servers/ledger-history/history-sharding.ja.md b/content/concepts/networks-and-servers/ledger-history/history-sharding.ja.md similarity index 99% rename from content/concepts/xrpl-servers/ledger-history/history-sharding.ja.md rename to content/concepts/networks-and-servers/ledger-history/history-sharding.ja.md index 7ba0ab25d8..0b931a80f8 100644 --- a/content/concepts/xrpl-servers/ledger-history/history-sharding.ja.md +++ b/content/concepts/networks-and-servers/ledger-history/history-sharding.ja.md @@ -1,6 +1,6 @@ --- html: history-sharding.html -parent: ledger-history.html +parent: data-retention.html blurb: 履歴シャーディングは、履歴レジャーデータを保持する任務をrippledサーバー間で分担するようにします。 labels: - データ保持 diff --git a/content/concepts/xrpl-servers/ledger-history/history-sharding.md b/content/concepts/networks-and-servers/ledger-history/history-sharding.md similarity index 98% rename from content/concepts/xrpl-servers/ledger-history/history-sharding.md rename to content/concepts/networks-and-servers/ledger-history/history-sharding.md index 398df77987..0485b85c3a 100644 --- a/content/concepts/xrpl-servers/ledger-history/history-sharding.md +++ b/content/concepts/networks-and-servers/ledger-history/history-sharding.md @@ -1,6 +1,6 @@ --- html: history-sharding.html -parent: ledger-history.html +parent: data-retention.html blurb: History sharding divides the work of keeping historical ledger data among rippled servers. labels: - Data Retention @@ -37,7 +37,7 @@ History shards are recorded in a deterministic format, so that any two servers a - **Concepts:** - [Ledgers](ledgers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Capacity Planning](capacity-planning.html) - [Configure `rippled`](configure-rippled.html) diff --git a/content/concepts/xrpl-servers/ledger-history/ledger-history.ja.md b/content/concepts/networks-and-servers/ledger-history/ledger-history.ja.md similarity index 92% rename from content/concepts/xrpl-servers/ledger-history/ledger-history.ja.md rename to content/concepts/networks-and-servers/ledger-history/ledger-history.ja.md index cd52748800..d23ad56b08 100644 --- a/content/concepts/xrpl-servers/ledger-history/ledger-history.ja.md +++ b/content/concepts/networks-and-servers/ledger-history/ledger-history.ja.md @@ -1,6 +1,6 @@ --- html: ledger-history.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: rippledサーバーはトランザクションの変動金額と状態の履歴をローカルに保管します。 labels: - データ保持 @@ -9,7 +9,7 @@ labels: --- # レジャー履歴 -[コンセンサスプロセス](intro-to-consensus.html)により、[検証済みレジャーバージョン](ledgers.html)のチェーンが作成されます。各バージョンは、以前のバージョンに[トランザクション](transaction-basics.html)のセットを適用して生成されます。各[`rippled`サーバー](xrpl-servers.html)には、レジャーバージョンとトランザクション履歴がローカルに保管されます。サーバーに保管されるトランザクション履歴の量は、サーバーがオンラインであった期間と、サーバーが取得し、保持する履歴量の設定に応じて異なります。 +[コンセンサスプロセス](consensus.html)により、[検証済みレジャーバージョン](ledgers.html)のチェーンが作成されます。各バージョンは、以前のバージョンに[トランザクション](transactions.html)のセットを適用して生成されます。各[`rippled`サーバー](xrpl-servers.html)には、レジャーバージョンとトランザクション履歴がローカルに保管されます。サーバーに保管されるトランザクション履歴の量は、サーバーがオンラインであった期間と、サーバーが取得し、保持する履歴量の設定に応じて異なります。 ピアツーピアのXRP Ledgerネットワーク内のサーバーは、コンセンサスプロセスの一環としてトランザクションやその他のデータを相互に共有します。各サーバーは個別に新しいレジャーバージョンを作成し、その結果を信頼できるバリデータと比較して、整合性を維持します。(信頼できるバリデータのコンセンサスがサーバーの結果と一致しない場合は、サーバーがピアから必要なデータを取得して整合性を維持します。)サーバーはピアから古いデータをダウンロードして、利用可能な履歴のギャップを埋めることができます。レジャーはデータの暗号[ハッシュ](basic-data-types.html#ハッシュ)を使用した構造となっているため、すべてのサーバーがデータの整合性の検証を行えます。 @@ -65,7 +65,7 @@ XRP Ledgerのすべての履歴を1台の高価なマシンに保管する代わ - **コンセプト:** - [レジャー](ledgers.html) - - [コンセンサスの紹介](intro-to-consensus.html) + - [コンセンサス](consensus.html) - **チュートリアル:** - [`rippled`の設定](configure-rippled.html) - [オンライン削除の設定](configure-online-deletion.html) diff --git a/content/concepts/xrpl-servers/ledger-history/ledger-history.md b/content/concepts/networks-and-servers/ledger-history/ledger-history.md similarity index 93% rename from content/concepts/xrpl-servers/ledger-history/ledger-history.md rename to content/concepts/networks-and-servers/ledger-history/ledger-history.md index 75693abdd0..c3a185f707 100644 --- a/content/concepts/xrpl-servers/ledger-history/ledger-history.md +++ b/content/concepts/networks-and-servers/ledger-history/ledger-history.md @@ -1,6 +1,6 @@ --- html: ledger-history.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: rippled servers store a variable amount of transaction and state history locally. labels: - Data Retention @@ -9,7 +9,7 @@ labels: --- # Ledger History -The [consensus process](intro-to-consensus.html) creates a chain of [validated ledger versions](ledgers.html), each derived from the previous one by applying a set of [transactions](transaction-basics.html). Every [`rippled` server](xrpl-servers.html) stores ledger versions and transaction history locally. The amount of transaction history a server stores depends on how long that server has been online and how much history it is configured to fetch and keep. +The [consensus process](consensus.html) creates a chain of [validated ledger versions](ledgers.html), each derived from the previous one by applying a set of [transactions](transactions.html). Every [`rippled` server](xrpl-servers.html) stores ledger versions and transaction history locally. The amount of transaction history a server stores depends on how long that server has been online and how much history it is configured to fetch and keep. Servers in the peer-to-peer XRP Ledger network share transactions and other data with each other as part of the consensus process. Each server independently builds each new ledger version and compares results with its trusted validators to ensure consistency. (If a consensus of trusted validators disagrees with a server's results, that server fetches the necessary data from its peers to achieve consistency.) Servers can download older data from their peers to fill gaps in their available history. The structure of the ledger uses cryptographic [hashes](basic-data-types.html#hashes) of the data so that any server can verify the integrity and consistency of the data. @@ -70,7 +70,7 @@ For more information, see [Configure History Sharding](configure-history-shardin - **Concepts:** - [Ledgers](ledgers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Configure `rippled`](configure-rippled.html) - [Configure Online Deletion](configure-online-deletion.html) diff --git a/content/concepts/xrpl-servers/ledger-history/online-deletion.ja.md b/content/concepts/networks-and-servers/ledger-history/online-deletion.ja.md similarity index 99% rename from content/concepts/xrpl-servers/ledger-history/online-deletion.ja.md rename to content/concepts/networks-and-servers/ledger-history/online-deletion.ja.md index 8ef30b6c55..63d2c252dd 100644 --- a/content/concepts/xrpl-servers/ledger-history/online-deletion.ja.md +++ b/content/concepts/networks-and-servers/ledger-history/online-deletion.ja.md @@ -1,6 +1,6 @@ --- html: online-deletion.html -parent: ledger-history.html +parent: data-retention.html blurb: オンライン削除は古いトランザクションと状態の履歴を消去します。 labels: - データ保持 diff --git a/content/concepts/xrpl-servers/ledger-history/online-deletion.md b/content/concepts/networks-and-servers/ledger-history/online-deletion.md similarity index 98% rename from content/concepts/xrpl-servers/ledger-history/online-deletion.md rename to content/concepts/networks-and-servers/ledger-history/online-deletion.md index 79c2ecd90e..09538228fd 100644 --- a/content/concepts/xrpl-servers/ledger-history/online-deletion.md +++ b/content/concepts/networks-and-servers/ledger-history/online-deletion.md @@ -1,13 +1,13 @@ --- html: online-deletion.html -parent: ledger-history.html +parent: data-retention.html blurb: Online deletion purges outdated transaction and state history. labels: - Data Retention - Core Server --- # Online Deletion -[[Source]
](https://github.com/ripple/rippled/blob/master/src/ripple/app/misc/SHAMapStoreImp.cpp "Source") +[[Source]](https://github.com/ripple/rippled/blob/master/src/ripple/app/misc/SHAMapStoreImp.cpp "Source") The online deletion feature lets the `rippled` server delete the server's local copy of old ledger versions to keep disk usage from rapidly growing over time. The default config file sets online deletion to run automatically, but online deletion can also be configured to run only when prompted. [New in: rippled 0.27.0][] @@ -119,7 +119,7 @@ When it comes time for online deletion, the server first walks through the oldes - **Concepts:** - [Ledgers](ledgers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Capacity Planning](capacity-planning.html) - [Configure `rippled`](configure-rippled.html) diff --git a/content/concepts/xrpl-servers/xrpl-servers.ja.md b/content/concepts/networks-and-servers/networks-and-servers.ja.md similarity index 98% rename from content/concepts/xrpl-servers/xrpl-servers.ja.md rename to content/concepts/networks-and-servers/networks-and-servers.ja.md index ee98f05b20..1fe4cf7379 100644 --- a/content/concepts/xrpl-servers/xrpl-servers.ja.md +++ b/content/concepts/networks-and-servers/networks-and-servers.ja.md @@ -1,6 +1,7 @@ --- -html: xrpl-servers.html +html: networks-and-servers.html parent: concepts.html +name: Networks and Servers blurb: rippledは、XRP Ledgerを管理するコアとなるピアツーピアサーバーです。 template: pagetype-category.html.jinja --- diff --git a/content/concepts/xrpl-servers/xrpl-servers.md b/content/concepts/networks-and-servers/networks-and-servers.md similarity index 98% rename from content/concepts/xrpl-servers/xrpl-servers.md rename to content/concepts/networks-and-servers/networks-and-servers.md index 02ce25b757..6bca7a680a 100644 --- a/content/concepts/xrpl-servers/xrpl-servers.md +++ b/content/concepts/networks-and-servers/networks-and-servers.md @@ -1,10 +1,10 @@ --- -html: xrpl-servers.html +html: networks-and-servers.html parent: concepts.html blurb: rippled is the core peer-to-peer server that manages the XRP Ledger. template: pagetype-category.html.jinja --- -# XRP Ledger Servers +# Networks and Servers There are two main types of server software that power the XRP Ledger: diff --git a/content/concepts/consensus-network/parallel-networks.ja.md b/content/concepts/networks-and-servers/parallel-networks.ja.md similarity index 96% rename from content/concepts/consensus-network/parallel-networks.ja.md rename to content/concepts/networks-and-servers/parallel-networks.ja.md index f3db4ce1a4..a25ab7388a 100644 --- a/content/concepts/consensus-network/parallel-networks.ja.md +++ b/content/concepts/networks-and-servers/parallel-networks.ja.md @@ -1,6 +1,6 @@ --- html: parallel-networks.html -parent: consensus-network.html +parent: networks-and-servers.html blurb: テストネットワークおよび代替レジャーチェーンと本番環境のXRP Ledgerとの関係について説明します。 labels: - ブロックチェーン @@ -13,7 +13,7 @@ XRP Ledgerにはピアツーピアの本番環境のネットワークが1つ存 | ネットワーク | アップグレード頻度 | 説明 | |:--------|:----------------|:-------------------------------------------------| -| Mainnet | 安定版リリース | [XRP Ledger](xrp-ledger-overview.html)。ピアツーピアサーバーのネットワーク機能を備えた分散型の暗号台帳であり、[XRP](xrp.html)の土台となるものです。 | +| Mainnet | 安定版リリース | [XRP Ledger](xrp-ledger-overview.html)。ピアツーピアサーバーのネットワーク機能を備えた分散型の暗号台帳であり、[XRP](what-is-xrp.html)の土台となるものです。 | | Testnet | 安定版リリース | XRP Ledger上に構築したソフトウェアのテスト環境として動作する「代替環境」のネットワーク。本番環境のXRP Ledgerユーザーに影響を及ぼすことも、本物の通貨をリスクにさらすこともありません。Testnetの[Amendmentのステータス](known-amendments.html)は、Mainnetを厳密に反映するようになっていますが、分散型システムが持つ予測不可能な性質により、タイミングにわずかな違いが生じることがあります。 | | Devnet | ベータ版リリース | 次期リリースのプレビュー。XRP Ledgerのコアソフトウェアへの不安定な変更がテストされます。このAltNetを使用すると、開発者はまだMainnetで有効になっていないXRPLの計画段階の新機能やAmendmentを操作したり学習したりすることができます。 | @@ -34,7 +34,7 @@ Rippleでは、TestnetとDevnetでメインサーバーを運用しています - **ツール:** - [XRP Testnet Faucet](xrp-test-net-faucet.html) - **コンセプト:** - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - [Amendment](amendments.html) - **チュートリアル:** - [XRP Testnetへの`rippled`の接続](connect-your-rippled-to-the-xrp-test-net.html) diff --git a/content/concepts/consensus-network/parallel-networks.md b/content/concepts/networks-and-servers/parallel-networks.md similarity index 96% rename from content/concepts/consensus-network/parallel-networks.md rename to content/concepts/networks-and-servers/parallel-networks.md index 39b5b7b3b9..cd203cfb49 100644 --- a/content/concepts/consensus-network/parallel-networks.md +++ b/content/concepts/networks-and-servers/parallel-networks.md @@ -1,6 +1,6 @@ --- html: parallel-networks.html -parent: consensus-network.html +parent: networks-and-servers.html blurb: Understand how test networks and alternate ledger chains relate to the production XRP Ledger. labels: - Blockchain @@ -13,7 +13,7 @@ To help members of the XRP Ledger community interact with XRP Ledger technology | Network | Upgrade Cadence | Description | |:--------|:----------------|:-------------------------------------------------| -| Mainnet | Stable releases | _The_ [XRP Ledger](xrp-ledger-overview.html), a decentralized cryptographic ledger powered by a network of peer-to-peer servers and the home of [XRP](xrp.html). | +| Mainnet | Stable releases | _The_ [XRP Ledger](xrp-ledger-overview.html), a decentralized cryptographic ledger powered by a network of peer-to-peer servers and the home of [XRP](what-is-xrp.html). | | Testnet | Stable releases | An "alternate universe" network that acts as a testing ground for software built on the XRP Ledger, without impacting production XRP Ledger users and without risking real money. The [amendment status](known-amendments.html) of the Testnet is intended to closely mirror the Mainnet, although slight variations in timing may occur due to the unpredictable nature of decentralized systems. | | Devnet | Beta releases | A preview of coming attractions, where unstable changes to the core XRP Ledger software may be tested out. Developers can use this altnet to interact with and learn about planned new XRP Ledger features and amendments that are not yet enabled on the Mainnet. | | [Hooks V3 Testnet](https://hooks-testnet-v3.xrpl-labs.com/) | [Hooks server](https://github.com/XRPL-Labs/xrpld-hooks) | A preview of on-chain smart contract functionality using [hooks](https://xrpl-hooks.readme.io/). | @@ -36,7 +36,7 @@ Ripple runs the main servers in the Testnet and Devnet; you can also [connect yo - **Tools:** - [XRP Testnet Faucet](xrp-test-net-faucet.html) - **Concepts:** - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - [Amendments](amendments.html) - **Tutorials:** - [Connect Your `rippled` to the XRP Testnet](connect-your-rippled-to-the-xrp-test-net.html) diff --git a/content/concepts/xrpl-servers/peer-protocol.ja.md b/content/concepts/networks-and-servers/peer-protocol.ja.md similarity index 99% rename from content/concepts/xrpl-servers/peer-protocol.ja.md rename to content/concepts/networks-and-servers/peer-protocol.ja.md index 250ea6992e..cc5675d640 100644 --- a/content/concepts/xrpl-servers/peer-protocol.ja.md +++ b/content/concepts/networks-and-servers/peer-protocol.ja.md @@ -1,6 +1,6 @@ --- html: peer-protocol.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: ピアプロトコルは、rippledサーバーが互いに通信する言語を指定します。 labels: - コアサーバー diff --git a/content/concepts/xrpl-servers/peer-protocol.md b/content/concepts/networks-and-servers/peer-protocol.md similarity index 99% rename from content/concepts/xrpl-servers/peer-protocol.md rename to content/concepts/networks-and-servers/peer-protocol.md index 1708e566b3..93f0de4f79 100644 --- a/content/concepts/xrpl-servers/peer-protocol.md +++ b/content/concepts/networks-and-servers/peer-protocol.md @@ -1,6 +1,6 @@ --- html: peer-protocol.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: The peer protocol specifies the language rippled servers speak to each other. labels: - Core Server diff --git a/content/concepts/xrpl-servers/rippled-server-modes.ja.md b/content/concepts/networks-and-servers/rippled-server-modes.ja.md similarity index 98% rename from content/concepts/xrpl-servers/rippled-server-modes.ja.md rename to content/concepts/networks-and-servers/rippled-server-modes.ja.md index 01d26777a6..2df93a279f 100644 --- a/content/concepts/xrpl-servers/rippled-server-modes.ja.md +++ b/content/concepts/networks-and-servers/rippled-server-modes.ja.md @@ -1,6 +1,6 @@ --- html: rippled-server-modes.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: ストックサーバー、バリデータサーバー、スタンドアロンモードで運用されるrippledサーバーなど、rippledサーバーのモードについて説明します。 labels: - コアサーバー @@ -35,7 +35,7 @@ P2Pモードのサーバーは、デフォルトで[Mainnet](parallel-networks.h ### APIサーバー -全てのP2Pモードサーバーは、トランザクションの送信、残高や設定の確認、サーバーの管理などの目的で、[API](http-websocket-apis.html)を提供しています。もしあなたがXRP Ledgerにデータを照会したり、ビジネス用途でトランザクションを送信するのであれば、[独自サーバーを運営する](xrpl-servers.html#独自サーバーを運用する理由)ことが有効でしょう。 +全てのP2Pモードサーバーは、トランザクションの送信、残高や設定の確認、サーバーの管理などの目的で、[API](http-websocket-apis.html)を提供しています。もしあなたがXRP Ledgerにデータを照会したり、ビジネス用途でトランザクションを送信するのであれば、[独自サーバーを運営する](networks-and-servers.html#独自サーバーを運用する理由)ことが有効でしょう。 #### 全履歴サーバー diff --git a/content/concepts/xrpl-servers/rippled-server-modes.md b/content/concepts/networks-and-servers/rippled-server-modes.md similarity index 98% rename from content/concepts/xrpl-servers/rippled-server-modes.md rename to content/concepts/networks-and-servers/rippled-server-modes.md index 3d7681b59e..c40de69b97 100644 --- a/content/concepts/xrpl-servers/rippled-server-modes.md +++ b/content/concepts/networks-and-servers/rippled-server-modes.md @@ -1,6 +1,6 @@ --- html: rippled-server-modes.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: Learn about rippled server modes, including stock servers, validator servers, and rippled servers run in stand-alone mode. labels: - Core Server @@ -36,7 +36,7 @@ P2P Mode servers connect to [Mainnet](parallel-networks.html) by default. ### API Servers -All P2P Mode servers provide [APIs](http-websocket-apis.html) for purposes like submitting transactions, checking balances and settings, and administering the server. If you query the XRP Ledger for data or submit transactions for business use, it can be useful to [run your own server](xrpl-servers.html#reasons-to-run-your-own-server). +All P2P Mode servers provide [APIs](http-websocket-apis.html) for purposes like submitting transactions, checking balances and settings, and administering the server. If you query the XRP Ledger for data or submit transactions for business use, it can be useful to [run your own server](networks-and-servers.html#reasons-to-run-your-own-server). #### Full History Servers diff --git a/content/concepts/xrpl-servers/the-clio-server.ja.md b/content/concepts/networks-and-servers/the-clio-server.ja.md similarity index 99% rename from content/concepts/xrpl-servers/the-clio-server.ja.md rename to content/concepts/networks-and-servers/the-clio-server.ja.md index 0f548b2d9d..8bcf2a796d 100644 --- a/content/concepts/xrpl-servers/the-clio-server.ja.md +++ b/content/concepts/networks-and-servers/the-clio-server.ja.md @@ -1,6 +1,6 @@ --- html: the-clio-server.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: Clioは、API呼び出しに最適化されたXRP Ledgerサーバーです。 --- # Clioサーバー diff --git a/content/concepts/xrpl-servers/the-clio-server.md b/content/concepts/networks-and-servers/the-clio-server.md similarity index 98% rename from content/concepts/xrpl-servers/the-clio-server.md rename to content/concepts/networks-and-servers/the-clio-server.md index 086119b453..1f3854f1ec 100644 --- a/content/concepts/xrpl-servers/the-clio-server.md +++ b/content/concepts/networks-and-servers/the-clio-server.md @@ -1,6 +1,6 @@ --- html: the-clio-server.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: Clio is an XRP Ledger server optimized for API calls. --- # The Clio Server diff --git a/content/concepts/xrpl-servers/transaction-censorship-detection.ja.md b/content/concepts/networks-and-servers/transaction-censorship-detection.ja.md similarity index 93% rename from content/concepts/xrpl-servers/transaction-censorship-detection.ja.md rename to content/concepts/networks-and-servers/transaction-censorship-detection.ja.md index dafe198ec1..a62ba00d09 100644 --- a/content/concepts/xrpl-servers/transaction-censorship-detection.ja.md +++ b/content/concepts/networks-and-servers/transaction-censorship-detection.ja.md @@ -1,6 +1,6 @@ --- html: transaction-censorship-detection.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: XRP Ledgerでは取引検閲の自動検知機能がすべてのrippledサーバーで有効になっています。 labels: - ブロックチェーン @@ -11,7 +11,7 @@ labels: XRP Ledgerは、高い検閲耐性を実現できるように設計されています。この設計をサポートするために、XRP Ledgerでは、取引検閲の自動検知機能がすべての`rippled`サーバーで有効になっており、検閲によるネットワークへの影響の有無を、すべての参加者が確認できます。 -`rippled`サーバーがネットワークと同期している間、検知機能は、`rippled`サーバーの観点から、[コンセンサス](intro-to-consensus.html)の最終ラウンドで受け入れられ、最後に検証されたレジャーに取り込まれるトランザクションをすべて追跡します。検知機能では、数回のコンセンサスラウンド後、検証済みのレジャーに取り込まれていないトランザクションの重大度が高くなるというログメッセージを発行します。 +`rippled`サーバーがネットワークと同期している間、検知機能は、`rippled`サーバーの観点から、[コンセンサス](consensus.html)の最終ラウンドで受け入れられ、最後に検証されたレジャーに取り込まれるトランザクションをすべて追跡します。検知機能では、数回のコンセンサスラウンド後、検証済みのレジャーに取り込まれていないトランザクションの重大度が高くなるというログメッセージを発行します。 diff --git a/content/concepts/xrpl-servers/transaction-censorship-detection.md b/content/concepts/networks-and-servers/transaction-censorship-detection.md similarity index 94% rename from content/concepts/xrpl-servers/transaction-censorship-detection.md rename to content/concepts/networks-and-servers/transaction-censorship-detection.md index 780886b1cd..30823b0724 100644 --- a/content/concepts/xrpl-servers/transaction-censorship-detection.md +++ b/content/concepts/networks-and-servers/transaction-censorship-detection.md @@ -1,6 +1,6 @@ --- html: transaction-censorship-detection.html -parent: xrpl-servers.html +parent: networks-and-servers.html blurb: XRP Ledger provides an automated transaction censorship detector that is available on all rippled servers. labels: - Blockchain @@ -11,7 +11,7 @@ labels: The XRP Ledger is designed to be censorship resistant. In support of this design, the XRP Ledger provides an automated transaction censorship detector that is available on all `rippled` servers, enabling all participants to see if censorship is affecting the network. -While a `rippled` server is in sync with the network, the detector tracks all transactions that should have been accepted in the last round of [consensus](intro-to-consensus.html) and included in the last validated ledger. The detector issues log messages of increasing severity when it sees transactions that have not been included in a validated ledger after several rounds of consensus. +While a `rippled` server is in sync with the network, the detector tracks all transactions that should have been accepted in the last round of [consensus](consensus.html) and included in the last validated ledger. The detector issues log messages of increasing severity when it sees transactions that have not been included in a validated ledger after several rounds of consensus. diff --git a/content/concepts/payment-system-basics/accounts/accounts.md b/content/concepts/payment-system-basics/accounts/accounts.md deleted file mode 100644 index d23cbb1677..0000000000 --- a/content/concepts/payment-system-basics/accounts/accounts.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -html: accounts.html -parent: payment-system-basics.html -blurb: Learn about accounts in the XRP Ledger. Accounts can send transactions and hold XRP. -labels: - - Accounts - - Payments ---- -# Accounts - -An "Account" in the XRP Ledger represents a holder of XRP and a sender of [transactions](transaction-formats.html). The core elements of an account are: - -- An identifying **address**, such as `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn`. (This is a "classic address", as opposed to the [X-Address format](#addresses).) -- An **XRP balance**. Some of this XRP is set aside for the [Reserve](reserves.html). -- A **sequence number**, which helps make sure any transactions this account sends are applied in the correct order and only once each. To execute a transaction, the transaction's sequence number and its sender's sequence number must match. Then, as part of applying the transaction, the account's sequence number increases by 1. (See also: [Basic Data Types: Account Sequence](basic-data-types.html#account-sequence).) -- A **history of transactions** that affected this account and its balances. -- One or more ways to [authorize transactions](transaction-basics.html#authorizing-transactions), possibly including: - - A master key pair intrinsic to the account. (This can be [disabled](accountset.html) but not changed.) - - A "regular" key pair that [can be rotated](setregularkey.html). - - A signer list for [multi-signing](multi-signing.html). (Stored separately from the account's core data.) - -In the ledger's data tree, an account's core data is stored in the [AccountRoot](accountroot.html) ledger object type. An account can also be the owner (or partial owner) of several other types of data. - -**Tip:** An "Account" in the XRP Ledger is somewhere between the financial usage (like "bank account") and the computing usage (like "UNIX account"). Non-XRP currencies and assets aren't stored in an XRP Ledger Account itself; each such asset is stored in an accounting relationship called a "Trust Line" that connects two parties. - -### Creating Accounts - -There is not a dedicated "create account" transaction. The [Payment transaction][] automatically creates a new account if the payment sends XRP equal to or greater than the [account reserve](reserves.html) to a mathematically-valid address that does not already have an account. This is called _funding_ an account, and creates an [AccountRoot object](accountroot.html) in the ledger. No other transaction can create an account. - -**Caution:** Funding an account **does not** give you any special privileges over that account. Whoever has the secret key corresponding to the account's address has full control over the account and all XRP it contains. For some addresses, it's possible that no one has the secret key, in which case the account is a [black hole](#special-addresses) and the XRP is lost forever. - -The typical way to get an account in the XRP Ledger is as follows: - -1. Generate a key pair from a strong source of randomness and calculate the address of that key pair. (For example, you can use the [wallet_propose method][] to do this.) - -2. Have someone who already has an account in the XRP Ledger send XRP to the address you generated. - - - For example, you can buy XRP in a private exchange, then withdraw XRP from the exchange to the address you specified. - - **Caution:** The first time you receive XRP at your own XRP Ledger address, you must pay the [account reserve](reserves.html) (currently 10 XRP), which locks up that amount of XRP indefinitely. In contrast, private exchanges usually hold all their customers' XRP in a few shared XRP Ledger accounts, so customers don't have to pay the reserve for individual accounts at the exchange. Before withdrawing, consider whether having your own account directly on the XRP Ledger is worth the price. - -## Addresses - -{% include '_snippets/data_types/address.md' %} - -Any valid address can [become an account in the XRP Ledger](#creating-accounts) by being funded. You can also use an address that has not been funded to represent a [regular key](setregularkey.html) or a member of a [signer list](multi-signing.html). Only a funded account can be the sender of a transaction. - -Creating a valid address is a strictly mathematical task starting with a key pair. You can generate a key pair and calculate its address entirely offline without communicating to the XRP Ledger or any other party. The conversion from a public key to an address involves a one-way hash function, so it is possible to confirm that a public key matches an address but it is impossible to derive the public key from the address alone. (This is part of the reason why signed transactions include the public key _and_ the address of the sender.) - -For more technical details of how to calculate an XRP Ledger address, see [Address Encoding](#address-encoding). - - -### Special Addresses - -Some addresses have special meaning, or historical uses, in the XRP Ledger. In many cases, these are "black hole" addresses, meaning the address is not derived from a known secret key. Since it is effectively impossible to guess a secret key from only an address, any XRP possessed by black hole addresses is lost forever. - - -| Address | Name | Meaning | Black Hole? | -|-------------------------------|------|---------|-------------| -| `rrrrrrrrrrrrrrrrrrrrrhoLvTp` | ACCOUNT\_ZERO | An address that is the XRP Ledger's [base58][] encoding of the value `0`. In peer-to-peer communications, `rippled` uses this address as the issuer for XRP. | Yes | -| `rrrrrrrrrrrrrrrrrrrrBZbvji` | ACCOUNT\_ONE | An address that is the XRP Ledger's [base58][] encoding of the value `1`. In the ledger, [RippleState entries](ripplestate.html) use this address as a placeholder for the issuer of a trust line balance. | Yes | -| `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` | The genesis account | When `rippled` starts a new genesis ledger from scratch (for example, in stand-alone mode), this account holds all the XRP. This address is generated from the seed value `masterpassphrase` which is [hard-coded](https://github.com/ripple/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184). | No | -| `rrrrrrrrrrrrrrrrrNAMEtxvNvQ` | Ripple Name reservation black-hole | In the past, Ripple asked users to send XRP to this account to reserve Ripple Names.| Yes | -| `rrrrrrrrrrrrrrrrrrrn5RM1rHd` | NaN Address | Previous versions of [ripple-lib](https://github.com/XRPLF/xrpl.js) generated this address when encoding the value [NaN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN) using the XRP Ledger's [base58][] string encoding format. | Yes | - - -## Deletion of Accounts - -The [DeletableAccounts amendment](known-amendments.html#deletableaccounts) (enabled 2020-05-08) made it possible to delete accounts. - -To be deleted, an account must meet the following requirements: - -- The account's `Sequence` number plus 256 must be less than the current [Ledger Index][]. -- The account must not be linked to any of the following types of [ledger objects](ledger-object-types.html) (as a sender or receiver): - - `Escrow` - - `PayChannel` - - `RippleState` - - `Check` -- The account must own fewer than 1000 objects in the ledger. -- The [AccountDelete transaction][] must pay a special [transaction cost][] equal to at least the [owner reserve](reserves.html) for one item (currently 2 XRP). - -After an account has been deleted, it can be re-created in the ledger through the normal method of [creating accounts](#creating-accounts). An account that has been deleted and re-created is no different than an account that has been created for the first time. - -**Warning:** The [AccountDelete transaction][]'s transaction cost always applies when the transaction is included in a validated ledger, even if the transaction failed because the account does not meet the requirements to be deleted. To greatly reduce the chances of paying the high transaction cost if the account cannot be deleted, [submit the transaction](submit.html) with `fail_hard` enabled. - -Unlike Bitcoin and many other cryptocurrencies, each new version of the XRP Ledger's public ledger chain contains the full state of the ledger, which increases in size with each new account. For that reason, you should not create new XRP Ledger accounts unless necessary. You can recover some of an account's 10 XRP [reserve](reserves.html) by deleting the account, but you must still destroy at least 2 XRP to do so. - -Institutions who send and receive value on behalf of many users can use [**Source Tags** and **Destination Tags**](source-and-destination-tags.html) to distinguish payments from and to their customers while only using one (or a handful) of accounts in the XRP Ledger. - - - - -## Transaction History - -In the XRP Ledger, transaction history is tracked by a "thread" of transactions linked by a transaction's identifying hash and the ledger index. The `AccountRoot` ledger object has the identifying hash and ledger of the transaction that most recently modified it; the metadata of that transaction includes the previous state of the `AccountRoot` node, so it is possible to iterate through the history of a single account this way. This transaction history includes any transactions that modify the `AccountRoot` node directly, including: - -- Transactions sent by the account, because they modify the account's `Sequence` number. These transactions also modify the account's XRP balance because of the [transaction cost](transaction-cost.html). -- Transactions that modified the account's XRP balance, including incoming [Payment transactions][] and other types of transactions such as [PaymentChannelClaim][] and [EscrowFinish][]. - -The _conceptual_ transaction history of an account also includes transactions that modified the account's owned objects and non-XRP balances. These objects are separate ledger objects, each with their own thread of transactions that affected them. If you have an account's full ledger history, you can follow it forward to find the ledger objects created or modified by it. A "complete" transaction history includes the history of objects owned by a transaction, such as: - -- `RippleState` objects (Trust Lines) connected to the account. -- `DirectoryNode` objects, especially the owner directory tracking the account's owned objects. -- `Offer` objects, representing the account's outstanding currency-exchange orders in the decentralized exchange -- `PayChannel` objects, representing asynchronous payment channels to and from the account -- `Escrow` objects, representing held payments to or from the account that are locked by time or a crypto-condition. -- `SignerList` objects, representing lists of addresses that can authorize transactions for the account by [multi-signing](multi-signing.html). - -For more information on each of these objects, see the [Ledger Format Reference](ledger-data-formats.html). - - -## Address Encoding - -**Tip:** These technical details are only relevant for people building low-level library software for XRP Ledger compatibility! - -[[Source]](https://github.com/ripple/rippled/blob/35fa20a110e3d43ffc1e9e664fc9017b6f2747ae/src/ripple/protocol/impl/AccountID.cpp#L109-L140 "Source") - -XRP Ledger addresses are encoded using [base58][] with the _dictionary_ `rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz`. Since the XRP Ledger encodes several types of keys with base58, it prefixes the encoded data with a one-byte "type prefix" (also called a "version prefix") to distinguish them. The type prefix causes addresses to usually start with different letters in base58 format. - -The following diagram shows the relationship between keys and addresses: - -{{ include_svg("img/address-encoding.svg", "Master Public Key + Type Prefix → Account ID + Checksum → Address") }} - -The formula for calculating an XRP Ledger address from a public key is as follows. For the complete example code, see [`encode_address.js`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/content/_code-samples/address_encoding/js/encode_address.js). For the process of deriving a public key from a passphrase or seed value, see [Key Derivation](cryptographic-keys.html#key-derivation). - -1. Import required algorithms: SHA-256, RIPEMD160, and base58. Set the dictionary for 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. Start with a 33-byte ECDSA secp256k1 public key, or a 32-byte Ed25519 public key. For Ed25519 keys, prefix the key with the byte `0xED`. - - const pubkey_hex = - 'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32'; - const pubkey = Buffer.from(pubkey_hex, 'hex'); - assert(pubkey.length == 33); - -3. Calculate the [RIPEMD160](https://en.wikipedia.org/wiki/RIPEMD) hash of the SHA-256 hash of the public key. This value is the "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. Calculate the SHA-256 hash of the SHA-256 hash of the Account ID; take the first 4 bytes. This value is the "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. Concatenate the payload and the checksum. Calculate the base58 value of the concatenated buffer. The result is the address. - - const dataToEncode = Buffer.concat([payload, checksum]); - const address = base58.encode(dataToEncode); - console.log(address); - // rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN - - -## See Also - -- **Concepts:** - - [Reserves](reserves.html) - - [Cryptographic Keys](cryptographic-keys.html) - - [Issuing and Operational Addresses](issuing-and-operational-addresses.html) -- **References:** - - [account_info method][] - - [wallet_propose method][] - - [AccountSet transaction][] - - [Payment transaction][] - - [AccountRoot object](accountroot.html) -- **Tutorials:** - - [Manage Account Settings (Category)](manage-account-settings.html) - - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) - - -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} -{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/payment-system-basics/ledgers.md b/content/concepts/payment-system-basics/ledgers.md deleted file mode 100644 index b61a8d4771..0000000000 --- a/content/concepts/payment-system-basics/ledgers.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -html: ledgers.html -parent: payment-system-basics.html -blurb: The XRP Ledger is composed of a series of individual ledgers, or ledger versions, which rippled keeps in its internal database. Learn about the structure and contents of these ledgers. -labels: - - Blockchain - - Data Retention ---- -# Ledgers - -The XRP Ledger is a shared, global ledger that is open to all. Individual participants can trust the integrity of the ledger without having to trust any single institution to manage it. The `rippled` server software accomplishes this by managing a ledger database that can only be updated according to very specific rules. Each instance of `rippled` keeps a full copy of the ledger, and the peer-to-peer network of `rippled` servers distributes candidate transactions among themselves. The consensus process determines which transactions get applied to each new version of the ledger. See also: [The Consensus Process](consensus.html). - -{{ include_svg("img/ledger-changes.svg", "Diagram: Each ledger is the result of applying transactions to the previous ledger version.") }} - -The shared global ledger is actually a series of individual ledgers, or ledger versions, which `rippled` keeps in its internal database. Every ledger version has a [Ledger Index][] which identifies the order in which ledgers occur. Each closed ledger version also has an identifying hash value, which uniquely identifies the contents of that ledger. At any given time, a `rippled` instance has an in-progress "current" open ledger, plus some number of closed ledgers that have not yet been approved by consensus, and any number of historical ledgers that have been validated by consensus. Only the validated ledgers are certain to be correct and immutable. - -A single ledger version consists of several parts: - -{{ include_svg("img/anatomy-of-a-ledger-simplified.svg", "Diagram: A ledger has transactions, a state tree, and a header with the close time and validation info") }} - -* A **header** - The [Ledger Index][], hashes of its other contents, and other metadata. -* A **transaction tree** - The [transactions](transaction-formats.html) that were applied to the previous ledger to make this one. Transactions are the _only_ way to change the ledger. -* A **state tree** - All the [ledger objects](ledger-object-types.html) that contain the settings, balances, and objects in the ledger as of this version. - - -## Tree Format - -As its name might suggest, a ledger's state tree is a tree data structure. Each object in the state tree is identified by a 256-bit object ID. In JSON, a ledger object's ID is the `index` field, which contains a 64-character hexadecimal string like `"193C591BF62482468422313F9D3274B5927CA80B4DD3707E42015DD609E39C94"`. Every object in the state tree has an ID that you can use to look up that object; every transaction has an identifying hash that you can use to look up the transaction in the transaction tree. Do not confuse the `index` (ID) of a ledger object with the [`ledger_index` (sequence number) of a ledger][Ledger Index]. - -**Tip:** Sometimes, an object in the ledger's state tree is called a "ledger node". For example, transaction metadata returns a list of `AffectedNodes`. Do not confuse this with a "node" (server) in the peer-to-peer network. - -In the case of transactions, the identifying hash is based on the signed transaction instructions, but the contents of the transaction object when you look it up also contain the results and metadata of the transaction, which are not taken into account when generating the hash. - -## Open, Closed, and Validated Ledgers - -The `rippled` server makes a distinction between ledger versions that are _open_, _closed_, and _validated_. A server has one open ledger, any number of closed but unvalidated ledgers, and an immutable history of validated ledgers. The following table summarizes the difference: - -| Ledger Type: | Open | Closed | Validated | -|:---------------------------------|:----------------------------|:-------------------------------------------|:--| -| **Purpose:** | Temporary workspace | Proposed next state | Confirmed previous state | -| **Number used:** | 1 | Any number, but usually 0 or 1 | One per ledger index, growing over time | -| **Can contents change?** | Yes | No, but the whole ledger could be replaced | Never | -| **Transactions are applied in:** | The order they are received | Canonical order | Canonical order | - -Unintuitively, the XRP Ledger never "closes" an open ledger to convert it into a closed ledger. Instead, the server throws away the open ledger, creates a new closed ledger by applying transactions on top of a previous closed ledger, then creates a new open ledger using the latest closed ledger as a base. This is a consequence of [how consensus solves the double-spend problem](consensus-principles-and-rules.html#simplifying-the-problem). - -For an open ledger, servers apply transactions in the order those transactions appear, but different servers may see transactions in different orders. Since there is no central timekeeper to decide which transaction was actually first, servers may disagree on the exact order of transactions that were sent around the same time. Thus, the process for calculating a closed ledger version that is eligible for [validation](consensus.html#validation) is different than the process of building an open ledger from proposed transactions in the order they arrive. To create a "closed" ledger, each XRP Ledger server starts with a set of transactions and a previous, or "parent", ledger version. The server puts the transactions in a canonical order, then applies them to the previous ledger in that order. The canonical order is designed to be deterministic and efficient, but hard to game, to increase the difficulty of front-running Offers in the [decentralized exchange](decentralized-exchange.html). - -Thus, an open ledger is only ever used as a temporary workspace, which is a major reason why transactions' [tentative results may vary from their final results](finality-of-results.html). - -## Ledger Close Times - -The time that a ledger version closed is recorded at the `close_time` field of the [ledger header](ledger-header.html). To make it easier for the network to reach a consensus on an exact close time, this value is rounded to a number of seconds based on the close time resolution, currently 10 seconds. If rounding would cause a ledger's close time to be the same as (or earlier than) its parent ledger's, the child ledger has its close time set to the parent's close time plus 1. This guarantees that the close times of validated ledgers are strictly increasing. - -Since new ledger versions usually close about every 3 to 5 seconds, these rules result in a loose pattern where ledgers' close times end in :00, :01, :02, :10, :11, :20, :21, and so on. Times ending in 2 are less common and times ending in 3 are very rare, but both occur randomly when more ledgers randomly happen to close within a 10-second window. - -Generally speaking, the ledger cannot make any time-based measurements that are more precise than the close time resolution. For example, to check if an object has passed an expiration date, the rule is to compare it to the close time of the parent ledger. (The close time of a ledger is not yet known when executing transactions to go into that ledger.) This means that, for example, an [Escrow](escrow.html) could successfully finish at a real-world time that is up to about 10 seconds later than the time-based expiration specified in the Escrow object. - -### Example - -The following examples show the rounding behavior of ledger close times, from the perspective of an example validator, following a ledger with the close time **12:00:00**: - -**Current consensus round** - -1. A validator notes that it was **12:00:03** when the ledger closed and entered consensus. The validator includes this close time in its proposals. -2. The validator observes that most other validators (on its UNL) proposed a close time of 12:00:02, and one other proposed a close time of 12:00:03. It changes its proposed close time to match the consensus of **12:00:02**. -3. The validator rounds this value to the nearest close time interval, resulting in **12:00:00**. -4. Since 12:00:00 is not greater than the previous ledger's close time, the validator adjusts the close time to be exactly 1 second after the previous ledger's close time. The result is an adjusted close time of **12:00:01**. -5. The validator builds the ledger with these details, calculates the resulting hash, and confirms in the [validation step](consensus.html#validation) that others did the same. - -Non-validating servers do all the same steps, except they don't propose their recorded close times to the rest of the network. - -**Next consensus round** - -1. The next ledger enters consensus at **12:00:04** according to most validators. -2. This rounds down again, to a close time of **12:00:00**. -3. Since this is not greater than the previous ledger's close time of 12:00:01, the adjusted close time is **12:00:02**. - -**Next consensus round after that** - -1. The ledger after that enters consensus at **12:00:05** according to most validators. -2. This rounds up, based on the close time resolution, to **12:00:10**. -3. Since this value is larger than the previous ledger's close time, it does not need to be adjusted. **12:00:10** becomes the official close time. - -## See Also - -- For more information about ledger headers, ledger object IDs, and ledger object types, see [Ledger Data Formats](ledger-data-formats.html) -- For information on how servers track the history of changes to ledger state, see [Ledger History](ledger-history.html) - - - -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} -{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/payment-system-basics/transaction-basics/understanding-signatures-draft.md b/content/concepts/payment-system-basics/transaction-basics/understanding-signatures-draft.md deleted file mode 100644 index d8ee700472..0000000000 --- a/content/concepts/payment-system-basics/transaction-basics/understanding-signatures-draft.md +++ /dev/null @@ -1,74 +0,0 @@ -# Understanding Signatures - -***TODO: DRAFT*** - -***TODO: Question: Added this concept section based on fantastic source material from Rome -- thought we should publish it. Useful? May be good to associate it with a flow diagram - like the one for address encoding: https://ripple.com/build/accounts/#address-encoding. Address both single and multi-sign flows.*** - -In the XRP Ledger, a digital signature proves that a transaction is authorized to do a specific set of actions. A digital signature is created based on a [key pair](cryptographic-keys.html) associated with the transaction's sending account. - -Here's an overview of some of the more common signature-related fields used in the XRP Ledger. - -***TODO: address from Ryan: Where would you see these fields? Either address in text -- or ensure that this is answered via the flow diagram discussed below.*** - -***TODO: JHA fix the IA here. Also need to more clearly express the single-signer flow vs multi-signer flow. Provide a flow diagram. Also need to move some conceptual content out of "Authorizing Transactions" and "Signing and Submitting Transactions" and put it in this doc.*** - -## `SigningPubKey` (top-level) - -The public key of the sender in hex format. Empty in the case of a multi-signed transaction. - -To verify whether a single-signed transaction is valid, a `rippled` server checks that all of the following are true: - -1. This key hashes to an address that's authorized by the transaction's sender. - - The default is that only the address of an account is authorized to send all transactions for that account. That address is [derived from](accounts.html#address-encoding) the public key from the master key pair that was generated during address creation. Regular keys add a different address (derived from a different key pair) that's authorized to send most transactions. And of course, you can also disable the [master key](cryptographic-keys.html) or add a [multi-signing list](reference-transaction-format.html#multi-signing). ***TODO: address from Ryan: "And of course" - Nit: this seems a little informal. Maybe just drop it and go into the next sentence? JHA take a closer look at what this sentence is trying to say.*** - -2. This key matches the signature on the transaction. - -3. The signature matches the transaction instructions. - -The validation process for multi-signed transactions is slightly different. For more information, see [`Signers[*].SigningPubKey`](#signerssigningpubkey). - - -## `TxnSignature` (top-level) - -The signature of the transaction instructions, in hex format. - -Used with the `SigningPubKey` to verify that the sender did in fact approve the corresponding transaction instructions. - -***TODO: Ensure that this doc reflects this: In transactions, we have two TxnSignature fields—one at the top level for single-signed transactions, and one in each member of the Signers array for multi-signed transactions. (Any given transaction has either the top level TxnSignature or the members in the Signers array but not both.)*** - -## `Signers` (in a multi-signed transaction) - -An array of signature data for a [multi-signed transaction](reference-transaction-format.html#multi-signing). - -Used to verify that a quorum of signers approved a transaction. - - -### `Signers[*].AccountID` - -The address of one signer, in base58. -***TODO: JHA: Slightly nitpicky note (relevant to all the fields, but it especially attracted my notice here): the base58 is how it's generally represented in JSON. In the canonical binary format, I believe this is the AccountID as a 160-bit number, so it's not base58-encoded and doesn't have the checksum in the binary format. Similarly, hexadecimal is just a way of representing a 160-bit number in formats like JSON. In the native binary format, the various fields are just numbers/data in various low-level computer formats. That's only relevant for people who are trying to implement offline signing, though. Everyone else will probably see the JSON representation, where they'll want to know what the conventional way to represent the fields is.*** - -Identifies which signer from the (predefined) [multi-signing list](reference-transaction-format.html#multi-signing) this portion of the multi-signature represents. - - -### `Signers[*].TxnSignature` - -One signature, as hexadecimal. - -Verifying a [multi-signed transaction](reference-transaction-format.html#multi-signing) involves making sure each such signature is valid for its `SigningPubKey` and the transaction instructions. - - -### `Signers[*].SigningPubKey` - -The public key of one signer. Verifying a [multi-signed transaction](reference-transaction-format.html#multi-signing) involves making sure each such key is authorized to sign for the `AccountID` of the signer. - -Multi-signature `AccountIDs` are a little special. If one is an address that doesn't exist in the ledger, then the `SigningPubKey` must hash to the `AccountID` value using the standard rules for [deriving an AccountID](accounts.html#address-encoding) from a public key. If the address does exist in the ledger, then either: - -1. The `SigningPubKey` must hash to the `AccountID` and the address must not have the master key disabled. - - or - -2. The `SigningPubKey` must hash to a regular key that the address has set in the ledger. - -For more information about signing transactions, see [Signing and Submitting Transactions](reference-transaction-format.html#signing-and-submitting-transactions). diff --git a/content/concepts/payment-types/checks.ja.md b/content/concepts/payment-types/checks.ja.md index 84256be69a..fcfd97dd4d 100644 --- a/content/concepts/payment-types/checks.ja.md +++ b/content/concepts/payment-types/checks.ja.md @@ -36,7 +36,7 @@ XRP Ledger Checksは、XRP Ledgerに固有の問題も解決できます。た ### ユースケース: 支払いの承認 -**課題:** [BSA、KYC、AML、CFT](become-an-xrp-ledger-gateway.html#compliance-guidelines)などの規制に準拠するにあたり、金融機関は受領する資金の送金元に関する文書を提出する必要があります。違法な資金移動を防止するため、これらの規制は金融機関に対して、処理済のすべての支払いについて、その送金元と送金先を開示するよう義務付けています。XRP Ledgerの性質上、誰でもXRPを(および該当する場合には発行済み通貨を)XRP Ledger上の金融機関のアカウントに送金することができます。金融機関のコンプライアンス部門では、このような不審な支払いへの対応にかかるコスト(罰金の可能性を含む)の増大と処理の遅れが生じます。 +**課題:** [BSA、KYC、AML、CFT](stablecoin-issuer.html#compliance-guidelines)などの規制に準拠するにあたり、金融機関は受領する資金の送金元に関する文書を提出する必要があります。違法な資金移動を防止するため、これらの規制は金融機関に対して、処理済のすべての支払いについて、その送金元と送金先を開示するよう義務付けています。XRP Ledgerの性質上、誰でもXRPを(および該当する場合には発行済み通貨を)XRP Ledger上の金融機関のアカウントに送金することができます。金融機関のコンプライアンス部門では、このような不審な支払いへの対応にかかるコスト(罰金の可能性を含む)の増大と処理の遅れが生じます。 **解決策:** 金融機関は各自のXRP Ledgerのアカウントで、[`AccountSet`トランザクションの`asfDepositAuth`フラグを設定](accountset.html)することにより、[Deposit Authorization](depositauth.html)を有効にできます。これにより、アカウントはPaymentトランザクションを受領できなくなります。Deposit Authorizationが有効なアカウントは、Escrow、Payment Channel、またはChecksでのみ資金を受領できます。Deposit Authorizationが有効な場合、Checksが最もシンプルで使いやすく、柔軟な資金移動手段となります。 diff --git a/content/concepts/payment-types/checks.md b/content/concepts/payment-types/checks.md index 5e13e926c5..16fa99290a 100644 --- a/content/concepts/payment-types/checks.md +++ b/content/concepts/payment-types/checks.md @@ -9,85 +9,35 @@ labels: --- # Checks -_(Added by the [Checks amendment][].)_ +The Checks feature enables users to create deferred payments similar to personal paper checks. Unlike an escrow or payment channel, funds aren't set aside when a check is created, so money only moves when the check is cashed. If the sender doesn't have the funds at the time a check is cashed, the transaction fails; recipients can retry failed transactions until the check expires. -The Checks feature in the XRP Ledger allows users to create deferred payments that can be canceled or cashed by the intended recipients. Like personal paper checks, XRP Ledger Checks start with the sender of the funds creating a Check that specifies an amount and a recipient. The recipient cashes the check to pull the funds from the sender's account into the recipient's account. No money moves until the recipient cashes the Check. Because funds are not put on hold when the Check is created, cashing a Check can fail if the sender doesn't have enough funds when the recipient tries to cash it. If there's a failure cashing the check, the check's recipient can retry until the Check expires. +XRP Ledger Checks can have expiration times after which they may no longer be cashed. If the recipient doesn't successfully cash the Check before it expires, the Check can no longer be cashed, but the object remains in the XRP Ledger until someone cancels it. Anyone may cancel the Check after it expires. Only the sender and recipient can cancel the Check before it expires. The Check object is removed from the Ledger when the sender successfully cashes the check or someone cancels it. -XRP Ledger Checks may have expiration times after which they may no longer be cashed. If the recipient doesn't successfully cash the Check before it expires, the Check can no longer be cashed, but the object remains in the XRP Ledger until someone cancels it. Anyone may cancel the Check after it expires. Only the sender and recipient can cancel the Check before it expires. The Check object is removed from the Ledger when the sender successfully cashes the check or someone cancels it. +## Use Cases -Checks have some similarities to [Escrow](escrow.html) and [Payment Channels](use-payment-channels.html), but there are some important differences between those features and Checks: +- Checks allow people to exchange funds using a process that is familiar to and accepted by the banking industry. -* You can send [tokens](tokens.html) with Checks. With Payment Channels and Escrow, you can only send XRP. +- If your intended recipient uses [Deposit Authorization](depositauth.html) to block direct payments from strangers, a check is a good alternative. -* Checks do not lock up or set aside any funds. The XRP involved in Payment Channels and Escrow cannot be spent until it is redeemed with a claim provided by the sender (Payment Channels), or released by an expiration or crypto-condition (Escrow). - -* You can send XRP to yourself through Escrow. You cannot send Checks to yourself. +- Flexible check cashes. The recipient can redeem the Check for between a minimum and maximum amount. -**Note:** The [Checks amendment][] changes the expiration behavior of the [OfferCreate][] transaction. For more information, see [Offer Expiration](offers.html#offer-expiration). +## Check Lifecycle +1. The sender sends a [CheckCreate transaction][], which defines: + - The recipient. + - An expiration date. + - The maximum amount that can be debited from their account. -## Why Checks? +2. When the transaction is processed, the XRP Ledger creates a `Check` object. The check can be canceled by the sender or receiver with a [CheckCancel transaction][]. -Traditional paper checks allow people to transfer funds without immediately exchanging physical currency. XRP Ledger Checks allow people to exchange funds asynchronously using a process that is familiar to and accepted by the banking industry. +3. The recipient submits a [CheckCash transaction][] that transfers the funds and destroys the `Check` object. Recipients have two options for cashing checks: + - Exact Amount: They specify an exact amount to cash that doesn't exceed the check maximum. + - Flexible Amount: They specify a minimum amount to cash and the XRP Ledger delivers as much as possible up to the check maximum. If the sender doesn't have the funds to at least meet the specified minimum, the transaction fails. -XRP Ledger Checks also solve a problem that is unique to the XRP Ledger: they allow users to reject unwanted payments or accept only part of a payment. This is useful for institutions that need to be careful about accepting payments for compliance reasons. +4. If the check expires before the receiver cashes the check, the `Check` object remains until anyone cancels it. -### Use Case: Payment Authorization - -**Problem:** To comply with regulations like [BSA, KYC, AML, and CFT](become-an-xrp-ledger-gateway.html#compliance-guidelines), financial institutions must provide documentation about the source of funds they receive. Such regulations seek to prevent the illicit transfer of funds by requiring institutions to know the source and destination of all payments processed by the institution. Because of the nature of the XRP Ledger, anyone could potentially send XRP (and, under the right circumstances, tokens) to an institution's account on the XRP Ledger. Dealing with such unwanted payments adds significant cost and time delays to these institutions' compliance departments, including potential fines or penalties. - -**Solution:** Institutions can enable [Deposit Authorization](depositauth.html) on their XRP Ledger accounts by [setting the `asfDepositAuth` flag in an `AccountSet` transaction](accountset.html). This makes the account unable to receive Payment transactions. Accounts with Deposit Authorization enabled can only receive funds through Escrow, Payment Channels, or Checks. Checks are the most straightforward, familiar, and flexible way to transfer funds if Deposit Authorization is enabled. - - -## Usage - -Checks typically have the lifecycle described below. - - - -[![Check flow diagram (successful cashing)](img/checks-happy-path.png)](img/checks-happy-path.png) - -**Step 1:** To create a Check, the sender submits a [CheckCreate][] transaction and specifies the recipient (`Destination`), expiration time (`Expiration`), and maximum amount that may be debited from the sender's account (`SendMax`). - - -**Step 2:** After the CheckCreate transaction is processed, a [Check object](check.html) is created on the XRP Ledger. This object contains the properties of the Check as defined by the transaction that created it. The object can only be modified by the sender (by canceling it with a [CheckCancel][] transaction) or recipient (by canceling it or cashing it) before the expiration time passes. After the expiration time, anyone may cancel the Check. - -**Step 3:** To cash the check, the recipient submits a [CheckCash][] transaction. The recipient has two options for cashing the check: - -* `Amount` — The recipient can use this option to specify an exact amount to cash. This may be useful for cases where the sender has padded the check to cover possible [transfer fees](transfer-fees.html) and the recipient wants to accept the exact amount on an invoice or other contract. - -* `DeliverMin` — The recipient can use this option to specify the minimum amount they are willing to receive from the Check. If the recipient uses this option, the XRP Ledger attempts to deliver as much as possible and always delivers at least this amount. The transaction fails if the amount that can be credited to the recipient is not at least the requested amount. - -If the sender has enough funds to cover the Check and the expiration time has not passed, the funds are debited from the sender's account and credited to the recipient's account, and the Check object is destroyed. - - - -#### Expiration Case - -In the case of expirations, Checks have the lifecycle described below. - - - -[![Check flow diagram (expiration)](img/checks-expiration.png)](img/checks-expiration.png) - - -All Checks start the same way, so **Steps 1 and 2** are the same. - -**Step 3a:** If the Check expires before the recipient can cash it, the Check can no longer be cashed but the object remains in the ledger. - -**Step 4a:** After a Check expires, anyone may cancel it by submitting a [CheckCancel][] transaction. That transaction removes the Check from the ledger. - - - - -## Availability of Checks - -The [Checks amendment][] became enabled on the XRP Ledger Mainnet on 2020-06-18. For more information about how amendments are enabled and voted on, see [Amendment Process](amendments.html#amendment-process). - -To check the status of an amendment on a test network or private network, use the [feature method][]. - ## See Also diff --git a/content/concepts/payment-types/cross-currency-payments.ja.md b/content/concepts/payment-types/cross-currency-payments.ja.md index 1a14a03003..5a30da5d21 100644 --- a/content/concepts/payment-types/cross-currency-payments.ja.md +++ b/content/concepts/payment-types/cross-currency-payments.ja.md @@ -16,7 +16,7 @@ XRP Ledgerでは、1つ以上の発行済み通貨、XRP、またはその両方 ## 前提条件 - 定義上、複数通貨間支払いには2種類以上の通貨が関係します。つまり、関係する通貨のうち、少なくとも1種類以上がXRP以外の発行済み通貨である必要があります。 - - 通常は、[XRP Ledgerゲートウェイ](become-an-xrp-ledger-gateway.html)が発行した通貨を1種類以上使用することになります。このような通貨はXRP Ledger外部の資金を担保とし、ゲートウェイを通じて引き出すことができます。 + - 通常は、[XRP Ledgerゲートウェイ](stablecoin-issuer.html)が発行した通貨を1種類以上使用することになります。このような通貨はXRP Ledger外部の資金を担保とし、ゲートウェイを通じて引き出すことができます。 - 取引を行う当事者が、XRP Ledger内でのみ発行され、外部の担保がないデジタルトークンを送受信し、何らかの価値を持つ資産として取り扱うことを望む限り、このデジタルトークンを使用することもできます。 - 送金元と受取人の間に1つ以上の[パス](paths.html)が確立しており、すべてのパスの総流動性が、支払いを促進するのに十分である必要があります。複数通貨間の支払いの場合、これは一般に通貨取引[オファー](offers.html)を消費することを意味します。 diff --git a/content/concepts/payment-types/cross-currency-payments.md b/content/concepts/payment-types/cross-currency-payments.md index d79df06581..45a42007e6 100644 --- a/content/concepts/payment-types/cross-currency-payments.md +++ b/content/concepts/payment-types/cross-currency-payments.md @@ -8,9 +8,9 @@ labels: --- # Cross-Currency Payments -In the XRP Ledger, you can send cross-currency payments that exchange tokens, XRP, or both. Like [direct XRP payments](use-simple-xrp-payments.html), these payments use the [Payment transaction type][Payment]. Cross-currency payments within the XRP Ledger are fully atomic, meaning that either the payment fully executes or no part of it executes. +The XRP Ledger enables you to make cross-currency payments of XRP and tokens. Cross-currency payments within the XRP Ledger are fully atomic, meaning the payment fully executes or no part of the payment executes at all. -By default, cross-currency payments deliver a fixed amount to their destination at a variable cost to their source. Cross-currency payments can also be [partial payments](partial-payments.html), which deliver a variable amount to the destination within a fixed sending limit. +By default, cross-currency payments deliver a fixed amount to their destination at a variable cost to their source. Cross-currency payments can also be [partial payments](partial-payments.html) that deliver a variable amount within a set sending limit. ## Prerequisites diff --git a/content/concepts/payment-types/direct-xrp-payments.ja.md b/content/concepts/payment-types/direct-xrp-payments.ja.md index b8ed15c8db..a9f2d826a6 100644 --- a/content/concepts/payment-types/direct-xrp-payments.ja.md +++ b/content/concepts/payment-types/direct-xrp-payments.ja.md @@ -78,8 +78,6 @@ XRP Ledgerでは、支払いを受け取ることができるアドレスは永 ## 関連項目 -- **コンセプト:** - - [決済システムの基本](payment-system-basics.html) - **チュートリアル:** - [XRPの送金(対話型チュートリアル)](send-xrp.html) - [WebSocketを使用した着信ペイメントの監視](monitor-incoming-payments-with-websocket.html) diff --git a/content/concepts/payment-types/direct-xrp-payments.md b/content/concepts/payment-types/direct-xrp-payments.md index 711c89e6cc..a1c9658983 100644 --- a/content/concepts/payment-types/direct-xrp-payments.md +++ b/content/concepts/payment-types/direct-xrp-payments.md @@ -8,81 +8,34 @@ labels: --- # Direct XRP Payments -The basis of any financial system is _transferring value_: or, in one word, payments. The simplest type of payment in the XRP Ledger is a direct XRP-to-XRP payment, which transfers XRP directly from one account in the XRP Ledger to another. - -## About Direct XRP-to-XRP Payments - -Generally, any address in the XRP Ledger can send XRP directly to any other address. The address on the receiving side is often called the _destination address_, and the address on the sending side is called the _source address_. To send XRP directly, the sender uses a [Payment transaction][], which can be as concise as the following: - -```json -{ - "TransactionType": "Payment", - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "Destination": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", - "Amount": "13000000" -} -``` - -These transaction instructions mean: Send a payment from `rf1Bi...` to `ra5nK...` delivering exactly 13 XRP. If the transaction is successfully processed, it does exactly that. Since it usually takes about 4 seconds for each new ledger version to become [validated](consensus.html), a successful transaction can be created, submitted, executed, and have a final outcome in 8 seconds or less, even if gets queued for the ledger version after the current in-progress one. - -**Caution:** The [Payment transaction type][Payment] can also be used for some more specialized kinds of payments, including [cross-currency payments](cross-currency-payments.html) and [partial payments](partial-payments.html). In the case of partial payments, it is possible that the `Amount` shows a large amount of XRP even if the transaction only delivered a very small amount. See [partial payments exploit](partial-payments.html#partial-payments-exploit) for how to avoid crediting a customer for the wrong amount. - -Direct XRP-to-XRP payments cannot be partial payments, but partial payments can deliver XRP after converting from a different source currency. +The basis of any financial system is transferring value. The quickest and simplest method on the XRP Ledger is a direct XRP payment from one account to another. Unlike other payment methods that require multiple transactions to complete, a direct XRP payment executes in one transaction with no intermediaries, and typically completes in 8 seconds or less. You can only make direct payments when XRP is the currency sent and received. -## Funding Accounts -Any mathematically-valid address can receive a payment, even if the XRP Ledger has no record of that address existing beforehand, as long as the payment delivers enough XRP to meet the minimum [account reserve](reserves.html). If the payment would not deliver enough XRP, it fails. +## Direct XRP Payment Lifecycle -For more information, see [Accounts](accounts.html#creating-accounts). +1. The sender creates a [Payment transaction][], which defines the parameters of the payment. The transaction is a direct XRP payment if XRP is the currency sent and received. +2. Transaction processing checks the parameters and circumstances of the transaction; if any check fails, the payment fails. -## Address Reuse + - All fields are formatted correctly. + - The sending address is a funded account in the XRP Ledger. + - All provided signatures are valid for the sending address. + - The destination address is different than the sending address. + - The sender has a high enough XRP balance to send the payment. -In the XRP Ledger, addresses where you can receive payments are permanent, and have a non-trivial [reserve requirement](reserves.html) of XRP that they cannot spend. This means that, contrary to some other blockchain systems, it is not a good idea to use a different, disposable address for every transaction. The best practice for the XRP Ledger is to reuse the same address for multiple transactions. If you use the address regularly (especially if it's managed by an internet-connected service), you should set a [regular key](cryptographic-keys.html) and proactively change keys on a regular basis to reduce the risk of a key compromise. +2. Transaction processing checks the receiving address; if any check fails, the payment fails. -As a sender, it is best not to assume that your intended recipient is using the same address from the last time you sent them a payment. Inevitably, sometimes security compromises happen and a person or business has to change addresses. Before sending money, you should ask the recipient for their current receiving address, so you don't accidentally send money to a malicious user who has taken control of a compromised old address. - - -## How Direct XRP Payments Are Processed - -From a relatively high level, the XRP Ledger's transaction processing engine applies a direct XRP payment as follows: - -1. It validates the parameters of the [Payment transaction][]. If the transaction is structured to send and deliver XRP, the transaction processing engine recognizes it as a direct XRP-to-XRP payment. Validation checks include: - - - Checking that all fields are formatted correctly. For example, for direct XRP payments, the `Amount` field must be [drops of XRP][]. - - Checking that the sending address is a funded [account](accounts.html) in the XRP Ledger. - - Checking that all provided signatures are valid for the sending address. - - Confirming that the destination address is different than the sender address. (It is not sufficient to send to the same address with a different [destination tag](source-and-destination-tags.html).) - - Confirming that the sender has a high enough XRP balance to send the payment. - - If any check fails, the payment fails. - -2. It checks whether the receiving address is a funded account. - - - If the receiving address is funded, the engine checks any additional requirements for receiving payments, such as [Deposit Authorization](depositauth.html) or [`RequireDest`](source-and-destination-tags.html#requiring-tags). If the payment does not satisfy any of these additional requirements, the payment fails. - - If the receiving address is not funded, it checks whether the payment would deliver enough XRP to meet the minimum [account reserve](reserves.html). If not, the payment fails. - -3. It debits the sending account by an amount of XRP specified by the `Amount` field plus the XRP to be destroyed for the [transaction cost](transaction-cost.html) and credits the receiving account for the same amount. - - If necessary, it creates a new account ([AccountRoot object](accountroot.html)) for the receiving address. The new account's starting balance is equal to the `Amount` of the payment. - - The engine adds a `delivered_amount` field to the [transaction's metadata](transaction-metadata.html) to indicate how much was delivered. You should always use `delivered_amount`, **not** the `Amount` field, to avoid being tricked about how much XRP you received. (Cross-currency "Partial Payments" can deliver less XRP than stated in the `Amount` field.) For more information, see [Partial Payments](partial-payments.html). - - -## Comparison to Other Payment Types - -- **Direct XRP Payments** are the only way to both send and receive XRP in a single transaction. They are a good balance of speed, simplicity, and low cost. -- [Cross-currency payments](cross-currency-payments.html) also use the [Payment][] transaction type, but can send any combination of XRP and non-XRP [tokens](tokens.html) except XRP-to-XRP. They can also be [partial payments](partial-payments.html). Cross-currency payments are good for payments not denominated in XRP or for taking arbitrage opportunities in the [decentralized exchange](decentralized-exchange.html). -- [Checks](checks.html) let the sender set up an obligation without transferring any money immediately. The recipient can cash it any time before it expires, but the amount is not guaranteed. Checks can send either XRP or [tokens](tokens.html). Checks are good for giving the recipient the autonomy to claim the payment. -- [Escrow](escrow.html) sets aside XRP which can be claimed by its intended recipient when certain conditions are met. The XRP amount is fully guaranteed and cannot be otherwise used by the sender unless the Escrow expires. Escrow is good for smart contracts in large amounts. -- [Payment Channels](payment-channels.html) set aside XRP. The recipient can claim XRP from the channel in bulk using signed authorizations. Individual authorizations can be verified without sending a full XRP Ledger transaction. Payment channels are good for extremely high-volume micropayments or "streaming" payments. + - If the receiving address is funded, the engine makes additional checks based on their settings, such as [Deposit Authorization](depositauth.html). + - If the receiving address isn't funded, it checks if the payment will deliver enough XRP to meet the minimum [account reserve](reserves.html) requirement. If the reserve is met, a new account is created for the address and its starting balance is the amount received. +4. The ledger debits and credits the corresponding accounts. + + **Note:** The sender is also debited the XRP [transaction cost](transaction-cost.html). + ## See Also -- **Concepts:** - - [Payment System Basics](payment-system-basics.html) - **Tutorials:** - [Send XRP (Interactive Tutorial)](send-xrp.html) - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) diff --git a/content/concepts/payment-types/escrow.md b/content/concepts/payment-types/escrow.md index e4c833f6e2..fe45fba01e 100644 --- a/content/concepts/payment-types/escrow.md +++ b/content/concepts/payment-types/escrow.md @@ -1,60 +1,39 @@ --- html: escrow.html parent: payment-types.html -blurb: Escrows set aside XRP and deliver it later when certain conditions are met. Escrows can depend on time limits, cryptographic conditions, or both. +blurb: Escrow holds funds until specified conditions are met. labels: - Escrow - - Smart Contracts --- # Escrow -Escrow is a feature of the XRP Ledger that allows you to send conditional XRP payments. These conditional payments, called _escrows_, set aside XRP and deliver it later when certain conditions are met. Conditions to successfully finish an escrow include time-based unlocks and [crypto-conditions][]. Escrows can also be set to expire if not finished in time. +Traditionally, an escrow is a contract between two parties to facilitate financial transactions. An impartial third party receives and holds funds, and only releases them to the intended recipient when conditions specified by the contract are met. This method ensures both parties meet their obligations. -The XRP set aside in an escrow is locked up. No one can use or destroy the XRP until the escrow has been successfully finished or canceled. Before the expiration time, only the intended receiver can get the XRP. After the expiration time, the XRP can only be returned to the sender. +The XRP Ledger takes escrow a step further, replacing the third party with an automated system built into the ledger. An escrow locks up XRP, which can't be used or destroyed until conditions are met. -## Usage +## Types of Escrow - +The XRP Ledger supports three types of escrow: -[![Escrow Flow Diagram (Successful finish)](img/escrow-success-flow.png)](img/escrow-success-flow.png) +- **Time-based Escrow:** Funds only become available after a certain amount of time passes. +- **Conditional Escrow:** This escrow is created with a corresponding condition and fulfillment. The condition serves as a lock on the funds and won't release until the correct fulfillment key is provided. +- **Combination Escrow:** This escrow combines the features of time-based and conditional escrow. The escrow is completely inaccessible until the specified time passes, after which the funds can be release by providing the correct fulfillment. -**Step 1:** To send an escrow, the sender uses an [EscrowCreate transaction][] to lock up some XRP. This transaction defines a finish time, an expiration time, or both. The transaction may also define a crypto-condition that must be fulfilled to finish the escrow. This transaction must define an intended recipient for the XRP; the recipient _may_ be the same as the sender. +## Escrow Lifecycle -**Step 2:** After this transaction has been processed, the XRP Ledger has an [Escrow object](escrow-object.html) that holds the escrowed XRP. This object contains the properties of the escrow as defined by the transaction that created it. If this escrow has a finish time, no one can access the XRP before then. +1. The sender creates an escrow using the `EscrowCreate` transaction. This transaction defines: -**Step 3:** The recipient, or any other XRP Ledger address, sends an [EscrowFinish transaction][] to deliver the XRP. If the correct conditions are met, this destroys the Escrow object in the ledger and credits the XRP to the intended recipient. If the escrow has a crypto-condition, this transaction must include a fulfillment for that condition. If the escrow has an expiration time that has already passed, the EscrowFinish transaction instead fails with the code [`tecNO_PERMISSION`](tec-codes.html). + - An amount of XRP to lock up. + - The conditions to release the XRP. + - The recipient of the XRP. -### Expiration Case +2. When the transaction is processed, the XRP Ledger creates an `Escrow` object that holds the escrowed XRP. -[![Escrow Flow Diagram (Expired escrow)](img/escrow-cancel-flow.png)](img/escrow-cancel-flow.png) +3. The recipient sends an `EscrowFinish` transaction to deliver the XRP. If the conditions have been met, this destroys the `Escrow` object and delivers the XRP to the recipient. -All escrows start the same way, so **Steps 1 and 2** are the same as in the successful case. + **Note:** If the escrow has an expiration time and isn't successfully finished before then, the escrow becomes expired. An expired escrow remains in the ledger until an `EscrowCancel` transaction cancels it, destroying the `Escrow` object and returning the XRP to the sender. -**Step 3a:** If the escrow has an expiration time, and it has not been successfully finished before then, the escrow is considered expired. It continues to exist in the XRP Ledger, but can no longer successfully finish. (Expired objects remain in the ledger until a transaction modifies them. Time-based triggers cannot change the ledger contents.) - -**Step 4a:** The sender, or any other XRP Ledger address, sends an [EscrowCancel transaction][] to cancel the expired escrow. This destroys the [Escrow object](escrow-object.html) in the ledger and returns the XRP to the sender. - - - - -## Limitations - -Escrow is designed as a feature to enable the XRP Ledger to be used in the [Interledger Protocol][] and with other smart contracts. The current version has a modest scope to avoid complexity. - -- Escrow only works with XRP, not tokens. -- Escrow requires sending at least two transactions: one to create the escrow, and one to finish or cancel it. Thus, it may not be financially sensible to escrow payments for very small amounts, because the participants must destroy the [transaction cost](transaction-cost.html) of the two transactions. - - When using Crypto-Conditions, the [cost of the transaction to finish the escrow](#escrowfinish-transaction-cost) is higher than usual. -- All escrows must be created with a "finish-after" time or a [crypto-condition][], or both. If the escrow does not have a finish-after time, it must have an expiration time. - - **Note:** The [fix1571 amendment][] changed the requirements for creating an escrow. Escrows created before that amendment could provide an expiration time with no condition or finish-after time. Anyone can finish such escrows immediately (sending the funds to the intended recipient). - -- None of the time values can be in the past when the escrow-creating transaction executes. -- Timed releases and expirations are limited to the resolution of XRP Ledger closes. This means that, in practice, times may be rounded to approximately 5 second intervals, depending on exactly when the ledgers close. -- The only supported [crypto-condition][] type is PREIMAGE-SHA-256. - -Escrow provides strong guarantees that are best suited for high-value, low-quantity payments. [Payment Channels](use-payment-channels.html) are better suited for fast, low-value payments. Of course, unconditional [Payments](payment.html) are also preferable for many use cases. - -## State Diagram +## Escrow States The following diagram shows the states an Escrow can progress through: @@ -69,25 +48,24 @@ The diagram shows three different cases for three possible combinations of the e - **Conditional Escrow (right):** If the escrow specifies a crypto-condition (`Condition` field) and not a finish-after time, the escrow becomes **Conditionally Ready** immediately when it is created. During this time, anyone can finish the escrow, but only if they supply the correct fulfillment to the crypto-condition. If no one finishes the escrow before its expiration time (`CancelAfter` field), the escrow becomes **Expired**. (An escrow without a finish-after time _must_ have an expiration time.) In the expired state, the escrow can no longer be finished, and anyone can cancel it. +## Limitations -## Availability of Escrow +- Escrow only works with XRP, not tokens. +- The costs can make it infeasible for small amounts. + - Escrow requires two transactions: one to create the escrow, and one to finish or cancel it. Crypto-Conditions incur a higher [transaction cost](transaction-cost.html) than usual. + - While the escrow is incomplete, the sender is responsible for the [reserve requirement](reserves.html) of the `Escrow` object. +- You can't create an escrow with past time values. +- Timed releases and expirations resolve according to [ledger close times](ledger-close-times.html). In practice, actual release and expiration times can vary by about five seconds as ledgers close. +- The only supported crypto-condition type is PREIMAGE-SHA-256. -Conditional payments have been enabled by the ["Escrow" Amendment](known-amendments.html#escrow) to the XRP Ledger Consensus Protocol since 2017-03-31. A previous version of the same functionality was available on the [XRP Ledger Test Net](xrp-test-net-faucet.html) by the name "Suspended Payments" (SusPay) in 2016. - -When testing in [stand-alone mode][], you can force the Escrow feature to be enabled locally regardless of the amendment status. Add the following stanza to your `rippled.cfg`: - - [features] - Escrow - -You can check the status of the Escrow amendment using the [feature method][]. ## EscrowFinish Transaction Cost -When using [crypto-conditions][], the EscrowFinish transaction must pay a [higher transaction cost](transaction-cost.html#special-transaction-costs) because of the higher processing load involved in verifying the crypto-condition fulfillment. +When using crypto-conditions, the EscrowFinish transaction must pay a [higher transaction cost](transaction-cost.html#special-transaction-costs) because of the higher processing load involved in verifying the crypto-condition fulfillment. -If the escrow is purely time-locked with no crypto-condition, the EscrowFinish costs only the standard [transaction cost](transaction-cost.html) for a reference transaction. +The additional transaction cost required is proportional to the size of the fulfillment. If the transaction is [multi-signed](multi-signing.html), the cost of multi-signing is added to the cost of the fulfillment. -The additional transaction cost required is proportional to the size of the fulfillment. Currently, an EscrowFinish with a fulfillment requires a minimum transaction cost of **330 [drops of XRP](basic-data-types.html#specifying-currency-amounts) plus 10 drops per 16 bytes in the size of the fulfillment**. If the transaction is [multi-signed](multi-signing.html), the cost of multi-signing is added to the cost of the fulfillment. +Currently, an EscrowFinish with a fulfillment requires a minimum transaction cost of **330 [drops of XRP](basic-data-types.html#specifying-currency-amounts) plus 10 drops per 16 bytes in the size of the fulfillment**. **Note:** The above formula is based on the assumption that the reference cost of a transaction is 10 drops of XRP. @@ -98,43 +76,12 @@ reference_fee * (signer_count + 33 + (fulfillment_bytes / 16)) ``` -## Why Escrow? - -The age-old practice of [Escrow](https://en.wikipedia.org/wiki/Escrow) enables many kinds of financial transactions that would be considered risky otherwise, especially online. By letting a trusted third party hold the money while a transaction or evaluation period is underway, both sides can be assured that the other must hold up their end of the bargain. - -The Escrow feature takes this idea further by replacing the third party with an automated system built into the XRP Ledger, so that the lock up and release of funds is impartial and can be automated. - -Fully automated escrow, backed by the integrity of the XRP Ledger itself, solves important problems for Ripple, and we think there are many other use cases that escrow enables. Ripple encourages the industry to find new and unique ways to put escrow to use. - -### Use Case: Time-based Lock-Up - -**Background:** Ripple holds a large amount of the total XRP, which it sells methodically as a way to fund and incentivize the healthy development of the XRP Ledger and related technologies. At the same time, owning such a large chunk of XRP causes problems for the company, such as: - -- Individuals and businesses who use the XRP Ledger worry that their investments in XRP could be diluted or devalued if Ripple were to flood the market by selling at a higher rate than usual. - - Although flooding the market would be a long-term loss for Ripple, the possibility that the company could do so exerts downward pressure over the price of XRP, and thus decreases the value of the company's assets. -- Ripple must carefully manage ownership of its accounts to protect against digital theft and other forms of malicious behavior, even by insiders. - -**Solution:** By placing 55 billion XRP into time-based escrows, Ripple ensures that the supply of XRP in circulation is predictable and increases at a slow but steady rate. Others who hold XRP know that Ripple cannot flood the market, even if the company's priorities or strategy changes. - -Placing the money into escrow does not directly protect Ripple's holdings from malicious actors, but it sharply reduces the amount of XRP that can be quickly stolen or redirected if a malicious actor gains temporary control over Ripple's XRP accounts. This reduces the risk of catastrophic losses of XRP and increases the time for Ripple to detect, prevent, and track down unintended uses of Ripple's XRP assets. - -### Use Case: Interledger Payments - -**Background:** In the quickly-developing world of financial technology, one of the core challenges is coordinating activities that cross multiple digital money systems, or ledgers. Many proposed solutions to this problem (including early views of the XRP Ledger!) can be reduced to creating "one ledger to rule them all." Ripple believes no single system can meet the needs of everyone in the world: in fact, some desirable features are mutually exclusive. Instead, Ripple believes that an interconnected network of ledgers—an _interledger_—is the true future of financial technology. The [Interledger Protocol][] defines standards for making as many systems as possible connect securely and smoothly. - -The most fundamental principle of inter-ledger payments is _conditional transfers_. Multi-hop payments have a risk problem: the more hops in the middle, the more places the payment can fail. Interledger solves this with the financial equivalent of a "[two-phase commit](https://en.wikipedia.org/wiki/Two-phase_commit_protocol)", where the two steps are (1) prepare conditional transfers, then (2) fulfill the conditions to execute the transfers. The Interledger project defined a [crypto-conditions][] specification to standardize automated ways to define and verify conditions, and settled on SHA-256 hashes as a "common denominator" of such conditions. - -**Solution:** The Escrow feature makes the XRP Ledger ideal for bridging multi-hop payments using the Interledger Protocol, because it natively supports transfers that deliver XRP based on PREIMAGE-SHA-256 crypto-conditions, and it executes those transfers within seconds of being presented with the matching fulfillment. - ## See Also For more information about Escrow in the XRP Ledger, see the following: - [Escrow Tutorials](use-escrows.html) - - [Send a Time-Held Escrow](send-a-time-held-escrow.html) - - [Send a conditionally-held escrow](send-a-conditionally-held-escrow.html) - - [Look up escrows by sender or receiver](look-up-escrows.html) - [Transaction Reference](transaction-formats.html) - [EscrowCreate transaction][] - [EscrowFinish transaction][] @@ -142,7 +89,6 @@ For more information about Escrow in the XRP Ledger, see the following: - [Ledger Reference](ledger-data-formats.html) - [Escrow object](escrow-object.html) -For more information on Interledger and how conditional transfers enable secure payments across multiple ledgers, see [Interledger Architecture](https://interledger.org/rfcs/0001-interledger-architecture/). For more information on Ripple's 55-billion XRP lock-up, see [Ripple's Insights Blog](https://ripple.com/insights/ripple-to-place-55-billion-xrp-in-escrow-to-ensure-certainty-into-total-xrp-supply/). diff --git a/content/concepts/payment-types/partial-payments.ja.md b/content/concepts/payment-types/partial-payments.ja.md index 28f82df6a7..8750bb24b7 100644 --- a/content/concepts/payment-types/partial-payments.ja.md +++ b/content/concepts/payment-types/partial-payments.ja.md @@ -8,7 +8,7 @@ labels: --- # Partial Payment -デフォルトのケースでは、XRP Ledgerの[Paymentトランザクション][]の`Amount`フィールドに、為替レートと[送金手数料](transfer-fees.html)を差し引いた実際の送金額が指定されます。「Partial Payment」フラグ([**tfPartialPayment**](payment.html#paymentのフラグ))を使うと、送金額を増額する代わりに受取金額を減額して、支払を正常に実行できます。Partial Paymentは、追加コストなしで[支払を返金](become-an-xrp-ledger-gateway.html#bouncing-payments)したい場合に便利です。 +デフォルトのケースでは、XRP Ledgerの[Paymentトランザクション][]の`Amount`フィールドに、為替レートと[送金手数料](transfer-fees.html)を差し引いた実際の送金額が指定されます。「Partial Payment」フラグ([**tfPartialPayment**](payment.html#paymentのフラグ))を使うと、送金額を増額する代わりに受取金額を減額して、支払を正常に実行できます。Partial Paymentは、追加コストなしで[支払を返金](stablecoin-issuer.html#bouncing-payments)したい場合に便利です。 [トランザクションコスト](transaction-cost.html)に使用されるXRPの額は、トランザクションタイプに関わらず常に送金元のアカウントから差し引かれます。 diff --git a/content/concepts/payment-types/partial-payments.md b/content/concepts/payment-types/partial-payments.md index 0bdf932a7a..0e58064d4a 100644 --- a/content/concepts/payment-types/partial-payments.md +++ b/content/concepts/payment-types/partial-payments.md @@ -10,7 +10,7 @@ labels: The sender of any [Payment transaction][] can enable the ["Partial Payment" flag](payment.html#payment-flags) and send a payment which delivers less than the `Amount` field indicates. When processing any Payment, use the `delivered_amount` metadata field, not the `Amount` field. The `delivered_amount` is the amount a payment actually delivered. -If a Payment does not enable the Partial Payment flag, the `Amount` field of a [Payment transaction][] in the XRP Ledger specifies the amount to deliver after charging for exchange rates and [transfer fees](transfer-fees.html). The Partial Payment flag ([`tfPartialPayment`](payment.html#payment-flags)) allows a payment to succeed by reducing the amount received instead of increasing the amount sent. Partial payments are useful for [returning payments](become-an-xrp-ledger-gateway.html#bouncing-payments) without incurring additional costs to oneself. +If a Payment does not enable the Partial Payment flag, the `Amount` field of a [Payment transaction][] in the XRP Ledger specifies the amount to deliver after charging for exchange rates and [transfer fees](transfer-fees.html). The Partial Payment flag ([`tfPartialPayment`](payment.html#payment-flags)) allows a payment to succeed by reducing the amount received instead of increasing the amount sent. Partial payments are useful for [returning payments](stablecoin-issuer.html#bouncing-payments) without incurring additional costs to oneself. The amount of XRP used for the [transaction cost](transaction-cost.html) is always deducted from the sender’s account, regardless of the type of transaction. This transaction cost, or fee, is not included in the `Amount`. @@ -120,7 +120,7 @@ Using [the `delivered_amount` field](#the-delivered_amount-field) when processin - **Tools:** - [Transaction Sender](tx-sender.html) - **Concepts:** - - [Transaction Basics](transaction-basics.html) + - [Transactions](transactions.html) - **Tutorials:** - [Look Up Transaction Results](look-up-transaction-results.html) - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) @@ -133,6 +133,6 @@ Using [the `delivered_amount` field](#the-delivered_amount-field) when processin - [tx method][] -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} {% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/tokens/authorized-trust-lines.ja.md b/content/concepts/tokens/authorized-trust-lines.ja.md index 4a47a4fa9a..3658161049 100644 --- a/content/concepts/tokens/authorized-trust-lines.ja.md +++ b/content/concepts/tokens/authorized-trust-lines.ja.md @@ -30,7 +30,7 @@ XRP Ledger上のステーブルコインと認可トラストラインの使用 **ヒント:** 2つのTrustSetトランザクション(ステップ3および4)は、どちらの順序で発生しても構いません。発行者がトラストラインを先に認可した場合、これにより限度額が0に設定されたトラストラインが作成され、顧客のTrustSetトランザクションは、事前に認可されたトラストラインの限度額を設定することになります。([TrustSetAuth amendment][]によって追加されました。)_ ## 注意事項 -認可トラストラインを使用するつもりがない場合でも、[運用アカウントと予備アカウント](issuing-and-operational-addresses.html)のRequire Auth設定を有効にし、これらのアカウントにトラストラインを認可させないようにすることができます。これは、これらのアカウントが誤ってトークンを発行することを防止します(たとえば、ユーザーが誤って間違ったアドレスをトラストしてしまった場合など)。これはあくまで予防措置であり、運用アカウントと予備アカウントが意図したとおりに _発行者の_ トークンを転送することを止めるものではありません。 +認可トラストラインを使用するつもりがない場合でも、[運用アカウントと予備アカウント](account-types.html)のRequire Auth設定を有効にし、これらのアカウントにトラストラインを認可させないようにすることができます。これは、これらのアカウントが誤ってトークンを発行することを防止します(たとえば、ユーザーが誤って間違ったアドレスをトラストしてしまった場合など)。これはあくまで予防措置であり、運用アカウントと予備アカウントが意図したとおりに _発行者の_ トークンを転送することを止めるものではありません。 ## 技術情報 @@ -116,8 +116,6 @@ POST http://localhost:8088/ - **コンセプト:** - [Deposit Authorization](depositauth.html) - [トークンの凍結](freezes.html) -- **チュートリアル:** - - [ステーブルコインを発行する](become-an-xrp-ledger-gateway.html) - **リファレンス:** - [account_linesメソッド][] - [account_infoメソッド][] diff --git a/content/concepts/tokens/authorized-trust-lines.md b/content/concepts/tokens/authorized-trust-lines.md index 47cb76e911..a7f9be5704 100644 --- a/content/concepts/tokens/authorized-trust-lines.md +++ b/content/concepts/tokens/authorized-trust-lines.md @@ -27,11 +27,11 @@ With a stablecoin on the XRP Ledger and use Authorized Trust Lines, the process 3. The customer sends a [TrustSet transaction][] to create a trust line to the issuer's address, with a positive limit. 4. The issuer sends a TrustSet transaction to authorize the customer's trust line. -**Tip:** The two TrustSet transactions (steps 3 and 4) can occur in either order. If the issuer authorizes the trust line first, this creates a trust line with the limit set to 0, and the customer's TrustSet transaction sets the limit on the pre-authorized trust line. _(Added by the [TrustSetAuth amendment][].)_ +**Tip:** The two TrustSet transactions (steps 3 and 4) can occur in either order. If the issuer authorizes the trust line first, this creates a trust line with the limit set to 0, and the customer's TrustSet transaction sets the limit on the pre-authorized trust line. ## As a Precaution -Even if you don't intend to use Authorized Trust Lines, you can enable the Require Auth setting on [operational and standby accounts](issuing-and-operational-addresses.html), and then never have those accounts approve any trust lines. This prevents those accounts from issuing tokens by accident (for example, if a user accidentally trusts the wrong address). This is only a precaution, and does not stop the operational and standby accounts from transferring the _issuer's_ tokens, as intended. +Even if you don't intend to use Authorized Trust Lines, you can enable the Require Auth setting on [operational and standby accounts](account-types.html), and then never have those accounts approve any trust lines. This prevents those accounts from issuing tokens by accident (for example, if a user accidentally trusts the wrong address). This is only a precaution, and does not stop the operational and standby accounts from transferring the _issuer's_ tokens, as intended. ## Technical Details @@ -120,8 +120,6 @@ In the response's `result.lines` array, find the object whose `currency` field i - **Concepts:** - [Deposit Authorization](depositauth.html) - [Freezing Issued Currencies](freezes.html) -- **Tutorials:** - - [Become a Stablecoin Issuer](become-an-xrp-ledger-gateway.html) - **References:** - [account_lines method][] - [account_info method][] diff --git a/content/concepts/decentralized-exchange/autobridging.ja.md b/content/concepts/tokens/autobridging.ja.md similarity index 77% rename from content/concepts/decentralized-exchange/autobridging.ja.md rename to content/concepts/tokens/autobridging.ja.md index 9a35f5ecda..91550fbb38 100644 --- a/content/concepts/decentralized-exchange/autobridging.ja.md +++ b/content/concepts/tokens/autobridging.ja.md @@ -8,7 +8,7 @@ labels: --- # オートブリッジング -XRP Ledgerの[分散型取引所](decentralized-exchange.html)で、XRP以外の2種類の通貨を交換する[オファー](offers.html)があった場合、合成されたオーダーブックで[XRP](xrp.html)が中間通貨として使用されることがあります。これは _オートブリッジング_ によるものです。この機能は、通貨を直接交換するよりも安く済む場合にXRPを使用し、あらゆる通貨ペアの流動性を向上させる役割を担います。XRP Ledgerのネイティブ暗号資産であるというXRPの特性によりこのように機能します。オファーを実行する際は、直接オファーとオートブリッジングオファーを組み合わせることで全体として最良の為替レートを実現できます。 +XRP Ledgerの[分散型取引所](decentralized-exchange.html)で、XRP以外の2種類の通貨を交換する[オファー](offers.html)があった場合、合成されたオーダーブックで[XRP](what-is-xrp.html)が中間通貨として使用されることがあります。これは _オートブリッジング_ によるものです。この機能は、通貨を直接交換するよりも安く済む場合にXRPを使用し、あらゆる通貨ペアの流動性を向上させる役割を担います。XRP Ledgerのネイティブ暗号資産であるというXRPの特性によりこのように機能します。オファーを実行する際は、直接オファーとオートブリッジングオファーを組み合わせることで全体として最良の為替レートを実現できます。 例: _AnitaはGBPを売却してBRLを購入するオファーを発行しました。このような一般的ではない通貨マーケットでは、オファーがあまりない場合があります。良いレートのオファーが1件ありますが、Anitaの取引を満たすのに十分な量ではありません。ただしGBPとXRPおよびBRLとXRPの間には、それぞれアクティブで競争力のあるマーケットが存在します。XRP Ledgerのオートブリッジングシステムは、あるトレーダーからXRPをGBPで購入し、そのXRPを別のトレーダーに支払ってBRLを購入することで、Anitaのオファーを履行できる方法を見つけます。AnitaはGBPとBRLを直接交換するマーケットでの少額オファーを、GBP対XRPのオファーとXRP対BRLのオファーをペアリングしてより良い複合レートと組み合わせて、最適なレートを自動的に得ることができます。_ diff --git a/content/concepts/tokens/autobridging.md b/content/concepts/tokens/autobridging.md new file mode 100644 index 0000000000..0a6c11aac9 --- /dev/null +++ b/content/concepts/tokens/autobridging.md @@ -0,0 +1,29 @@ +--- +html: autobridging.html +parent: decentralized-exchange.html +blurb: Autobriding automatically connects order books using XRP as an intermediary when it reduces costs. +labels: + - XRP + - Decentralized Exchange +--- +# Auto-Bridging + +Any [Offer](offers.html) in the XRP Ledger's [decentralized exchange](decentralized-exchange.html) 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._ + +Auto-bridging happens automatically on any [OfferCreate transaction][]. [Payment transactions](payment.html) _do not_ use auto-bridging by default, but path-finding can find [paths](paths.html) that have the same effect. + +## See Also + +- [Dev Blog: Introducing Autobridging](https://xrpl.org/blog/2014/introducing-offer-autobridging.html) + +- [Offer Preference](offers.html#offer-preference) + +- [Payment Paths](paths.html) + + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/content/concepts/decentralized-exchange/decentralized-exchange.ja.md b/content/concepts/tokens/decentralized-exchange.ja.md similarity index 93% rename from content/concepts/decentralized-exchange/decentralized-exchange.ja.md rename to content/concepts/tokens/decentralized-exchange.ja.md index 7e7f28cc75..cc6dc54a90 100644 --- a/content/concepts/decentralized-exchange/decentralized-exchange.ja.md +++ b/content/concepts/tokens/decentralized-exchange.ja.md @@ -1,6 +1,6 @@ --- html: decentralized-exchange.html -parent: concepts.html +parent: tokens.html template: pagetype-category.html.jinja blurb: XRP Ledgerには多機能な取引所が含まれており、この取引所を利用してユーザーはトークンをXRPに、あるいはXRPをトークンにに交換できます。 --- @@ -14,7 +14,7 @@ XRP Ledgerには、世界でおそらく最も古い _分散型取引所_ (「DE XRP Ledgerの分散型取引所は、無制限の通貨ペアで構成されており、ユーザーが取引を行う際にオンデマンドで追跡されます。通貨ペアは、XRPとトークン、または2つの異なるトークンから構成されます。トークンは常に、発行者と通貨コードの組み合わせによって識別されます。同じ通貨コードで異なる発行者のトークン同士、または同じ発行者で異なる通貨コードのトークン同士の取引も可能です。 -XRP Ledgerのすべての変更がそうであるように、取引を行うには[トランザクション](transaction-basics.html)を送信する必要があります。XRP Ledgerにおける取引は、[オファー](offers.html)と呼ばれています。オファーは事実上、ある通貨(XRPまたはトークン)を特定の金額で他の通貨と売買するための[_指値注文_](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%9F%E3%83%83%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC)です。ネットワークがオファーを実行する際、同じ通貨ペアでマッチングするオファーがあれば、最も良い取引レートから順に約定されます。 +XRP Ledgerのすべての変更がそうであるように、取引を行うには[トランザクション](transactions.html)を送信する必要があります。XRP Ledgerにおける取引は、[オファー](offers.html)と呼ばれています。オファーは事実上、ある通貨(XRPまたはトークン)を特定の金額で他の通貨と売買するための[_指値注文_](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%9F%E3%83%83%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC)です。ネットワークがオファーを実行する際、同じ通貨ペアでマッチングするオファーがあれば、最も良い取引レートから順に約定されます。 オファーは、全額または一部が約定されることがあります。すぐに全額が約定されなかった場合は、残りの金額は台帳上のOfferオブジェクトとなります。その後、他のオファーや[クロスカレンシー支払い](cross-currency-payments.html)がオファーにマッチし、約定する可能性があります。このため、Offerは最初に注文したときは指定した取引レートよりも高いレートで約定し、後で注文したときは指定した取引レートと全く同じレートで約定することがあります。(端数処理のためのわずかな差は除きます) diff --git a/content/concepts/decentralized-exchange/decentralized-exchange.md b/content/concepts/tokens/decentralized-exchange.md similarity index 93% rename from content/concepts/decentralized-exchange/decentralized-exchange.md rename to content/concepts/tokens/decentralized-exchange.md index 60f9058685..8431cccbb1 100644 --- a/content/concepts/decentralized-exchange/decentralized-exchange.md +++ b/content/concepts/tokens/decentralized-exchange.md @@ -1,6 +1,6 @@ --- html: decentralized-exchange.html -parent: concepts.html +parent: tokens.html template: pagetype-category.html.jinja blurb: The XRP Ledger contains a fully-functional exchange where users can trade tokens for XRP or each other. targets: @@ -16,7 +16,7 @@ The XRP Ledger has possibly the world's oldest _decentralized exchange_ (sometim The XRP Ledger's decentralized exchange consists of an unlimited number of currency pairs, tracked on-demand when users make trades. A currency pair can consist of XRP and a token or two different tokens; tokens are always identified by the combination of an issuer and a currency code. It is possible to trade between two tokens with the same currency code and different issuers, or the same issuer and different currency codes. -As with all changes to the XRP Ledger, you need to send a [transaction](transaction-basics.html) to make a trade. A trade in the XRP Ledger is called an [Offer](offers.html). An Offer is effectively a [_limit order_](https://en.wikipedia.org/wiki/Order_(exchange)#Limit_order) to buy or sell a specific amount of one currency (XRP or a token) for a specific amount of another. When the network executes an Offer, if there are any matching Offers for the same currency pair, they are consumed starting with the best exchange rate first. +As with all changes to the XRP Ledger, you need to send a [transaction](transactions.html) to make a trade. A trade in the XRP Ledger is called an [Offer](offers.html). An Offer is effectively a [_limit order_](https://en.wikipedia.org/wiki/Order_(exchange)#Limit_order) to buy or sell a specific amount of one currency (XRP or a token) for a specific amount of another. When the network executes an Offer, if there are any matching Offers for the same currency pair, they are consumed starting with the best exchange rate first. An Offer can be fully or partially filled; if it's not fully filled right away, it becomes a passive Offer object in the ledger for the remaining amount. Later on, other Offers or [Cross-currency payments](cross-currency-payments.html) can match and consume the Offer. Because of this, Offers can execute at better than their requested exchange rate when initially placed, or at exactly their stated exchange rate later on (aside from minor differences to account for rounding). diff --git a/content/concepts/tokens/freezes.ja.md b/content/concepts/tokens/freezes.ja.md index 3dc3a9b18f..6cb0cecc05 100644 --- a/content/concepts/tokens/freezes.ja.md +++ b/content/concepts/tokens/freezes.ja.md @@ -39,7 +39,7 @@ XRP Ledgerでは、XRP以外の通貨はすべて発行済み通貨として表 金融機関は、疑わしい活動を行う取引相手や、金融機関の利用規約に違反する取引相手にリンクしているトラストラインを凍結できます。金融機関は、同機関が運用する、XRP Ledgerに接続されているその他のシステムにおいても、その取引相手を凍結する必要があります。(凍結しないと、アドレスから金融機関経由で支払を送金することで、望ましくない活動を行うことが依然として可能となります。) -各個別アドレスは金融機関とのトラストラインを凍結できます。これは金融機関とその他のユーザーの間の取引には影響しません。ただし、他のアドレス([運用アドレス](issuing-and-operational-addresses.html)を含む)からその個別アドレスに対しては、その金融機関のイシュアンスを送信できなくなります。このようなIndividual Freezeは、オファーには影響しません。 +各個別アドレスは金融機関とのトラストラインを凍結できます。これは金融機関とその他のユーザーの間の取引には影響しません。ただし、他のアドレス([運用アドレス](account-types.html)を含む)からその個別アドレスに対しては、その金融機関のイシュアンスを送信できなくなります。このようなIndividual Freezeは、オファーには影響しません。 Individual Freezeは1つの通貨にのみ適用されます。特定の取引相手の複数通貨を凍結するには、アドレスが各通貨のトラストラインで、個別にIndividual Freezeを有効にする必要があります。 @@ -50,15 +50,15 @@ Individual Freezeは1つの通貨にのみ適用されます。特定の取引 **Global Freeze**機能は、アドレスに設定できます。発行アドレスがGlobal Freeze機能を有効にすると、その発行アドレスのすべての発行済み通貨に対して以下のルールが適用されます: -* 凍結された発行アドレスのすべての取引相手は、イシュアーに直接支払う場合を除き、凍結されたアドレスへのトラストラインの残高を減らすことができません。(これはすべての[運用アドレス](issuing-and-operational-addresses.html)にも影響します。) +* 凍結された発行アドレスのすべての取引相手は、イシュアーに直接支払う場合を除き、凍結されたアドレスへのトラストラインの残高を減らすことができません。(これはすべての[運用アドレス](account-types.html)にも影響します。) * 凍結された発行アドレスの取引相手は、発行アドレスとの直接的な支払の送受信を引き続き行うことができます。 * 凍結アドレスによる発行済み通貨の売りオファーはすべて、[資金不足とみなされます](offers.html#オファーのライフサイクル)。 確認事項: アドレスはXRPを発行できません。Global FreezeはXRPには適用されません。 -運用アドレスのシークレットキーが漏えいした場合には、運用アドレスの制御を取り戻した後であっても金融機関の[発行アドレス](issuing-and-operational-addresses.html)に対してGlobal Freezeを有効にすることが有益です。これにより資金流出を止め、攻撃者がそれ以上の資金を盗むことを防止し、少なくともそれまでの経過の追跡が容易になります。XRP LedgerでGlobal Freezeを行う他に、金融機関は外部システムへのコネクターでの疑わしい活動を停止する必要があります。 +運用アドレスのシークレットキーが漏えいした場合には、運用アドレスの制御を取り戻した後であっても金融機関の[発行アドレス](account-types.html)に対してGlobal Freezeを有効にすることが有益です。これにより資金流出を止め、攻撃者がそれ以上の資金を盗むことを防止し、少なくともそれまでの経過の追跡が容易になります。XRP LedgerでGlobal Freezeを行う他に、金融機関は外部システムへのコネクターでの疑わしい活動を停止する必要があります。 -また、金融機関が新しい[発行アドレス](issuing-and-operational-addresses.html)への移行や、営業の停止を予定している場合にも、Global Freezeを有効にすることが有用です。これにより、特定の時点で資金がロックされるため、ユーザーは他の通貨で取引することができなくなります。 +また、金融機関が新しい[発行アドレス](account-types.html)への移行や、営業の停止を予定している場合にも、Global Freezeを有効にすることが有用です。これにより、特定の時点で資金がロックされるため、ユーザーは他の通貨で取引することができなくなります。 Global Freezeは、当該アドレスによって発行および保有されている _すべての_ 通貨に適用されます。1つの通貨のみに対してGlobal Freezeを有効にすることはできません。一部の通貨のみを凍結できるようにしたい場合は、通貨ごとに異なるアドレスを使用してください。 diff --git a/content/concepts/tokens/freezes.md b/content/concepts/tokens/freezes.md index a241200375..2b84b8d70a 100644 --- a/content/concepts/tokens/freezes.md +++ b/content/concepts/tokens/freezes.md @@ -35,7 +35,7 @@ Reminder: Trust lines do not hold XRP. XRP cannot be frozen. A financial institution can freeze the trust line linking it to a counterparty if that counterparty shows suspicious activity or violates the financial institution's terms of use. The financial institution should also freeze the counterparty in any other systems the financial institution uses that are connected to the XRP Ledger. (Otherwise, an address might still be able to engage in undesired activity by sending payments through the financial institution.) -An individual address can freeze its trust line to a financial institution. This has no effect on transactions between the institution and other users. It does, however, prevent other addresses, including [operational addresses](issuing-and-operational-addresses.html), from sending that financial institution's tokens to the individual address. This type of individual freeze has no effect on offers. +An individual address can freeze its trust line to a financial institution. This has no effect on transactions between the institution and other users. It does, however, prevent other addresses, including [operational addresses](account-types.html), from sending that financial institution's tokens to the individual address. This type of individual freeze has no effect on offers. The Individual Freeze applies to a single trust line. To freeze multiple tokens with a particular counterparty, the address must enable Individual Freeze on the trust lines for each separate currency code. @@ -46,15 +46,15 @@ An address cannot enable the Individual Freeze setting if it has enabled the [No The **Global Freeze** feature is a setting on an account. An account can enable a global freeze only on itself. When an issuer enables the Global Freeze feature, the following rules apply to all tokens they issue: -* All counterparties of the frozen issuer can no longer decrease the balances in their trust lines to the frozen account, except in direct payments to the issuer. (This also affects the issuer's own [operational addresses](issuing-and-operational-addresses.html).) +* All counterparties of the frozen issuer can no longer decrease the balances in their trust lines to the frozen account, except in direct payments to the issuer. (This also affects the issuer's own [operational addresses](account-types.html).) * Counterparties of the frozen issuer can still send and receive payments directly to and from the issuing address. * All offers to sell tokens issued by the frozen address are [considered unfunded](offers.html#lifecycle-of-an-offer). Reminder: addresses cannot issue XRP. Global freezes do not apply to XRP. -It can be useful to enable Global Freeze on a financial institution's [issuing account](issuing-and-operational-addresses.html) if the issuer's [secret key](cryptographic-keys.html) is compromised, even after regaining control of a such an address. This stops the flow of funds, preventing attackers from getting away with any more money or at least making it easier to track what happened. Besides enacting a Global Freeze in the XRP Ledger, the issuer should also suspend activities in its outside systems. +It can be useful to enable Global Freeze on a financial institution's [issuing account](account-types.html) if the issuer's [secret key](cryptographic-keys.html) is compromised, even after regaining control of a such an address. This stops the flow of funds, preventing attackers from getting away with any more money or at least making it easier to track what happened. Besides enacting a Global Freeze in the XRP Ledger, the issuer should also suspend activities in its outside systems. -It can also be useful to enable Global Freeze if a financial institution intends to migrate to a new [issuing address](issuing-and-operational-addresses.html), or if the financial institution intends to cease doing business. This locks the funds at a specific point in time, so users cannot trade them away for other currencies. +It can also be useful to enable Global Freeze if a financial institution intends to migrate to a new [issuing address](account-types.html), or if the financial institution intends to cease doing business. This locks the funds at a specific point in time, so users cannot trade them away for other currencies. Global Freeze applies to _all_ tokens issued and held by the address. You cannot enable Global Freeze for only one currency code. If you want to have the ability to freeze some tokens and not others, you should use different addresses for each token. diff --git a/content/concepts/tokens/nftoken-batch-minting.ja.md b/content/concepts/tokens/nftoken-batch-minting.ja.md index b3309de307..078afddb51 100644 --- a/content/concepts/tokens/nftoken-batch-minting.ja.md +++ b/content/concepts/tokens/nftoken-batch-minting.ja.md @@ -27,7 +27,7 @@ NFTokenオブジェクトの初回販売以前の市場活動は、XRP Ledgerに プログラムまたはスクリプトを使用して、一度に多数のトークンをMintします。[チケット](tickets.html)を使えば、1度に200件までのトランザクションを並行して処理することができます。 -実用例としては、チュートリアルの[Batch Mint NFTokens](batch-minting.html)を参照してください。 +実用例としては、チュートリアルの[JavaScriptでNFTをバッチMint](batch-mint-nfts-using-javascript.html)を参照してください。 ### メリット diff --git a/content/concepts/tokens/nftoken-batch-minting.md b/content/concepts/tokens/nftoken-batch-minting.md index 139c4cb31e..e54f3e0064 100644 --- a/content/concepts/tokens/nftoken-batch-minting.md +++ b/content/concepts/tokens/nftoken-batch-minting.md @@ -27,7 +27,7 @@ Any market activity before the initial sale of the NFToken object is not recorde Use a program or script to mint many tokens at once. You might find that [Tickets](tickets.html) help you submit transactions in parallel, up to a current limit of 200 transactions in one group. -For a practical example, see the [Batch Mint NFTokens](batch-minting.html) tutorial. +For a practical example, see the [Batch Mint NFTs Using JavaScript](batch-mint-nfts-using-javascript.html) tutorial. ### Benefits diff --git a/content/concepts/tokens/non-fungible-token-transfers.ja.md b/content/concepts/tokens/non-fungible-token-transfers.ja.md index c222b17ce7..64672e4e24 100644 --- a/content/concepts/tokens/non-fungible-token-transfers.ja.md +++ b/content/concepts/tokens/non-fungible-token-transfers.ja.md @@ -11,7 +11,7 @@ labels: XRP Ledger上のアカウント間で`NFToken`オブジェクトを転送することができます。`NFToken`の売買をオファーしたり、他のアカウントから自分が保有するNFTokenへの売買オファーを受け入れることができます。`NFToken`を無料(価格が0)で売却することで、`NFToken`を配布することもできます。すべてのオファーは[NFTokenCreateOfferトランザクション][]を使って作成されます。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## 売却オファー diff --git a/content/concepts/decentralized-exchange/offers.ja.md b/content/concepts/tokens/offers.ja.md similarity index 98% rename from content/concepts/decentralized-exchange/offers.ja.md rename to content/concepts/tokens/offers.ja.md index 008bc0c688..e6d830a651 100644 --- a/content/concepts/decentralized-exchange/offers.ja.md +++ b/content/concepts/tokens/offers.ja.md @@ -89,7 +89,7 @@ Offerオブジェクトは、他のオファーやクロスカレンシー決済 有効期限は秒単位で指定できますが、オファーが期限切れとなる時刻は、実際には正確ではありません。オファーが期限切れとなるのは、期限切れ時刻が直前の台帳のクローズ時刻より前か等しい場合です。それ以外の場合は、現実の時刻がオファー期限よりも後でも、オファーが約定する可能性があります。言い換えると、有効期限が最新の有効な台帳のクローズ時刻よりも遅ければ、実際の時計がどうであろうと、オファーはまだ「有効」なのです。 -これは、ネットワークのコンセンサス形成の仕組みによるものです。ピアツーピアネットワーク全体が合意に達するには、トランザクションを実行する際に、すべてのサーバーがどのオファーが期限切れであるかに合意する必要があります。個々のサーバーはシステム時刻の設定にわずかな違いがあるため、各サーバーが「現在」時刻を使用した場合、どのオファーが期限切れであるかについて同じ結論に達しない可能性があります。台帳のクローズ時刻は、その台帳のトランザクションが実行されるまで分からないため、サーバーは「前の台帳」の正式なクローズ時刻を代わりに使用します。[台帳のクローズ時刻は丸められます](ledgers.html#ledger-close-times)。このため、オファーが期限切れかどうかを判断するための時刻と実世界の時刻の差が生じる場合があるのです。 +これは、ネットワークのコンセンサス形成の仕組みによるものです。ピアツーピアネットワーク全体が合意に達するには、トランザクションを実行する際に、すべてのサーバーがどのオファーが期限切れであるかに合意する必要があります。個々のサーバーはシステム時刻の設定にわずかな違いがあるため、各サーバーが「現在」時刻を使用した場合、どのオファーが期限切れであるかについて同じ結論に達しない可能性があります。台帳のクローズ時刻は、その台帳のトランザクションが実行されるまで分からないため、サーバーは「前の台帳」の正式なクローズ時刻を代わりに使用します。[台帳のクローズ時刻は丸められます](ledger-close-times.html)。このため、オファーが期限切れかどうかを判断するための時刻と実世界の時刻の差が生じる場合があるのです。 **注記:** 期限切れのOfferオブジェクトは、トランザクションによって削除されるまで、台帳内に残ります。それまでは、APIから取得したデータ([ledger_entryメソッド][]などを使用)に表示され続ける可能性があります。トランザクションは、有効期限が切れたOfferオブジェクトや資金不足のOfferオブジェクトを見つけると自動的に削除します。通常、オファーやクロスカレンシー決済を実行すると、そのOfferオブジェクトはマッチングまたはキャンセルされます。Offerオブジェクトに対応する所有者準備金は、Offerオブジェクトが実際に削除されたときにのみ再び利用可能になります。 diff --git a/content/concepts/decentralized-exchange/offers.md b/content/concepts/tokens/offers.md similarity index 98% rename from content/concepts/decentralized-exchange/offers.md rename to content/concepts/tokens/offers.md index e535c2746c..093e499365 100644 --- a/content/concepts/decentralized-exchange/offers.md +++ b/content/concepts/tokens/offers.md @@ -93,7 +93,7 @@ When you place an Offer, you can optionally add an expiration time to it. By def Expiration times are specified down to the second, but the exact, real-world time when an Offer expires is less precise. An Offer is expired if it has an expiration time that is _earlier than or equal to_ the close time of the previous ledger. Otherwise, the Offer can still execute, even if the real-world time is later than the Offer's expiration. In other words, an Offer is still "active" if its expiration time is later than the close time of the latest validated ledger, regardless of what your clock says. -This is a consequence of how the network reaches agreement. For the entire peer-to-peer network to reach a consensus, all servers must agree which Offers are expired when executing transactions. Individual servers may have slight differences in their internal clock settings, so they might not reach the same conclusions about which Offers were expired if they each used the "current" time. The close time of a ledger is not known until after the transactions in that ledger have been executed, so servers use the official close time of the _previous_ ledger instead. The [close times of ledgers are rounded](ledgers.html#ledger-close-times), which further increases the potential difference between real-world time and the time used to determine if an Offer is expired. +This is a consequence of how the network reaches agreement. For the entire peer-to-peer network to reach a consensus, all servers must agree which Offers are expired when executing transactions. Individual servers may have slight differences in their internal clock settings, so they might not reach the same conclusions about which Offers were expired if they each used the "current" time. The close time of a ledger is not known until after the transactions in that ledger have been executed, so servers use the official close time of the _previous_ ledger instead. The [close times of ledgers are rounded](ledger-close-times.html), which further increases the potential difference between real-world time and the time used to determine if an Offer is expired. **Note:** Expired Offers remain in the ledger data until a transaction removes them. Until then, they can continue to appear in data retrieved from the API (for example, using the [ledger_entry method][]). Transactions automatically delete any expired and unfunded Offers they find, usually while executing Offers or cross-currency payments that would have matched or canceled them. The owner reserve associated with an Offer is only made available again when the Offer is actually deleted. diff --git a/content/concepts/tokens/rippling.ja.md b/content/concepts/tokens/rippling.ja.md index c581ae358d..ebe9af15b2 100644 --- a/content/concepts/tokens/rippling.ja.md +++ b/content/concepts/tokens/rippling.ja.md @@ -65,8 +65,6 @@ DefaultRippleフラグは、デフォルトで着信トラストラインでのR アカウントのDefaultRipple設定は、他者があなたに対してオープンしたトラストラインにのみ影響し、あなたが作成するトラストラインには影響しません。アカウントのDefaultRipple設定を変更する場合、変更前に作成したトラストラインでは既存のNoRipple設定が維持されます。アドレスの新しいデフォルトに合わせてトラストラインのNoRipple設定を変更するには、[TrustSetトランザクション][]を使用します。 -詳細は、[「XRP Ledgerゲートウェイの開設」のDefaultRipple](become-an-xrp-ledger-gateway.html#default-ripple)を参照してください。 - ## NoRippleを使用する @@ -89,8 +87,6 @@ DefaultRippleフラグは、デフォルトで着信トラストラインでのR - **コンセプト:** - [パス](paths.html) -- **チュートリアル:** - - [XRP Ledgerゲートウェイの開設](become-an-xrp-ledger-gateway.html) - **リファレンス:** - [account_linesメソッド][] - [account_infoメソッド][] diff --git a/content/concepts/tokens/rippling.md b/content/concepts/tokens/rippling.md index 718b632dd0..42612de8b6 100644 --- a/content/concepts/tokens/rippling.md +++ b/content/concepts/tokens/rippling.md @@ -26,7 +26,7 @@ If Bob wants to pay $3 to Charlie, then he could say, "Alice, take $3 of the mon {{ include_svg("img/noripple-02.svg", "Charlie --($13)-- Alice --($17)-- Bob") }} -We call this process, where two addresses pay each other by adjusting the balances of trust lines in between them, "rippling". This is a useful and important feature of the XRP Ledger. Rippling occurs when addresses are linked by trust lines that use the same [currency code][]. The issuer does not need to be the same: in fact, larger chains always involve changing issuers. +We call this process, where two addresses pay each other by adjusting the balances of trust lines in between them, "rippling". This is a useful and important feature of the XRP Ledger. Rippling occurs when addresses are linked by trust lines that use the same currency code. The issuer does not need to be the same: in fact, larger chains always involve changing issuers. ## The No Ripple Flag @@ -65,8 +65,6 @@ The **Default Ripple** flag is an account setting that enables rippling on all _ The Default Ripple setting of your account does not affect trust lines that you create; only trust lines that others open to you. If you change the Default Ripple setting of your account, trust lines that were created before the change keep their existing No Ripple settings. You can use a [TrustSet transaction][] to change the No Ripple setting of a trust line to match your address's new default. -For more information, see [Default Ripple in 'Becoming an XRP Ledger Gateway'](become-an-xrp-ledger-gateway.html#default-ripple). - ## Using No Ripple @@ -89,7 +87,7 @@ Using the [HTTP / WebSocket APIs](http-websocket-apis.html) or your preferred [c - **Concepts:** - [Paths](paths.html) - **Tutorials:** - - [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html) + - [Stablecoin Issuer](stablecoin-issuer.html) - **References:** - [account_lines method][] - [account_info method][] diff --git a/content/concepts/decentralized-exchange/ticksize.ja.md b/content/concepts/tokens/ticksize.ja.md similarity index 100% rename from content/concepts/decentralized-exchange/ticksize.ja.md rename to content/concepts/tokens/ticksize.ja.md diff --git a/content/concepts/decentralized-exchange/ticksize.md b/content/concepts/tokens/ticksize.md similarity index 98% rename from content/concepts/decentralized-exchange/ticksize.md rename to content/concepts/tokens/ticksize.md index 37dc4f3a9d..cdef7729d4 100644 --- a/content/concepts/decentralized-exchange/ticksize.md +++ b/content/concepts/tokens/ticksize.md @@ -8,8 +8,6 @@ labels: --- # Tick Size -_(Added by the [TickSize amendment][].)_ - When an Offer is placed into an order book, its exchange rate is truncated based on the `TickSize` values set by the issuers of the currencies involved in the Offer. When trading XRP and a token, the `TickSize` from the token's issuer applies. When trading two tokens, the Offer uses the smaller `TickSize` value (that is, the one with fewer significant digits). If neither token has a `TickSize` set, the default behavior applies. The `TickSize` value truncates the number of _significant digits_ in the exchange rate of an offer when it gets placed in an order book. Issuers can set `TickSize` to an integer from `3` to `15` using an [AccountSet transaction][]. The exchange rate is represented as significant digits and an exponent; the `TickSize` does not affect the exponent. This allows the XRP Ledger to represent exchange rates between assets that vary greatly in value (for example, a highly inflated currency compared to a rare commodity). The lower the `TickSize` an issuer sets, the larger the increment traders must offer to be considered a higher exchange rate than the existing Offers. diff --git a/content/concepts/tokens/tokens.ja.md b/content/concepts/tokens/tokens.ja.md index ab39f70c04..01bf693acb 100644 --- a/content/concepts/tokens/tokens.ja.md +++ b/content/concepts/tokens/tokens.ja.md @@ -25,7 +25,7 @@ XRP Ledger におけるトークンの代表的なモデルとして、発行者 実際には、XRP Ledger はただのシステムであり、その外側にいかなるルールも適用することはできません。そのため、XRP Ledger上のステーブルコインは、その発行者を信頼し、その発行者が要求に応じてトークンを現物資産へ交換することができなければ、そのステーブルコインの価値が維持されないと考えるべきでしょう。ユーザは、誰がトークンを発行しているのか、信頼できるのか、合法的なのか、支払能力があるのか、という点について十分に注意をしなければなりません。信頼できない場合は、そのトークンを保有するべきではないでしょう。 -ゲートウェイの運営方法については、[XRP Ledger Gatewayの開設](become-an-xrp-ledger-gateway.html)をご覧ください。 +[Stablecoin Issuer](stablecoin-issuer.html)をご覧ください。 ## コミュニティクレジット @@ -58,12 +58,12 @@ XRP Ledgerにおけるトークンは、[XRPと異なる性質](currency-formats ## 関連項目 - **コンセプト:** - - [XRP](xrp.html) + - [XRP?](what-is-xrp.html) - [複数通貨間の支払い](cross-currency-payments.html) - [分散型取引所](decentralized-exchange.html) - **チュートリアル:** - [代替可能トークンの発行](issue-a-fungible-token.html) - - [XRP Ledgerゲートウェイの開設](become-an-xrp-ledger-gateway.html) + - [XRP Ledgerゲートウェイの開設](stablecoin-issuer.html) - [トランザクションの結果の確認](look-up-transaction-results.html) - [専門化した支払いタイプの使用](use-specialized-payment-types.html) - **リファレンス:** diff --git a/content/concepts/tokens/tokens.md b/content/concepts/tokens/tokens.md index e579686c69..512f63c51a 100644 --- a/content/concepts/tokens/tokens.md +++ b/content/concepts/tokens/tokens.md @@ -25,7 +25,7 @@ A stablecoin issuer should offer _deposits_ and _withdrawals_ to exchange the to In practice, the XRP Ledger is a computer system that cannot enforce any rules outside of itself, so stablecoins on the XRP Ledger depend on their issuer's integrity. If you can't count on the stablecoin's issuer to redeem your tokens for the real thing on demand, then you shouldn't expect the stablecoin to hold its value. As a user, you should be mindful of who's issuing the tokens: are they reliable, lawful, and solvent? If not, it's probably best not to hold those tokens. -For more information on how to run a gateway, see the [Becoming an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html). +For more information, see [Stablecoin Issuer](stablecoin-issuer.html). ## Community Credit @@ -62,12 +62,11 @@ For a tutorial of the technical steps involved in issuing a token, see [Issue a ## See Also - **Concepts:** - - [XRP](xrp.html) + - [What is XRP?](what-is-xrp.html) - [Cross-Currency Payments](cross-currency-payments.html) - [Decentralized Exchange](decentralized-exchange.html) - **Tutorials:** - [Issue a Fungible Token](issue-a-fungible-token.html) - - [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html) - [Look Up Transaction Results](look-up-transaction-results.html) - [Use Specialized Payment Types](use-specialized-payment-types.html) - **References:** diff --git a/content/concepts/tokens/transfer-fees.ja.md b/content/concepts/tokens/transfer-fees.ja.md index 8b7addc6ef..19ecbc07a5 100644 --- a/content/concepts/tokens/transfer-fees.ja.md +++ b/content/concepts/tokens/transfer-fees.ja.md @@ -8,10 +8,10 @@ labels: --- # 送金手数料 -[XRP Ledgerで通貨を発行する金融機関](become-an-xrp-ledger-gateway.html)は、XRP Ledgerの`TransferRate`設定を使用して、 その金融機関が発行する通貨を送金するユーザーに対し _送金手数料_ を請求できます。この送金の送金元からは送金手数料に基づくパーセンテージが引き落とされ、送金先には予定額が入金されます。差額が送金手数料です。送金手数料は発行アドレスの資産となり、XRP Ledgerではこれ以上追跡されません。発行アカウントとの _直接_ の送金と入金には送金手数料は適用されませんが、[運用アドレス][]から別のユーザーへの送金には送金手数料が適用されます。 +[XRP Ledgerで通貨を発行する金融機関](stablecoin-issuer.html)は、XRP Ledgerの`TransferRate`設定を使用して、 その金融機関が発行する通貨を送金するユーザーに対し _送金手数料_ を請求できます。この送金の送金元からは送金手数料に基づくパーセンテージが引き落とされ、送金先には予定額が入金されます。差額が送金手数料です。送金手数料は発行アドレスの資産となり、XRP Ledgerではこれ以上追跡されません。発行アカウントとの _直接_ の送金と入金には送金手数料は適用されませんが、[運用アドレス][]から別のユーザーへの送金には送金手数料が適用されます。 -[運用アドレス]: issuing-and-operational-addresses.html -[発行アドレス]: issuing-and-operational-addresses.html +[運用アドレス]: account-types.html +[発行アドレス]: account-types.html XRPにはイシュアーがいないため、送金手数料が発生することはありません。 @@ -56,8 +56,6 @@ XRPにはイシュアーがいないため、送金手数料が発生するこ - [手数料(曖昧さの回避)](fees.html) - [トランザクションコスト](transaction-cost.html) - [パス](paths.html) -- **チュートリアル:** - - [XRP Ledgerゲートウェイの開設](become-an-xrp-ledger-gateway.html) - **リファレンス:** - [account_linesメソッド][] - [account_infoメソッド][] diff --git a/content/concepts/tokens/transfer-fees.md b/content/concepts/tokens/transfer-fees.md index 1cf055d81b..6e17c84662 100644 --- a/content/concepts/tokens/transfer-fees.md +++ b/content/concepts/tokens/transfer-fees.md @@ -14,10 +14,7 @@ For standard tokens, the tokens paid in the transfer fee are burned, and no long Non-fungible tokens can also have transfer fees, but they work differently. For details, see [Non-Fungible Tokens](non-fungible-tokens.html). -The transfer fee does not apply when sending or receiving _directly_ to and from the issuing account, but it does apply when transferring from an [operational address][] to another user. - -[operational address]: issuing-and-operational-addresses.html -[issuing address]: issuing-and-operational-addresses.html +The transfer fee does not apply when sending or receiving _directly_ to and from the issuing account, but it does apply when transferring from an [operational address](account-types.html) to another user. XRP never has a transfer fee, because it never has an issuer. @@ -53,15 +50,15 @@ In this scenario, Salazar (the sender) holds EUR issued by ACME, and wants to de # Technical Details -The transfer fee is represented by a setting on the [issuing address][]. The transfer fee cannot be less than 0% or more than 100% and is rounded down to the nearest 0.0000001%. The transfer fee applies to all tokens issued by the same account. If you want to have different transfer fees for different tokens, use multiple [issuing addresses][issuing address]. +The transfer fee is controlled by a setting on the issuer's account. The transfer fee cannot be less than 0% or more than 100% and is rounded down to the nearest 0.0000001%. The transfer fee applies to all tokens issued by the same account. If you want to have different transfer fees for different tokens, use multiple issuing addresses. -In the [XRP Ledger protocol](protocol-reference.html), the transfer fee is specified in the `TransferRate` field, as an integer which represents the amount you must send for the recipient to get 1 billion units of the same token. A `TransferRate` of `1005000000` is equivalent to a transfer fee of 0.5%. By default, the `TransferRate` is set to no fee. The value of `TransferRate` cannot be set to less than `1000000000` ("0%" fee) or more than `2000000000` (a "100%" fee). The value `0` is special case for no fee, equivalent to `1000000000`. +The transfer fee is specified in the `TransferRate` field, as an integer which represents the amount you must send for the recipient to get 1 billion units of the same token. A `TransferRate` of `1005000000` is equivalent to a transfer fee of 0.5%. By default, the `TransferRate` is set to no fee. The value of `TransferRate` cannot be set to less than `1000000000` ("0%" fee) or more than `2000000000` (a "100%" fee). The value `0` is special case for no fee, equivalent to `1000000000`. -A token issuer can submit an [AccountSet transaction][] from its [issuing address][] to change the `TransferRate` for all its tokens. +A token issuer can submit an [AccountSet transaction][] to change the `TransferRate` for all its tokens. Anyone can check an account's `TransferRate` with the [account_info method][]. If the `TransferRate` is omitted, then that indicates no fee. -**Note:** The [fix1201](known-amendments.html#fix1201) [amendment](amendments.html), introduced in `rippled` v0.80.0 and enabled on 2017-11-14, lowered the maximum transfer fee to 100% (a `TransferRate` of `2000000000`) from an effective limit of approximately 329% (based on the maximum size of a 32-bit integer). The ledger may still contain accounts with a transfer fee setting higher than 100% because transfer fees that were already set continue to apply at their stated rate. +**Note:** The ledger may contain accounts with a transfer fee larger than the current maximum. The [fix1201 amendment](known-amendments.html#fix1201), enabled on 2017-11-14, lowered the maximum transfer fee to 100% (a `TransferRate` of `2000000000`) from an effective limit of approximately 329% (based on the maximum size of a 32-bit integer). Transfer fees that were already set continue to apply at their stated rate. ## Client Library Support @@ -75,8 +72,6 @@ Some [client libraries](client-libraries.html) have convenience functions for ge - [Fees (Disambiguation)](fees.html) - [Transaction Cost](transaction-cost.html) - [Paths](paths.html) -- **Tutorials:** - - [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html) - **References:** - [account_lines method][] - [account_info method][] diff --git a/content/concepts/tokens/trust-lines-and-issuing.ja.md b/content/concepts/tokens/trust-lines-and-issuing.ja.md index 3de98c509b..2e17f87932 100644 --- a/content/concepts/tokens/trust-lines-and-issuing.ja.md +++ b/content/concepts/tokens/trust-lines-and-issuing.ja.md @@ -73,8 +73,6 @@ labels: - **コンセプト:** - [分散型取引所](decentralized-exchange.html) - [リップリング](rippling.html) -- **チュートリアル:** - - [XRP Ledgerゲートウェイの開設](become-an-xrp-ledger-gateway.html) - **リファレンス:** - [account_linesメソッド][] - 指定されたアカウントに関連付けられたトラストラインを確認 - [gateway_balancesメソッド][] - 発行者の発行残高を確認 diff --git a/content/concepts/tokens/trust-lines-and-issuing.md b/content/concepts/tokens/trust-lines-and-issuing.md index ec7ecc7bc6..8be3a21fa0 100644 --- a/content/concepts/tokens/trust-lines-and-issuing.md +++ b/content/concepts/tokens/trust-lines-and-issuing.md @@ -77,8 +77,6 @@ When an account owns 3 or more objects in the ledger, the full owner reserve app - **Concepts:** - [Decentralized Exchange](decentralized-exchange.html) - [Rippling](rippling.html) -- **Tutorials:** - - [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html) - **References:** - [account_lines method][] - Look up trust lines attached to a given account - [gateway_balances method][] - Look up an issuer's total balance issued diff --git a/content/concepts/consensus-network/about-canceling-a-transaction.ja.md b/content/concepts/transactions/about-canceling-a-transaction.ja.md similarity index 94% rename from content/concepts/consensus-network/about-canceling-a-transaction.ja.md rename to content/concepts/transactions/about-canceling-a-transaction.ja.md index 3cb7fdf460..b0c09ac1f6 100644 --- a/content/concepts/consensus-network/about-canceling-a-transaction.ja.md +++ b/content/concepts/transactions/about-canceling-a-transaction.ja.md @@ -1,11 +1,11 @@ --- -html: about-canceling-a-transaction.html -parent: consensus-network.html +html: canceling-a-transaction.html +parent: finality-of-results.html blurb: 送信済みのトランザクションのキャンセルがいつどのように可能か説明します。 labels: - トランザクション送信 --- -# トランザクションの取消しについて +# トランザクションの取消し XRP Ledgerの重要かつ意図的な機能の1つに、トランザクションが検証済みレジャーに組み込まれると、即時に最終的なトランザクションになるという機能があります。 diff --git a/content/concepts/consensus-network/about-canceling-a-transaction.md b/content/concepts/transactions/about-canceling-a-transaction.md similarity index 67% rename from content/concepts/consensus-network/about-canceling-a-transaction.md rename to content/concepts/transactions/about-canceling-a-transaction.md index 2f1b0dd3ed..727f18a987 100644 --- a/content/concepts/consensus-network/about-canceling-a-transaction.md +++ b/content/concepts/transactions/about-canceling-a-transaction.md @@ -1,19 +1,19 @@ --- -html: about-canceling-a-transaction.html -parent: consensus-network.html +html: canceling-a-transaction.html +parent: finality-of-results.html blurb: Understand when and how it's possible to cancel a transaction that has already been sent. labels: - Transaction Sending --- -# About Canceling a Transaction +# Canceling a Transaction -An important and intentional feature of the XRP Ledger is that a [transaction](transaction-basics.html)'s outcome is [final](finality-of-results.html) as soon as it has been incorporated in a [ledger version](ledgers.html) that is validated by the [consensus process](consensus.html). +An important and intentional feature of the XRP Ledger is that a [transaction](transactions.html)'s outcome is [final](finality-of-results.html) as soon as it has been incorporated in a [ledger version](ledgers.html) that is validated by the [consensus process](consensus.html). If a transaction has _not_ yet been included in a validated ledger, it may be possible to effectively cancel it by sending another transaction from the same sending address with the same `Sequence` value. If you do not want the replacement transaction to do anything, send an [AccountSet transaction][] with no options. **Caution:** There is no guaranteed way to cancel a valid transaction after it has been distributed to the network. The process described here may or may not work depending on factors including how busy the network is, the network topology, and the [transaction cost](transaction-cost.html) of the proposed transaction. -If the transaction has already been distributed to the network and proposed as a [candidate transaction](consensus.html#consensus-1) in servers' consensus proposals, it may be too late to cancel. It is more likely that you can successfully cancel a transaction that is [queued](transaction-queue.html) or is stuck "in limbo" because its [transaction cost](transaction-cost.html) is not high enough to meet the network's current requirements. In this case, the replacement transaction can either do nothing, or do the same thing as the transaction to be canceled. The replacement transaction is more likely to succeed if its transaction cost is higher. +If the transaction has already been distributed to the network and proposed as a [candidate transaction](consensus-structure.html#consensus) in servers' consensus proposals, it may be too late to cancel. It is more likely that you can successfully cancel a transaction that is [queued](transaction-queue.html) or is stuck "in limbo" because its [transaction cost](transaction-cost.html) is not high enough to meet the network's current requirements. In this case, the replacement transaction can either do nothing, or do the same thing as the transaction to be canceled. The replacement transaction is more likely to succeed if its transaction cost is higher. For example, if you try to submit 3 transactions with sequence numbers 11, 12, and 13, but transaction 11 gets lost somehow or does not have a high enough [transaction cost](transaction-cost.html) to be propagated to the network, then you can cancel transaction 11 by submitting an AccountSet transaction with no options and sequence number 11. This does nothing (except destroying the transaction cost for the new transaction 11), but it allows transactions 12 and 13 to become valid. diff --git a/content/concepts/payment-system-basics/fees.ja.md b/content/concepts/transactions/fees.ja.md similarity index 99% rename from content/concepts/payment-system-basics/fees.ja.md rename to content/concepts/transactions/fees.ja.md index 888a2caef7..6382a5e5ea 100644 --- a/content/concepts/payment-system-basics/fees.ja.md +++ b/content/concepts/transactions/fees.ja.md @@ -1,6 +1,6 @@ --- html: fees.html -parent: payment-system-basics.html +parent: transactions.html blurb: レジャーを悪用から守る中立的な手数料(誰にも支払われません)や、ユーザーが互いから徴収できる手数料など、XRP Ledgerで許可されている手数料のタイプについて説明します。 labels: - 手数料 diff --git a/content/concepts/payment-system-basics/fees.md b/content/concepts/transactions/fees.md similarity index 98% rename from content/concepts/payment-system-basics/fees.md rename to content/concepts/transactions/fees.md index e4ab5810e6..127b75bb1b 100644 --- a/content/concepts/payment-system-basics/fees.md +++ b/content/concepts/transactions/fees.md @@ -1,6 +1,6 @@ --- html: fees.html -parent: payment-system-basics.html +parent: transactions.html blurb: Learn about the types of fees allowed by the XRP Ledger, including neutral fees (payable to no one) that protect the ledger against abuse, as well as fees that users can collect from each other. labels: - Fees diff --git a/content/concepts/payment-system-basics/transaction-basics/finality-of-results.ja.md b/content/concepts/transactions/finality-of-results.ja.md similarity index 94% rename from content/concepts/payment-system-basics/transaction-basics/finality-of-results.ja.md rename to content/concepts/transactions/finality-of-results.ja.md index 01871e0391..c597e3bb50 100644 --- a/content/concepts/payment-system-basics/transaction-basics/finality-of-results.ja.md +++ b/content/concepts/transactions/finality-of-results.ja.md @@ -1,6 +1,6 @@ --- html: finality-of-results.html -parent: transaction-basics.html +parent: transactions.html blurb: トランザクション結果が最終的かつ不変になるタイミングについて説明します。 labels: - トランザクション送信 @@ -8,7 +8,7 @@ labels: --- # 結果のファイナリティー -トランザクションがコンセンサスレジャーに適用される順序は、[レジャー](ledgers.html)がクローズされ、そのトランザクションセットが[コンセンサスプロセス](intro-to-consensus.html)によって承認されるまで確定されません。最初に成功したトランザクションはその後で失敗する可能性があり、最初に失敗したトランザクションはその後で成功する可能性があります。さらに、あるラウンドでコンセンサスプロセスによって拒否されたトランザクションは、後のラウンドでコンセンサスに達する可能性があります。 +トランザクションがコンセンサスレジャーに適用される順序は、[レジャー](ledgers.html)がクローズされ、そのトランザクションセットが[コンセンサスプロセス](consensus.html)によって承認されるまで確定されません。最初に成功したトランザクションはその後で失敗する可能性があり、最初に失敗したトランザクションはその後で成功する可能性があります。さらに、あるラウンドでコンセンサスプロセスによって拒否されたトランザクションは、後のラウンドでコンセンサスに達する可能性があります。 検証済みレジャーには、失敗したトランザクション(`tec`結果コード)だけでなく、成功したトランザクション(`tes`結果コード)も含まれる可能性があります。それ以外の結果のトランザクションはレジャーに含まれません。 diff --git a/content/concepts/payment-system-basics/transaction-basics/finality-of-results.md b/content/concepts/transactions/finality-of-results.md similarity index 77% rename from content/concepts/payment-system-basics/transaction-basics/finality-of-results.md rename to content/concepts/transactions/finality-of-results.md index d7138cb344..871ca6aa5f 100644 --- a/content/concepts/payment-system-basics/transaction-basics/finality-of-results.md +++ b/content/concepts/transactions/finality-of-results.md @@ -1,6 +1,6 @@ --- html: finality-of-results.html -parent: transaction-basics.html +parent: transactions.html blurb: Learn when the outcome of a transaction is final and immutable. labels: - Transaction Sending @@ -8,7 +8,7 @@ labels: --- # Finality of Results -The order in which transactions apply to the consensus [ledger](ledgers.html) is not final until a ledger is closed and the exact transaction set is approved by the [consensus process](intro-to-consensus.html). A transaction that succeeded initially could still fail, and a transaction that failed initially could still succeed. Additionally, a transaction that was rejected by the consensus process in one round could achieve consensus in a later round. +The order in which transactions apply to the consensus [ledger](ledgers.html) is not final until a ledger is closed and the exact transaction set is approved by the [consensus process](consensus.html). A transaction that succeeded initially could still fail, and a transaction that failed initially could still succeed. Additionally, a transaction that was rejected by the consensus process in one round could achieve consensus in a later round. A validated ledger can include successful transactions (`tes` result codes) as well as failed transactions (`tec` result codes). No transaction with any other result is included in a ledger. @@ -40,11 +40,11 @@ When you initially submit a transaction, the `rippled` server tentatively applie - Combinations of two or more of these factors can also occur. -- The [order transactions apply in a closed ledger](ledgers.html#open-closed-and-validated-ledgers) is usually different than the order those transactions were tentatively applied to a current open ledger; depending on the transactions involved, this can cause a tentatively-successful transaction to fail or a tentatively-failed transaction to succeed. Some examples include: +- The [order transactions apply in a closed ledger](open-closed-validated-ledgers.html) is usually different than the order those transactions were tentatively applied to a current open ledger; depending on the transactions involved, this can cause a tentatively-successful transaction to fail or a tentatively-failed transaction to succeed. Some examples include: - - If two transactions would each fully consume the same [Offer](offers.html) in the [decentralized exchange](decentralized-exchange.html), whichever one comes first succeeds, and the other fails. Since the order in which those transactions apply may change, the one that succeeded can fail and the one that failed can succeed. Since offers can be partially executed, they could also still succeed, but to a greater or lesser extent. + - If two transactions would each fully consume the same Offer in the [decentralized exchange](decentralized-exchange.html), whichever one comes first succeeds, and the other fails. Since the order in which those transactions apply may change, the one that succeeded can fail and the one that failed can succeed. Since oOffers can be partially executed, they could also still succeed, but to a greater or lesser extent. - - If a [cross-currency payment](cross-currency-payments.html) succeeds by consuming an [Offer](offers.html) in the [decentralized exchange](decentralized-exchange.html), but a different transaction consumes or creates offers in the same order book, the cross-currency payment may succeed with a different exchange rate than it had when it executed tentatively. If it was a [partial payment](partial-payments.html), it could also deliver a different amount. + - If a [cross-currency payment](cross-currency-payments.html) succeeds by consuming an Offer in the decentralized exchange, but a different transaction consumes or creates offers in the same order book, the cross-currency payment may succeed with a different exchange rate than it had when it executed tentatively. If it was a [partial payment](partial-payments.html), it could also deliver a different amount. - A [Payment transaction][] that tentatively failed because the sender did not have enough funds may later succeed because another transaction delivering the necessary funds came first in the canonical order. The reverse is also possible: a transaction that tentatively succeeded may fail because a transaction delivering the necessary funds did not come first after being put into canonical order. diff --git a/content/tutorials/production-readiness/look-up-transaction-results.ja.md b/content/concepts/transactions/look-up-transaction-results.ja.md similarity index 99% rename from content/tutorials/production-readiness/look-up-transaction-results.ja.md rename to content/concepts/transactions/look-up-transaction-results.ja.md index e1847fba6e..e8e04709ee 100644 --- a/content/tutorials/production-readiness/look-up-transaction-results.ja.md +++ b/content/concepts/transactions/look-up-transaction-results.ja.md @@ -1,6 +1,6 @@ --- html: look-up-transaction-results.html -parent: production-readiness.html +parent: finality-of-results.html blurb: 以前に送信したトランザクションの結果を確認します。 labels: - 支払い @@ -8,7 +8,7 @@ labels: --- # トランザクションの結果の確認 -XRP Ledgerを効果的に使用するには、[トランザクション](transaction-basics.html)の結果を次のように把握することが重要です。トランザクションは成功したか?トランザクションは何を遂行したか?失敗した場合は、なぜか? +XRP Ledgerを効果的に使用するには、[トランザクション](transactions.html)の結果を次のように把握することが重要です。トランザクションは成功したか?トランザクションは何を遂行したか?失敗した場合は、なぜか? XRP Ledgerは共有システムとなっていて、すべてのデータが公開された形で正確に記録され、データはそれぞれ新しい[レジャーバージョン](ledgers.html)で安全に更新されます。誰もが任意のトランザクションの結果を確認し、[トランザクションメタデータ](transaction-metadata.html)によってその実行内容を確認できます。 diff --git a/content/tutorials/production-readiness/look-up-transaction-results.md b/content/concepts/transactions/look-up-transaction-results.md similarity index 96% rename from content/tutorials/production-readiness/look-up-transaction-results.md rename to content/concepts/transactions/look-up-transaction-results.md index fab0fcc1b4..4035970ce7 100644 --- a/content/tutorials/production-readiness/look-up-transaction-results.md +++ b/content/concepts/transactions/look-up-transaction-results.md @@ -1,6 +1,6 @@ --- html: look-up-transaction-results.html -parent: production-readiness.html +parent: finality-of-results.html blurb: Find the results of previously-submitted transactions. labels: - Payments @@ -8,7 +8,7 @@ labels: --- # Look Up Transaction Results -To use the XRP Ledger effectively, you need to be able to understand [transaction](transaction-basics.html) outcomes: did the transaction succeed? What did it do? If it failed, why? +To use the XRP Ledger effectively, you need to be able to understand [transaction](transactions.html) outcomes: did the transaction succeed? What did it do? If it failed, why? The XRP Ledger is a shared system, with all data recorded publicly and carefully, securely updated with each new [ledger version](ledgers.html). Anyone can look up the exact outcome of any transaction and read the [transaction metadata](transaction-metadata.html) to see what it did. @@ -361,7 +361,7 @@ In the following excerpt, we see that `r9UUEX...`'s balance increases by 1 billi Look for a `CreatedNode` of type `PayChannel` when creating a payment channel. You should also find a `ModifiedNode` of type `AccountRoot` showing the decrease in the sender's balance. Look for an `Account` field in the `FinalFields` to confirm that the address matches the sender, and look at the difference in the `Balance` fields to see the change in XRP balance. -The metadata also lists the newly-created payment channel in the destination's [owner directory](directorynode.html). This prevents an account from [being deleted](accounts.html#deletion-of-accounts) if it is the destination of an open payment channel. (This behavior was added by the [fixPayChanRecipientOwnerDir amendment](known-amendments.html#fixpaychanrecipientownerdir).) +The metadata also lists the newly-created payment channel in the destination's [owner directory](directorynode.html). This prevents an account from [being deleted](deleting-accounts.html) if it is the destination of an open payment channel. (This behavior was added by the [fixPayChanRecipientOwnerDir amendment](known-amendments.html#fixpaychanrecipientownerdir).) There are several ways to request to close a payment channel, aside from the immutable `CancelAfter` time of the channel (which is only set on creation). If a transaction schedules a channel to close, there is a `ModifiedNode` entry of type `PayChannel` for the channel, with the newly-added close time in the `Expiration` field of the `FinalFields`. The following example shows the changes to a `PayChannel` in a case where the sender requested to close the channel without redeeming a claim: @@ -434,7 +434,7 @@ Most other transactions create a specific type of ledger entry and [adjust the s ### Pseudo-Transactions -[Pseudo-transactions](pseudo-transaction-types.html) also have metadata, but they do not follow all the rules of normal transactions. They are not tied to a real account (the `Account` value is the [base58-encoded form of the number 0](accounts.html#special-addresses)), so they do not modify an AccountRoot object in the ledger to increase the `Sequence` number or destroy XRP. Pseudo-transactions only make specific changes to special ledger objects: +[Pseudo-transactions](pseudo-transaction-types.html) also have metadata, but they do not follow all the rules of normal transactions. They are not tied to a real account (the `Account` value is the [base58-encoded form of the number 0](addresses.html#special-addresses)), so they do not modify an AccountRoot object in the ledger to increase the `Sequence` number or destroy XRP. Pseudo-transactions only make specific changes to special ledger objects: - [EnableAmendment pseudo-transactions][] modify the [Amendments ledger object](amendments-object.html) to track which amendments are enabled, and which ones are pending with majority support and for how long. - [SetFee pseudo-transactions][] modify the [FeeSettings ledger object](feesettings.html) to change the base levels for the [transaction cost](transaction-cost.html) and [reserve requirements](reserves.html). @@ -442,12 +442,12 @@ Most other transactions create a specific type of ledger entry and [adjust the s ## See Also - **Concepts:** - - [Finality of Results](finality-of-results.html) - How to know when a transaction's success or failure is final. (Short version: if a transaction is in a validated ledger, its outcome and metadata are final.) -- **Tutorials:** + - [Finality of Results](finality-of-results.html) - [Reliable Transaction Submission](reliable-transaction-submission.html) +- **Tutorials:** - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) - **References:** - - [Ledger Object Types Reference](ledger-object-types.html) - All possible fields of all types of ledger objects + - [Ledger Entry Types Reference](ledger-object-types.html) - All possible fields of all types of ledger entries - [Transaction Metadata](transaction-metadata.html) - Summary of the metadata format and fields that appear in metadata - [Transaction Results](transaction-results.html) - Tables of all possible result codes for transactions. diff --git a/content/concepts/payment-system-basics/accounts/multi-signing.ja.md b/content/concepts/transactions/multi-signing.ja.md similarity index 93% rename from content/concepts/payment-system-basics/accounts/multi-signing.ja.md rename to content/concepts/transactions/multi-signing.ja.md index 5d59b8221a..9f9c16038b 100644 --- a/content/concepts/payment-system-basics/accounts/multi-signing.ja.md +++ b/content/concepts/transactions/multi-signing.ja.md @@ -8,7 +8,7 @@ labels: --- # マルチシグ -マルチシグは、複数のシークレットキーを組み合わせて使用してXRP Ledgerの[トランザクションを承認する](transaction-basics.html#トランザクションの承認)手法です。アドレスで有効な承認手法(マルチシグ、[マスターキーペア](cryptographic-keys.html#マスターキーペア)、[レギュラーキーペア](cryptographic-keys.html#レギュラーキーペア)など)を自由に組み合わせて使用できます。(唯一の要件は、 _少なくとも1つの_ 手法を有効にする必要があることです。) +マルチシグは、複数のシークレットキーを組み合わせて使用してXRP Ledgerの[トランザクションを承認する](transactions.html#トランザクションの承認)手法です。アドレスで有効な承認手法(マルチシグ、[マスターキーペア](cryptographic-keys.html#マスターキーペア)、[レギュラーキーペア](cryptographic-keys.html#レギュラーキーペア)など)を自由に組み合わせて使用できます。(唯一の要件は、 _少なくとも1つの_ 手法を有効にする必要があることです。) マルチシグには次のメリットがあります。 @@ -49,7 +49,7 @@ _([ExpandedSignerList amendment][]によって追加されました。)_ CEOのウェイトを3、副社長3人のウェイトを各2、取締役3人のウェイトを各1に割り当てたとする。このアカウントのトランザクションを承認するには、取締役3名全員(合計ウェイト3)、副社長1名と取締役1名(合計ウェイト3)、副社長2名(合計ウェイト4)、またはCEO(合計ウェイト3)の承認が必要となります。 -先の3つのユースケースでは、レギュラーキーを設定せずにマスターキーを無効にすることで、マルチシグが唯一の[トランザクションの承認](transaction-basics.html#authorizing-transactions)の方法となるようにします。 +先の3つのユースケースでは、レギュラーキーを設定せずにマスターキーを無効にすることで、マルチシグが唯一の[トランザクションの承認](transactions.html#トランザクションの承認)の方法となるようにします。 "バックアッププラン"としてマルチシグリストを作成するシナリオがあるかもしれません。アカウント所有者は、通常、トランザクションにレギュラーキー(マルチシグではない)を使用します。もしアカウント所有者が秘密鍵を紛失した場合、通常の鍵に代わるトランザクションにマルチシグするよう友人に依頼することができます。 diff --git a/content/concepts/payment-system-basics/accounts/multi-signing.md b/content/concepts/transactions/multi-signing.md similarity index 88% rename from content/concepts/payment-system-basics/accounts/multi-signing.md rename to content/concepts/transactions/multi-signing.md index 2b80fc71a9..8ce66d22ad 100644 --- a/content/concepts/payment-system-basics/accounts/multi-signing.md +++ b/content/concepts/transactions/multi-signing.md @@ -8,14 +8,13 @@ labels: --- # Multi-Signing -Multi-signing in the XRP Ledger is a method of [authorizing transactions](transaction-basics.html#authorizing-transactions) for the XRP Ledger by using a combination of multiple secret keys. You can have any combination of authorization methods enabled for your address, including multi-signing, a [master key pair](cryptographic-keys.html#master-key-pair), and a [regular key pair](cryptographic-keys.html#regular-key-pair). (The only requirement is that _at least one_ method must be enabled.) +Multi-signing in the XRP Ledger is a method of [authorizing transactions](transactions.html#authorizing-transactions) for the XRP Ledger by using a combination of multiple secret keys. You can have any combination of authorization methods enabled for your address, including multi-signing, a [master key pair](cryptographic-keys.html#master-key-pair), and a [regular key pair](cryptographic-keys.html#regular-key-pair). (The only requirement is that _at least one_ method must be enabled.) Benefits of multi-signing include: -* You can require keys from different devices, so that a malicious actor must compromise multiple machines to send transactions on your behalf. -* You can share custody of an address between multiple people, each of whom only has one of several keys necessary to send transactions from that address. -* You can delegate the power to send transactions from your address to a group of people, who can control your address if you are unavailable or unable to sign normally. -* ... and more. +- You can require keys from different devices, so that a malicious actor must compromise multiple machines to send transactions on your behalf. +- You can share custody of an address between multiple people, each of whom only has one of several keys necessary to send transactions from that address. +- You can delegate the power to send transactions from your address to a group of people, who can control your address if you are unavailable or unable to sign normally. ## Signer Lists @@ -51,7 +50,7 @@ For a very important account, you might set the quorum to 3, with 3 participants Another account might also have a quorum of 3. You assign your CEO a weight of 3, 3 Vice Presidents a weight of 2 each, and 3 Directors a weight of 1 each. To approve a transaction for this account requires the approval of all 3 Directors (total weight of 3), 1 Vice President and 1 Director (total weight of 3), 2 Vice Presidents (total weight of 4), or the CEO (total weight of 3). -In each of the previous three use cases, you would disable the master key without configuring a regular key, so that multi-signing is the only way of [authorizing transactions](transaction-basics.html#authorizing-transactions). +In each of the previous three use cases, you would disable the master key without configuring a regular key, so that multi-signing is the only way of [authorizing transactions](transactions.html#authorizing-transactions). There might be a scenario where you create a multi-signing list as a "backup plan." The account owner normally uses a regular key for their transactions (not a multi-signing key). For safety, the owner adds a signer list containing 3 friends, each with a weight of 1, and a quorum of 3. If the account owner were to lose the private key, they can ask their friends to multi-sign a transaction to replace the regular key. diff --git a/content/tutorials/production-readiness/reliable-transaction-submission.ja.md b/content/concepts/transactions/reliable-transaction-submission.ja.md similarity index 99% rename from content/tutorials/production-readiness/reliable-transaction-submission.ja.md rename to content/concepts/transactions/reliable-transaction-submission.ja.md index 26cd3c5465..a2a6394709 100644 --- a/content/tutorials/production-readiness/reliable-transaction-submission.ja.md +++ b/content/concepts/transactions/reliable-transaction-submission.ja.md @@ -1,6 +1,6 @@ --- html: reliable-transaction-submission.html -parent: production-readiness.html +parent: transactions.html blurb: XRP Ledgerにトランザクションを送信することができるシステムを構築し、最終結果を素早く安全に受け取ります。 labels: - トランザクション送信 diff --git a/content/tutorials/production-readiness/reliable-transaction-submission.md b/content/concepts/transactions/reliable-transaction-submission.md similarity index 99% rename from content/tutorials/production-readiness/reliable-transaction-submission.md rename to content/concepts/transactions/reliable-transaction-submission.md index d768c1d7da..50adc86acd 100644 --- a/content/tutorials/production-readiness/reliable-transaction-submission.md +++ b/content/concepts/transactions/reliable-transaction-submission.md @@ -1,6 +1,6 @@ --- html: reliable-transaction-submission.html -parent: production-readiness.html +parent: transactions.html blurb: Build a system that can submit transactions to the XRP Ledger and get their final results safely and quickly. labels: - Transaction Sending @@ -539,7 +539,7 @@ The server may report a last validated ledger index less than the specified `Las Finally the server may show one or more gaps in the transaction history. The `completed_ledgers` field shown in the response above indicates that ledgers 10256383 through 10256411 are missing from this rippled instance. Our example transaction can only appear in ledgers 10268597 - 10268600 (based on when it was submitted and `LastLedgerSequence`), so the gap shown here is not relevant. However, if the gap indicated a ledger in that range was missing, then an application would need to query another rippled server (or wait for this one to retrieve the missing ledgers) to determine that a `txnNotFound` result is immutable. -## Additional Resources +## See Also - [Transaction Formats](transaction-formats.html) - [Transaction Cost](transaction-cost.html) diff --git a/content/tutorials/production-readiness/set-up-secure-signing.ja.md b/content/concepts/transactions/set-up-secure-signing.ja.md similarity index 94% rename from content/tutorials/production-readiness/set-up-secure-signing.ja.md rename to content/concepts/transactions/set-up-secure-signing.ja.md index fcb8f1a700..94a4f116e1 100644 --- a/content/tutorials/production-readiness/set-up-secure-signing.ja.md +++ b/content/concepts/transactions/set-up-secure-signing.ja.md @@ -1,14 +1,14 @@ --- -html: set-up-secure-signing.html -parent: production-readiness.html +html: secure-signing.html +parent: transactions.html blurb: 安全にトランザクションを送信できる環境を設定します。 labels: - セキュリティ - 開発 --- -# 安全な署名の設定 +# 安全な署名 -[トランザクション](transaction-basics.html)をXRP Ledgerに送信するには、[秘密鍵](cryptographic-keys.html)のセキュリティを損なわない方法でトランザクションにデジタル署名する必要があります。(他の人があなたの秘密鍵にアクセスできる場合、その人はあなたと同じようにあなたのアカウントを操作できるため、すべての資金が盗まれたり消却されたりする可能性があります。)このページでは、トランザクションに安全に署名できる環境の設定方法について説明します。 +[トランザクション](transactions.html)をXRP Ledgerに送信するには、[秘密鍵](cryptographic-keys.html)のセキュリティを損なわない方法でトランザクションにデジタル署名する必要があります。(他の人があなたの秘密鍵にアクセスできる場合、その人はあなたと同じようにあなたのアカウントを操作できるため、すべての資金が盗まれたり消却されたりする可能性があります。)このページでは、トランザクションに安全に署名できる環境の設定方法について説明します。 **ヒント:** ネットワークにトランザクションを送信していない場合は、Rippleが運用しているサーバーなど、信頼できる公開サーバーを安全に使用して、着信トランザクションの監視やその他のネットワークアクティビティの読み取りを行うことができます。XRP Ledgerのすべてのトランザクション、残高、データは公開されています。 diff --git a/content/tutorials/production-readiness/set-up-secure-signing.md b/content/concepts/transactions/set-up-secure-signing.md similarity index 94% rename from content/tutorials/production-readiness/set-up-secure-signing.md rename to content/concepts/transactions/set-up-secure-signing.md index 6620894d2b..49cb4b38da 100644 --- a/content/tutorials/production-readiness/set-up-secure-signing.md +++ b/content/concepts/transactions/set-up-secure-signing.md @@ -1,14 +1,14 @@ --- -html: set-up-secure-signing.html -parent: production-readiness.html +html: secure-signing.html +parent: transactions.html blurb: Set up an environment where you can submit transactions securely. labels: - Security - Development --- -# Set Up Secure Signing +# Secure Signing -To submit [transactions](transaction-basics.html) to the XRP Ledger, you need a way to digitally sign them without compromising the security of your [secret keys](cryptographic-keys.html). (If others gain access to your secret keys, they have as much control over your accounts as you do, and can steal or destroy all your money.) This page summarizes how to set up such an environment so you can sign transactions securely. +To submit [transactions](transactions.html) to the XRP Ledger, you need a way to digitally sign them without compromising the security of your [secret keys](cryptographic-keys.html). (If others gain access to your secret keys, they have as much control over your accounts as you do, and can steal or destroy all your money.) This page summarizes how to set up such an environment so you can sign transactions securely. **Tip:** If you are not submitting transactions to the network, you can safely use a trustworthy public server, such as the ones run by Ripple, to monitor for incoming transactions or read other network activity. All transactions, balances, and data in the XRP Ledger are public. diff --git a/content/concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md b/content/concepts/transactions/source-and-destination-tags.md similarity index 92% rename from content/concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md rename to content/concepts/transactions/source-and-destination-tags.md index f480bceca6..14f606ea06 100644 --- a/content/concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md +++ b/content/concepts/transactions/source-and-destination-tags.md @@ -1,6 +1,6 @@ --- html: source-and-destination-tags.html -parent: transaction-basics.html +parent: transactions.html blurb: Use source and destination tags to indicate specific purposes for payments from and to multi-purpose addresses. labels: - Payments @@ -11,7 +11,7 @@ labels: _Source tags_ and _destination tags_ are a feature of XRP Ledger [payments](payment-types.html) that can indicate specific purposes for payments from and to multi-purpose addresses. Source and destination tags do not have direct on-ledger functionality; source and destination tags merely provide information about how off-ledger systems should process a payment. In transactions, both source and destination tags are formatted as 32-bit unsigned integers. -Destination tags indicate the beneficiary or destination for a payment. For example, a payment to an [exchange](list-xrp-as-an-exchange.html) or [gateway](become-an-xrp-ledger-gateway.html) address can use a destination tag to indicate which customer to credit for the amount of the payment in that business's own systems. A payment to a merchant could indicate what item or cart the payment is buying. +Destination tags indicate the beneficiary or destination for a payment. For example, a payment to an [exchange](list-xrp-as-an-exchange.html) or [stablecoin issuer](stablecoin-issuer.html) address can use a destination tag to indicate which customer to credit for the amount of the payment in that business's own systems. A payment to a merchant could indicate what item or cart the payment is buying. Source tags indicate the originator or source of a payment. Most commonly, a Source Tag is included so that the recipient of the payment knows where to send a return, or "bounced", payment. When returning an incoming payment, you should use the source tag from the incoming payment as the destination tag of the outgoing (return) payment. @@ -47,7 +47,6 @@ For an XRP Ledger address that may receive payments intended for several custome ## See Also - [Require Destination Tags](require-destination-tags.html) -- [XRP Ledger Businesses](xrp-ledger-businesses.html) - [Payment Types](payment-types.html) diff --git a/content/concepts/payment-system-basics/accounts/tickets.ja.md b/content/concepts/transactions/tickets.ja.md similarity index 88% rename from content/concepts/payment-system-basics/accounts/tickets.ja.md rename to content/concepts/transactions/tickets.ja.md index de0429ad06..cfbfee1cc0 100644 --- a/content/concepts/payment-system-basics/accounts/tickets.ja.md +++ b/content/concepts/transactions/tickets.ja.md @@ -14,7 +14,7 @@ XRP Ledgerのチケットは、取引をすぐに送信せずに、その取引 ## 背景 -[トランザクション](transaction-basics.html)にはシーケンス番号が付いているので、任意のトランザクションを2回以上実行することはできません。シーケンス番号はまた、任意のトランザクションが一意であることを保証します。全く同じ金額を同じ人に複数回送信する場合、シーケンス番号は毎回異なることが保証される1つの詳細です。最後に、シーケンス番号は、ネットワーク全体に送信される際に一部のトランザクションが順不同で届いたとしても、トランザクションを一貫した順序で並べるためのエレガントな方法を提供します。 +[トランザクション](transactions.html)にはシーケンス番号が付いているので、任意のトランザクションを2回以上実行することはできません。シーケンス番号はまた、任意のトランザクションが一意であることを保証します。全く同じ金額を同じ人に複数回送信する場合、シーケンス番号は毎回異なることが保証される1つの詳細です。最後に、シーケンス番号は、ネットワーク全体に送信される際に一部のトランザクションが順不同で届いたとしても、トランザクションを一貫した順序で並べるためのエレガントな方法を提供します。 しかし、シーケンス番号では限界がある場合もあります。たとえば、次のような場合です。 @@ -53,8 +53,8 @@ XRP Ledgerのチケットは、取引をすぐに送信せずに、その取引 - 各アカウントでは、一度に250枚以上のチケットをレジャーに登録することはできません。また、一度に250枚以上のチケットを作成することもできません。 - チケットを使って別のチケットを作ることは_できます_。その場合、使用したチケットは、一度に所持できるチケットの合計数にはカウントされません。 - 各チケットは[所有者準備金](reserves.html#所有者準備金)にカウントされるため、まだ使用していないチケット1枚につき2XRPを確保する必要があります。このXRPは、チケットを使用した後、再び使用することができます。 -- 個々の元帳の中では、チケットを使用した取引は、同じ送信者からの他の取引の後に実行されます。1つのアカウントが同じ元帳のバージョンでTicketを使用する複数のトランザクションを持つ場合、それらのTicketは最も低いTicket Sequenceから最も高いTicket Sequenceの順に実行されます。 (詳細については、コンセンサスの[正規順序](consensus.html#xrp-ledgerプロトコル-コンセンサスと検証)に関するドキュメントを参照してください)。 -- 個々の元帳の中では、チケットを使用した取引は、同じ送信者からの他の取引の後に実行されます。1つのアカウントが同じ元帳のバージョンでチケットを使用する複数のトランザクションを持つ場合、それらのチケットは最も低いチケット シーケンス番号から最も高いチケット シーケンス番号の順に実行されます。 (詳細については、コンセンサスの[正規順序](consensus.html#xrp-ledgerプロトコル-コンセンサスと検証)に関するドキュメントを参照してください)。 +- 個々の元帳の中では、チケットを使用した取引は、同じ送信者からの他の取引の後に実行されます。1つのアカウントが同じ元帳のバージョンでTicketを使用する複数のトランザクションを持つ場合、それらのTicketは最も低いTicket Sequenceから最も高いTicket Sequenceの順に実行されます。 (詳細については、コンセンサスの[正規順序](consensus-structure.html#xrp-ledgerプロトコル-コンセンサスと検証)に関するドキュメントを参照してください)。 +- 個々の元帳の中では、チケットを使用した取引は、同じ送信者からの他の取引の後に実行されます。1つのアカウントが同じ元帳のバージョンでチケットを使用する複数のトランザクションを持つ場合、それらのチケットは最も低いチケット シーケンス番号から最も高いチケット シーケンス番号の順に実行されます。 (詳細については、コンセンサスの[正規順序](consensus-structure.html#xrp-ledgerプロトコル-コンセンサスと検証)に関するドキュメントを参照してください)。 ## 関連項目 diff --git a/content/concepts/payment-system-basics/accounts/tickets.md b/content/concepts/transactions/tickets.md similarity index 88% rename from content/concepts/payment-system-basics/accounts/tickets.md rename to content/concepts/transactions/tickets.md index 27d1a3bc14..88a1808b48 100644 --- a/content/concepts/payment-system-basics/accounts/tickets.md +++ b/content/concepts/transactions/tickets.md @@ -14,7 +14,7 @@ A Ticket in the XRP Ledger is a way of setting aside a [sequence number][Sequenc ## Background -[Transactions](transaction-basics.html) have sequence numbers so that any given transaction can execute no more than once. Sequence numbers also make sure any given transaction is unique: if you send the exact same amount of money to the same person multiple times, the Sequence Number is one detail that is guaranteed to be different each time. Finally, Sequence Numbers provide an elegant way to put transactions in a consistent order, even if some of them arrive out of order when sent throughout the network. +[Transactions](transactions.html) have sequence numbers so that any given transaction can execute no more than once. Sequence numbers also make sure any given transaction is unique: if you send the exact same amount of money to the same person multiple times, the Sequence Number is one detail that is guaranteed to be different each time. Finally, Sequence Numbers provide an elegant way to put transactions in a consistent order, even if some of them arrive out of order when sent throughout the network. However, there are some situations where sequence numbers are too limiting. For example: @@ -53,8 +53,8 @@ Any account can create and use Tickets on any type of transaction. However, some - Each account cannot have more than 250 Tickets in the ledger at a time. You cannot create more than 250 Tickets at a time, either. - You _can_ use a Ticket to create more Tickets. If you do, the Ticket you used does not count towards the total number of Tickets you can have at once. - Each Ticket counts toward the [owner reserve](reserves.html), so you must set aside 2 XRP for each Ticket you have not used yet. The XRP becomes available for you to use again after the Ticket is used. -- Within an individual ledger, transactions that use Tickets execute after other transactions from the same sender. If an account has multiple transactions using Tickets in the same ledger version, those Tickets execute in order from lowest Ticket Sequence to highest. (For more information, see the documentation on consensus's [canonical order](consensus.html#calculate-and-share-validations).) -- To "cancel" a Ticket, use the Ticket to [perform a no-op](about-canceling-a-transaction.html) [AccountSet transaction][]. This deletes the Ticket so that you don't have to meet its reserve requirement. +- Within an individual ledger, transactions that use Tickets execute after other transactions from the same sender. If an account has multiple transactions using Tickets in the same ledger version, those Tickets execute in order from lowest Ticket Sequence to highest. (For more information, see the documentation on consensus's [canonical order](consensus-structure.html#calculate-and-share-validations).) +- To "cancel" a Ticket, use the Ticket to [perform a no-op](canceling-a-transaction.html) [AccountSet transaction][]. This deletes the Ticket so that you don't have to meet its reserve requirement. ## See Also diff --git a/content/concepts/payment-system-basics/transaction-basics/transaction-cost.ja.md b/content/concepts/transactions/transaction-cost.ja.md similarity index 96% rename from content/concepts/payment-system-basics/transaction-basics/transaction-cost.ja.md rename to content/concepts/transactions/transaction-cost.ja.md index 6ada98d267..b2fc109406 100644 --- a/content/concepts/payment-system-basics/transaction-basics/transaction-cost.ja.md +++ b/content/concepts/transactions/transaction-cost.ja.md @@ -1,6 +1,6 @@ --- html: transaction-cost.html -parent: transaction-basics.html +parent: transactions.html blurb: トランザクションコストとはトランザクション送信のために償却される少額のXRPで、これによってレジャーがスパムから保護されます。トランザクションコストの適用方法について説明します。 labels: - 手数料 @@ -8,7 +8,7 @@ labels: --- # トランザクションコスト -XRP LedgerをスパムやDoS攻撃から守るため、各トランザクションでは少額の[XRP](xrp.html)が消却されます。この _トランザクションコスト_ はネットワークの負荷とともに増加するように設計されており、故意または不注意にネットワークに過剰な負荷をかけると非常に高くつきます。 +XRP LedgerをスパムやDoS攻撃から守るため、各トランザクションでは少額の[XRP](what-is-xrp.html)が消却されます。この _トランザクションコスト_ はネットワークの負荷とともに増加するように設計されており、故意または不注意にネットワークに過剰な負荷をかけると非常に高くつきます。 各トランザクションのトランザクションコストを支払う際には、[消却するXRPの額を指定](#トランザクションコストの指定)する必要があります。 @@ -29,7 +29,7 @@ XRP LedgerをスパムやDoS攻撃から守るため、各トランザクショ | [Key Resetトランザクション](#key-resetトランザクション)| 0 | | [マルチシグトランザクション](multi-signing.html)| 10 drop × (1 + 署名の数) | | [フルフィルメントを伴うEscrowFinishトランザクション](escrowfinish.html)| 10 drop × (33 + (バイト単位のフルフィルメントサイズ ÷ 16)) | -| [AccountDeleteトランザクション](accounts.html#アカウントの削除)| 5,000,000 drop | +| [AccountDeleteトランザクション](accounts.html#アカウントの削除)| 2,000,000 drop | ## トランザクションコストの受取人 @@ -122,7 +122,7 @@ XRP LedgerをスパムやDoS攻撃から守るため、各トランザクショ オンラインでトランザクションに署名する場合は、`Fee`フィールドを省略できます。この場合、`rippled`または[クライアントライブラリ](client-libraries.html)が現在の要件に照らしてピアツーピアネットワークの状態を確認し、トランザクションに署名する前に`Fee`値を追加します。ただし、このようなトランザクションコストへの自動入力にはいくつかの欠点と制限事項があります。 * トランザクションに署名し、分散するまでの間にネットワークのトランザクションコストが上昇した場合、そのトランザクションは承認されない場合があります。 - * 最悪の場合、トランザクションに`LastLedgerSequence`パラメーターが含まれているか、同じ`Sequence`番号を使用する新しいトランザクションによってそのトランザクションがキャンセルされない限り、トランザクションは明確に承認も拒否もされない状態のままとなってしまいます。ベストプラクティスについては、[信頼できるトランザクションの送信](reliable-transaction-submission.html)を参照してください。 + * 最悪の場合、トランザクションに`LastLedgerSequence`パラメーターが含まれているか、同じ`Sequence`番号を使用する新しいトランザクションによってその[トランザクションがキャンセル](canceling-a-transaction.html)されない限り、トランザクションは明確に承認も拒否もされない状態のままとなってしまいます。ベストプラクティスについては、[信頼できるトランザクションの送信](reliable-transaction-submission.html)を参照してください。 * 署名するトランザクションの`Fee`フィールドの正確な値は事前にわかりません。 * `rippled`を使用している場合は、[signメソッド][]の`fee_mult_max`パラメーターと`fee_div_max`パラメーターを使用して、署名しようとしている負荷スケーリングに制限を設定することもできます。 * オフラインのマシンから現在のトランザクションコストを調べることはできません。 diff --git a/content/concepts/payment-system-basics/transaction-basics/transaction-cost.md b/content/concepts/transactions/transaction-cost.md similarity index 96% rename from content/concepts/payment-system-basics/transaction-basics/transaction-cost.md rename to content/concepts/transactions/transaction-cost.md index 103fd523b1..daa9187c18 100644 --- a/content/concepts/payment-system-basics/transaction-basics/transaction-cost.md +++ b/content/concepts/transactions/transaction-cost.md @@ -1,6 +1,6 @@ --- html: transaction-cost.html -parent: transaction-basics.html +parent: transactions.html blurb: The transaction cost is a small amount of XRP destroyed to send a transaction, which protects the ledger from spam. Learn how the transaction cost applies. labels: - Fees @@ -8,7 +8,7 @@ labels: --- # Transaction Cost -To protect the XRP Ledger from being disrupted by spam and denial-of-service attacks, each transaction must destroy a small amount of [XRP](xrp.html). This _transaction cost_ is designed to increase along with the load on the network, making it very expensive to deliberately or inadvertently overload the network. +To protect the XRP Ledger from being disrupted by spam and denial-of-service attacks, each transaction must destroy a small amount of [XRP](what-is-xrp.html). This _transaction cost_ is designed to increase along with the load on the network, making it very expensive to deliberately or inadvertently overload the network. Every transaction must [specify how much XRP to destroy](#specifying-the-transaction-cost) to pay the transaction cost. @@ -29,7 +29,7 @@ Some transactions have different transaction costs: | [Key Reset Transaction](#key-reset-transaction) | 0 | | [Multi-signed Transaction](multi-signing.html) | 10 drops × (1 + Number of Signatures Provided) | | [EscrowFinish Transaction with Fulfillment](escrowfinish.html) | 10 drops × (33 + (Fulfillment size in bytes ÷ 16)) | -| [AccountDelete Transaction](accounts.html#deletion-of-accounts) | 2,000,000 drops | +| [AccountDelete Transaction](deleting-accounts.html) | 2,000,000 drops | ## Beneficiaries of the Transaction Cost @@ -121,7 +121,7 @@ Before signing a transaction, we recommend [looking up the current load-based tr The `Fee` field is one of the things that can be [auto-filled](transaction-common-fields.html#auto-fillable-fields) when creating a transaction. In this case, the auto-filling software provides a suitable `Fee` value based on the current load in the peer-to-peer network. However, there are several drawbacks and limitations to automatically filling in the transaction cost in this manner: - If the network's transaction cost goes up between auto-filling and submitting the transaction, the transaction may not be confirmed. - - To prevent a transaction from getting stuck in a state of being neither definitively confirmed or rejected, be sure to provide a `LastLedgerSequence` parameter so it eventually expires. Alternatively, you can try to [cancel a stuck transaction](about-canceling-a-transaction.html) by reusing the same `Sequence` number. See [reliable transaction submission](reliable-transaction-submission.html) for best practices. + - To prevent a transaction from getting stuck in a state of being neither definitively confirmed or rejected, be sure to provide a `LastLedgerSequence` parameter so it eventually expires. Alternatively, you can try to [cancel a stuck transaction](canceling-a-transaction.html) by reusing the same `Sequence` number. See [reliable transaction submission](reliable-transaction-submission.html) for best practices. - You have to be careful that the automatically provided value isn't too high. You don't want to burn a large fee to send a small transaction. - If you are using `rippled`, you can also use the `fee_mult_max` and `fee_div_max` parameters of the [sign method][] to set a limit to the load scaling you are willing to sign. - Some client libraries (like [xrpl.js](https://js.xrpl.org/) and [xrpl-py](https://xrpl-py.readthedocs.io/)) have configurable maximum `Fee` values, and raise an error instead of signing a transaction whose `Fee` value is higher than the maximum. diff --git a/content/concepts/consensus-network/transaction-malleability.ja.md b/content/concepts/transactions/transaction-malleability.ja.md similarity index 99% rename from content/concepts/consensus-network/transaction-malleability.ja.md rename to content/concepts/transactions/transaction-malleability.ja.md index ad057dcf05..c67ef5ee59 100644 --- a/content/concepts/consensus-network/transaction-malleability.ja.md +++ b/content/concepts/transactions/transaction-malleability.ja.md @@ -1,6 +1,6 @@ --- html: transaction-malleability.html -parent: consensus-network.html +parent: finality-of-results.html blurb: トランザクションが想定とは異なるハッシュを持つようにどのように変更される可能性があるか注意してください。 labels: - セキュリティ @@ -28,7 +28,7 @@ labels: XRP Ledgerでは、以下の条件に該当しない場合にはトランザクションを実行できません。 - 署名自体を除く[トランザクションのすべてのフィールド](transaction-common-fields.html)に署名がなされている。 -- トランザクションの署名に使用されるキーペアが、[そのアカウントの代理としてトランザクションを送信することが承認されている](transaction-basics.html#トランザクションの承認)。 +- トランザクションの署名に使用されるキーペアが、[そのアカウントの代理としてトランザクションを送信することが承認されている](transactions.html#トランザクションの承認)。 - 署名は _正規_ であり、トランザクションの指示に一致している。 署名付きフィールドに変更を加えると、どれほど小さな変更であっても署名が無効となるため、署名自体を除き、トランザクションのいかなる部分にも展性が生じることはありません。ほとんどの場合、署名自体を変更すると常に署名が無効になりますが、以下で説明するような特定の例外があります。 diff --git a/content/concepts/consensus-network/transaction-malleability.md b/content/concepts/transactions/transaction-malleability.md similarity index 98% rename from content/concepts/consensus-network/transaction-malleability.md rename to content/concepts/transactions/transaction-malleability.md index c3b32cc55d..3ee688d10e 100644 --- a/content/concepts/consensus-network/transaction-malleability.md +++ b/content/concepts/transactions/transaction-malleability.md @@ -1,6 +1,6 @@ --- html: transaction-malleability.html -parent: consensus-network.html +parent: finality-of-results.html blurb: Be aware of ways transactions could be changed to have a different hash than expected. labels: - Security @@ -23,7 +23,7 @@ Before 2014, single-signed transactions could be malleable due to properties of In the XRP Ledger, a transaction cannot execute unless: - All [fields of a transaction](transaction-common-fields.html) are signed, except the signature itself. -- The key pair(s) used to sign the transaction are [authorized to send transactions on behalf of that account](transaction-basics.html#authorizing-transactions). +- The key pair(s) used to sign the transaction are [authorized to send transactions on behalf of that account](transactions.html#authorizing-transactions). - The signature is _canonical_ and matches the transaction instructions. Any change to the signed fields, no matter how small, would invalidate the signature, so no part of the transaction can be malleable except for the signature itself. In most cases, any change to a signature itself also invalidates the signature, but there are some specific exceptions, described below. @@ -134,7 +134,7 @@ The process to exploit a vulnerable system follows a series of steps like the fo ## See Also - **Concepts:** - - [Transaction Basics](transaction-basics.html) + - [Transactions](transactions.html) - [Finality of Results](finality-of-results.html) - **Tutorials:** - [Look Up Transaction Results](look-up-transaction-results.html) diff --git a/content/concepts/consensus-network/transaction-queue.ja.md b/content/concepts/transactions/transaction-queue.ja.md similarity index 98% rename from content/concepts/consensus-network/transaction-queue.ja.md rename to content/concepts/transactions/transaction-queue.ja.md index 84eb75cd2c..3833dee692 100644 --- a/content/concepts/consensus-network/transaction-queue.ja.md +++ b/content/concepts/transactions/transaction-queue.ja.md @@ -1,6 +1,6 @@ --- html: transaction-queue.html -parent: consensus-network.html +parent: transactions.html blurb: コンセンサスに至る前にトランザクションをどのようにキューに入れることができるか説明します。 labels: - トランザクション送信 @@ -35,7 +35,7 @@ labels: `rippled`サーバーはさまざまな経験則によるテストを行って「レジャーに追加される可能性がある」トランザクションを推定します。現行の実装では、以下のルールに基づいてキューに入れるトランザクションが決定されます。 -- トランザクションは適切な形式で作成され、有効な署名によって[承認](transaction-basics.html#トランザクションの承認)されている必要があります。 +- トランザクションは適切な形式で作成され、有効な署名によって[承認](transactions.html#トランザクションの承認)されている必要があります。 - `AccountTxnID`フィールドが指定されているトランザクションはキューに入れることができません。 - 1つの送信側アドレスには、同時に最大10個のトランザクションを入れることができます。 - トランザクションをキューに入れるには、送信者が以下のすべてを行うのに十分なXRPを保有している必要があります。[更新: rippled 1.2.0][] @@ -63,7 +63,7 @@ labels: トランザクションキュー内では、最も高いトランザクションコストを支払うトランザクションが一番になるようにトランザクションがランク付けされています。このランク付けはトランザクションの _絶対_ XRPコストではなく、 _[該当するトランザクションタイプの最小コスト](transaction-cost.html#特別なトランザクションコスト)に相対的な_ コストに基づいています。トランザクションコストが同額のトランザクションが複数ある場合は、サーバーが受信した順にランク付けされます。キュー内のトランザクションの順序にはその他の要因も影響します。たとえば、同一送信者からのトランザクションはその`Sequence`番号によりソートされ、順に送信されます。 -キュー内のトランザクションの数が次のレジャーバージョンの予期サイズを超える場合には、キュー内のトランザクションの正確な順序に基づいて、次の処理レジャーバージョンに追加されるトランザクションが決定します。トランザクションの順序は**検証済みレジャー内でのトランザクションの実行順序には影響しません**。各検証済みレジャーバージョンでは、そのバージョンのトランザクションセットが[正規の順序](consensus.html#検証の計算と共有)で実行されます。 +キュー内のトランザクションの数が次のレジャーバージョンの予期サイズを超える場合には、キュー内のトランザクションの正確な順序に基づいて、次の処理レジャーバージョンに追加されるトランザクションが決定します。トランザクションの順序は**検証済みレジャー内でのトランザクションの実行順序には影響しません**。各検証済みレジャーバージョンでは、そのバージョンのトランザクションセットが[正規の順序](consensus-structure.html#検証の計算と共有)で実行されます。 **注記:**`rippled`がトランザクションをキューに入れるときに付与される暫定的な[トランザクション応答コード](transaction-results.html)は`terQUEUED`です。つまり、トランザクションは今後のレジャーバージョンで成功する見込みです。すべての暫定的な応答コードと同様に、トランザクションが検証済みレジャーに追加されるか、または[完全に無効であると示される](finality-of-results.html)までは、トランザクションの結果は最終的ではありません。 diff --git a/content/concepts/consensus-network/transaction-queue.md b/content/concepts/transactions/transaction-queue.md similarity index 93% rename from content/concepts/consensus-network/transaction-queue.md rename to content/concepts/transactions/transaction-queue.md index 5c5d0ca716..151b15109e 100644 --- a/content/concepts/consensus-network/transaction-queue.md +++ b/content/concepts/transactions/transaction-queue.md @@ -1,7 +1,7 @@ --- html: transaction-queue.html -parent: consensus-network.html -blurb: Understand how transactions can be queued before reaching consensus. +parent: transactions.html +blurb: Transactions can be queued before being processed. labels: - Transaction Sending --- @@ -35,21 +35,19 @@ The transaction queue plays an important role in selecting the transactions that The `rippled` server uses a variety of heuristics to estimate which transactions are "likely to be included in a ledger." The current implementation uses the following rules to decide which transactions to queue: -- Transactions must be properly-formed and [authorized](transaction-basics.html#authorizing-transactions) with valid signatures. +- Transactions must be properly-formed and [authorized](transactions.html#authorizing-transactions) with valid signatures. - Transactions with an `AccountTxnID` field cannot be queued. - A single sending address can have at most 10 transactions queued at the same time. -- To queue a transaction, the sender must have enough XRP for all of the following: [Updated in: rippled 1.2.0][] +- To queue a transaction, the sender must have enough XRP for all of the following: - Destroying the XRP [transaction cost](transaction-cost.html) as specified in the `Fee` fields of all the sender's queued transactions. The total amount among queued transactions cannot be more than the base account reserve (currently 10 XRP). (Transactions paying significantly more than the minimum transaction cost of 0.00001 XRP typically skip the queue and go straight into the open ledger.) - Sending the maximum sum of XRP that all the sender's queued transactions could send. - Keeping enough XRP to meet the account's [reserve requirements](reserves.html). -- If a transaction affects how the sending address authorizes transactions, no other transactions from the same address can be queued behind it. [New in: rippled 0.32.0][] +- If a transaction affects how the sending address authorizes transactions, no other transactions from the same address can be queued behind it. - If a transaction includes a `LastLedgerSequence` field, the value of that field must be at least **the current ledger index + 2**. ### Fee Averaging -[New in: rippled 0.33.0][] - -If a sending address has one or more transactions queued, that sender can "push" the existing queued transactions into the open ledger by submitting a new transaction with a high enough transaction cost to pay for all of them. Specifically, the new transaction must pay a high enough transaction cost to cover the [open ledger cost](transaction-cost.html#open-ledger-cost) of itself and each other transaction from the same sender before it in the queue. (Keep in mind that the open ledger cost increases exponentially each time a transaction pays it.) The transactions must still follow the other [queuing restrictions](#queuing-restrictions) and the sending address must have enough XRP to pay the transaction costs of all the queued transactions. +If a sending address has one or more transactions queued, that sender can "push" the existing queued transactions into the open ledger by submitting a new transaction with a high enough transaction cost to pay for all of them. Specifically, the new transaction must pay a high enough transaction cost to cover the [open ledger cost](transaction-cost.html#open-ledger-cost) of itself and each other transaction from the same sender before it in the queue. (Keep in mind that the open ledger cost increases exponentially each time a transaction pays it.) The transactions must still follow the other queuing restrictions and the sending address must have enough XRP to pay the transaction costs of all the queued transactions. This feature helps you work around a particular situation. If you submitted one or more transactions with a low cost that were queued, you cannot send new transactions from the same address unless you do one of the following: @@ -63,7 +61,7 @@ If none of the above occur, transactions can stay in the queue for a theoretical Within the transaction queue, transactions are ranked so that transactions paying a higher transaction cost come first. This ranking is not by the transactions' _absolute_ XRP cost, but by costs _relative to the [minimum cost for that type of transaction](transaction-cost.html#special-transaction-costs)_. Transactions that pay the same transaction cost are ranked in the order the server received them. Other factors may also affect the order of transactions in the queue; for example, transactions from the same sender are sorted by their `Sequence` numbers so that they are submitted in order. -The precise order of transactions in the queue decides which transactions get added to the next in-progress ledger version in cases where there are more transactions in the queue than the expected size of the next ledger version. The order of the transactions **does not affect the order the transactions are executed within a validated ledger**. In each validated ledger version, the transaction set for that version executes in [canonical order](consensus.html#calculate-and-share-validations). +The precise order of transactions in the queue decides which transactions get added to the next in-progress ledger version in cases where there are more transactions in the queue than the expected size of the next ledger version. The order of the transactions **does not affect the order the transactions are executed within a validated ledger**. In each validated ledger version, the transaction set for that version executes in [canonical order](consensus-structure.html#calculate-and-share-validations). **Note:** When `rippled` queues a transaction, the provisional [transaction response code](transaction-results.html) is `terQUEUED`. This means that the transaction is likely to succeed in a future ledger version. As with all provisional response codes, the outcome of the transaction is not final until the transaction is either included in a validated ledger, or [rendered permanently invalid](finality-of-results.html). diff --git a/content/concepts/payment-system-basics/transaction-basics/transaction-basics.ja.md b/content/concepts/transactions/transactions.ja.md similarity index 97% rename from content/concepts/payment-system-basics/transaction-basics/transaction-basics.ja.md rename to content/concepts/transactions/transactions.ja.md index d67d8e9697..328c8ce134 100644 --- a/content/concepts/payment-system-basics/transaction-basics/transaction-basics.ja.md +++ b/content/concepts/transactions/transactions.ja.md @@ -1,12 +1,12 @@ --- -html: transaction-basics.html -parent: payment-system-basics.html +html: transactions.html +parent: concepts.html blurb: トランザクションは、XRP Ledgerの変更を可能にする唯一の手段です。トランザクションの形態とその使用方法について説明します。 labels: - トランザクション送信 - 支払い --- -# トランザクションの基本 +# トランザクション _トランザクション(取引)_ は、XRP Ledgerを変更する唯一の方法です。[コンセンサスプロセス](consensus.html)に従って署名され、送信され、検証済みのレジャーバージョンに承認された場合にのみ、トランザクションは最終的なものになります。レジャーのルールによっては、_[疑似トランザクション](pseudo-transaction-types.html)_ も生成されます。このトランザクションは署名も送信もされませんが、コンセンサスによって承認されなければならないことは同様です。失敗したトランザクションであっても、スパム対策の[トランザクションコスト][]を支払のためXRPの残高が変わるため、レジャーに記録されます。 @@ -87,7 +87,7 @@ JSON形式の未署名の[Paymentトランザクション][]の例を次に示 } ``` -XRP Ledgerは、トランザクションオブジェクトが送信元アドレス(`Account`内)フィールドによって承認されている場合にのみ、トランザクションを中継して実行します。これを安全に行う方法については、[安全な署名の設定](set-up-secure-signing.html)を参照してください。 +XRP Ledgerは、トランザクションオブジェクトが送信元アドレス(`Account`内)フィールドによって承認されている場合にのみ、トランザクションを中継して実行します。これを安全に行う方法については、[安全な署名の設定](secure-signing.html)を参照してください。 ## 署名付きトランザクションブロブの例 @@ -202,9 +202,8 @@ XRP Ledgerは、トランザクションオブジェクトが送信元アドレ - **コンセプト:** - [支払いタイプ](payment-types.html) - - [コンセンサスネットワーク](consensus-network.html) - **チュートリアル:** - - [安全な署名の設定](set-up-secure-signing.html) + - [安全な署名の設定](secure-signing.html) - [XRPの送金](send-xrp.html) - [トランザクションの結果の確認](look-up-transaction-results.html) - [WebSocketを使用した着信ペイメントの監視](monitor-incoming-payments-with-websocket.html) diff --git a/content/concepts/payment-system-basics/transaction-basics/transaction-basics.md b/content/concepts/transactions/transactions.md similarity index 97% rename from content/concepts/payment-system-basics/transaction-basics/transaction-basics.md rename to content/concepts/transactions/transactions.md index c1037879ff..2e9ea6843b 100644 --- a/content/concepts/payment-system-basics/transaction-basics/transaction-basics.md +++ b/content/concepts/transactions/transactions.md @@ -1,12 +1,12 @@ --- -html: transaction-basics.html -parent: payment-system-basics.html +html: transactions.html +parent: concepts.html blurb: Transactions are the only way to change the XRP Ledger. Understand what forms they take and how to use them. labels: - Payments - Transaction Sending --- -# Transaction Basics +# Transactions A _Transaction_ is the only way to modify the XRP Ledger. Transactions are only final if signed, submitted, and accepted into a validated ledger version following the [consensus process](consensus.html). Some ledger rules also generate _[pseudo-transactions](pseudo-transaction-types.html)_, which aren't signed or submitted, but still must be accepted by consensus. Transactions that fail are also included in ledgers because they modify balances of XRP to pay for the anti-spam [transaction cost][]. @@ -87,7 +87,7 @@ Here is an example of an unsigned [Payment transaction][] in JSON: } ``` -The XRP Ledger only relays and executes a transaction if the transaction object has been authorized by the sending address (in the `Account`) field. For instructions on how to do this securely, see [Set Up Secure Signing](set-up-secure-signing.html). +The XRP Ledger only relays and executes a transaction if the transaction object has been authorized by the sending address (in the `Account`) field. For instructions on how to do this securely, see [Set Up Secure Signing](secure-signing.html). ## Example Signed Transaction Blob @@ -204,9 +204,8 @@ Example response from the `tx` command: - **Concepts:** - [Payment Types](payment-types.html) - - [Consensus Network](consensus-network.html) - **Tutorials:** - - [Set Up Secure Signing](set-up-secure-signing.html) + - [Set Up Secure Signing](secure-signing.html) - [Send XRP](send-xrp.html) - [Look Up Transaction Results](look-up-transaction-results.html) - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) diff --git a/content/contributing/contribute-code.md b/content/contributing/contribute-code.md deleted file mode 100644 index b65c7c7b0e..0000000000 --- a/content/contributing/contribute-code.md +++ /dev/null @@ -1,28 +0,0 @@ -# Contribute Code to the XRP Ledger - -The software that powers the XRP Ledger is open-source, so anyone can download, modify, extend, or explore it. Community involvement makes it better. Look for "[Source]" links in the [documentation](docs.html) to jump directly into the related source code, or browse the source code on GitHub: - -| XRP Ledger Source Code | | -|:-----------------------|:----------------------------------------------------| -| Repository | | -| License | [Multiple; ISC (permissive)](https://github.com/ripple/rippled/blob/develop/LICENSE.md) | -| Programming Language | C++ | - -If you're not sure where to start, Dev Null Productions provides a detailed and thorough [**Source Code Guide**](https://xrpintel.com/source) that describes the structure and functions of the core XRP Ledger server (`rippled`) implementation. - -## Standards Drafts - -When developing amendments to the XRP Ledger protocol or interoperability between XRP Ledger applications, it's best to discuss the proposed changes with the community. - -The [**Community Standards Drafts**](https://github.com/XRPLF/XRPL-Standards/) project is a great place to share your plans and collect suggestions on a proposed standard. This feedback can help to balance trade-offs, design for greater efficiency, and address potential security implications before you share your actual source code with others. - - -## Related Repositories - -You can find various XRP Ledger-related projects under these and other GitHub organizations: - -- [XRP Ledger Foundation](https://github.com/XRPLF/) -- [Ripple](https://github.com/ripple/) -- [XRPL Labs](https://github.com/XRPL-Labs/) - -Be sure to look at each repository's license and contributing guidelines before contributing to that repository. diff --git a/content/contributing/report-a-scam.ja.md b/content/contributing/report-a-scam.ja.md new file mode 100644 index 0000000000..a8267d3edc --- /dev/null +++ b/content/contributing/report-a-scam.ja.md @@ -0,0 +1,30 @@ +--- +html: report-a-scam.html +parent: contribute.html +--- +# 詐欺の報告 +発展する業界において、信頼とセキュリティは非常に重要ですが、詐欺はクリプトとブロックチェーンの進歩を妨げ続けています。Xrplorer forensicsチームのようなXRP Ledgerコミュニティ全体の個人やチームは、詐欺を報告するための無料ツールを提供することで、これらの詐欺行為を抑制する手助けをしています。 + +## 報告する +詐欺に遭ったと思ったら、詐欺の手口や詐欺業者について、できるだけ早く、できるだけ多くの情報を集めるようにしてください。どのように行動すべきかは以下の方法を確認してください。 + +**注意:** 誰もXRP Ledgerのアカウントを凍結したり、トランザクションを元に戻したりすることはできません。これはXRP Ledgerブロックチェーンの分散型設計によるものです。 + +1. [Xrplorerの調査チーム](https://xrplorer.com/forensics/submit)に詐欺業者のウォレットアドレスを提出してください。 + + これにより、不正行為に使用されたアカウントにフラグを立て、他のユーザ、ウォレット、および取引所に対する追加の監視、自動追跡、および警告に含めることができます。 + +2. 最寄りの警察署に通報してください。詐欺業者が捕まれば、お金を取り戻せる場合があります。 + +3. 詐欺業者が取引所にXRPを送金した場合は、必ず取引所のサポートチームに連絡してください。取引所は詐欺業者の口座を凍結することができます。以下は、いくつかの有名な取引所のサポートリンクです。 + + - [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. 詐欺業者がXRP Ledger上でXRPを他のトークンと交換した場合、そのトークンの発行者に連絡してください。発行者は[詐欺業者のトラストラインを凍結する](freeze-a-trust-line.html)ことができるかもしれません。 + +詐欺業者の報告に関する詳細は、[Xrplorer Forensicsのヘルプ](https://xrplorer.com/forensics/help)をご覧ください。 + +XRP Ledgerコミュニティからのヘルプについては、[XRPChatフォーラム](https://xrpchat.com)を利用することもできます。 diff --git a/content/faq.ja.md b/content/faq.ja.md index 835361bc5f..bced938546 100644 --- a/content/faq.ja.md +++ b/content/faq.ja.md @@ -33,7 +33,7 @@ name: よくある質問 #### どのようにして持続可能なブロックチェーンを実現するのでしょうか? -ビットコインのエネルギー消費量は、2021年現在アルゼンチンのエネルギー総消費量に相当します。また、ビットコインの採掘者が使用する電力の多くは環境を汚染するリソースから供給されていることが広く報告されています。XRPLは、プルーフ・オブ・ワークのようにエネルギーを浪費しない[コンセンサス・メカニズム](intro-to-consensus.html)を通じてトランザクションを承認し、カーボン・オフセットを活用して、[真にカーボンニュートラルな最初のブロックチェーンのひとつ](https://ripple.com/ripple-press/ripple-leads-sustainability-agenda-to-achieve-carbon-neutrality-by-2030)となっています。 +ビットコインのエネルギー消費量は、2021年現在アルゼンチンのエネルギー総消費量に相当します。また、ビットコインの採掘者が使用する電力の多くは環境を汚染するリソースから供給されていることが広く報告されています。XRPLは、プルーフ・オブ・ワークのようにエネルギーを浪費しない[コンセンサス・メカニズム](consensus.html)を通じてトランザクションを承認し、カーボン・オフセットを活用して、[真にカーボンニュートラルな最初のブロックチェーンのひとつ](https://ripple.com/ripple-press/ripple-leads-sustainability-agenda-to-achieve-carbon-neutrality-by-2030)となっています。 #### XRPLではXRP以外の通貨も取引できますか? @@ -67,7 +67,7 @@ UNLとは、ある参加者が共謀しないと信じるバリデータのリ #### どのUNLを選択すればよいですか? -バリデータは誰でも実行できるため、信頼できるバリデータを選ぶ責任はネットワーク参加者にあります。現在、2つの発行者(Ripple、XRP Ledger財団)が、過去の実績、証明された身元、責任あるITポリシーに基づき、高品質なバリデータの推奨デフォルトリストを公表していることが知られています。 しかし、すべてのネットワーク参加者は、自身が信頼できるバリデーターを選択することができ、上記の2つの発行者のいずれかに従う必要はありません。 +バリデータは誰でも実行できるため、信頼できるバリデータを選ぶ責任はネットワーク参加者にあります。現在、RippleとXRP Ledger財団が、過去の実績、証明された身元、責任あるITポリシーに基づき、高品質なバリデータの推奨デフォルトリストを公表していることが知られています。 しかし、すべてのネットワーク参加者は、自身が信頼できるバリデーターを選択することができ、上記の2つの発行者のいずれかに従う必要はありません。 #### RippleがそのUNLの採用を推奨しているなら、それは中央集権的なシステムを形成することにならないのですか? diff --git a/content/faq.md b/content/faq.md index d50a0d4219..a83b2101ed 100644 --- a/content/faq.md +++ b/content/faq.md @@ -23,11 +23,11 @@ No, the XRP Ledger is a decentralized, public blockchain. Any changes that would #### Isn’t Proof of Work the best validation mechanism? -Proof of Work (PoW) was the first mechanism to solve the double spend problem without requiring a trusted 3rd party. [The XRP Ledger’s consensus mechanism](intro-to-consensus.html) solves the same problem in a far faster, cheaper and more energy efficient way. +Proof of Work (PoW) was the first mechanism to solve the double spend problem without requiring a trusted 3rd party. [The XRP Ledger’s consensus mechanism](consensus.html) solves the same problem in a far faster, cheaper and more energy efficient way. #### 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](intro-to-consensus.html)” 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](https://ripple.com/ripple-press/ripple-leads-sustainability-agenda-to-achieve-carbon-neutrality-by-2030/). +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](consensus.html)” 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](https://ripple.com/ripple-press/ripple-leads-sustainability-agenda-to-achieve-carbon-neutrality-by-2030/). #### Can currencies other than XRP be traded through XRPL? @@ -58,7 +58,7 @@ UNLs are the lists of validators a given participant believes will not conspire #### Which UNL should I select? -Since anybody can run a validator, the burden is on the network participants to choose a reliable set. Currently, two publishers (Ripple, the XRP Ledger Foundation) are known to publish recommended default lists of high quality validators, based on past performance, proven identities, and responsible IT policies. However, every network participant can choose which validators it chooses as reliable and need not follow one of the two publishers noted above. +Since anybody can run a validator, the burden is on the network participants to choose a reliable set. Currently, the XRP Ledger Foundation and Ripple are known to publish recommended default lists of high quality validators, based on past performance, proven identities, and responsible IT policies. However, every network participant can choose which validators it chooses as reliable and need not follow one of the publishers noted above. #### If Ripple recommends adoption of its UNL, doesn't that create a centralized system? diff --git a/content/tutorials/manage-the-clio-server/install-clio-on-ubuntu.md b/content/infrastructure/clio/install-clio-on-ubuntu.md similarity index 95% rename from content/tutorials/manage-the-clio-server/install-clio-on-ubuntu.md rename to content/infrastructure/clio/install-clio-on-ubuntu.md index 87c6c68b60..afe597295d 100644 --- a/content/tutorials/manage-the-clio-server/install-clio-on-ubuntu.md +++ b/content/infrastructure/clio/install-clio-on-ubuntu.md @@ -1,6 +1,6 @@ --- html: install-clio-on-ubuntu.html -parent: manage-the-clio-server.html +parent: infrastructure.html blurb: Install a precompiled Clio binary on Ubuntu Linux. labels: - Clio Server @@ -33,7 +33,7 @@ Before you install Clio, you must meet the following requirements. docker run --rm -it --network=host --name cassandra cassandra:4.0.4 -- You need gRPC access to one or more `rippled` servers in [P2P mode](install-rippled.html). The `rippled` servers can either be local or remote, but you must trust them. The most reliable way to do this is to [install `rippled` yourself](install-rippled.html). +- You need gRPC access to one or more `rippled` servers in P2P mode. The `rippled` servers can either be local or remote, but you must trust them. The most reliable way to do this is to [install `rippled` yourself](install-rippled.html). ## Installation Steps diff --git a/content/references/http-websocket-apis/commandline-usage.ja.md b/content/infrastructure/rippled/commandline-usage.ja.md similarity index 99% rename from content/references/http-websocket-apis/commandline-usage.ja.md rename to content/infrastructure/rippled/commandline-usage.ja.md index 50e00f4dec..420dd4609c 100644 --- a/content/references/http-websocket-apis/commandline-usage.ja.md +++ b/content/infrastructure/rippled/commandline-usage.ja.md @@ -1,6 +1,7 @@ --- html: commandline-usage.html -parent: http-websocket-apis.html +name: Commandline Usage +parent: infrastructure.html blurb: rippledサーバーのコマンドライン使用オプションです。 curated_anchors: - name: 使用できるモード diff --git a/content/references/http-websocket-apis/commandline-usage.md b/content/infrastructure/rippled/commandline-usage.md similarity index 99% rename from content/references/http-websocket-apis/commandline-usage.md rename to content/infrastructure/rippled/commandline-usage.md index 685ae6cfb2..7816d675f4 100644 --- a/content/references/http-websocket-apis/commandline-usage.md +++ b/content/infrastructure/rippled/commandline-usage.md @@ -1,6 +1,7 @@ --- html: commandline-usage.html -parent: http-websocket-apis.html +name: Commandline Usage +parent: infrastructure.html blurb: Commandline usage options for the rippled server. curated_anchors: - name: Available Modes @@ -16,7 +17,7 @@ curated_anchors: labels: - Core Server --- -# rippled Commandline Usage Reference +# Commandline Usage The `rippled` executable usually runs as a daemon that powers the XRP Ledger, although it can also run in other modes. This page describes all the options you can pass to `rippled` when running it from the command line. diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.ja.md b/content/infrastructure/rippled/configuration/configure-advisory-deletion.ja.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.ja.md rename to content/infrastructure/rippled/configuration/configure-advisory-deletion.ja.md index 9949061676..533e48b13b 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.ja.md +++ b/content/infrastructure/rippled/configuration/configure-advisory-deletion.ja.md @@ -1,6 +1,6 @@ --- html: configure-advisory-deletion.html -parent: configure-rippled.html +parent: data-retention.html blurb: 指示による削除を使用して、新しい履歴ができたときではなく、スケジュールで古いレジャー履歴を削除します。 labels: - コアサーバー diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.md b/content/infrastructure/rippled/configuration/configure-advisory-deletion.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.md rename to content/infrastructure/rippled/configuration/configure-advisory-deletion.md index 577820f274..b6325b1e00 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.md +++ b/content/infrastructure/rippled/configuration/configure-advisory-deletion.md @@ -1,6 +1,6 @@ --- html: configure-advisory-deletion.html -parent: configure-rippled.html +parent: data-retention.html blurb: Use advisory deletion to delete older ledger history on a schedule rather than as new history becomes available. labels: - Core Server diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-amendment-voting.ja.md b/content/infrastructure/rippled/configuration/configure-amendment-voting.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configuration/configure-amendment-voting.ja.md rename to content/infrastructure/rippled/configuration/configure-amendment-voting.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-amendment-voting.md b/content/infrastructure/rippled/configuration/configure-amendment-voting.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configuration/configure-amendment-voting.md rename to content/infrastructure/rippled/configuration/configure-amendment-voting.md diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-full-history.ja.md b/content/infrastructure/rippled/configuration/configure-full-history.ja.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-full-history.ja.md rename to content/infrastructure/rippled/configuration/configure-full-history.ja.md index 745b673409..df674a3318 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-full-history.ja.md +++ b/content/infrastructure/rippled/configuration/configure-full-history.ja.md @@ -1,6 +1,6 @@ --- html: configure-full-history.html -parent: configure-rippled.html +parent: data-retention.html blurb: 完全履歴サーバーは、運用のコストは高いものの、XRP Ledgerでこれまでに発生したすべてのトランザクションの記録を提供します。 labels: - コアサーバー diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-full-history.md b/content/infrastructure/rippled/configuration/configure-full-history.md similarity index 94% rename from content/tutorials/manage-the-rippled-server/configuration/configure-full-history.md rename to content/infrastructure/rippled/configuration/configure-full-history.md index fba777362c..69ab74ef28 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-full-history.md +++ b/content/infrastructure/rippled/configuration/configure-full-history.md @@ -1,6 +1,6 @@ --- html: configure-full-history.html -parent: configure-rippled.html +parent: data-retention.html blurb: Full history servers provide a record of every transaction ever to occur in the XRP Ledger, although they are expensive to run. labels: - Core Server @@ -12,7 +12,9 @@ In its default configuration, the `rippled` server automatically deletes outdate ## Warnings -Storing full history is expensive. As of 2020-11-10, the full history of the XRP Ledger occupies approximately **14 terabytes** of disk space, which must be entirely stored on fast solid state disk drives for proper server performance. Such a large amount of solid state storage is not cheap, and the total amount of history you must store increases by approximately 12 GB per day. +Storing full history is expensive. As of 2023-07-19, the full history of the XRP Ledger occupies approximately **26 terabytes** of disk space, which must be entirely stored on fast solid state disk drives for proper server performance. Such a large amount of solid state storage is not cheap, and the total amount of history you must store increases by approximately 12 GB per day. + +Additionally, storing full history in NuDB requires single files that are larger than the 16 TB limit of ext4 filesystems, which is the default on many Linux distributions. You must use a filesystem with a larger single-file limit, such as XFS (recommended) or ZFS. Acquiring full history from the peer-to-peer network takes a long time (several months) and requires that your server has enough system and network resources to acquire older history while keeping up with new ledger progress. To get a faster start on acquiring ledger history, you may want to find another server operator who has a large amount of history already downloaded, who can give you a database dump or at least allow your server to explicitly peer with theirs for a long time to acquire history. The server can load ledger history from a file and verify the integrity of the historical ledgers it imports. @@ -97,7 +99,6 @@ To configure your server to acquire and store full history, complete the followi - **Concepts:** - [Ledger History](ledger-history.html) - - [Consensus Network](consensus-network.html) - [rippled Server Modes](rippled-server-modes.html) - **Tutorials:** - [Capacity Planning](capacity-planning.html), particularly [Disk Space](capacity-planning.html#disk-space) diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-grpc.md b/content/infrastructure/rippled/configuration/configure-grpc.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configuration/configure-grpc.md rename to content/infrastructure/rippled/configuration/configure-grpc.md diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-history-sharding.ja.md b/content/infrastructure/rippled/configuration/configure-history-sharding.ja.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-history-sharding.ja.md rename to content/infrastructure/rippled/configuration/configure-history-sharding.ja.md index 9824a78c9a..9b6f50cdfb 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-history-sharding.ja.md +++ b/content/infrastructure/rippled/configuration/configure-history-sharding.ja.md @@ -1,6 +1,6 @@ --- html: configure-history-sharding.html -parent: configure-rippled.html +parent: data-retention.html blurb: 履歴XRPレジャーデータのシャードを保存するようにサーバーを設定します。 labels: - データ保持 diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-history-sharding.md b/content/infrastructure/rippled/configuration/configure-history-sharding.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-history-sharding.md rename to content/infrastructure/rippled/configuration/configure-history-sharding.md index 50faeb7d2d..568b842c73 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-history-sharding.md +++ b/content/infrastructure/rippled/configuration/configure-history-sharding.md @@ -1,6 +1,6 @@ --- html: configure-history-sharding.html -parent: configure-rippled.html +parent: data-retention.html blurb: Set up a server to contribute to preserving shards of historical XRP Ledger data. labels: - Data Retention diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-online-deletion.ja.md b/content/infrastructure/rippled/configuration/configure-online-deletion.ja.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-online-deletion.ja.md rename to content/infrastructure/rippled/configuration/configure-online-deletion.ja.md index 704285c503..939e3e7f43 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-online-deletion.ja.md +++ b/content/infrastructure/rippled/configuration/configure-online-deletion.ja.md @@ -1,6 +1,6 @@ --- html: configure-online-deletion.html -parent: configure-rippled.html +parent: data-retention.html blurb: サーバーでどこまで古いトランザクション履歴を保持するかを設定します。 labels: - データ保持 diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-online-deletion.md b/content/infrastructure/rippled/configuration/configure-online-deletion.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/configure-online-deletion.md rename to content/infrastructure/rippled/configuration/configure-online-deletion.md index 8d5a923c5a..e44ee8d5ec 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-online-deletion.md +++ b/content/infrastructure/rippled/configuration/configure-online-deletion.md @@ -1,6 +1,6 @@ --- html: configure-online-deletion.html -parent: configure-rippled.html +parent: data-retention.html blurb: Configure how far back your server should store transaction history. labels: - Core Server diff --git a/content/tutorials/manage-the-rippled-server/configuration/configure-statsd.md b/content/infrastructure/rippled/configuration/configure-statsd.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/configuration/configure-statsd.md rename to content/infrastructure/rippled/configuration/configure-statsd.md index 3c91ae3547..450787144c 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/configure-statsd.md +++ b/content/infrastructure/rippled/configuration/configure-statsd.md @@ -57,7 +57,6 @@ For descriptions of each StatsD metric, see the [`rippledmon` repository](https: - **Concepts:** - [XRP Ledger Overview](xrp-ledger-overview.html) - - [Consensus Network](consensus-network.html) - [The `rippled` Server](xrpl-servers.html) - **Tutorials:** - [Install `rippled`](install-rippled.html) diff --git a/content/tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md b/content/infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md rename to content/infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md index 1c27724bd3..8ed4e455d3 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md +++ b/content/infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md @@ -98,7 +98,7 @@ Rippleは[代替となるテスト用および開発用ネットワーク](paral - [WebSocket APIツール](websocket-api-tool.html) - 接続オプションで「Testnet公開サーバー」を選択します。 - **コンセプト:** - [並列ネットワーク](parallel-networks.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [バリデータとしてのrippledの実行](run-rippled-as-a-validator.html) - [スタンドアロンモードでの`rippled`のオフラインテスト](use-stand-alone-mode.html) diff --git a/content/tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.md b/content/infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.md rename to content/infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.md index d16fde048d..41345096cf 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.md +++ b/content/infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.md @@ -218,7 +218,7 @@ You can use [server_info in the WebSocket Tool](websocket-api-tool.html#server_i - [WebSocket API Tool](websocket-api-tool.html) - Select 'Testnet Public Server' or 'Devnet Public Server' in the connection options. - **Concepts:** - [Parallel Networks](parallel-networks.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Run rippled as a Validator](run-rippled-as-a-validator.html) - [Test `rippled` Offline in Stand-Alone Mode](use-stand-alone-mode.html) diff --git a/content/tutorials/manage-the-rippled-server/configuration/enable-public-signing.ja.md b/content/infrastructure/rippled/configuration/enable-public-signing.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configuration/enable-public-signing.ja.md rename to content/infrastructure/rippled/configuration/enable-public-signing.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configuration/enable-public-signing.md b/content/infrastructure/rippled/configuration/enable-public-signing.md similarity index 95% rename from content/tutorials/manage-the-rippled-server/configuration/enable-public-signing.md rename to content/infrastructure/rippled/configuration/enable-public-signing.md index 32e034a518..eb4cbcf0d7 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/enable-public-signing.md +++ b/content/infrastructure/rippled/configuration/enable-public-signing.md @@ -40,10 +40,10 @@ To enable public signing, perform the following steps: ## See Also - **Concepts:** - - [Transaction Basics](transaction-basics.html) + - [Transactions](transactions.html) - [Cryptographic Keys](cryptographic-keys.html) - **Tutorials:** - - [Set Up Secure Signing](set-up-secure-signing.html) + - [Set Up Secure Signing](secure-signing.html) - [Get Started Using HTTP / WebSocket APIs](get-started-using-http-websocket-apis.html) - [Get Started Using JavaScript](get-started-using-javascript.html) - **References:** diff --git a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-stock-server.md b/content/infrastructure/rippled/configuration/run-rippled-as-a-stock-server.md similarity index 87% rename from content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-stock-server.md rename to content/infrastructure/rippled/configuration/run-rippled-as-a-stock-server.md index c4a2221afb..faa270e13f 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-stock-server.md +++ b/content/infrastructure/rippled/configuration/run-rippled-as-a-stock-server.md @@ -1,6 +1,6 @@ --- html: run-rippled-as-a-stock-server.html -parent: configure-rippled.html +parent: server-modes.html blurb: A multipurpose configuration for anyone integrating XRP. labels: - Core Server @@ -12,9 +12,9 @@ A stock server is a multipurpose configuration for `rippled`. With a stock serve A stock server does all of the following: -- Connects to a [network of peers](consensus-network.html) +- Connects to a [network of peers](peer-protocol.html) -- Relays cryptographically signed [transactions](transaction-basics.html) +- Relays cryptographically signed [transactions](transactions.html) - Maintains a local copy of the complete shared global [ledger](ledgers.html) @@ -37,13 +37,11 @@ For more information, see [Troubleshooting `rippled`](troubleshoot-the-rippled-s - **Concepts:** - [XRP Ledger Overview](xrp-ledger-overview.html) - - [Consensus Network](consensus-network.html) - [The `rippled` Server](xrpl-servers.html) - **Tutorials:** - [Cluster rippled Servers](cluster-rippled-servers.html) - [Install `rippled`](install-rippled.html) - [Capacity Planning](capacity-planning.html) - - [XRP Ledger Businesses](xrp-ledger-businesses.html) - **References:** - [Validator Keys Tool Guide](https://github.com/ripple/validator-keys-tool/blob/master/doc/validator-keys-tool-guide.md) - [consensus_info method][] diff --git a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.ja.md b/content/infrastructure/rippled/configuration/run-rippled-as-a-validator.ja.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.ja.md rename to content/infrastructure/rippled/configuration/run-rippled-as-a-validator.ja.md index 3bad8adc58..55fab2cda1 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.ja.md +++ b/content/infrastructure/rippled/configuration/run-rippled-as-a-validator.ja.md @@ -1,6 +1,6 @@ --- html: run-rippled-as-a-validator.html -parent: configure-rippled.html +parent: server-modes.html blurb: サーバーがコンセンサスレジャーで投票できるようにします。 labels: - コアサーバー @@ -12,9 +12,9 @@ top_nav_name: UNLに参加しよう [バリデータモード](rippled-server-modes.html)で実行されている[`rippled`サーバー](xrpl-servers.html)は、ストックサーバーが実行するあらゆる処理を実行します。 -- [ピアのネットワーク](consensus-network.html)への接続 +- [ピアのネットワーク](peer-protocol.html)への接続 -- 暗号署名された[トランザクション](transaction-basics.html)の中継 +- 暗号署名された[トランザクション](transactions.html)の中継 - 完全な共有グローバル[レジャー](ledgers.html)のローカルコピーの維持 @@ -293,13 +293,11 @@ _**公開ハブを使用してバリデータをネットワークに接続す - **コンセプト:** - [XRP Ledgerの概要](xrp-ledger-overview.html) - - [コンセンサスネットワーク](consensus-network.html) - [`rippled`サーバー](xrpl-servers.html) - **チュートリアル:** - [rippledサーバーのクラスター化](cluster-rippled-servers.html) - [`rippled`のインストール](install-rippled.html) - [容量の計画](capacity-planning.html) - - [XRP Ledgerのビジネス](xrp-ledger-businesses.html) - **リファレンス:** - [Validator Keysツールガイド](https://github.com/ripple/validator-keys-tool/blob/master/doc/validator-keys-tool-guide.md) - [consensus_infoメソッド][] diff --git a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.md b/content/infrastructure/rippled/configuration/run-rippled-as-a-validator.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.md rename to content/infrastructure/rippled/configuration/run-rippled-as-a-validator.md index 0eab3a105a..dd5a4b82ac 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.md +++ b/content/infrastructure/rippled/configuration/run-rippled-as-a-validator.md @@ -1,6 +1,6 @@ --- html: run-rippled-as-a-validator.html -parent: configure-rippled.html +parent: server-modes.html blurb: Have your server vote on the consensus ledger. labels: - Core Server @@ -12,9 +12,9 @@ top_nav_name: Join UNL A [`rippled` server](xrpl-servers.html) running in [validator mode](rippled-server-modes.html) does everything a stock server does: -- Connects to a [network of peers](consensus-network.html) +- Connects to a [network of peers](peer-protocol.html) -- Relays cryptographically signed [transactions](transaction-basics.html) +- Relays cryptographically signed [transactions](transactions.html) - Maintains a local copy of the complete shared global [ledger](ledgers.html) @@ -267,13 +267,11 @@ For information about how to revoke a master key pair you generated for your val - **Concepts:** - [XRP Ledger Overview](xrp-ledger-overview.html) - - [Consensus Network](consensus-network.html) - [The `rippled` Server](xrpl-servers.html) - **Tutorials:** - [Cluster rippled Servers](cluster-rippled-servers.html) - [Install `rippled`](install-rippled.html) - [Capacity Planning](capacity-planning.html) - - [XRP Ledger Businesses](xrp-ledger-businesses.html) - **References:** - [Validator Keys Tool Guide](https://github.com/ripple/validator-keys-tool/blob/master/doc/validator-keys-tool-guide.md) - [consensus_info method][] diff --git a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-wallet-server.ja.md b/content/infrastructure/rippled/configuration/run-rippled-as-a-wallet-server.ja.md similarity index 89% rename from content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-wallet-server.ja.md rename to content/infrastructure/rippled/configuration/run-rippled-as-a-wallet-server.ja.md index 5cbe3a47d1..d98875722b 100644 --- a/content/tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-wallet-server.ja.md +++ b/content/infrastructure/rippled/configuration/run-rippled-as-a-wallet-server.ja.md @@ -1,6 +1,6 @@ --- html: run-rippled-as-a-stock-server.html -parent: configure-rippled.html +parent: server-modes.html blurb: XRPを統合する人のための汎用的な構成。 labels: - コアサーバー @@ -12,9 +12,9 @@ labels: ウォレットサーバーは、次のすべてのことを行います。 -- [ピアネットワーク](consensus-network.html)に接続 +- [ピアネットワーク](peer-protocol.html)に接続 -- 暗号署名された[トランザクション](transaction-basics.html)を中継 +- 暗号署名された[トランザクション](transactions.html)を中継 - 完全な共有グローバル[レジャー](ledgers.html)のローカルコピーを維持 @@ -44,13 +44,11 @@ labels: - **コンセプト:** - [XRP Ledgerの概要](xrp-ledger-overview.html) - - [コンセンサスネットワーク](consensus-network.html) - [`rippled`サーバー](xrpl-servers.html) - **チュートリアル:** - [rippledサーバーのクラスター化](cluster-rippled-servers.html) - [`rippled`のインストール](install-rippled.html) - [容量の計画](capacity-planning.html) - - [XRP Ledgerのビジネス](xrp-ledger-businesses.html) - **リファレンス:** - [Validator Keysツールガイド](https://github.com/ripple/validator-keys-tool/blob/master/doc/validator-keys-tool-guide.md) - [consensus_infoメソッド][] diff --git a/content/tutorials/manage-the-rippled-server/configuration/test-amendments.md b/content/infrastructure/rippled/configuration/test-amendments.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configuration/test-amendments.md rename to content/infrastructure/rippled/configuration/test-amendments.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.ja.md b/content/infrastructure/rippled/configure-peering/cluster-rippled-servers.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.ja.md rename to content/infrastructure/rippled/configure-peering/cluster-rippled-servers.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.md b/content/infrastructure/rippled/configure-peering/cluster-rippled-servers.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.md rename to content/infrastructure/rippled/configure-peering/cluster-rippled-servers.md index d8e6d34b37..ba555ad27b 100644 --- a/content/tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.md +++ b/content/infrastructure/rippled/configure-peering/cluster-rippled-servers.md @@ -40,7 +40,7 @@ If you run multiple [`rippled` servers](xrpl-servers.html) in the same data cent This defines specific peer servers to which this server should always attempt to maintain a direct peer-to-peer connection. - **Note:** If you omit the port number, the server uses port 2459, the IANA-assigned port for the [XRP Ledger protocol](peer-protocol.html). [New in: rippled 1.6.0][] + **Note:** If you omit the port number, the server uses port 2459, the IANA-assigned port for the XRP Ledger protocol. 2. In the `[node_seed]` section, set the server's node seed to one of the `validation_seed` values you generated using the [validation_create method][] in step 2. Each server must use a unique node seed. For example: diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.ja.md b/content/infrastructure/rippled/configure-peering/configure-a-private-server.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.ja.md rename to content/infrastructure/rippled/configure-peering/configure-a-private-server.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.md b/content/infrastructure/rippled/configure-peering/configure-a-private-server.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.md rename to content/infrastructure/rippled/configure-peering/configure-a-private-server.md index 57af802e81..93c2fc048f 100644 --- a/content/tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.md +++ b/content/infrastructure/rippled/configure-peering/configure-a-private-server.md @@ -52,7 +52,7 @@ To set up a specific server as a private peer, complete the following steps: 192.168.0.1 51235 192.168.0.2 51235 - **Note:** If you omit the port number, the server uses port 2459, the IANA-assigned port for the [XRP Ledger protocol](peer-protocol.html). [New in: rippled 1.6.0][] + **Note:** If you omit the port number, the server uses port 2459, the IANA-assigned port for the XRP Ledger protocol. 4. If using proxies, cluster them with your private peer and each other. diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/configure-peering.ja.md b/content/infrastructure/rippled/configure-peering/configure-peering.ja.md similarity index 96% rename from content/tutorials/manage-the-rippled-server/configure-peering/configure-peering.ja.md rename to content/infrastructure/rippled/configure-peering/configure-peering.ja.md index 8f1819eec8..b46efe97a4 100644 --- a/content/tutorials/manage-the-rippled-server/configure-peering/configure-peering.ja.md +++ b/content/infrastructure/rippled/configure-peering/configure-peering.ja.md @@ -1,6 +1,7 @@ --- html: configure-peering.html -parent: manage-the-rippled-server.html +name: Peering +parent: infrastructure.html template: pagetype-category.html.jinja blurb: サーバーをピアツーピアネットワークに接続する方法を設定します。 labels: diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/configure-peering.md b/content/infrastructure/rippled/configure-peering/configure-peering.md similarity index 95% rename from content/tutorials/manage-the-rippled-server/configure-peering/configure-peering.md rename to content/infrastructure/rippled/configure-peering/configure-peering.md index 8f5d9c0f31..1d614ff0a1 100644 --- a/content/tutorials/manage-the-rippled-server/configure-peering/configure-peering.md +++ b/content/infrastructure/rippled/configure-peering/configure-peering.md @@ -1,6 +1,7 @@ --- html: configure-peering.html -parent: manage-the-rippled-server.html +name: Peering +parent: infrastructure.html template: pagetype-category.html.jinja blurb: Configure how your server connects to the peer-to-peer network. labels: diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/configure-the-peer-crawler.md b/content/infrastructure/rippled/configure-peering/configure-the-peer-crawler.md similarity index 92% rename from content/tutorials/manage-the-rippled-server/configure-peering/configure-the-peer-crawler.md rename to content/infrastructure/rippled/configure-peering/configure-the-peer-crawler.md index 00266adaf1..bcdee104f7 100644 --- a/content/tutorials/manage-the-rippled-server/configure-peering/configure-the-peer-crawler.md +++ b/content/infrastructure/rippled/configure-peering/configure-the-peer-crawler.md @@ -8,7 +8,7 @@ labels: --- # Configure the Peer Crawler -By default, [`rippled` servers](xrpl-servers.html) provide statistics publicly to anyone who asks using the [peer crawler API](peer-crawler.html), to make it easier to track the health and topology of [the XRP Ledger's peer-to-peer network](consensus-network.html). You can configure your server to provide more or less information, or to reject peer crawler requests entirely. [New in: rippled 1.2.0][] +By default, [`rippled` servers](xrpl-servers.html) provide statistics publicly to anyone who asks using the [peer crawler API](peer-crawler.html), to make it easier to track the health and topology of [the XRP Ledger's peer-to-peer network](peer-protocol.html). You can configure your server to provide more or less information, or to reject peer crawler requests entirely. This document contains steps for two options: diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/enable-link-compression.md b/content/infrastructure/rippled/configure-peering/enable-link-compression.md similarity index 96% rename from content/tutorials/manage-the-rippled-server/configure-peering/enable-link-compression.md rename to content/infrastructure/rippled/configure-peering/enable-link-compression.md index f0e4976d2b..f7842ba92b 100644 --- a/content/tutorials/manage-the-rippled-server/configure-peering/enable-link-compression.md +++ b/content/infrastructure/rippled/configure-peering/enable-link-compression.md @@ -7,7 +7,7 @@ labels: --- # Enable Link Compression -The `rippled` server can save bandwidth by compressing its [peer-to-peer communications](peer-protocol.html), at a cost of greater CPU usage. If you enable link compression, the server automatically compresses communications with peer servers that also have link compression enabled. [New in: rippled 1.6.0][] +The `rippled` server can save bandwidth by compressing its [peer-to-peer communications](peer-protocol.html), at a cost of greater CPU usage. If you enable link compression, the server automatically compresses communications with peer servers that also have link compression enabled. ## Steps diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/forward-ports-for-peering.ja.md b/content/infrastructure/rippled/configure-peering/forward-ports-for-peering.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/forward-ports-for-peering.ja.md rename to content/infrastructure/rippled/configure-peering/forward-ports-for-peering.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/forward-ports-for-peering.md b/content/infrastructure/rippled/configure-peering/forward-ports-for-peering.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/forward-ports-for-peering.md rename to content/infrastructure/rippled/configure-peering/forward-ports-for-peering.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/manually-connect-to-a-specific-peer.ja.md b/content/infrastructure/rippled/configure-peering/manually-connect-to-a-specific-peer.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/manually-connect-to-a-specific-peer.ja.md rename to content/infrastructure/rippled/configure-peering/manually-connect-to-a-specific-peer.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/manually-connect-to-a-specific-peer.md b/content/infrastructure/rippled/configure-peering/manually-connect-to-a-specific-peer.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/manually-connect-to-a-specific-peer.md rename to content/infrastructure/rippled/configure-peering/manually-connect-to-a-specific-peer.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/set-max-number-of-peers.ja.md b/content/infrastructure/rippled/configure-peering/set-max-number-of-peers.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/set-max-number-of-peers.ja.md rename to content/infrastructure/rippled/configure-peering/set-max-number-of-peers.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/set-max-number-of-peers.md b/content/infrastructure/rippled/configure-peering/set-max-number-of-peers.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/set-max-number-of-peers.md rename to content/infrastructure/rippled/configure-peering/set-max-number-of-peers.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/use-a-peer-reservation.ja.md b/content/infrastructure/rippled/configure-peering/use-a-peer-reservation.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/use-a-peer-reservation.ja.md rename to content/infrastructure/rippled/configure-peering/use-a-peer-reservation.ja.md diff --git a/content/tutorials/manage-the-rippled-server/configure-peering/use-a-peer-reservation.md b/content/infrastructure/rippled/configure-peering/use-a-peer-reservation.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/configure-peering/use-a-peer-reservation.md rename to content/infrastructure/rippled/configure-peering/use-a-peer-reservation.md diff --git a/content/tutorials/manage-the-rippled-server/installation/build-run-rippled-in-reporting-mode.md b/content/infrastructure/rippled/installation/build-run-rippled-in-reporting-mode.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/installation/build-run-rippled-in-reporting-mode.md rename to content/infrastructure/rippled/installation/build-run-rippled-in-reporting-mode.md index 42a1c89ab5..faa70c2ada 100644 --- a/content/tutorials/manage-the-rippled-server/installation/build-run-rippled-in-reporting-mode.md +++ b/content/infrastructure/rippled/installation/build-run-rippled-in-reporting-mode.md @@ -35,7 +35,7 @@ Multiple reporting mode servers can share access to the same network accessible **Note:** If you choose to use Cassandra as the database, the disk requirements for `rippled` will be lower as the data will not be stored on your local disk. -2. In order to run reporting mode, you also need to run at least one `rippled` server in [P2P mode](install-rippled.html). +2. You also need to run at least one `rippled` server in P2P mode. 3. A compatible version of CMake must be installed. @@ -100,7 +100,7 @@ If you’re running `rippled` in reporting mode for your local network, you can NuDB is installed as part of your `rippled` build setup and does not require any additional installation steps. -### Procedure +### Steps 1. Build `rippled` for reporting mode on [Ubuntu or macOS](https://github.com/XRPLF/rippled/blob/release/BUILD.md). diff --git a/content/tutorials/manage-the-rippled-server/installation/capacity-planning.ja.md b/content/infrastructure/rippled/installation/capacity-planning.ja.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/installation/capacity-planning.ja.md rename to content/infrastructure/rippled/installation/capacity-planning.ja.md index d4d26aad16..a34146109e 100644 --- a/content/tutorials/manage-the-rippled-server/installation/capacity-planning.ja.md +++ b/content/infrastructure/rippled/installation/capacity-planning.ja.md @@ -200,7 +200,7 @@ AWSインスタンスストア(`ephemeral`ストレージ)では適切なパ - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [`rippled`の構成](configure-rippled.html) - [オンライ削除の設定](configure-online-deletion.html) - サーバーが一度に保持するレジャー履歴のバージョン数を調整します。 diff --git a/content/tutorials/manage-the-rippled-server/installation/capacity-planning.md b/content/infrastructure/rippled/installation/capacity-planning.md similarity index 83% rename from content/tutorials/manage-the-rippled-server/installation/capacity-planning.md rename to content/infrastructure/rippled/installation/capacity-planning.md index 9d89c86adf..ccf8bc074e 100644 --- a/content/tutorials/manage-the-rippled-server/installation/capacity-planning.md +++ b/content/infrastructure/rippled/installation/capacity-planning.md @@ -50,23 +50,19 @@ If you set the `[node_size]` parameter to an invalid value, the [server fails to The `type` field in the `[node_db]` stanza of the `rippled.cfg` file sets the type of key-value store that `rippled` uses to hold the ledger store. -This setting does not directly configure RAM settings, but the choice of key-value store has important implications for RAM usage because of the different ways these technologies cache and index data for fast lookup. +For almost all purposes, use `NuDB`. A fast SSD is required. [Learn more](#more-about-using-nudb) -- For most cases, use `NuDB` because its performance is constant even with large amounts of data on disk. A fast SSD is required. [Learn more](#more-about-using-nudb) - -- If you are using rotational disks (not recommended) or an unusually slow SSD, use `RocksDB`. You should avoid this setting for production servers. [Learn more](#more-about-using-rocksdb) +The `RocksDB` setting is available for legacy purposes, but is generally not recommended. [Learn more](#more-about-using-rocksdb) The example `rippled-example.cfg` file has the `type` field in the `[node_db]` stanza set to `NuDB`. #### More About Using RocksDB -[RocksDB](https://rocksdb.org/docs/getting-started.html) is an persistent key-value store built into `rippled`. +[RocksDB](https://rocksdb.org/docs/getting-started.html) is a persistent key-value store built into `rippled`. **Support for RocksDB is considered legacy.** Servers using RocksDB usually struggle to maintain sync with the Mainnet due to the memory requirements of maintaining a large database. Generally, you should use NuDB instead. -**Caution:** As of late 2021, the total size of the ledger has grown large enough that servers using RocksDB often struggle to maintain sync with the Mainnet. Large amounts of RAM can help, but you should generally use NuDB instead. +Cases where you might use RocksDB include if you need to load historical data saved in RocksDB format, or if you are storing data on slow SSDs or rotational disks. While rotational disks won't be able to keep up with Mainnet, you can probably run offline tests or small private networks on them. -RocksDB is intended to work on either solid-state disks or rotational disks. It requires approximately one-third less [disk storage](#disk-space) than NuDB and provides better I/O latency. However, the better I/O latency comes as result of the large amount of RAM RocksDB requires to store data indexes. - -RocksDB has performance-related configuration options that you can tweak for more transaction processing throughput. Here is a recommended `[node_db]` configuration for RocksDB: +RocksDB has performance-related configuration options that you can tweak for more transaction processing throughput. Here is an example `[node_db]` configuration for RocksDB: ``` [node_db] @@ -83,13 +79,13 @@ advisory_delete=0 (Adjust the `path` to the directory where you want to keep the ledger store on disk. Adjust the `online_delete` and `advisory_delete` settings as desired for your configuration.) -#### More About Using NuDb +#### More About Using NuDB [NuDB](https://github.com/vinniefalco/nudb#introduction) is an append-only key-value store that is optimized for SSD drives. -NuDB has nearly constant performance and memory footprints regardless of the [amount of data being stored](#disk-space). NuDB _requires_ a solid-state drive, but uses much less RAM than RocksDB to access a large database. +NuDB has nearly constant performance and memory footprints regardless of the [amount of data being stored](#disk-space). NuDB _requires_ a solid-state drive. Scalability testing has shown that NuDB has equivalent or better performance than RocksDB in production and comparable configurations. -Production servers should be configured to use NuDB and to store the amount of historical data required for the use case. +Production servers should be configured to use NuDB and to store the amount of historical data required for your use case. NuDB does not have performance-related configuration options available in `rippled.cfg`. Here is the recommended `[node_db]` configuration for a `rippled` server using NuDB: @@ -101,7 +97,7 @@ online_delete=2000 advisory_delete=0 ``` -(Adjust the `path` to the directory where you want to keep the ledger store on disk. Adjust the `online_delete` and `advisory_delete` settings as desired for your configuration.) +Adjust the `path` to the directory where you want to keep the ledger store on disk. Adjust the `online_delete` and `advisory_delete` settings as desired for your configuration. For more details about these settings, see [Configure Online Deletion](configure-online-deletion.html) and [Configure Advisory Deletion](configure-advisory-deletion.html). ### Log Level @@ -139,18 +135,18 @@ The `[node_db]` stanza controls the server's _ledger store_, which holds [ledger You can control how much data you keep with [online deletion](online-deletion.html); the default config file has the server keep the latest 2000 ledger versions. Without online deletion, the server's disk requirements grow without bounds. -The following table approximates the requirements for different amounts of history, at the time of writing (2018-12-13): +The following table approximates the requirements for different amounts of history, at the time of writing (2023-07-19): -| Real Time Amount | Number of Ledger Versions | Disk Space Required (RocksDB) | Disk Space Required (NuDB) | -|:-----------------|:--------------------------|:------------------------------|:--| -| 2 hours | 2,000 | 250 MB | 450 MB | -| 1 day | 25,000 | 8 GB | 12 GB | -| 14 days | 350,000 | 112 GB | 168 GB | -| 30 days | 750,000 | 240 GB | 360 GB | -| 90 days | 2,250,000 | 720 GB | 1 TB | -| 1 year | 10,000,000 | 3 TB | 4.5 TB | -| 2 years | 20,000,000 | 6 TB | 9 TB | -| Full history (as of 2022-12-18) | 76,500,000+ | (Not recommended) | ~22.3 TB | +| Real Time Amount | Number of Ledger Versions | Disk Space Required (NuDB) | +|:-----------------|:--------------------------|:---------------------------| +| 2 hours | 2,000 | 450 MB | +| 1 day | 25,000 | 12 GB | +| 14 days | 350,000 | 168 GB | +| 30 days | 750,000 | 360 GB | +| 90 days | 2,250,000 | 1 TB | +| 1 year | 10,000,000 | 4.5 TB | +| 2 years | 20,000,000 | 9 TB | +| Full history | 81,000,000+ | ~26 TB | These numbers are estimates. They depend on several factors, most importantly the volume of transactions in the network. As transaction volume increases, each ledger version stores more unique data. You should provision extra storage capacity to prepare for future growth. @@ -199,7 +195,7 @@ You can save bandwidth by [enabling compression on peer-to-peer communications]( - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Configure rippled](configure-rippled.html) - [Configure Online Deletion](configure-online-deletion.html) - Adjust how many historical ledger versions your server should keep at a time. diff --git a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.ja.md b/content/infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.ja.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.ja.md rename to content/infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.ja.md index 50c720a12a..704913144c 100644 --- a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.ja.md +++ b/content/infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.ja.md @@ -63,7 +63,7 @@ labels: - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [rippledの構成](configure-rippled.html) - [rippledのトラブルシューティング](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.md b/content/infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.md rename to content/infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.md index da96d61e3f..d4a36e34d1 100644 --- a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.md +++ b/content/infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.md @@ -97,7 +97,7 @@ Before you install `rippled`, you must meet the [System Requirements](system-req - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Configure rippled](configure-rippled.html) - [Troubleshoot rippled](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.ja.md b/content/infrastructure/rippled/installation/install-rippled-on-ubuntu.ja.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.ja.md rename to content/infrastructure/rippled/installation/install-rippled-on-ubuntu.ja.md index 213fc32483..9a3c1dfddf 100644 --- a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.ja.md +++ b/content/infrastructure/rippled/installation/install-rippled-on-ubuntu.ja.md @@ -92,7 +92,7 @@ labels: - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [rippledの構成](configure-rippled.html) - [rippledのトラブルシューティング](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.md b/content/infrastructure/rippled/installation/install-rippled-on-ubuntu.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.md rename to content/infrastructure/rippled/installation/install-rippled-on-ubuntu.md index c95e054d9e..5f960bc97a 100644 --- a/content/tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.md +++ b/content/infrastructure/rippled/installation/install-rippled-on-ubuntu.md @@ -101,7 +101,7 @@ Before you install `rippled`, you must meet the [System Requirements](system-req - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Configure rippled](configure-rippled.html) - [Troubleshoot rippled](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.ja.md b/content/infrastructure/rippled/installation/rippled-1-3-migration-instructions.ja.md similarity index 99% rename from content/tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.ja.md rename to content/infrastructure/rippled/installation/rippled-1-3-migration-instructions.ja.md index 5938e2be1b..687933b87b 100644 --- a/content/tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.ja.md +++ b/content/infrastructure/rippled/installation/rippled-1-3-migration-instructions.ja.md @@ -94,7 +94,7 @@ Rippleの公式RPMリポジトリとそれを使用するための手順が変 - **[`rippled` v1.3.1リリースノート](https://github.com/ripple/rippled/releases/1.3.1)** - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [Linuxでの自動更新](update-rippled-automatically-on-linux.html) - [rippledのトラブルシューティング](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.md b/content/infrastructure/rippled/installation/rippled-1-3-migration-instructions.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.md rename to content/infrastructure/rippled/installation/rippled-1-3-migration-instructions.md index 941a02f01f..5586cea6d8 100644 --- a/content/tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.md +++ b/content/infrastructure/rippled/installation/rippled-1-3-migration-instructions.md @@ -95,7 +95,7 @@ The `rippled` v1.3 package includes an updated auto-update script that works on - **[`rippled` v1.3.1 Release Notes](https://github.com/ripple/rippled/releases/1.3.1)** - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Update Automatically on Linux](update-rippled-automatically-on-linux.html) - [Troubleshoot rippled](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/system-requirements.ja.md b/content/infrastructure/rippled/installation/system-requirements.ja.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/system-requirements.ja.md rename to content/infrastructure/rippled/installation/system-requirements.ja.md index cd1a86a06a..0bf551e72d 100644 --- a/content/tutorials/manage-the-rippled-server/installation/system-requirements.ja.md +++ b/content/infrastructure/rippled/installation/system-requirements.ja.md @@ -39,7 +39,7 @@ labels: - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [容量の計画](capacity-planning.html) - 本番環境向けの推奨仕様および計画についての詳細情報 - [`rippled`のインストール](install-rippled.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/system-requirements.md b/content/infrastructure/rippled/installation/system-requirements.md similarity index 94% rename from content/tutorials/manage-the-rippled-server/installation/system-requirements.md rename to content/infrastructure/rippled/installation/system-requirements.md index bd2fdfdffb..ac7b03c6bf 100644 --- a/content/tutorials/manage-the-rippled-server/installation/system-requirements.md +++ b/content/infrastructure/rippled/installation/system-requirements.md @@ -11,7 +11,7 @@ labels: For reliable performance in production environments, it is recommended to run an XRP Ledger (`rippled`) server on bare metal with the following characteristics or better: -- Operating System: Ubuntu (LTS) or CentOS or Red Hat Enterprise Linux (latest release). +- Operating System: Ubuntu (LTS), Red Hat Enterprise Linux (latest release), or a compatible Linux distribution. - CPU: Intel Xeon 3+ GHz processor with 8+ cores and hyperthreading enabled. - Disk: SSD / NVMe (10,000 IOPS sustained - not burst or peak - or better). Minimum 50 GB for the database partition. Do not use Amazon Elastic Block Store (AWS EBS) because its latency is too high to sync reliably. - RAM: 64 GB. @@ -43,7 +43,7 @@ A `rippled` server relies on maintaining the correct time. It is recommended tha - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Capacity Planning](capacity-planning.html) - More information on the recommended specifications and planning for production needs - [Install `rippled`](install-rippled.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.ja.md b/content/infrastructure/rippled/installation/update-rippled-automatically-on-linux.ja.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.ja.md rename to content/infrastructure/rippled/installation/update-rippled-automatically-on-linux.ja.md index db04c46efa..8f1a51ab35 100644 --- a/content/tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.ja.md +++ b/content/infrastructure/rippled/installation/update-rippled-automatically-on-linux.ja.md @@ -35,7 +35,7 @@ Linuxでは、`rippled`が1回限りの`cron`構成を使用して最新バー - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [容量の計画](capacity-planning.html) - [rippledのトラブルシューティング](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.md b/content/infrastructure/rippled/installation/update-rippled-automatically-on-linux.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.md rename to content/infrastructure/rippled/installation/update-rippled-automatically-on-linux.md index 86c90b61ed..ad6e031be5 100644 --- a/content/tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.md +++ b/content/infrastructure/rippled/installation/update-rippled-automatically-on-linux.md @@ -33,7 +33,7 @@ To set up automatic updates, complete the following steps: - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [Capacity Planning](capacity-planning.html) - [Troubleshoot rippled](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.ja.md b/content/infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.ja.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.ja.md rename to content/infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.ja.md index d502f0dabc..0cd553f4db 100644 --- a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.ja.md +++ b/content/infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.ja.md @@ -45,7 +45,7 @@ labels: - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [`rippled` v1.3.xへの移行手順](rippled-1-3-migration-instructions.html) - [rippledのトラブルシューティング](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.md b/content/infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.md rename to content/infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.md index 2290a58951..1436147d04 100644 --- a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.md +++ b/content/infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.md @@ -47,7 +47,7 @@ To update manually, complete the following steps: - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [`rippled` v1.3.x Migration Instructions](rippled-1-3-migration-instructions.html) - [Troubleshoot rippled](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.ja.md b/content/infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.ja.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.ja.md rename to content/infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.ja.md index 61adeec006..20a970603b 100644 --- a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.ja.md +++ b/content/infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.ja.md @@ -37,7 +37,7 @@ labels: - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - **チュートリアル:** - [`rippled` v1.3.xへの移行手順](rippled-1-3-migration-instructions.html) - [rippledのトラブルシューティング](troubleshoot-the-rippled-server.html) diff --git a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.md b/content/infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.md similarity index 97% rename from content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.md rename to content/infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.md index 24a191e485..a1d01f4094 100644 --- a/content/tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.md +++ b/content/infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.md @@ -42,7 +42,7 @@ To update manually, complete the following steps: - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - **Tutorials:** - [`rippled` v1.3.x Migration Instructions](rippled-1-3-migration-instructions.html) - [Troubleshoot rippled](troubleshoot-the-rippled-server.html) diff --git a/content/infrastructure/rippled/run-private-network-with-docker.md b/content/infrastructure/rippled/run-private-network-with-docker.md new file mode 100644 index 0000000000..85b478ada7 --- /dev/null +++ b/content/infrastructure/rippled/run-private-network-with-docker.md @@ -0,0 +1,443 @@ +--- +html: private-network-with-docker.html +name: Run a Private Network with Docker +parent: infrastructure.html +blurb: Learn how to set up your own XRP private ledger network with Docker and Docker Compose. +labels: + - Core Server +--- + +# Run a Private Network with Docker + +This tutorial describes how to run a private XRP Ledger network on your computer with [Docker](https://docs.docker.com/get-docker/) and the latest version of [rippled](https://hub.docker.com/r/xrpllabsofficial/xrpld). + +While you can easily use the public XRP Testnet servers, running a private network can be useful when trying to understand how the XRP Ledger works, or when testing new features in isolation. + +**Caution:** This tutorial is suited for development or testing purposes only, and does not involve using real money. You should **not** use this configuration for a production network. + +## Learning Goals + +In this tutorial, you will learn: + +- How to set up and configure a _small_ network with three `rippled` validator nodes, including how to generate the keys for each node. + +- How to run the network with [Docker Compose](https://docs.docker.com/compose/). + +- How to verify the network is up and running. + +The following diagram shows a high-level overview of the containerized private network that you will set up. + +{{ include_svg("img/xrp-ledger-private-network-docker.svg", "Figure 1: Diagram of a three node containerized private ledger network") }} + +## Prerequisites + +To follow along with this tutorial, ensure that you have the latest version of **Docker** installed on your preferred platform. + +## Generate the Validator Keys + +Generate the keys for **each** of your validator nodes by using the `validator-keys` tool provided with `rippled`. The generated keys should be saved in a text file on your computer for later use. + +1. In your terminal, run the following to execute commands within the `rippled` Docker container shell: + + docker run -it --entrypoint /bin/bash xrpllabsofficial/xrpld:latest + + **Note:** For Apple M1 or M2 chips, run `docker run -it --platform linux/amd64 --entrypoint /bin/bash xrpllabsofficial/xrpld:latest` instead. + + Sample output: + + root@7732bd585b14:/# + +2. Generate a validator keypair using the `create_keys` command. + + cd /opt/ripple/bin && + ./validator-keys create_keys --keyfile /PATH/TO/YOUR/validator--keys.json + + Sample output: + + Validator keys stored in /PATH/TO/YOUR/validator--keys.json + + This file should be stored securely and not shared. + + **Warning:** In a production or test environment you should follow best practices always and store the generated keys in a secure, offline, and recoverable location, such as an encrypted USB flash drive. However, as this tutorial is an example of a local development setup, storing the keys on your computer is sufficient. + +3. Copy the **public_key** value from the JSON output, and store it in a text file on your computer. + + cat /PATH/TO/YOUR/validator--keys.json + + Sample output: + + { + "key_type" : "ed25519", + "public_key" : "nHD9jtA9y1nWC2Fs1HeRkEisqV3iFpk12wHmHi3mQxQwUP1ywUKs", + "revoked" : false, + "secret_key" : "paLsUUm9bRrvNBPpvJQ4nF7vdRTZyDNofGMMYs9EDeEKeNJa99q", + "token_sequence" : 0 + } + +4. Create a validator token using the `create_token` command. + + ./validator-keys create_token --keyfile /PATH/TO/YOUR/validator--keys.json + + Copy the token value from the output and save it in a text file on your computer. For example: + + [validator_token] + eyJ2YWxpZGF0aW9uX3NlY3J|dF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT + QzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYT|kYWY2IiwibWFuaWZl + c3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE + hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG + bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2 + hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1 + NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj + VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ== + +5. Repeat steps **2-4** for the remaining validator nodes. Once you have generated the keys and tokens for _all_ validators, enter `exit` in your terminal to exit the Docker container. + +## Configure the Network + +This section describes how to configure the validator nodes in your network. + +**Note:** The configuration in this tutorial enables the network to retain _some_ ledger history, but the amount of transaction history stored will depend on how long the network has been online. + +### Create the node directories + +On your computer, create the directories for all nodes in the private network, and their respective configuration folders. + + xrpl-private-network/ + ├── validator_1/ + │ └── config + ├── validator_2/ + │ └── config + └── validator_3/ + └── config + +In your terminal, run the following command to create the directories: + + mkdir -p xrpl-private-network/{validator_1/config,validator_2/config,validator_3/config} + +### Create the validator configuration files + +For each validator node, follow these steps: + +1. In the validator's `config` directory, create a `rippled.cfg` file. + +2. Copy the information from the `rippled.cfg` template below into the file. + + [server] + port_rpc_admin_local + port_rpc + port_ws_admin_local + port_ws_public + port_peer + # ssl_key = /etc/ssl/private/server.key + # ssl_cert = /etc/ssl/certs/server.crt + + [port_rpc_admin_local] + port = 5005 + ip = 127.0.0.1 + admin = 127.0.0.1 + protocol = http + + [port_ws_admin_local] + port = 6006 + ip = 127.0.0.1 + admin = 127.0.0.1 + protocol = ws + + [port_ws_public] + port = 80 + ip = 0.0.0.0 + protocol = ws + + [port_peer] + port = 51235 + ip = 0.0.0.0 + protocol = peer + + [port_rpc] + port = 51234 + ip = 0.0.0.0 + admin = 127.0.0.1 + protocol = https, http + + [node_size] + small + # tiny + # small + # medium + # large + # huge + + [node_db] + type=NuDB + path=/var/lib/rippled/db/nudb + advisory_delete=0 + + # How many ledgers do we want to keep (history)? + # Integer value that defines the number of ledgers + # between online deletion events + online_delete=256 + + [ledger_history] + # How many ledgers do we want to keep (history)? + # Integer value (ledger count) + # or (if you have lots of TB SSD storage): 'full' + 256 + + [database_path] + /var/lib/rippled/db + + [debug_logfile] + /var/log/rippled/debug.log + + [sntp_servers] + time.windows.com + time.apple.com + time.nist.gov + pool.ntp.org + + [ips_fixed] + validator_1 51235 + validator_2 51235 + validator_3 51235 + + [validators_file] + validators.txt + + [rpc_startup] + { "command": "log_level", "severity": "warning" } + # severity (order: lots of information .. only errors) + # debug + # info + # warn + # error + # fatal + + [ssl_verify] + 0 + + [validator_token] + + +3. Add the generated validator token that you created at the [beginning](#generate-the-validator-keys) of the tutorial. For example: + + [validator_token] + eyJtYW5pZmVzdCI6IkpBQUFBQUZ4SWUwcVd3ZnpLZ2tacWJTL01QVGxHVXlOeTVJZ2kzYzlG + V1JvTDFIMGoydkNobk1oQTBOc2RHeFNXbWF6b0xkdU5NeDVmaVVZU2h3bjk2SnpSaUFReFJz + cENuR2dka1l3UkFJZ1dLazV4cklSN3FNRWd1UmJwOTRrN0E0QnBOZmwrT2VYUm92bTNIOGtS + YkVDSUZXYmVocHd5ZS9UWFpZRGYwUEgwTkxjN2I1cWNEOXUvbzVYUjA4YW1pUEJjQkpBYjEw + NE95bG5IS0JSZTJmRW1qSVVjT24vZ2ZacE44bXdhZ1dGbUxlemc2RFRLL0hpTVkyektNQ3l0 + aksreHpHNWpjc3JlS3k5Q29sRGtpKzk3V0JHQ2c9PSIsInZhbGlkYXRpb25fc2VjcmV0X2tl + eSI6IjZFNTNFQjA1M0IwNEM1RTczNDc4M0VCMEU0RTBFOTg1NDVDNDQ0QzI3OTBFQjdBMzA2 + NUQzMUVBOTU1QjQyMTIifQ== + + Each validator node must have its own unique token. + +### Create the validators.txt files + +Now that you have created the configuration files for your validators, you need to add a `validator.txt` file. This file defines which validators are trusted by your network. + +For each node, follow these steps: + +1. Create a `validators.txt` file in the configuration directory. +2. Copy the public keys from the `validator-keys.json` files that you generated at the [beginning](#generate-the-validator-keys) of the tutorial. +3. Add the public keys of _all_ the validators. For example: + + [validators] + nHBgaEDL8buUECuk4Rck4QBYtmUgbAoeYJLpWLzG9iXsznTRYrQu + nHBCHX7iLDTyap3LumqBNuKgG7JLA5tc6MSJxpLs3gjkwpu836mY + nHU5STUKTgWdreVqJDx6TopLUymzRUZshTSGcWNtjfByJkYdiiRc + +## Start the Network + +Docker Compose lets you manage multiple containers on your computer with a simple `yaml` file configuration. This section describes how to run the network with Docker Compose, and how to verify that the network is running successfully. + +**Note:** Docker Compose ensures the containers are part of the same Docker virtual network by default, so you don't need to take any additional steps for the `rippled` containers to communicate with each other. + +To start running your private network, follow these steps: + +1. Create a `docker-compose.yml` file in the root of the private network directory, `xrpl-private-network`, and add the following content: + + version: "3.9" + services: + validator_1: + platform: linux/amd64 + container_name: validator_1 + image: "xrpllabsofficial/xrpld" + ports: + - "8001:80" + - "5006:5005" + - "4001:6006" + - "9001:51235" + volumes: + - ./validator_1/config:/config/ + validator_2: + platform: linux/amd64 + container_name: validator_2 + image: "xrpllabsofficial/xrpld" + ports: + - "8002:80" + - "5007:5005" + - "4002:6006" + - "9002:51235" + volumes: + - ./validator_2/config:/config/ + validator_3: + platform: linux/amd64 + container_name: validator_3 + image: "xrpllabsofficial/xrpld" + ports: + - "8003:80" + - "5008:5005" + - "4003:6006" + - "9003:51235" + volumes: + - ./validator_3/config:/config/ + + The `volumes` key in each `service` represents the location where your config files are stored. For example, `./validator_1/config:/config/` maps the `/validator_1/config` directory on your host computer to `/config/` in the Docker container. Any changes made in the host directory will be reflected in the container automatically. + +2. From your terminal, in the location where you created the `docker-compose.yml` file, run `docker-compose up -d`. You should see a similar output to the one below: + + [+] Running 4/4 + ✔ Network xrpl-private-network_default Created 0.0s + ✔ Container validator_3 Started 0.5s + ✔ Container validator_1 Started 0.5s + ✔ Container validator_2 Started 0.5s + +## Verify the Network + +Now that the private ledger network is up, you need to verify that **each** validator node is running as expected: + +1. In your terminal, run `docker exec -it bin/bash` to execute commands in the validator Docker container. Replace `` with the name of the container (e.g., `validator_1`). + +2. Run the `rippled server_info` command to check the state of the validator: + + rippled server_info | grep server_state + + Sample Output: + + "server_state" : "proposing" + + **Note:** If the state is not updated to **proposing**, repeat step **2** after a few minutes as the ledger can take some time to update. + +3. Verify the number of peers connected to the validator. + + rippled server_info | grep peers + + Sample Output: + + "peers" : 2 + +4. Run the following command to check the genesis account information: + + rippled account_info rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh validated strict + + Sample Output: + + { + "result" : { + "account_data" : { + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Balance" : "100000000000000000", + "Flags" : 0, + "LedgerEntryType" : "AccountRoot", + "OwnerCount" : 0, + "PreviousTxnID" : "0000000000000000000000000000000000000000000000000000000000000000", + "PreviousTxnLgrSeq" : 0, + "Sequence" : 1, + "index" : "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8" + }, + "ledger_hash" : "CFCEFB049A71E26DE812529ABB212F330FAF583A98FE073F14713B0644D7CEE9", + "ledger_index" : 10181, + "status" : "success", + "validated" : true + } + } + +5. To leave the Docker container shell, enter `exit` in the terminal. + +### Perform a test transaction + +Perform a **test** transaction to ensure you can send money to an account. + +1. In your terminal, run the the following command to submit a transaction: + + docker exec -it validator_1 \ + rippled submit 'snoPBrXtMeMyMHUVTgbuqAfg1SUTb' '{ "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Amount": "1000000000", "Destination": "r9wRwVgL2vWVnKhTPdtxva5vdH7FNw1zPs", "TransactionType": "Payment", "Fee": "10" }' + + Sample Output: + + { + "result" : { + "engine_result" : "tesSUCCESS", + "engine_result_code" : 0, + "engine_result_message" : "The transaction was applied. Only final in a validated ledger.", + "status" : "success", + "tx_blob" : "1200002280000000240000000161400000003B9ACA0068400000000000000A73210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02074463044022057CCEED351A4278F35C13FD104A55338DC8F48C1F9902D58045A4CD0CE89C92A0220184026BD3B1E2C21239017CAF1BBF683 35EDC57F6F98D952E263763DE449561B8114B5F762798A53D543A014CAF8B297CFF8F2F937E883145988EBB744055F4E8BDC7F67FD53EB9FCF961DC0", + "tx_json" : { + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "1000000000", + "Destination" : "r9wRwVgL2vWVnKhTPdtxva5vdH7FNw1zPs", + "Fee" : "10", + "Flags" : 2147483648, + "Sequence" : 1, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "Payment", + "TxnSignature" : "3044022057CCEED351A4278F35C13FD104A55338DC8F48C1F9902D58045A4CD0CE89C92A0220184026BD3B1E2C21239017CAF1BBF68335EDC57F6F98D952E263763DE449561B", + "hash" : "EB516738841794B24819C68273E0F853A3D234350E6534F7F2841F620CE99437" + } + } + } + +2. For each validator, verify that the destination account `r9wRwVgL2vWVnKhTPdtxva5vdH7FNw1zPs` has 1000000000 XRP. For example: + + docker exec -it validator_1 \ + rippled account_info r9wRwVgL2vWVnKhTPdtxva5vdH7FNw1zPs validated strict + + Sample Output: + + { + "result" : { + "account_data" : { + "Account" : "r9wRwVgL2vWVnKhTPdtxva5vdH7FNw1zPs", + "Balance" : "1000000000", + "Flags" : 0, + "LedgerEntryType" : "AccountRoot", + "OwnerCount" : 0, + "PreviousTxnID" : "EB516738841794B24819C68273E0F853A3D234350E6534F7F2841F620CE99437", + "PreviousTxnLgrSeq" : 36, + "Sequence" : 1, + "index" : "0F2E4615AE24EEF58EE82BD1E67D237234ED41BFC8B7885630B7AC05082E97AA" + }, + "ledger_hash" : "6F9F54903CC4546F7A426CD78AFD68D907F5DC40B1780DF31A662CF65920E49C", + "ledger_index" : 51, + "status" : "success", + "validated" : true + } + } + + All validator nodes should respond with the same balance of 1000000000 XRP for the `r9wRwVgL2vWVnKhTPdtxva5vdH7FNw1zPs` account. + +## Stop the Network + +If you wish to stop running the private network: + +1. In your terminal, go to the `xrpl-private-network` directory. +2. Run the following command to shut down the network: + + docker-compose down + + Sample Output: + + [+] Running 4/4 + ✔ Container validator_3 Removed 1.7s + ✔ Container validator_1 Removed 1.6s + ✔ Container validator_2 Removed 1.6s + ✔ Network xrpl-private-network_default Removed 0.0s + +## See Also + +- **Networks and Servers:** + - [Peer Protocol](peer-protocol.html) + +- **References:** + - [XRPL Testnet Setup Scripts for Docker](https://github.com/UNIC-IFF/xrpl-docker-testnet) diff --git a/content/tutorials/manage-the-rippled-server/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.ja.md b/content/infrastructure/rippled/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.ja.md rename to content/infrastructure/rippled/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.ja.md diff --git a/content/tutorials/manage-the-rippled-server/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.md b/content/infrastructure/rippled/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.md rename to content/infrastructure/rippled/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.md diff --git a/content/tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md b/content/infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md similarity index 98% rename from content/tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md rename to content/infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md index 83cab4ed57..fccff032e9 100644 --- a/content/tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md +++ b/content/infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md @@ -74,7 +74,7 @@ rippled ledger_accept --conf=/path/to/rippled.cfg - **コンセプト:** - [`rippled`サーバー](xrpl-servers.html) - [`rippled`サーバーのモード](rippled-server-modes.html) - - [コンセンサスについて](intro-to-consensus.html) + - [コンセンサスについて](consensus.html) - [Amendment](amendments.html) - **リファレンス:** - [ledger_acceptメソッド][] diff --git a/content/tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.md b/content/infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.md rename to content/infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.md diff --git a/content/tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.ja.md b/content/infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.ja.md rename to content/infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.ja.md diff --git a/content/tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md b/content/infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md similarity index 89% rename from content/tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md rename to content/infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md index d2b757ce79..09f09f44df 100644 --- a/content/tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md +++ b/content/infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md @@ -17,7 +17,7 @@ rippled -a --start --conf=/path/to/rippled.cfg For more information on the options you can use when starting `rippled` in stand-alone mode, see [Commandline Usage: Stand-Alone Mode Options](commandline-usage.html#stand-alone-mode-options). -In a genesis ledger, the [genesis address](accounts.html#special-addresses) holds all 100 billion XRP. The keys of the genesis address are [hardcoded](https://github.com/ripple/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184) as follows: +In a genesis ledger, the [genesis address](addresses.html#special-addresses) holds all 100 billion XRP. The keys of the genesis address are [hardcoded](https://github.com/ripple/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184) as follows: **Address:** `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/diagnosing-problems.ja.md b/content/infrastructure/rippled/troubleshooting/diagnosing-problems.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/diagnosing-problems.ja.md rename to content/infrastructure/rippled/troubleshooting/diagnosing-problems.ja.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/diagnosing-problems.md b/content/infrastructure/rippled/troubleshooting/diagnosing-problems.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/diagnosing-problems.md rename to content/infrastructure/rippled/troubleshooting/diagnosing-problems.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/fix-sqlite-tx-db-page-size-issue.ja.md b/content/infrastructure/rippled/troubleshooting/fix-sqlite-tx-db-page-size-issue.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/fix-sqlite-tx-db-page-size-issue.ja.md rename to content/infrastructure/rippled/troubleshooting/fix-sqlite-tx-db-page-size-issue.ja.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/fix-sqlite-tx-db-page-size-issue.md b/content/infrastructure/rippled/troubleshooting/fix-sqlite-tx-db-page-size-issue.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/fix-sqlite-tx-db-page-size-issue.md rename to content/infrastructure/rippled/troubleshooting/fix-sqlite-tx-db-page-size-issue.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/health-check-interventions.md b/content/infrastructure/rippled/troubleshooting/health-check-interventions.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/health-check-interventions.md rename to content/infrastructure/rippled/troubleshooting/health-check-interventions.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.ja.md b/content/infrastructure/rippled/troubleshooting/server-doesnt-sync.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.ja.md rename to content/infrastructure/rippled/troubleshooting/server-doesnt-sync.ja.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.md b/content/infrastructure/rippled/troubleshooting/server-doesnt-sync.md similarity index 96% rename from content/tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.md rename to content/infrastructure/rippled/troubleshooting/server-doesnt-sync.md index 51f199f68a..68290ed7df 100644 --- a/content/tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.md +++ b/content/infrastructure/rippled/troubleshooting/server-doesnt-sync.md @@ -16,10 +16,10 @@ These instructions assume you have [installed `rippled`](install-rippled.html) o Syncing with the network normally takes about 5 to 15 minutes. During that time, the server does several things: -- Loads a recommended validator list (typically from `vl.ripple.com`) to determine which validators it trusts. +- Loads a recommended validator list (for example, from `vl.ripple.com`) to determine which validators it trusts. - [Discovers peer servers](peer-protocol.html#peer-discovery) and connects to them. -- Downloads the [header](ledger-header.html) and full [state information](ledgers.html#tree-format) of the latest ledger from its peers, and uses that to build its internal database of ledger data. - Listens to its trusted validators to find which ledger hashes have been recently validated. +- Downloads the full latest ledger from its peers, and uses that to build its internal database of ledger data. - Collects newly-broadcast transactions and attempts to apply them to its in-progress ledger. If the server is unable to keep up with the network while doing these tasks, the server does not sync to the network. diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/server-is-amendment-blocked.md b/content/infrastructure/rippled/troubleshooting/server-is-amendment-blocked.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/server-is-amendment-blocked.md rename to content/infrastructure/rippled/troubleshooting/server-is-amendment-blocked.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/server-wont-start.ja.md b/content/infrastructure/rippled/troubleshooting/server-wont-start.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/server-wont-start.ja.md rename to content/infrastructure/rippled/troubleshooting/server-wont-start.ja.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/server-wont-start.md b/content/infrastructure/rippled/troubleshooting/server-wont-start.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/server-wont-start.md rename to content/infrastructure/rippled/troubleshooting/server-wont-start.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/understanding-log-messages.ja.md b/content/infrastructure/rippled/troubleshooting/understanding-log-messages.ja.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/understanding-log-messages.ja.md rename to content/infrastructure/rippled/troubleshooting/understanding-log-messages.ja.md diff --git a/content/tutorials/manage-the-rippled-server/troubleshooting/understanding-log-messages.md b/content/infrastructure/rippled/troubleshooting/understanding-log-messages.md similarity index 100% rename from content/tutorials/manage-the-rippled-server/troubleshooting/understanding-log-messages.md rename to content/infrastructure/rippled/troubleshooting/understanding-log-messages.md diff --git a/content/references/data-api.ja.md b/content/references/data-api.ja.md index 25835f4359..de5aaf3400 100644 --- a/content/references/data-api.ja.md +++ b/content/references/data-api.ja.md @@ -7,7 +7,7 @@ nav_omit: true --- # Ripple Data API v2 -**警告:** Ripple Data API v2は廃止されました。代わりに[HTTP / WebSocket API](https://xrpl.org/http-websocket-apis.html)を使って下さい。 +**警告:** Ripple Data API v2は廃止されました。代わりに[HTTP / WebSocket API](http-websocket-apis.html)を使って下さい。 Ripple Data API v2を使用すると、XRP Ledgerの変更に関する情報(トランザクション履歴や処理済みの分析データなど)にアクセスできます。このような情報は専用データベースに保管されるので、`rippled`サーバーで保持する必要のある履歴レジャーバージョンの数が少なくなります。Data API v2は[XRP Charts](https://xrpcharts.ripple.com/)や[ripple.com](https://www.ripple.com)などのアプリケーションのデータソースとしても機能します。 diff --git a/content/references/http-websocket-apis/admin-api-methods/template-admin-method.md b/content/references/http-websocket-apis/admin-api-methods/_template-admin-method.md similarity index 100% rename from content/references/http-websocket-apis/admin-api-methods/template-admin-method.md rename to content/references/http-websocket-apis/admin-api-methods/_template-admin-method.md diff --git a/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.ja.md b/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.ja.md index 98a969b724..4b5d431848 100644 --- a/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.ja.md +++ b/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.ja.md @@ -91,7 +91,7 @@ rippled wallet_propose masterpassphrase #### シードの指定 -ほとんどの場合、強力な乱数ソースから生成されたシード値を使用する必要があります。あるアドレスのシード値を知っている人は、[そのアドレスで署名されたトランザクションを送信する](transaction-basics.html#トランザクションの承認)すべての権限を持っています。一般的に、ランダムシードの生成には、このコマンドにパラメーターを指定しないで実行する方法が適しています。 +ほとんどの場合、強力な乱数ソースから生成されたシード値を使用する必要があります。あるアドレスのシード値を知っている人は、[そのアドレスで署名されたトランザクションを送信する](transactions.html#トランザクションの承認)すべての権限を持っています。一般的に、ランダムシードの生成には、このコマンドにパラメーターを指定しないで実行する方法が適しています。 以下の場合には、既知のシードを指定します。 diff --git a/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.md b/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.md index dd8a00969c..de2336ab93 100644 --- a/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.md +++ b/content/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.md @@ -91,7 +91,7 @@ You must provide **at most one** of the following fields: `passphrase`, `seed`, #### Specifying a Seed -For most cases, you should use a seed value generated from a strong source of randomness. Anyone who knows the seed value for an address has full power to [send transactions signed by that address](transaction-basics.html#authorizing-transactions). Generally, running this command with no parameters is a good way to generate a random seed. +For most cases, you should use a seed value generated from a strong source of randomness. Anyone who knows the seed value for an address has full power to [send transactions signed by that address](transactions.html#authorizing-transactions). Generally, running this command with no parameters is a good way to generate a random seed. Cases where you would specify a known seed include: diff --git a/content/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/ledger_request.md b/content/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/ledger_request.md index 63c1da22f9..5fc0f3988e 100644 --- a/content/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/ledger_request.md +++ b/content/references/http-websocket-apis/admin-api-methods/logging-and-data-management-methods/ledger_request.md @@ -174,10 +174,10 @@ When the server is in the progress of fetching a ledger, but has not yet finishe |:----------------------------|:-----------------|:----------------------------| | `hash` | String | (May be omitted) The [Hash][] of the requested ledger, if the server knows it. | | `have_header` | Boolean | Whether the server has the header section of the requested ledger. | -| `have_state` | Boolean | (May be omitted) Whether the server has the [account-state section](ledgers.html#tree-format) of the requested ledger. | -| `have_transactions` | Boolean | (May be omitted) Whether the server has the transaction section of the requested ledger. | -| `needed_state_hashes` | Array of Strings | (May be omitted) Up to 16 hashes of objects in the [state tree](ledgers.html#tree-format) that the server still needs to retrieve. | -| `needed_transaction_hashes` | Array of Strings | (May be omitted) Up to 16 hashes of objects in the transaction tree that the server still needs to retrieve. | +| `have_state` | Boolean | (May be omitted) Whether the server has the full state data of the requested ledger. | +| `have_transactions` | Boolean | (May be omitted) Whether the server has the full transaction set of the requested ledger. | +| `needed_state_hashes` | Array of Strings | (May be omitted) Up to 16 hashes of objects in the state data that the server still needs to retrieve. | +| `needed_transaction_hashes` | Array of Strings | (May be omitted) Up to 16 hashes of objects in the transaction set that the server still needs to retrieve. | | `peers` | Number | How many peers the server is querying to find this ledger. | | `timeouts` | Number | Number of times fetching this ledger has timed out so far. | diff --git a/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.ja.md b/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.ja.md index a673a06654..10dffaae74 100644 --- a/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.ja.md +++ b/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.ja.md @@ -13,7 +13,7 @@ labels: {% include '_snippets/public-signing-note.md' %} -**注意:** 独自の`rippled`サーバーを運用している場合を除き、このコマンドを使用するのではなく、[クライアントライブラリ](client-libraries.html)を実行してください。詳細については[安全な署名の設定](set-up-secure-signing.html)を参照してください。 +**注意:** 独自の`rippled`サーバーを運用している場合を除き、このコマンドを使用するのではなく、[クライアントライブラリ](client-libraries.html)を実行してください。詳細については[安全な署名の設定](secure-signing.html)を参照してください。 ## 要求フォーマット 要求フォーマットの例: @@ -76,7 +76,7 @@ rippled sign s██████████████████████ -トランザクションに署名するには、[トランザクションを承認](transaction-basics.html#トランザクションの承認)できるシークレットキーを提供する必要があります。通常、サーバーが秘密鍵を取得するシード値を提供します。これを行うには、以下の方法があります。 +トランザクションに署名するには、[トランザクションを承認](transactions.html#トランザクションの承認)できるシークレットキーを提供する必要があります。通常、サーバーが秘密鍵を取得するシード値を提供します。これを行うには、以下の方法があります。 * `secret`フィールドにシードを指定し、`key_type`フィールドを省略します。この値は、XRP Ledgerの[base58][]シード、RFC-1751、16進値のフォーマットで記述するか、文字列パスフレーズとして記述します(secp256k1キーのみ)。 * `key_type`値と、`seed`、`seed_hex`、または`passphrase`のいずれか1つを提供します。`secret`フィールドは省略します。(コマンドライン構文ではサポートされません)。 diff --git a/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.md b/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.md index cc7d24360e..c513010f0b 100644 --- a/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.md +++ b/content/references/http-websocket-apis/admin-api-methods/signing-methods/sign.md @@ -13,7 +13,7 @@ The `sign` method takes a [transaction in JSON format](transaction-formats.html) {% include '_snippets/public-signing-note.md' %} -**Caution:** Unless you run the `rippled` server yourself, you should do local signing using a [client library](client-libraries.html) instead of using this command. For more information, see [Set Up Secure Signing](set-up-secure-signing.html). +**Caution:** Unless you run the `rippled` server yourself, you should do local signing using a [client library](client-libraries.html) instead of using this command. For more information, see [Set Up Secure Signing](secure-signing.html). ## Request Format An example of the request format: @@ -76,7 +76,7 @@ rippled sign s██████████████████████ -To sign a transaction, you must provide a secret key that can [authorize the transaction](transaction-basics.html#authorizing-transactions). Typically you provide a seed value that the server derives the secret key from. You can do this in a few ways: +To sign a transaction, you must provide a secret key that can [authorize the transaction](transactions.html#authorizing-transactions). Typically you provide a seed value that the server derives the secret key from. You can do this in a few ways: * Provide the seed in the `secret` field and omit the `key_type` field. This value can be formatted as an XRP Ledger [base58][] seed, RFC-1751, hexadecimal, or as a string passphrase. (secp256k1 keys only) * Provide a `key_type` value and exactly one of `seed`, `seed_hex`, or `passphrase`. Omit the `secret` field. (Not supported by the commandline syntax.) diff --git a/content/references/http-websocket-apis/admin-api-methods/status-and-debugging-methods/validators.md b/content/references/http-websocket-apis/admin-api-methods/status-and-debugging-methods/validators.md index 0c71588f66..7f79dc60c6 100644 --- a/content/references/http-websocket-apis/admin-api-methods/status-and-debugging-methods/validators.md +++ b/content/references/http-websocket-apis/admin-api-methods/status-and-debugging-methods/validators.md @@ -9,7 +9,7 @@ labels: # validators [[Source]](https://github.com/ripple/rippled/blob/master/src/ripple/rpc/handlers/Validators.cpp "Source") -The `validators` command returns human readable information about the current list of published and [trusted validators](intro-to-consensus.html#trust-based-validation) used by the server. [New in: rippled 0.80.1][] +The `validators` command returns human readable information about the current list of published and [trusted validators](consensus.html#trust-based-validation) used by the server. *The `validators` method is an [admin method](admin-api-methods.html) that cannot be run by unprivileged users!* diff --git a/content/references/http-websocket-apis/api-conventions/request-formatting.md b/content/references/http-websocket-apis/api-conventions/request-formatting.md index 694c984039..cdbbfc1328 100644 --- a/content/references/http-websocket-apis/api-conventions/request-formatting.md +++ b/content/references/http-websocket-apis/api-conventions/request-formatting.md @@ -90,7 +90,7 @@ See [Response Formatting](response-formatting.html) for the response from the se ## Commandline Format -Put the API method name after any normal (dash-prefaced) commandline options, followed by a limited set of parameters, separated by spaces. For any parameter values that might contain spaces or other unusual characters, use single-quotes to encapsulate them. Not all methods have commandline API syntax. For more information, see [Commandline Usage](https://xrpl.org/commandline-usage.html#client-mode-options). +Put the API method name after any normal (dash-prefaced) commandline options, followed by a limited set of parameters, separated by spaces. For any parameter values that might contain spaces or other unusual characters, use single-quotes to encapsulate them. Not all methods have commandline API syntax. For more information, see [Commandline Usage](commandline-usage.html#client-mode-options). The commandline calls JSON-RPC, so its responses always match the JSON-RPC [response format](response-formatting.html). diff --git a/content/references/http-websocket-apis/api-conventions/response-formatting.md b/content/references/http-websocket-apis/api-conventions/response-formatting.md index 4b6bf4901c..4dcef6cf5c 100644 --- a/content/references/http-websocket-apis/api-conventions/response-formatting.md +++ b/content/references/http-websocket-apis/api-conventions/response-formatting.md @@ -184,7 +184,7 @@ It is generally safe to ignore this warning. - [Error Formatting](error-formatting.html) for unsuccessful API responses. - **Concepts:** - [The `rippled` Server](xrpl-servers.html) - - [Introduction to Consensus](intro-to-consensus.html) + - [Consensus](consensus.html) - [Amendments](amendments.html) - [Known Amendments](known-amendments.html) - **Tutorials:** diff --git a/content/references/http-websocket-apis/peer-port-methods/health-check.md b/content/references/http-websocket-apis/peer-port-methods/health-check.md index 7905b9a4f6..ec942c043a 100644 --- a/content/references/http-websocket-apis/peer-port-methods/health-check.md +++ b/content/references/http-websocket-apis/peer-port-methods/health-check.md @@ -103,7 +103,7 @@ The `info` object may contain the following fields: | `load_factor` | Number | _(May be omitted)_ A measure of the overall load the server is under. This reflects I/O, CPU, and memory limitations. This is a warning if the load factor is over 100, or critical if the load factor is 1000 or higher. | | `peers` | Number | _(May be omitted)_ The number of [peer servers](peer-protocol.html) this server is connected to. This is a warning if connected to 7 or fewer peers, and critical if connected to zero peers. | | `server_state` | String | _(May be omitted)_ The current [server state](rippled-server-states.html). This is a warning if the server is in the `tracking`, `syncing`, or `connected` states. This is critical if the server is in the `disconnected` state. | -| `validated_ledger` | Number | _(May be omitted)_ The number of seconds since the last time a ledger was validated by [consensus](intro-to-consensus.html). If there is no validated ledger available ([as during the initial sync period when starting the server](server-doesnt-sync.html#normal-syncing-behavior)), this is the value `-1` and is considered a warning. This metric is also a warning if the last validated ledger was at least 7 seconds ago, or critical if the last validated ledger was at least 20 seconds ago. | +| `validated_ledger` | Number | _(May be omitted)_ The number of seconds since the last time a ledger was validated by [consensus](consensus.html). If there is no validated ledger available ([as during the initial sync period when starting the server](server-doesnt-sync.html#normal-syncing-behavior)), this is the value `-1` and is considered a warning. This metric is also a warning if the last validated ledger was at least 7 seconds ago, or critical if the last validated ledger was at least 20 seconds ago. | ## See Also diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.ja.md b/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.ja.md index c1e59a44aa..c5a73189c3 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.ja.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.ja.md @@ -183,8 +183,8 @@ rippled account_channels rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn ra5nK24KXen9AHvsdFTK | `settle_delay` | 符号なし整数 | Payment Channelの所有者がChannel閉鎖を依頼した後に、そのChannelが開いている必要がある秒数。 | | `expiration` | 符号なし整数 | _(省略される場合があります)_ このChannelに設定された有効期限([Rippleエポック以降の経過秒数][])。この有効期限の日付は変更可能です。これが最新の検証済みレジャーの閉鎖時刻よりも前の場合、Channelは有効期限切れです。 | | `cancel_after` | 符号なし整数 | _(省略される場合があります)_ このChannelの変更不可能な有効期限がChannel作成時に指定されている場合はその有効期限([Rippleエポック以降の経過秒数][])。これが最新の検証済みレジャーの閉鎖時刻よりも前の場合、Channelは有効期限切れです。 | -| `source_tag` | 符号なし整数 | _(省略される場合があります)_ このPayment Channelを通じた支払いの[送金元タグ](become-an-xrp-ledger-gateway.html#source-and-destination-tags)として使用される32ビット符号なし整数(Channel作成時に指定されている場合)。送金元アカウントでのPayment Channelの送金人またはその他の目的を示します。通常、このChannelからの支払いを差し戻す場合、返金の`DestinationTag`にこの値を指定する必要があります。 | -| `destination_tag` | 符号なし整数 | _(省略される場合があります)_ このChannelを通じた支払いの[送金先タグ](become-an-xrp-ledger-gateway.html#source-and-destination-tags)として使用される32ビット符号なし整数(Channel作成時に指定されている場合)。送金先アカウントでのPayment Channelの受取人またはその他の目的を示します。 | +| `source_tag` | 符号なし整数 | _(省略される場合があります)_ このPayment Channelを通じた支払いの[送金元タグ](source-and-destination-tags.html)として使用される32ビット符号なし整数(Channel作成時に指定されている場合)。送金元アカウントでのPayment Channelの送金人またはその他の目的を示します。通常、このChannelからの支払いを差し戻す場合、返金の`DestinationTag`にこの値を指定する必要があります。 | +| `destination_tag` | 符号なし整数 | _(省略される場合があります)_ このChannelを通じた支払いの[送金先タグ](source-and-destination-tags.html)として使用される32ビット符号なし整数(Channel作成時に指定されている場合)。送金先アカウントでのPayment Channelの受取人またはその他の目的を示します。 | ## 考えられるエラー diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.md b/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.md index 55e0a681a3..14cdded0f1 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/account_channels.md @@ -182,8 +182,8 @@ Each Channel Object has the following fields: | `public_key_hex` | String | _(May be omitted)_ The public key for the payment channel in hexadecimal format, if one was specified at channel creation. Signed claims against this channel must be redeemed with the matching key pair. | | `expiration` | Unsigned Integer | _(May be omitted)_ Time, in [seconds since the Ripple Epoch][], when this channel is set to expire. This expiration date is mutable. If this is before the close time of the most recent validated ledger, the channel is expired. | | `cancel_after` | Unsigned Integer | _(May be omitted)_ Time, in [seconds since the Ripple Epoch][], of this channel's immutable expiration, if one was specified at channel creation. If this is before the close time of the most recent validated ledger, the channel is expired. | -| `source_tag` | Unsigned Integer | _(May be omitted)_ A 32-bit unsigned integer to use as a [source tag](become-an-xrp-ledger-gateway.html#source-and-destination-tags) for payments through this payment channel, if one was specified at channel creation. This indicates the payment channel's originator or other purpose at the source account. Conventionally, if you bounce payments from this channel, you should specify this value in the `DestinationTag` of the return payment. | -| `destination_tag` | Unsigned Integer | _(May be omitted)_ A 32-bit unsigned integer to use as a [destination tag](become-an-xrp-ledger-gateway.html#source-and-destination-tags) for payments through this channel, if one was specified at channel creation. This indicates the payment channel's beneficiary or other purpose at the destination account. | +| `source_tag` | Unsigned Integer | _(May be omitted)_ A 32-bit unsigned integer to use as a [source tag](source-and-destination-tags.html) for payments through this payment channel, if one was specified at channel creation. This indicates the payment channel's originator or other purpose at the source account. Conventionally, if you bounce payments from this channel, you should specify this value in the `DestinationTag` of the return payment. | +| `destination_tag` | Unsigned Integer | _(May be omitted)_ A 32-bit unsigned integer to use as a [destination tag](source-and-destination-tags.html) for payments through this channel, if one was specified at channel creation. This indicates the payment channel's beneficiary or other purpose at the destination account. | ## Possible Errors diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.ja.md b/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.ja.md index e8f4b80d1b..df66b7aa1c 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.ja.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.ja.md @@ -192,7 +192,7 @@ rippled account_info r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 true | `Field` | 型 | 説明 | |:------------------------|:--------|:-----------------------------------------| | `txn_count` | 整数 | このアドレスからキューに入れられたトランザクションの数。 | -| `auth_change_queued` | ブール値 | (省略される場合があります)キュー内のトランザクションがこのアドレスの[トランザクションの承認方法](transaction-basics.html#トランザクションの承認)を変更するかどうかを示します。`true`の場合、トランザクションが実行されているかキューから除外されるまで、このアドレスはトランザクションをこれ以上キューに入れることができません。 | +| `auth_change_queued` | ブール値 | (省略される場合があります)キュー内のトランザクションがこのアドレスの[トランザクションの承認方法](transactions.html#トランザクションの承認)を変更するかどうかを示します。`true`の場合、トランザクションが実行されているかキューから除外されるまで、このアドレスはトランザクションをこれ以上キューに入れることができません。 | | `lowest_sequence` | 整数 | (省略される場合があります)このアドレスによってキューに入れられたトランザクションのうち最も低い[シーケンス番号][]。 | | `highest_sequence` | 整数 | (省略される場合があります)このアドレスによってキューに入れられたトランザクションのうち最も高い[シーケンス番号][]。 | | `max_spend_drops_total` | 文字列 | (省略される場合があります)キュー内のすべてのトランザクションが利用可能なXRPを最大限消費する場合に、このアドレスから差し引くことができる[XRPのdrop数][]を示す整数の金額。 | @@ -202,7 +202,7 @@ rippled account_info r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59 true | `Field` | 型 | 説明 | |:------------------|:--------|:-----------------------------------------------| -| `auth_change` | ブール値 | このトランザクションがこのアドレスの[トランザクション承認の方法](transaction-basics.html#トランザクションの承認)を変更するかどうかを示します。 | +| `auth_change` | ブール値 | このトランザクションがこのアドレスの[トランザクション承認の方法](transactions.html#トランザクションの承認)を変更するかどうかを示します。 | | `fee` | 文字列 | このトランザクションの[トランザクションコスト](transaction-cost.html)([XRPのdrop数][])。 | | `fee_level` | 文字列 | このタイプのトランザクションの最少コストと比較した、このトランザクションのトランザクションコスト([手数料レベル][])。 | | `max_spend_drops` | 文字列 | このトランザクションで送信または消却できる[XRPのdrop数][]の最高額。 | diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.md b/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.md index e678200b57..8f3af50e00 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/account_info.md @@ -207,7 +207,7 @@ The response follows the [standard format][], with the result containing the req | `signer_lists` | Array | _(Omitted unless the request specified `signer_lists` and at least one SignerList is associated with the account.)_ Array of [SignerList ledger objects](signerlist.html) associated with this account for [Multi-Signing](multi-signing.html). Since an account can own at most one SignerList, this array must have exactly one member if it is present. [New in: rippled 0.31.0][] | | `ledger_current_index` | Integer | _(Omitted if `ledger_index` is provided instead)_ The [ledger index][] of the current in-progress ledger, which was used when retrieving this information. | | `ledger_index` | Integer | _(Omitted if `ledger_current_index` is provided instead)_ The [ledger index][] of the ledger version used when retrieving this information. The information does not contain any changes from ledger versions newer than this one. | -| `queue_data` | Object | _(Omitted unless `queue` specified as `true` and querying the current open ledger.)_ Information about [queued transactions](transaction-cost.html#queued-transactions) sent by this account. This information describes the state of the local `rippled` server, which may be different from other servers in the [peer-to-peer XRP Ledger network](consensus-network.html). Some fields may be omitted because the values are calculated "lazily" by the queuing mechanism. | +| `queue_data` | Object | _(Omitted unless `queue` specified as `true` and querying the current open ledger.)_ Information about [queued transactions](transaction-cost.html#queued-transactions) sent by this account. This information describes the state of the local `rippled` server, which may be different from other servers in the [peer-to-peer XRP Ledger network](peer-protocol.html). Some fields may be omitted because the values are calculated "lazily" by the queuing mechanism. | | `validated` | Boolean | True if this data is from a validated ledger version; if omitted or set to false, this data is not final. [New in: rippled 0.26.0][] | The `account_flags` field contains the following nested fields: @@ -233,7 +233,7 @@ The `queue_data` field, if present, contains the following nested fields: | `Field` | Type | Description | |:------------------------|:--------|:-----------------------------------------| | `txn_count` | Integer | Number of queued transactions from this address. | -| `auth_change_queued` | Boolean | (May be omitted) Whether a transaction in the queue changes this address's [ways of authorizing transactions](transaction-basics.html#authorizing-transactions). If `true`, this address can queue no further transactions until that transaction has been executed or dropped from the queue. | +| `auth_change_queued` | Boolean | (May be omitted) Whether a transaction in the queue changes this address's [ways of authorizing transactions](transactions.html#authorizing-transactions). If `true`, this address can queue no further transactions until that transaction has been executed or dropped from the queue. | | `lowest_sequence` | Integer | (May be omitted) The lowest [Sequence Number][] among transactions queued by this address. | | `highest_sequence` | Integer | (May be omitted) The highest [Sequence Number][] among transactions queued by this address. | | `max_spend_drops_total` | String | (May be omitted) Integer amount of [drops of XRP][] that could be debited from this address if every transaction in the queue consumes the maximum amount of XRP possible. | @@ -243,7 +243,7 @@ Each object in the `transactions` array of `queue_data`, if present, may contain | `Field` | Type | Description | |:------------------|:--------|:-----------------------------------------------| -| `auth_change` | Boolean | Whether this transaction changes this address's [ways of authorizing transactions](transaction-basics.html#authorizing-transactions). | +| `auth_change` | Boolean | Whether this transaction changes this address's [ways of authorizing transactions](transactions.html#authorizing-transactions). | | `fee` | String | The [Transaction Cost](transaction-cost.html) of this transaction, in [drops of XRP][]. | | `fee_level` | String | The transaction cost of this transaction, relative to the minimum cost for this type of transaction, in [fee levels][]. | | `max_spend_drops` | String | The maximum amount of [XRP, in drops][], this transaction could send or destroy. | diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md b/content/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md index 563e450fe1..08336218c5 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/account_objects.md @@ -76,13 +76,15 @@ The request includes the following parameters: | `Field` | Type | Required? | Description | |:-------------------------|:-----------------|:----------|-------------| | `account` | String | Yes | A unique identifier for the account, most commonly the account's [Address][]. | -| `deletion_blockers_only` | Boolean | No | If `true`, the response only includes objects that would block this account from [being deleted](accounts.html#deletion-of-accounts). The default is `false`. [New in: rippled 1.4.0][] | +| `deletion_blockers_only` | Boolean | No | If `true`, the response only includes objects that would block this account from [being deleted](deleting-accounts.html). The default is `false`. [New in: rippled 1.4.0][] | | `ledger_hash` | [Hash][] | No | A 20-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][]) | | `limit` | Number | No | The maximum number of objects to include in the results. Must be within the inclusive range `10` to `400` on non-admin connections. The default is `200`. | | `marker` | [Marker][] | No | Value from a previous paginated response. Resume retrieving data where that response left off. | | `type` | String | No | Filter results by a ledger entry type. The valid types are: `check`, `deposit_preauth`, `escrow`, `nft_offer`, `nft_page`, `offer`, `payment_channel`, `signer_list`, `state` (trust line), and `ticket`. | +**Note:** The commandline interface to the `account_objects` command doesn't accept the `type` field. Use the [json method][] to send the JSON-RPC format request on the commandline instead. + ## Response Format An example of a successful response: diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.ja.md b/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.ja.md index a71062d1e8..738020066f 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.ja.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.ja.md @@ -9,7 +9,7 @@ labels: # gateway_balances [[ソース]](https://github.com/ripple/rippled/blob/9111ad1a9dc37d49d085aa317712625e635197c0/src/ripple/rpc/handlers/GatewayBalances.cpp "Source") -`gateway_balances`コマンドは、特定のアカウントから発行された残高の合計を計算します。オプションで、[運用アドレス](issuing-and-operational-addresses.html)が保有する額を除外できます。[新規: rippled 0.28.2][] +`gateway_balances`コマンドは、特定のアカウントから発行された残高の合計を計算します。オプションで、[運用アドレス](account-types.html)が保有する額を除外できます。[新規: rippled 0.28.2][] ## 要求フォーマット 要求フォーマットの例: @@ -54,9 +54,9 @@ labels: | `Field` | 型 | 説明 | |:---------------|:---------------------------|:-------------------------------| -| `account` | 文字列 | チェックする[アドレス][]。[発行アドレス](issuing-and-operational-addresses.html)である必要があります。 | +| `account` | 文字列 | チェックする[アドレス][]。[発行アドレス](account-types.html)である必要があります。 | | `strict` | ブール値 | _(省略可)_ trueの場合は、アカウントパラメーターにアドレスまたは公開鍵だけを受け入れます。デフォルトではfalseです。 | -| `hotwallet` | 文字列または配列 | _(省略可)_ 発行済み残高から除外する[運用アドレス](issuing-and-operational-addresses.html)、またはそのようなアドレスの配列。 | +| `hotwallet` | 文字列または配列 | _(省略可)_ 発行済み残高から除外する[運用アドレス](account-types.html)、またはそのようなアドレスの配列。 | | `ledger_hash` | 文字列 | _(省略可)_ 使用するレジャーバージョンの20バイトの16進文字列。([レジャーの指定][]を参照してください) | | `ledger_index` | 文字列または符号なし整数 | _(省略可)_ 使用するレジャーバージョンの[レジャーインデックス][]、またはレジャーを自動的に選択するためのショートカット文字列。([レジャーの指定][]を参照してください) | @@ -212,7 +212,7 @@ labels: | `account` | 文字列 - [アドレス][] | 残高を発行したアカウントのアドレス。 | | `obligations` | オブジェクト | (空の場合は省略)除外されていないアドレスに発行された額の合計。発行された価値の合計に対する通貨のマップとして示されます。 | | `balances` | オブジェク | _(空の場合は省略)_ 要求から`hotwallet`アドレスに発行された額。キーはアドレスであり、値はアドレスが保有する通貨額の配列です。 | -| `assets` | オブジェクト | _(空の場合は省略)_ 他から発行された保有額の合計。推奨される構成では、[発行アドレス](issuing-and-operational-addresses.html)の保有額はありません。 | +| `assets` | オブジェクト | _(空の場合は省略)_ 他から発行された保有額の合計。推奨される構成では、[発行アドレス](account-types.html)の保有額はありません。 | | `ledger_hash` | 文字列 - [ハッシュ][] | _(省略される場合があります)_ この応答の生成に使用されたレジャーバージョンの識別用ハッシュ。 | | `ledger_index` | 数値 - [レジャーインデックス][] | _(省略される場合があります)_ この応答の生成に使用されたレジャーバージョンのレジャーインデックス。 | | | `ledger_current_index` | 数値 - [レジャーインデックス][] | _(`ledger_current_index`が指定されている場合は省略)_ この情報の取得時に使用した、現在処理中のレジャーバージョンの[レジャーインデックス][]。 | diff --git a/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.md b/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.md index 896eba5535..603e061689 100644 --- a/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.md +++ b/content/references/http-websocket-apis/public-api-methods/account-methods/gateway_balances.md @@ -9,7 +9,7 @@ labels: # gateway_balances [[Source]](https://github.com/ripple/rippled/blob/9111ad1a9dc37d49d085aa317712625e635197c0/src/ripple/rpc/handlers/GatewayBalances.cpp "Source") -The `gateway_balances` command calculates the total balances issued by a given account, optionally excluding amounts held by [operational addresses](issuing-and-operational-addresses.html). [New in: rippled 0.28.2][] +The `gateway_balances` command calculates the total balances issued by a given account, optionally excluding amounts held by [operational addresses](account-types.html). [New in: rippled 0.28.2][] **Caution:** Some public servers disable this API method because it can require a large amount of processing. @@ -63,9 +63,9 @@ The request includes the following parameters: | `Field` | Type | Description | |:---------------|:---------------------------|:-------------------------------| -| `account` | String | The [Address][] to check. This should be the [issuing address](issuing-and-operational-addresses.html) | +| `account` | String | The [Address][] to check. This should be the [issuing address](account-types.html) | | `strict` | Boolean | _(Optional)_ If true, only accept an address or public key for the account parameter. Defaults to false. | -| `hotwallet` | String or Array | _(Optional)_ An [operational address](issuing-and-operational-addresses.html) to exclude from the balances issued, or an array of such addresses. | +| `hotwallet` | String or Array | _(Optional)_ An [operational address](account-types.html) to exclude from the balances issued, or an array of such addresses. | | `ledger_hash` | String | _(Optional)_ A 20-byte hex string for the ledger version to use. (See [Specifying Ledgers][]) | | `ledger_index` | String or Unsigned Integer | _(Optional)_ The [ledger index][] of the ledger version to use, or a shortcut string to choose a ledger automatically. (See [Specifying Ledgers][]) | @@ -286,7 +286,7 @@ The response follows the [standard format][], with a successful result containin | `account` | String - [Address][] | The address of the account that issued the balances. | | `obligations` | Object | (Omitted if empty) Total amounts issued to addresses not excluded, as a map of currencies to the total value issued. | | `balances` | Object | _(Omitted if empty)_ Amounts issued to the `hotwallet` addresses from the request. The keys are addresses and the values are arrays of currency amounts they hold. | -| `assets` | Object | _(Omitted if empty)_ Total amounts held that are issued by others. In the recommended configuration, the [issuing address](issuing-and-operational-addresses.html) should have none. | +| `assets` | Object | _(Omitted if empty)_ Total amounts held that are issued by others. In the recommended configuration, the [issuing address](account-types.html) should have none. | | `ledger_hash` | String - [Hash][] | _(May be omitted)_ The identifying hash of the ledger version that was used to generate this response. | | `ledger_index` | Number - [Ledger Index][] | _(May be omitted)_ The ledger index of the ledger version that was used to generate this response. | | `ledger_current_index` | Number - [Ledger Index][] | _(Omitted if `ledger_current_index` is provided)_ The [ledger index][] of the current in-progress ledger version, which was used to retrieve this information. | diff --git a/content/references/http-websocket-apis/public-api-methods/clio-methods/ledger-clio.md b/content/references/http-websocket-apis/public-api-methods/clio-methods/ledger-clio.md index 001522b3fd..69e7d9b322 100644 --- a/content/references/http-websocket-apis/public-api-methods/clio-methods/ledger-clio.md +++ b/content/references/http-websocket-apis/public-api-methods/clio-methods/ledger-clio.md @@ -203,7 +203,7 @@ Each member of the `queue_data` array represents one transaction in the queue. S | `retries_remaining` | Number | How many times this transaction can be retried before being dropped. | | `preflight_result` | String | The tentative result from preliminary transaction checking. This is always `tesSUCCESS`. | | `last_result` | String | _(May be omitted)_ If this transaction was left in the queue after getting a [retriable (`ter`) result](ter-codes.html), this is the exact `ter` result code it got. | -| `auth_change` | Boolean | _(May be omitted)_ Whether this transaction changes this address's [ways of authorizing transactions](transaction-basics.html#authorizing-transactions). | +| `auth_change` | Boolean | _(May be omitted)_ Whether this transaction changes this address's [ways of authorizing transactions](transactions.html#authorizing-transactions). | | `fee` | String | _(May be omitted)_ The [Transaction Cost](transaction-cost.html) of this transaction, in [drops of XRP][]. | | `fee_level` | String | _(May be omitted)_ The transaction cost of this transaction, relative to the minimum cost for this type of transaction, in [fee levels][]. | | `max_spend_drops` | String | _(May be omitted)_ The maximum amount of [XRP, in drops][], this transaction could potentially send or destroy. | diff --git a/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.ja.md b/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.ja.md index 456314d027..78f6a7a3ee 100644 --- a/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.ja.md +++ b/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.ja.md @@ -185,7 +185,7 @@ rippled ledger current | `retries_remaining` | 数値 | このトランザクションの再試行可能回数。この回数を超えるとトランザクションが除外されます。 | | `preflight_result` | 文字列 | 初期トランザクションチェックの一時的な結果。これは常に`tesSUCCESS`です。 | | `last_result` | 文字列 | _(省略される場合があります)_[再試行可能な (`ter`) の結果](ter-codes.html)を取得した後でこのトランザクションがキューに残っている場合、これは取得した正確な`ter`結果コードです。 | -| `auth_change` | ブール値 | _(省略される場合があります)_ このトランザクションがこのアドレスの[トランザクション承認方法](transaction-basics.html#トランザクションの承認)を変更するかどうかを示します。 | +| `auth_change` | ブール値 | _(省略される場合があります)_ このトランザクションがこのアドレスの[トランザクション承認方法](transactions.html#トランザクションの承認)を変更するかどうかを示します。 | | `fee` | 文字列 | _(省略される場合があります)_ このトランザクションの[トランザクションコスト](transaction-cost.html)([XRPのdrop数][])。 | | `fee_level` | 文字列 | _(省略される場合があります)_ このタイプのトランザクションの最少コストと比較した、このトランザクションのトランザクションコスト([手数料レベル][])。 | | `max_spend_drops` | 文字列 | _(省略される場合があります)_ このトランザクションで送信または消却できる[XRP、drop単位][]の最高額。 | diff --git a/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md b/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md index 8140d138f9..f47b2142f8 100644 --- a/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md +++ b/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md @@ -222,7 +222,7 @@ Each member of the `queue_data` array represents one transaction in the queue. S | `retries_remaining` | Number | How many times this transaction can be retried before being dropped. | | `preflight_result` | String | The tentative result from preliminary transaction checking. This is always `tesSUCCESS`. | | `last_result` | String | _(May be omitted)_ If this transaction was left in the queue after getting a [retriable (`ter`) result](ter-codes.html), this is the exact `ter` result code it got. | -| `auth_change` | Boolean | _(May be omitted)_ Whether this transaction changes this address's [ways of authorizing transactions](transaction-basics.html#authorizing-transactions). | +| `auth_change` | Boolean | _(May be omitted)_ Whether this transaction changes this address's [ways of authorizing transactions](transactions.html#authorizing-transactions). | | `fee` | String | _(May be omitted)_ The [Transaction Cost](transaction-cost.html) of this transaction, in [drops of XRP][]. | | `fee_level` | String | _(May be omitted)_ The transaction cost of this transaction, relative to the minimum cost for this type of transaction, in [fee levels][]. | | `max_spend_drops` | String | _(May be omitted)_ The maximum amount of [XRP, in drops][], this transaction could potentially send or destroy. | diff --git a/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md b/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md index 518d0164e0..1d34b98a3a 100644 --- a/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md +++ b/content/references/http-websocket-apis/public-api-methods/ledger-methods/ledger_entry.md @@ -206,9 +206,9 @@ Retrieve an [Offer object](offer.html), which defines an offer to exchange curre | Field | Type | Description | |:------------------------|:---------------------------|:----------------------| -| `offer` | Object or String | The [Offer object](offer.html) to retrieve. If a string, interpret as the [unique object ID](ledgers.html#tree-format) to the Offer. If an object, requires the sub-fields `account` and `seq` to uniquely identify the offer. | +| `offer` | Object or String | The [Offer object](offer.html) to retrieve. If a string, interpret as the Offer's [ledger entry ID](ledger-object-ids.html). If an object, requires the sub-fields `account` and `seq` to uniquely identify the offer. | | `offer.account` | String - [Address][] | _(Required if `offer` is specified as an object)_ The account that placed the offer. | -| `offer.seq` | Unsigned Integer | _(Required if `offer` is specified as an object)_ The [Sequence Number][] of the transaction that created the Offer object. | +| `offer.seq` | Unsigned Integer | _(Required if `offer` is specified as an object)_ The [Sequence Number][] of the transaction that created the Offer entry. | diff --git a/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.ja.md b/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.ja.md index 4a5fd4e47e..18f7f177c8 100644 --- a/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.ja.md +++ b/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.ja.md @@ -70,7 +70,7 @@ rippled channel_authorize s█████████████████ 要求では、`secret`、`seed`、`seed_hex`、`passphrase`のうち1つだけを指定する**必要があります**。 -**警告:** 信頼できないサーバーに対して、またはセキュリティが確保されていないネットワーク接続を通じて秘密鍵を送信しないでください。(これには、この要求の`secret`、`seed`、`seed_hex`、または`passphrase`フィールドも含まれます)このメソッドは、自身が実行するサーバー、または資金を預けている十分に信頼できるサーバーへの、安全で暗号化されたネットワーク接続でのみ使用してください。そうでない場合、盗聴者があなたの秘密鍵を使用してクレームに署名し、同じキーペアを使用してこのPayment Channelなどから資金をすべて持ち出す可能性があります。手順については、[安全な署名の設定](set-up-secure-signing.html)を参照してください。 +**警告:** 信頼できないサーバーに対して、またはセキュリティが確保されていないネットワーク接続を通じて秘密鍵を送信しないでください。(これには、この要求の`secret`、`seed`、`seed_hex`、または`passphrase`フィールドも含まれます)このメソッドは、自身が実行するサーバー、または資金を預けている十分に信頼できるサーバーへの、安全で暗号化されたネットワーク接続でのみ使用してください。そうでない場合、盗聴者があなたの秘密鍵を使用してクレームに署名し、同じキーペアを使用してこのPayment Channelなどから資金をすべて持ち出す可能性があります。手順については、[安全な署名の設定](secure-signing.html)を参照してください。 ## 応答フォーマット diff --git a/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.md b/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.md index da62821bcb..7064d26040 100644 --- a/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.md +++ b/content/references/http-websocket-apis/public-api-methods/payment-channel-methods/channel_authorize.md @@ -70,7 +70,7 @@ The request includes the following parameters: The request **must** specify exactly one of `secret`, `seed`, `seed_hex`, or `passphrase`. -**Warning:** Do not send secret keys to untrusted servers or through unsecured network connections. (This includes the `secret`, `seed`, `seed_hex`, or `passphrase` fields of this request.) You should only use this method on a secure, encrypted network connection to a server you run or fully trust with your funds. Otherwise, eavesdroppers could use your secret key to sign claims and take all the money from this payment channel and anything else using the same key pair. See [Set Up Secure Signing](set-up-secure-signing.html) for instructions. +**Warning:** Do not send secret keys to untrusted servers or through unsecured network connections. (This includes the `secret`, `seed`, `seed_hex`, or `passphrase` fields of this request.) You should only use this method on a secure, encrypted network connection to a server you run or fully trust with your funds. Otherwise, eavesdroppers could use your secret key to sign claims and take all the money from this payment channel and anything else using the same key pair. See [Set Up Secure Signing](secure-signing.html) for instructions. ## Response Format diff --git a/content/references/http-websocket-apis/public-api-methods/transaction-methods/tx.md b/content/references/http-websocket-apis/public-api-methods/transaction-methods/tx.md index f27566edca..34e912c84f 100644 --- a/content/references/http-websocket-apis/public-api-methods/transaction-methods/tx.md +++ b/content/references/http-websocket-apis/public-api-methods/transaction-methods/tx.md @@ -442,7 +442,7 @@ The response follows the [standard format][], with a successful result containin | `Field` | Type | Description | |:---------------|:---------------------------------|:-------------------------| -| `date` | Number | A [number of seconds](basic-data-types.html#specifying-time) since January 1, 2000 (00:00 UTC) indicating the [close time](ledgers.html#ledger-close-times) of the ledger in which the transaction was applied. This value does not have a precise relationship with physical time, and is dependent on the close time resolution. | +| `date` | Number | A [number of seconds](basic-data-types.html#specifying-time) since January 1, 2000 (00:00 UTC) indicating the [close time](ledger-close-times.html) of the ledger in which the transaction was applied. This value does not have a precise relationship with physical time, and is dependent on the close time resolution. | | `hash` | String | The SHA-512 hash of the transaction | | `inLedger` | Number | _(Deprecated)_ Alias for `ledger_index`. | | `ledger_index` | Number | The [ledger index][] of the ledger that includes this transaction. | diff --git a/content/references/protocol-reference/data-types/base58-encodings.md b/content/references/protocol-reference/data-types/base58-encodings.md index 88de323abf..f01ab201b2 100644 --- a/content/references/protocol-reference/data-types/base58-encodings.md +++ b/content/references/protocol-reference/data-types/base58-encodings.md @@ -5,7 +5,7 @@ blurb: Formats for representing cryptographic keys and related data in base58 fo --- # base58 Encodings -XRP Ledger APIs often use a "base58" encoding with a checksum (sometimes called "Base58Check") to represent [account addresses](accounts.html#addresses) and other types of values related to cryptographic keys. This encoding is the same as [the one used for Bitcoin addresses](https://en.bitcoin.it/wiki/Base58Check_encoding), except that the XRP Ledger uses the following dictionary: `rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz`. +XRP Ledger APIs often use a "base58" encoding with a checksum (sometimes called "Base58Check") to represent [account addresses](addresses.html) and other types of values related to cryptographic keys. This encoding is the same as [the one used for Bitcoin addresses](https://en.bitcoin.it/wiki/Base58Check_encoding), except that the XRP Ledger uses the following dictionary: `rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz`. The XRP Ledger prefixes different types of values with a specific 8-bit number before encoding them to distinguish between different data types. With the arrangement of characters in the XRP Ledger's base58 dictionary, the result is that the base58 representations for different types of encoded values start with specific letters by type. @@ -24,7 +24,7 @@ The following table lists all the encodings the XRP Ledger uses: ## See Also -- [Address Encoding](accounts.html#address-encoding) - detailed information on address encoding +- [Address Encoding](addresses.html#address-encoding) - detailed information on address encoding - [Cryptographic Keys](cryptographic-keys.html) - types of cryptographic keys in the XRP Ledger and how they're used - [wallet_propose Reference][wallet_propose method] - API method for generating account keys - [validation_create Reference][validation_create method] - API method for generating validator keys diff --git a/content/references/protocol-reference/data-types/basic-data-types.md b/content/references/protocol-reference/data-types/basic-data-types.md index 719c6b9040..e735bac6ac 100644 --- a/content/references/protocol-reference/data-types/basic-data-types.md +++ b/content/references/protocol-reference/data-types/basic-data-types.md @@ -82,7 +82,7 @@ Many API methods require you to specify an instance of the ledger, with the data 3. Specify a ledger by one of the following shortcuts, in the `ledger_index` parameter: - * `validated` for the most recent ledger that has been [validated by consensus](consensus.html#validation) + * `validated` for the most recent ledger that has been [validated by consensus](consensus-structure.html#validation) "ledger_index": "validated" diff --git a/content/references/protocol-reference/data-types/currency-formats.ja.md b/content/references/protocol-reference/data-types/currency-formats.ja.md index df462d489f..74d4aa63c5 100644 --- a/content/references/protocol-reference/data-types/currency-formats.ja.md +++ b/content/references/protocol-reference/data-types/currency-formats.ja.md @@ -8,7 +8,7 @@ labels: --- # 通貨フォーマット -XRP Ledgerには2種類の通貨([XRP](xrp.html)と[発行済み通貨](issued-currencies.html))があります。XRP Ledgerでは、これらの通貨のフォーマットは異なりますが、いずれの通貨も高精度です。 +XRP Ledgerには2種類の通貨 XRP と[発行済み通貨](issued-currencies.html))があります。XRP Ledgerでは、これらの通貨のフォーマットは異なりますが、いずれの通貨も高精度です。 ## 文字列フォーマット diff --git a/content/references/protocol-reference/data-types/currency-formats.md b/content/references/protocol-reference/data-types/currency-formats.md index bd5bc81912..aa8aa9ffb8 100644 --- a/content/references/protocol-reference/data-types/currency-formats.md +++ b/content/references/protocol-reference/data-types/currency-formats.md @@ -8,7 +8,7 @@ label: --- # Currency Formats -The XRP Ledger has two kinds of digital asset: [XRP](xrp.html) and [tokens](tokens.html). Both types have high precision, although their formats are different. +The XRP Ledger has two kinds of digital asset: XRP and [tokens](tokens.html). Both types have high precision, although their formats are different. ## Comparison @@ -27,7 +27,7 @@ The following table summarizes some of the differences between XRP and tokens in | No transfer fees; XRP-to-XRP payments are always direct. | Can take indirect [paths](paths.html) with each issuer charging a percentage [transfer fee](transfer-fees.html). | | Can be used in [Payment Channels](payment-channels.html) and [Escrow](escrow.html). | Not compatible with Payment Channels or Escrow. | -For more information, see [XRP](xrp.html) and [Tokens](tokens.html). +For more information, see [What is XRP?](what-is-xrp.html) and [Tokens](tokens.html). ## Specifying Currency Amounts diff --git a/content/references/protocol-reference/data-types/nftoken.ja.md b/content/references/protocol-reference/data-types/nftoken.ja.md index 1bc4c4037e..9479088b9c 100644 --- a/content/references/protocol-reference/data-types/nftoken.ja.md +++ b/content/references/protocol-reference/data-types/nftoken.ja.md @@ -132,6 +132,6 @@ https://example.com/.well-known/xrpl-nft/{tokenid} `NFTokenMint`トランザクションを使用して`NFTtoken`を作成します。`NFTokenBurn`トランザクションを使用して`NFToken`を破棄することもできます。 -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} {% include '_snippets/rippled_versions.md' %} diff --git a/content/references/protocol-reference/ledger-data/ledger-header.md b/content/references/protocol-reference/ledger-data/ledger-header.md index 67291e9907..ee5b9ceda2 100644 --- a/content/references/protocol-reference/ledger-data/ledger-header.md +++ b/content/references/protocol-reference/ledger-data/ledger-header.md @@ -32,7 +32,7 @@ Every [ledger version](ledgers.html) has a unique header that describes the cont ## Close Flags -The ledger has only one flag defined for `closeFlags`: **`sLCF_NoConsensusTime`** (value `1`). If this flag is enabled, it means that validators had different [close times for the ledger](ledgers.html#ledger-close-times), but built otherwise the same ledger, so they declared consensus while "agreeing to disagree" on the close time. In this case, official `close_time` value of the ledger is 1 second after that of the parent ledger. +The ledger has only one flag defined for `closeFlags`: **`sLCF_NoConsensusTime`** (value `1`). If this flag is enabled, it means that validators had different [close times for the ledger](ledger-close-times.html), but built otherwise the same ledger, so they declared consensus while "agreeing to disagree" on the close time. In this case, official `close_time` value of the ledger is 1 second after that of the parent ledger. The `closeFlags` field is not included in any JSON representations of a ledger, but is included in the binary representation of a ledger, and is one of the fields that determine the ledger's hash. diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/directorynode.md b/content/references/protocol-reference/ledger-data/ledger-object-types/directorynode.md index 418797d72b..ce7aac4f75 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/directorynode.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/directorynode.md @@ -9,11 +9,11 @@ labels: # DirectoryNode [[Source]](https://github.com/ripple/rippled/blob/5d2d88209f1732a0f8d592012094e345cbe3e675/src/ripple/protocol/impl/LedgerFormats.cpp#L44 "Source") -The `DirectoryNode` object type provides a list of links to other objects in the ledger's state tree. A single conceptual _Directory_ takes the form of a doubly linked list, with one or more DirectoryNode objects each containing up to 32 [IDs](ledgers.html#tree-format) of other objects. The first object is called the root of the directory, and all objects other than the root object can be added or deleted as necessary. +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](ledger-object-ids.html). 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: -* **Owner directories** list other objects owned by an account, such as [`RippleState` (trust line)](ripplestate.html) or [`Offer`](offer.html) objects. +* **Owner directories** list other entries owned by an account, such as [`RippleState` (trust line)](ripplestate.html) or [`Offer`](offer.html) entries. * **Offer directories** list the offers available in the [decentralized exchange](decentralized-exchange.html). A single Offer directory contains all the offers that have the same exchange rate for the same token (currency code and issuer). ## Example {{currentpage.name}} JSON @@ -61,7 +61,7 @@ There are two kinds of Directories: | 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. | diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/ledgerhashes.md b/content/references/protocol-reference/ledger-data/ledger-object-types/ledgerhashes.md index 9068aba388..dde0e7fafb 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/ledgerhashes.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/ledgerhashes.md @@ -10,7 +10,7 @@ labels: (Not to be confused with the ["ledger hash" string data type][Hash], which uniquely identifies a ledger version. This section describes the `LedgerHashes` ledger object type.) -The `LedgerHashes` object type contains a history of prior ledgers that led up to this ledger version, in the form of their hashes. Objects of this ledger type are modified automatically when closing a ledger. (This is one of the only times a ledger's state data is modified without a [transaction](transaction-basics.html) or [pseudo-transaction](pseudo-transaction-types.html).) The `LedgerHashes` objects exist to make it possible to look up a previous ledger's hash with only the current ledger version and at most one lookup of a previous ledger version. +The `LedgerHashes` object type contains a history of prior ledgers that led up to this ledger version, in the form of their hashes. Objects of this ledger type are modified automatically when closing a ledger. (This is one of the only times a ledger's state data is modified without a [transaction](transactions.html) or [pseudo-transaction](pseudo-transaction-types.html).) The `LedgerHashes` objects exist to make it possible to look up a previous ledger's hash with only the current ledger version and at most one lookup of a previous ledger version. There are two kinds of `LedgerHashes` object. Both types have the same fields. Each ledger version contains: diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenoffer.ja.md b/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenoffer.ja.md index 4d2f429375..5b2b0bf597 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenoffer.ja.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenoffer.ja.md @@ -7,34 +7,40 @@ labels: --- # NFTokenOffer -`lsfTransferable` フラグが設定されているトークンは、オファーを使って 参加者間で転送することができます。`NFTokenOffer` オブジェクトは `NFToken` オブジェクトの購入、売却、または譲渡のオファーを表します。`NFToken` の所有者は `NFTokenCreateOffer` を使用して売買を行うことができます。 +`lsfTransferable`フラグが設定されているトークンは、オファーを使って参加者間で転送することができます。`NFTokenOffer`オブジェクトは`NFToken`オブジェクトの購入、売却、または譲渡のオファーを表します。`NFToken`の所有者は`NFTokenCreateOffer`を使用して売買を行うことができます。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ +## {{currentpage.name}} JSONの例 -### `NFTokenOfferID`のフォーマット - -`NFTokenOffer` オブジェクトのユニーク ID (`NFTokenOfferID`) は、以下の値を順番に結合したものである。 - - - -* `NFTokenOffer` のスペースキー、`0x0074` -* オファーを出すアカウントの `AccountID` -* `NFTokenCreateOffer` トランザクションが生成する `Sequence` (または `Ticket`) +```json +{ + "Amount": "1000000", + "Flags": 1, + "LedgerEntryType": "NFTokenOffer", + "NFTokenID": "00081B5825A08C22787716FA031B432EBBC1B101BB54875F0002D2A400000000", + "NFTokenOfferNode": "0", + "Owner": "rhRxL3MNvuKEjWjL7TBbZSDacb8PmzAd7m", + "OwnerNode": "17", + "PreviousTxnID": "BFA9BE27383FA315651E26FDE1FA30815C5A5D0544EE10EC33D3E92532993769", + "PreviousTxnLgrSeq": 75443565, + "index": "AEBABA4FAC212BF28E0F9A9C3788A47B085557EC5D1429E7A8266FB859C863B3" +} +``` ### `NFTokenOffer`のフィールド | 名前 | JSONの型 | [内部の型][] | 必須? | 説明 | |:--------------------|:------------|:------------------|:------|:-----------| -| `Amount` | [通貨額][] | AMOUNT | はい | NFTokenに対して見込まれる、または提示される金額です。トークンに `lsfOnlyXRP` フラグが設定されている場合、金額は XRP で指定する必要があります。XRP 以外の資産を指定する売却オファーは、0 以外の金額を指定する必要があります。XRP を指定する売却オファーは、`無料`にすることができます(つまり、このフィールドは `"0"` とすることができます)。 | +| `Amount` | [通貨額][] | AMOUNT | はい | NFTokenに対して見込まれる、または提示される金額です。トークンに`lsfOnlyXRP`フラグが設定されている場合、金額はXRPで指定する必要があります。XRP以外の資産を指定する売却オファーは、0以外の金額を指定する必要があります。XRPを指定する売却オファーは、`無料`にすることができます(つまり、このフィールドは`"0"`とすることができます)。 | | `Destination` | 文字列 | AccountID | いいえ | このオファーの対象となるAccountID。存在する場合、そのアカウントのみがオファーを受け入れることができます。 | | `Expiration` | 数値 | UInt32 | いいえ | オファーが有効でなくなる時刻。値は、リップルエポックからの秒数です。 | | `Flags` | 数値 | UInt32 | はい | このオブジェクトに関連付けられたフラグのセットで、様々なオプションや設定を指定するために使用されます。フラグは、以下の表に示すとおりです。 | | `LedgerEntryType` | 文字列 | UInt16 | はい | レジャーオブジェクトの種類を示します(0x0074)。 | -| `NFTokenID` | 文字列 | Hash256 | はい | このオファーが参照する NFToken オブジェクトの NFTokenID。 | +| `NFTokenID` | 文字列 | Hash256 | はい | このオファーが参照するNFTokenオブジェクトのNFTokenID。 | | `NFTokenOfferNode` | 文字列 | UInt64 | いいえ | トークン購入または売却のオファーディレクトリの中で、このトークンが記録されている内部的な台帳です。このフィールドを使用することで、オファーを効率的に削除することができます。 | -| `Owner` | 文字列 | AccountID | はい | オファーの作成者であり、所有者であるアカウント。NFToken の現在の所有者のみが NFToken の売却オファーを作成できますが、NFToken の購入オファーはどのアカウントでも作成できます。 | +| `Owner` | 文字列 | AccountID | はい | オファーの作成者であり、所有者であるアカウント。NFTokenの現在の所有者のみがNFTokenの売却オファーを作成できますが、NFTokenの購入オファーはどのアカウントでも作成できます。 | | `OwnerNode` | 文字列 | UInt64 | いいえ | このトークンが記録されているオーナーディレクトリ内のページを示す、内部的な台帳です。このフィールドを使用することで、オファーを効率的に削除することができます。 | | `PreviousTxnID` | 文字列 | Hash256 | はい | このオブジェクトを最も最近更新したトランザクションの識別ハッシュ。 | | `PreviousTxnLgrSeq` | 数値 | UInt32 | はい | このオブジェクトを最も最近更新したトランザクションを含むレジャーのインデックス。 | @@ -43,39 +49,38 @@ _([NonFungibleTokensV1_1 amendment][]が必要です)_ #### NFTokenOffer フラグ +|フラグ名 |16進数値 |10進数値|説明 | +|------------------|--------------|------|---------| +| `lsfSellNFToken `| `0x00000001` | 1 | 有効な場合、オファーは売却オファーとなります。そうでない場合、オファーは購入オファーとなります。 | -|フラグ名|フラグ値|説明| -|---|---|---| -| `lsfSellNFToken `| `0x00000001` | 有効な場合、オファーは売却オファーとなります。そうでない場合、オファーは購入オファーとなります。 | +## `NFTokenOffer`トランザクション -## `NFTokenOffer` トランザクション +[代替可能トークンに対するOffer](offers.html)とは異なり、`NFTokenOffer`はオーダーブックに保存されず、自動的にマッチングされたり約定されたりすることはありません。買い手は売り手により提示されてた`NFTokenOffer`の受け入れを明示的に選択する必要があります。同様に、売り手は自分が所有する`NFToken`オブジェクトを買いたいと申し出た買い手の`NFTokenOffer`を受け入れることを明示的に選択しなければなりません。 -XRPL上のトークン・オファーは、オーダーブックに品質順に保存され、オンレジャーのメカニズムによって自動的にマッチングされます。`NFTokenOffer`はオーダーブックに保存されず、自動的にマッチングされたり実行されたりすることはありません。 +`NFToken`の取引のためのトランザクションは3つあります。 -購入者は `NFToken` の購入を申し出る `NFTokenOffer` を受け入れるかどうかを明示的に選択しなければなりません。同様に、販売者は自分が所有する `NFToken` オブジェクトの購入を申し出る特定の `NFTokenOffer` を受け入れることを明示的に選択する必要があります。 +- [NFTokenCreateOffer][] +- [NFTokenCancelOffer][] +- [NFTokenAcceptOffer][] -定義されたトランザクションは3つあります。 +### `NFTokenOffer`オブジェクトの検索 + +各`NFToken`は、2つの[ディレクトリ](directorynode.html)があります。1つはトークンを購入するためのオファー、もう1つはトークンを売却するためのオファーが含まれています。マーケットプレイスやその他のクライアントアプリケーションは、ユーザに対し`NFToken`オブジェクトの取引オファーを提示したり、自動的にマッチングすることができます。 +### `NFTokenOffer`の準備金 -1. `NFTokenCreateOffer` +各`NFTokenOffer`オブジェクトは、オファーを出すアカウントに1つ分の準備金の増額を要求します。執筆時点では、準備金の増分は2XRPです。この準備金は、オファーをキャンセルすることで取り戻すことができます。 -2. `NFTokenCancelOffer` +### `NFTokenOfferID`のフォーマット +`NFTokenOffer`オブジェクトのユニークID(`NFTokenOfferID`)は、以下の値を順番に結合したものです。 -3. `NFTokenAcceptOffer` - - -### `NFTokenOffer` オブジェクトの検索 - -各トークンには、2つのディレクトリがあります。1 つはトークンを購入するためのオファー、もう 1 つはトークンを売却するためのオファーが含まれています。これにより、特定のトークンの `NFTokenOffer` を簡単に見つけることができます。オフレッジャー システムが、オファーの取得、提示、通知、作成、照会、承認、キャンセルに使用されることが予想されます。たとえば、マーケットプレイスは、ウェブやアプリベースの直感的なインターフェースをユーザに提供することができます。 - - -### `NFTokenOffer` の準備金 - -各NFTokenOfferオブジェクトは、オファーを出すアカウントに準備金の増額を1つ要求します。この記事の執筆時点では、準備金の増分は2 XRPです。この準備金は、オファーをキャンセルすることで 取り戻すことができます。 +* `NFTokenOffer`のスペースキー、`0x0074` +* オファーを出すアカウントの`AccountID` +* `NFTokenCreateOffer`トランザクションが生成する`NFTokenCreateOffer`の`Sequence`(または`Ticket`) diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenpage.ja.md b/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenpage.ja.md index 5289b16a7f..0eef68660e 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenpage.ja.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/nftokenpage.ja.md @@ -9,7 +9,7 @@ labels: `NFTokenPage` オブジェクトは、同じアカウントが所有する `NFToken` オブジェクトのコレクションを表します。一つのアカウントは複数の `NFTokenPage` 型のレジャーオブジェクトを持つことができ、それらは双方向リストを形成します。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## {{currentpage.name}} JSONの例 diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/ripplestate.md b/content/references/protocol-reference/ledger-data/ledger-object-types/ripplestate.md index b57786a84c..6009dbb644 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/ripplestate.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/ripplestate.md @@ -12,7 +12,7 @@ The `RippleState` object type connects two accounts in a single currency. Concep ## High vs. Low Account -There can only be one `RippleState` object per currency for any given pair of accounts. Since no account is privileged in the XRP Ledger, a `RippleState` object sorts account addresses numerically, to ensure a canonical form. Whichever address is numerically lower when [decoded](accounts.html#address-encoding) is deemed the "low account" and the other is the "high account". The net balance of the trust line is stored from the low account's perspective. +There can only be one `RippleState` object per currency for any given pair of accounts. Since no account is privileged in the XRP Ledger, a `RippleState` object sorts account addresses numerically, to ensure a canonical form. Whichever address is numerically lower when [decoded](addresses.html#address-encoding) is deemed the "low account" and the other is the "high account". The net balance of the trust line is stored from the low account's perspective. The ["issuer"](trust-lines-and-issuing.html) for the balance in a trust line depends on whether the balance is positive or negative. If a `RippleState` object shows a positive balance, the high account is the issuer. If the balance is negative, the low account is the issuer. Often, the issuer has its limit set to 0 and the other account has a positive limit, but this is not reliable because limits can change without affecting an existing balance. @@ -52,7 +52,7 @@ A `RippleState` object has the following fields: | Name | JSON Type | Internal Type | Required? | Description | |:--------------------|:----------|:--------------|:----------|:------------| -| `Balance` | Object | Amount | Yes | The balance of the trust line, from the perspective of the low account. A negative balance indicates that the high account holds tokens issued by the low account. The issuer in this is always set to the neutral value [ACCOUNT_ONE](accounts.html#special-addresses). | +| `Balance` | Object | Amount | Yes | The balance of the trust line, from the perspective of the low account. A negative balance indicates that the high account holds tokens issued by the low account. The issuer in this is always set to the neutral value [ACCOUNT_ONE](addresses.html#special-addresses). | | `Flags` | Number | UInt32 | Yes | A bit-map of boolean options enabled for this object. | | `HighLimit` | Object | Amount | Yes | The limit that the high account has set on the trust line. The `issuer` is the address of the high account that set this limit. | | `HighNode` | String | UInt64 | Yes | (Omitted in some historical ledgers) A hint indicating which page of the high account's owner directory links to this object, in case the directory consists of multiple pages. | diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.ja.md b/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.ja.md index dd555262de..bd6400a2c8 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.ja.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.ja.md @@ -37,7 +37,7 @@ _([TicketBatch amendment][]が必要です)_ | `Account` | 文字列 | AccountID | このチケットを所有する[アカウント](accounts.html)です。 | | `Flags` | Number | UInt32 | ブール値フラグのビットマップ。Ticketにはフラグが定義されていないため、この値は常に0です。 | | `OwnerNode` | 文字列 | UInt64 | 送金元の所有者ディレクトリが複数ページで構成されている場合に、このオブジェクトにリンクしているページを示すヒントです。注記: このオブジェクトには、オブジェクトを含む所有者ディレクトリへの直接リンクは含まれていません。これは、その値を`Account`から取得できるためです。 | -| `PreviousTxnID` | 文字列 | Hash256 | 最後にこのオブジェクトを変更した[トランザクション](transaction-basics.html)の識別用ハッシュ。 | +| `PreviousTxnID` | 文字列 | Hash256 | 最後にこのオブジェクトを変更した[トランザクション](transactions.html)の識別用ハッシュ。 | | `PreviousTxnLgrSeq` | 数値 | UInt32 | 最後にこのオブジェクトを変更したトランザクションを含む[レジャーインデックス][Ledger Index]。 | | `TicketSequence` | 数値 | UInt32 | 本チケットが設定する[シーケンス番号][]。 | diff --git a/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.md b/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.md index e1fe79de63..75b403e5c5 100644 --- a/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.md +++ b/content/references/protocol-reference/ledger-data/ledger-object-types/ticket.md @@ -37,7 +37,7 @@ A `Ticket` object has the following fields: | `Flags` | Number | UInt32 | Yes | A bit-map of boolean flags enabled for this object. Currently, the protocol defines no flags for `Ticket` objects. The value is always `0`. | | `LedgerEntryType` | String | UInt16 | Yes | The value `0x0054`, mapped to the string `Ticket`, indicates that this object is a {{currentpage.name}} object. | | `OwnerNode` | String | UInt64 | Yes | A hint indicating which page of the owner directory links to this object, in case the directory consists of multiple pages. **Note:** The object does not contain a direct link to the owner directory containing it, since that value can be derived from the `Account`. | -| `PreviousTxnID` | String | Hash256 | Yes | The identifying hash of the [transaction](transaction-basics.html) that most recently modified this object. | +| `PreviousTxnID` | String | Hash256 | Yes | The identifying hash of the [transaction](transactions.html) that most recently modified this object. | | `PreviousTxnLgrSeq` | Number | UInt32 | Yes | The [index of the ledger][Ledger Index] that contains the transaction that most recently modified this object. | | `TicketSequence` | Number | UInt32 | Yes | The [Sequence Number][] this Ticket sets aside. | diff --git a/content/references/protocol-reference/serialization.md b/content/references/protocol-reference/serialization.md index c137f87115..b714dd0e16 100644 --- a/content/references/protocol-reference/serialization.md +++ b/content/references/protocol-reference/serialization.md @@ -209,7 +209,7 @@ In addition to all of the above field types, the following types may appear in o ### AccountID Fields [AccountID]: #accountid-fields -Fields of this type contain the 160-bit identifier for an XRP Ledger [account](accounts.html). In JSON, these fields are represented as [base58][] XRP Ledger "addresses", with additional checksum data so that typos are unlikely to result in valid addresses. (This encoding, sometimes called "Base58Check", prevents accidentally sending money to the wrong address.) The binary format for these fields does not contain any checksum data nor does it include the `0x00` "type prefix" used in [address base58 encoding](accounts.html#address-encoding). (However, since the binary format is used mostly for signed transactions, a typo or other error in transcribing a signed transaction would invalidate the signature, preventing it from sending money.) +Fields of this type contain the 160-bit identifier for an XRP Ledger [account](accounts.html). In JSON, these fields are represented as [base58][] XRP Ledger "addresses", with additional checksum data so that typos are unlikely to result in valid addresses. (This encoding, sometimes called "Base58Check", prevents accidentally sending money to the wrong address.) The binary format for these fields does not contain any checksum data nor does it include the `0x00` "type prefix" used in [address base58 encoding](addresses.html#address-encoding). (However, since the binary format is used mostly for signed transactions, a typo or other error in transcribing a signed transaction would invalidate the signature, preventing it from sending money.) AccountIDs that appear as stand-alone fields (such as `Account` and `Destination`) are [length-prefixed](#length-prefixing) despite being a fixed 160 bits in length. As a result, the length indicator for these fields is always the byte `0x14`. AccountIDs that appear as children of special fields ([Amount `issuer`][Amount] and [PathSet `account`][PathSet]) are _not_ length-prefixed. @@ -229,7 +229,7 @@ The "Amount" type is a special field type that represents an amount of currency, 1. 64 bits indicating the amount in the [token amount format](#token-amount-format). The first bit is `1` to indicate that this is not XRP. 2. 160 bits indicating the [currency code](currency-formats.html#currency-codes). The standard API converts 3-character codes such as "USD" into 160-bit codes using the [standard currency code format](currency-formats.html#standard-currency-codes), but custom 160-bit codes are also possible. - 3. 160 bits indicating the issuer's Account ID. (See also: [Account Address Encoding](accounts.html#address-encoding)) + 3. 160 bits indicating the issuer's Account ID. (See also: [Account Address Encoding](addresses.html#address-encoding)) You can tell which of the two sub-types it is based on the first bit: `0` for XRP; `1` for tokens. diff --git a/content/references/protocol-reference/transactions/pseudo-transaction-types/pseudo-transaction-types.md b/content/references/protocol-reference/transactions/pseudo-transaction-types/pseudo-transaction-types.md index 9ef2fcbf4f..51013248ca 100644 --- a/content/references/protocol-reference/transactions/pseudo-transaction-types/pseudo-transaction-types.md +++ b/content/references/protocol-reference/transactions/pseudo-transaction-types/pseudo-transaction-types.md @@ -16,7 +16,7 @@ Some of the required [common fields][] for normal transactions do not make sense | Field | JSON Type | [Internal Type][] | Value | |:----------------|:----------|:------------------|:---------------------------| -| `Account` | String | AccountID | [ACCOUNT_ZERO](accounts.html#special-addresses) | +| `Account` | String | AccountID | [ACCOUNT_ZERO](addresses.html#special-addresses) | | `Fee` | String | Amount | `0` | | `Sequence` | Number | UInt32 | `0` | | `SigningPubKey` | String | Blob | `""` (Empty string) | diff --git a/content/references/protocol-reference/transactions/transaction-metadata.md b/content/references/protocol-reference/transactions/transaction-metadata.md index 99718822e6..fae83f3b46 100644 --- a/content/references/protocol-reference/transactions/transaction-metadata.md +++ b/content/references/protocol-reference/transactions/transaction-metadata.md @@ -25,13 +25,13 @@ The following JSON object shows the metadata for [a complex cross-currency payme ## AffectedNodes -The `AffectedNodes` array contains a complete list of the [objects in the ledger](ledger-object-types.html) that this transaction modified in some way. Each entry in this array is an object with one top-level field indicating what type it is: +The `AffectedNodes` array contains a complete list of the [ledger entries](ledger-object-types.html) that this transaction modified in some way. Each item in this array is an object with one top-level field indicating what happened: -- `CreatedNode` indicates that the transaction created a new object in the ledger. -- `DeletedNode` indicates that the transaction removed an object from the ledger. -- `ModifiedNode` indicates that the transaction modified an existing object in the ledger. +- `CreatedNode` indicates that the transaction created a new ledger entry. +- `DeletedNode` indicates that the transaction removed a ledger entry +- `ModifiedNode` indicates that the transaction modified an existing ledger entry. -The value of each of these fields is a JSON object describing the changes made to the ledger object. +The value of each of these fields is a JSON object describing the changes made to the ledger entry. ### CreatedNode Fields @@ -39,9 +39,9 @@ A `CreatedNode` object contains the following fields: | Field | Value | Description | |:------------------|:------------------|:-------------------------------------| -| `LedgerEntryType` | String | The [type of ledger object](ledger-object-types.html) that was created. | -| `LedgerIndex` | String - [Hash][] | The [ID of this ledger object](ledger-object-ids.html) in the ledger's [state tree](ledgers.html). **Note:** This is **not the same** as a [ledger index](basic-data-types.html#ledger-index), even though the field name is very similar. | -| `NewFields` | Object | The content fields of the newly-created ledger object. Which fields are present depends on what type of ledger object was created. | +| `LedgerEntryType` | String | The [type of ledger entry](ledger-object-types.html) that was created. | +| `LedgerIndex` | String - [Hash][] | The [ID of this ledger entry](ledger-object-ids.html) in the ledger's [state tree](ledgers.html). **Note:** This is **not the same** as a [ledger index](basic-data-types.html#ledger-index), even though the field name is very similar. | +| `NewFields` | Object | The content fields of the newly-created ledger entry. Which fields are present depends on what type of ledger entry was created. | ### DeletedNode Fields @@ -49,9 +49,9 @@ A `DeletedNode` object contains the following fields: | Field | Value | Description | |:------------------|:------------------|:-------------------------------------| -| `LedgerEntryType` | String | The [type of ledger object](ledger-object-types.html) that was deleted. | -| `LedgerIndex` | String - [Hash][] | The [ID of this ledger object](ledger-object-ids.html) in the ledger's [state tree](ledgers.html). **Note:** This is **not the same** as a [ledger index](basic-data-types.html#ledger-index), even though the field name is very similar. | -| `FinalFields` | Object | The content fields of the ledger object immediately before it was deleted. Which fields are present depends on what type of ledger object was created. | +| `LedgerEntryType` | String | The [type of ledger entry](ledger-object-types.html) that was deleted. | +| `LedgerIndex` | String - [Hash][] | The [ID of this ledger entry](ledger-object-ids.html) in the ledger's [state tree](ledgers.html). **Note:** This is **not the same** as a [ledger index](basic-data-types.html#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. | ### ModifiedNode Fields @@ -59,14 +59,14 @@ A `ModifiedNode` object contains the following fields: | Field | Value | Description | |:--------------------|:--------------------------|:---------------------------| -| `LedgerEntryType` | String | The [type of ledger object](ledger-object-types.html) that was deleted. | -| `LedgerIndex` | String - [Hash][] | The [ID of this ledger object](ledger-object-ids.html) in the ledger's [state tree](ledgers.html). **Note:** This is **not the same** as a [ledger index](basic-data-types.html#ledger-index), even though the field name is very similar. | -| `FinalFields` | Object | The content fields of the ledger object after applying any changes from this transaction. Which fields are present depends on what type of ledger object was created. This omits the `PreviousTxnID` and `PreviousTxnLgrSeq` fields, even though most types of ledger objects have them. | +| `LedgerEntryType` | String | The [type of ledger entry](ledger-object-types.html) that was deleted. | +| `LedgerIndex` | String - [Hash][] | The [ID of this ledger entry](ledger-object-ids.html) in the ledger's [state tree](ledgers.html). **Note:** This is **not the same** as a [ledger index](basic-data-types.html#ledger-index), even though the field name is very similar. | +| `FinalFields` | Object | The content fields of the ledger entry after applying any changes from this transaction. Which fields are present depends on what type of ledger entry was created. This omits the `PreviousTxnID` and `PreviousTxnLgrSeq` fields, even though most types of ledger entries have them. | | `PreviousFields` | Object | The previous values for all fields of the object that were changed as a result of this transaction. If the transaction _only added_ fields to the object, this field is an empty object. | -| `PreviousTxnID` | String - [Hash][] | _(May be omitted)_ The [identifying hash][] of the previous transaction to modify this ledger object. Omitted for ledger object types that do not have a `PreviousTxnID` field. | -| `PreviousTxnLgrSeq` | Number - [Ledger Index][] | _(May be omitted)_ The [Ledger Index][] of the ledger version containing the previous transaction to modify this ledger object. Omitted for ledger object types that do not have a `PreviousTxnLgrSeq` field. | +| `PreviousTxnID` | String - [Hash][] | _(May be omitted)_ The [identifying hash][] of the previous transaction to modify this ledger entry. Omitted for ledger entry types that do not have a `PreviousTxnID` field. | +| `PreviousTxnLgrSeq` | Number - [Ledger Index][] | _(May be omitted)_ The [Ledger Index][] of the ledger version containing the previous transaction to modify this ledger entry. Omitted for ledger entry types that do not have a `PreviousTxnLgrSeq` field. | -**Note:** If the modified ledger object has `PreviousTxnID` and `PreviousTxnLgrSeq` fields, the transaction always updates them with the transaction's own identifying hash and the index of the ledger version that included the transaction, but these fields' new value is not listed in the `FinalFields` of the `ModifiedNode` object, and their previous values are listed at the top level of the `ModifiedNode` object rather than in the nested `PreviousFields` object. +**Note:** If the modified ledger entry has `PreviousTxnID` and `PreviousTxnLgrSeq` fields, the transaction always updates them with the transaction's own identifying hash and the index of the ledger version that included the transaction, but these fields' new value is not listed in the `FinalFields` of the `ModifiedNode` object, and their previous values are listed at the top level of the `ModifiedNode` object rather than in the nested `PreviousFields` object. ## NFT Fields diff --git a/content/references/protocol-reference/transactions/transaction-results/tec-codes.ja.md b/content/references/protocol-reference/transactions/transaction-results/tec-codes.ja.md index 543a046d7e..8a2566e4dd 100644 --- a/content/references/protocol-reference/transactions/transaction-results/tec-codes.ja.md +++ b/content/references/protocol-reference/transactions/transaction-results/tec-codes.ja.md @@ -32,7 +32,7 @@ labels: | `tecINVARIANT_FAILED` | 147 | このトランザクションを実行しようとしたところ、不変性チェックが失敗しました。[EnforceInvariants Amendment][]が必要です。このエラーを再現できる場合は、[問題を報告](https://github.com/ripple/rippled/issues)してください。 | | `tecKILLED` | 150 | [OfferCreateトランザクション][]がtfFillOrKillフラグを指定しましたが、トランザクションを確定できなかったため、このトランザクションは取り消されました。_([fix1578 Amendment][]が必要です。)_ | | `tecNEED_MASTER_KEY` | 142 | このトランザクションはマスターキーを必要とする変更([マスターキーの無効化または残高凍結能力の放棄](accountset.html#accountsetのフラグ)など)を試みました。[新規: rippled 0.28.0][] | -| `tecNO_ALTERNATIVE_KEY` | 130 | トランザクションが唯一の[トランザクション承認](transaction-basics.html#トランザクションの承認)メソッドを削除しようとしました。これは、レギュラーキーを削除する[SetRegularKeyトランザクション][]、SignerListを削除する[SignerListSetトランザクション][]、またはマスターキーを無効にする[AccountSetトランザクション][]である可能性があります。(`rippled` 0.30.0より前のバージョンでは、このトランザクションは`tecMASTER_DISABLED`と呼ばれていました。) | +| `tecNO_ALTERNATIVE_KEY` | 130 | トランザクションが唯一の[トランザクション承認](transactions.html#トランザクションの承認)メソッドを削除しようとしました。これは、レギュラーキーを削除する[SetRegularKeyトランザクション][]、SignerListを削除する[SignerListSetトランザクション][]、またはマスターキーを無効にする[AccountSetトランザクション][]である可能性があります。(`rippled` 0.30.0より前のバージョンでは、このトランザクションは`tecMASTER_DISABLED`と呼ばれていました。) | | `tecNO_AUTH` | 134 | トランザクションはトラストラインの残高を、`lsfRequireAuth`フラグが有効になっているアカウントに追加する必要がありましたが、そのトラストラインが承認されていなかったため、失敗しました。トラストラインが存在しない場合は、代わりに`tecNO_LINE`が発生します。 | | `tecNO_DST` | 124 | トランザクションの受信側のアカウントが存在しません。これには、PaymentトランザクションタイプやTrustSetトランザクションタイプがあります。(XRPを十分に受信した場合に作成される可能性があります。) | | `tecNO_DST_INSUF_XRP` | 125 | トランザクションの受信側のアカウントが存在しません。トランザクションは、アカウントの作成に十分なXRPを送金していません。 | @@ -42,7 +42,7 @@ labels: | `tecNO_LINE_INSUF_RESERVE` | 126 | 送信側アカウントに、新しいトラストラインを作成するのに十分なXRPがないため、トランザクションが失敗しました。([準備金](reserves.html)を参照)このエラーは、取引相手がこのアカウントに対する同一通貨のトラストラインを持っていない場合に発生します。(その他のケースについては`tecINSUF_RESERVE_LINE`を参照してください。) | | `tecNO_LINE_REDUNDANT` | 127 | トランザクションはトラストラインをデフォルト状態に設定しようと試みましたが、トラストラインが存在していなかったため、失敗しました。 | | `tecNO_PERMISSION` | 139 | 送信者にはこの操作を実行する権限がありません。たとえば[EscrowFinishトランザクション][]が`FinishAfter`時刻に達する前に保留中の支払をリリースしようとしたか、送信者が所有していないChannelで誰かが[PaymentChannelFund][]を使用しようとしたか、または[Payment][]が「DepositAuth」フラグが有効になっているアカウントに資金の送金を試みました。 | -| `tecNO_REGULAR_KEY` | 131 | [AccountSetトランザクション][]がマスターキーを無効にしようとしましたが、アカウントにはマスターキー以外で[トランザクションを承認する](transaction-basics.html#トランザクションの承認)方法がありません。[マルチシグ](multi-signing.html)が有効な場合、このコードは廃止予定であり、代わりに`tecNO_ALTERNATIVE_KEY`が使用されます。 | +| `tecNO_REGULAR_KEY` | 131 | [AccountSetトランザクション][]がマスターキーを無効にしようとしましたが、アカウントにはマスターキー以外で[トランザクションを承認する](transactions.html#トランザクションの承認)方法がありません。[マルチシグ](multi-signing.html)が有効な場合、このコードは廃止予定であり、代わりに`tecNO_ALTERNATIVE_KEY`が使用されます。 | | `tecNO_TARGET` | 138 | トランザクションが参照するEscrowレジャーオブジェクトまたはPayChannelレジャーオブジェクトが存在していません。これらのオブジェクトは、これまでに存在したことがないか、すでに削除されています。(たとえば、別の[EscrowFinishトランザクション][]で保留中の支払がすでに実行されている場合などです。)あるいは、支払先アカウントで`asfDisallowXRP`が設定されているため、このアカウントは[PaymentChannelCreate][]トランザクションまたは[EscrowCreate][]トランザクションの宛先に指定できません。 | | `tecOVERSIZE` | 145 | サーバーがこのトランザクションの適用時に大量のメタデータを作成したため、このトランザクションを処理できませんでした。[新規: rippled 0.29.0-hf1][] | | `tecOWNERS` | 132 | トランザクションでは、トランザクションを送信するアカウントの「所有者カウント」はゼロ以外である必要があります。このためトランザクションを正常に完了できません。たとえば、トラストラインや使用可能なオファーがあるアカウントでは、[`lsfRequireAuth`](accountset.html#accountsetのフラグ)フラグを有効にできません。 | diff --git a/content/references/protocol-reference/transactions/transaction-results/tec-codes.md b/content/references/protocol-reference/transactions/transaction-results/tec-codes.md index 440f96c027..b59b174cba 100644 --- a/content/references/protocol-reference/transactions/transaction-results/tec-codes.md +++ b/content/references/protocol-reference/transactions/transaction-results/tec-codes.md @@ -20,11 +20,11 @@ Transactions with `tec` codes destroy the XRP paid as a [transaction cost](trans | `tecCRYPTOCONDITION_ERROR` | 146 | This [EscrowCreate][] or [EscrowFinish][] transaction contained a malformed or mismatched crypto-condition. | | `tecDIR_FULL` | 121 | The transaction tried to add an object (such as a trust line, Check, Escrow, or Payment Channel) to an account's owner directory, but that account cannot own any more objects in the ledger. | | `tecDUPLICATE` | 149 | The transaction tried to create an object (such as a [DepositPreauth][] authorization) that already exists. | -| `tecDST_TAG_NEEDED` | 143 | The [Payment transaction][] omitted a [destination tag](source-and-destination-tags.html), but the destination account has the `lsfRequireDestTag` flag enabled. [New in: rippled 0.28.0][] | +| `tecDST_TAG_NEEDED` | 143 | The [Payment transaction][] omitted a [destination tag](source-and-destination-tags.html), but the destination account has the `lsfRequireDestTag` flag enabled. | | `tecEXPIRED` | 148 | The transaction tried to create an object (such as an Offer or a Check) whose provided Expiration time has already passed. | | `tecFAILED_PROCESSING` | 105 | An unspecified error occurred when processing the transaction. | | `tecFROZEN` | 137 | The [OfferCreate transaction][] failed because one or both of the assets involved are subject to a [global freeze](freezes.html). | -| `tecHAS_OBLIGATIONS` | 151 | The [AccountDelete transaction][] failed because the account to be deleted owns objects that cannot be deleted. See [Deletion of Accounts](accounts.html#deletion-of-accounts) for details. | +| `tecHAS_OBLIGATIONS` | 151 | The [AccountDelete transaction][] failed because the account to be deleted owns objects that cannot be deleted. See [Deleting Accounts](deleting-accounts.html) for details. | | `tecINSUF_RESERVE_LINE` | 122 | The transaction failed because the sending account does not have enough XRP to create a new trust line. (See: [Reserves](reserves.html)) This error occurs when the counterparty already has a trust line in a non-default state to the sending account for the same currency. (See `tecNO_LINE_INSUF_RESERVE` for the other case.) | | `tecINSUF_RESERVE_OFFER` | 123 | The transaction failed because the sending account does not have enough XRP to create a new Offer. (See: [Reserves](reserves.html)) | | `tecINSUFF_FEE` | 136 | The transaction failed because the sending account does not have enough XRP to pay the [transaction cost](transaction-cost.html) that it specified. (In this case, the transaction processing destroys all of the sender's XRP even though that amount is lower than the specified transaction cost.) This result only occurs if the account's balance decreases _after_ this transaction has been distributed to enough of the network to be included in a consensus set. Otherwise, the transaction fails with [`terINSUF_FEE_B`](ter-codes.html) before being distributed. | @@ -35,10 +35,10 @@ Transactions with `tec` codes destroy the XRP paid as a [transaction cost](trans | `tecINVARIANT_FAILED` | 147 | An invariant check failed when trying to execute this transaction. Added by the [EnforceInvariants amendment][]. If you can reproduce this error, please [report an issue](https://github.com/ripple/rippled/issues). | | `tecKILLED` | 150 | The [OfferCreate transaction][] specified the `tfFillOrKill` flag and could not be filled, so it was killed. _(Added by the [fix1578 amendment][].)_ | | `tecMAX_SEQUENCE_REACHED` | 153 | A sequence number field is already at its maximum. This includes the `MintedNFTokens` field. _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | -| `tecNEED_MASTER_KEY` | 142 | This transaction tried to cause changes that require the master key, such as [disabling the master key or giving up the ability to freeze balances](accountset.html#accountset-flags). [New in: rippled 0.28.0][] | +| `tecNEED_MASTER_KEY` | 142 | This transaction tried to cause changes that require the master key, such as [disabling the master key or giving up the ability to freeze balances](accountset.html#accountset-flags). | | `tecNFTOKEN_BUY_SELL_MISMATCH` | 155 | The [NFTokenAcceptOffer transaction][] attempted to match incompatible offers to buy and sell a non-fungible token. _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | | `tecNFTOKEN_OFFER_TYPE_MISMATCH` | 156 | One or more of the offers specified in the transaction was not the right type of offer. (For example, a buy offer was specified in the `NFTokenSellOffer` field.) _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | -| `tecNO_ALTERNATIVE_KEY` | 130 | The transaction tried to remove the only available method of [authorizing transactions](transaction-basics.html#authorizing-transactions). This could be a [SetRegularKey transaction][] to remove the regular key, a [SignerListSet transaction][] to delete a SignerList, or an [AccountSet transaction][] to disable the master key. (Prior to `rippled` 0.30.0, this was called `tecMASTER_DISABLED`.) | +| `tecNO_ALTERNATIVE_KEY` | 130 | The transaction tried to remove the only available method of [authorizing transactions](transactions.html#authorizing-transactions). This could be a [SetRegularKey transaction][] to remove the regular key, a [SignerListSet transaction][] to delete a SignerList, or an [AccountSet transaction][] to disable the master key. (Prior to `rippled` 0.30.0, this was called `tecMASTER_DISABLED`.) | | `tecNO_AUTH` | 134 | The transaction failed because it needs to add a balance on a trust line to an account with the `lsfRequireAuth` flag enabled, and that trust line has not been authorized. If the trust line does not exist at all, `tecNO_LINE` occurs instead. | | `tecNO_DST` | 124 | The account on the receiving end of the transaction does not exist. This includes Payment and TrustSet transaction types. (It could be created if it received enough XRP.) | | `tecNO_DST_INSUF_XRP` | 125 | The account on the receiving end of the transaction does not exist, and the transaction is not sending enough XRP to create it. | @@ -48,11 +48,11 @@ Transactions with `tec` codes destroy the XRP paid as a [transaction cost](trans | `tecNO_LINE_INSUF_RESERVE` | 126 | The transaction failed because the sending account does not have enough XRP to create a new trust line. (See: [Reserves](reserves.html)) This error occurs when the counterparty does not have a trust line to this account for the same currency. (See `tecINSUF_RESERVE_LINE` for the other case.) | | `tecNO_LINE_REDUNDANT` | 127 | The transaction failed because it tried to set a trust line to its default state, but the trust line did not exist. | | `tecNO_PERMISSION` | 139 | The sender does not have permission to do this operation. For example, the [EscrowFinish transaction][] tried to release a held payment before its `FinishAfter` time, someone tried to use [PaymentChannelFund][] on a channel the sender does not own, or a [Payment][] tried to deliver funds to an account with the "DepositAuth" flag enabled. | -| `tecNO_REGULAR_KEY` | 131 | The [AccountSet transaction][] tried to disable the master key, but the account does not have another way to [authorize transactions](transaction-basics.html#authorizing-transactions). If [multi-signing](multi-signing.html) is enabled, this code is deprecated and `tecNO_ALTERNATIVE_KEY` is used instead. | +| `tecNO_REGULAR_KEY` | 131 | The [AccountSet transaction][] tried to disable the master key, but the account does not have another way to [authorize transactions](transactions.html#authorizing-transactions). If [multi-signing](multi-signing.html) is enabled, this code is deprecated and `tecNO_ALTERNATIVE_KEY` is used instead. | | `tecNO_SUITABLE_NFTOKEN_PAGE` | 154 | The transaction tried to mint or acquire a non-fungible token but the account receiving the `NFToken` does not have a directory page that can hold it. This situation is rare. _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | | `tecNO_TARGET` | 138 | The transaction referenced an Escrow or PayChannel ledger object that doesn't exist, either because it never existed or it has already been deleted. (For example, another [EscrowFinish transaction][] has already executed the held payment.) Alternatively, the destination account has `asfDisallowXRP` set so it cannot be the destination of this [PaymentChannelCreate][] or [EscrowCreate][] transaction. | | `tecOBJECT_NOT_FOUND` | 160 | One of the objects specified by this transaction did not exist in the ledger. _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | -| `tecOVERSIZE` | 145 | This transaction could not be processed, because the server created an excessively large amount of [metadata](transaction-metadata.html) when it tried to apply the transaction. [New in: rippled 0.29.0-hf1][] | +| `tecOVERSIZE` | 145 | This transaction could not be processed, because the server created an excessively large amount of [metadata](transaction-metadata.html) when it tried to apply the transaction. | | `tecOWNERS` | 132 | The transaction cannot succeed because the sender already owns objects in the ledger. For example, an account cannot enable the [`lsfRequireAuth`](accountset.html#accountset-flags) flag if it has any trust lines or available offers. | | `tecPATH_DRY` | 128 | The transaction failed because the provided [paths](paths.html) did not have enough liquidity to send anything at all. This could mean that the source and destination accounts are not linked by [trust lines](trust-lines-and-issuing.html). | | `tecPATH_PARTIAL` | 101 | The transaction failed because the provided [paths](paths.html) did not have enough liquidity to send the full amount. | diff --git a/content/references/protocol-reference/transactions/transaction-types/accountdelete.md b/content/references/protocol-reference/transactions/transaction-types/accountdelete.md index b9614b2469..42925a69c0 100644 --- a/content/references/protocol-reference/transactions/transaction-types/accountdelete.md +++ b/content/references/protocol-reference/transactions/transaction-types/accountdelete.md @@ -11,7 +11,7 @@ labels: _Added by the [DeletableAccounts amendment](known-amendments.html#deletableaccounts)_ -An AccountDelete transaction deletes an [account](accountroot.html) and any objects it owns in the XRP Ledger, if possible, sending the account's remaining XRP to a specified destination account. See [Deletion of Accounts](accounts.html#deletion-of-accounts) for the requirements to delete an account. +An AccountDelete transaction deletes an [account](accountroot.html) and any objects it owns in the XRP Ledger, if possible, sending the account's remaining XRP to a specified destination account. See [Deleting Accounts](deleting-accounts.html) for the requirements to delete an account. ## Example {{currentpage.name}} JSON diff --git a/content/references/protocol-reference/transactions/transaction-types/accountset.ja.md b/content/references/protocol-reference/transactions/transaction-types/accountset.ja.md index c650b5d6d6..95ea88788a 100644 --- a/content/references/protocol-reference/transactions/transaction-types/accountset.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/accountset.ja.md @@ -35,7 +35,7 @@ AccountSetトランザクションは、[XRP Ledgerのアカウント](accountro | [`Domain`](#domain) | 文字列 | Blob | _(省略可)_ このアカウントを保有するドメインのASCII小文字を表現する16進文字列。[256バイトを超える長さは使用できません。](https://github.com/XRPLF/rippled/blob/55dc7a252e08a0b02cd5aa39e9b4777af3eafe77/src/ripple/app/tx/impl/SetAccount.h#L34) | | `EmailHash` | 文字列 | Hash128 | _(省略可)_ アバターイメージの生成に使用されるメールアドレスのハッシュ。一般的に、クライアントは[Gravatar](http://en.gravatar.com/site/implement/hash/)を使用してこのイメージを表示しています。 | | `MessageKey` | 文字列 | Blob | _(省略可)_ 暗号化されたメッセージをこのアカウントに送信するための公開鍵です。キーを設定するには、正確に33バイトである必要があり、最初のバイトはキーの種類を示します。secp256k1鍵の場合は`0x02`または`0x03`、Ed25519鍵の場合は`0xED`です。キーを削除するには、空の値を使用します。 | -| `NFTokenMinter` | 文字列 | Blob | _(省略可)_ あなたのために[NFTokensをミントする](authorize-minter.html)ことができる別のアカウント。 _([NonFungibleTokensV1_1 amendment][]によって追加されました.)_ | +| `NFTokenMinter` | 文字列 | Blob | _(省略可)_ あなたのために[NFTokensをミントする](assign-an-authorized-minter-using-javascript.html)ことができる別のアカウント。 _([NonFungibleTokensV1_1 amendment][]により追加されました.)_ | | [`SetFlag`](#accountsetのフラグ) | 数値 | UInt32 | _(省略可)_ このアカウントについてオプションを有効にするための整数フラグ。 | | [`TransferRate`](#transferrate) | 符号なし整数 | UInt32 | _(省略可)_ ユーザーがこのアカウントの発行済み通貨を送金するときに請求される手数料。通貨単位の10億分の1で表現されます。手数料なしを意味する特殊なケースの`0`を除いて、`2000000000`より大きくしたり、`1000000000`より小さくしたりすることはできません。 | | [`TickSize`](ticksize.html) | 符号なし整数 | UInt8 | _(省略可)_このアドレスによって発行されている通貨が関係するオファーに使用する為替レートの呼値の単位。それらのオファーの為替レートは、この有効桁数へと丸められます。有効な値は`3`から`15`、または無効にするための`0`です_([TickSize Amendment][]によって追加されました)。_ | @@ -72,7 +72,7 @@ AccountSetトランザクションは、[XRP Ledgerのアカウント](accountro | フラグの名前 | 10進値 | 対応するレジャーフラグ | 説明 | |:----------------------------------|:------|:----------------------------------|:--------------| | `asfAccountTxnID` | 5 | (なし) | このアカウントの直近のトランザクションのIDを追跡します。[AccountTxnID](transaction-common-fields.html#accounttxnid)については必須です。 | -| `asfAuthorizedNFTokenMinter` | 10 | (なし) | このアカウントの代わりに、別のアカウントが非代替性トークン(NFToken)をミントすることを許可するために使用します。認可されたアカウントを[AccountRoot](accountroot.html)オブジェクトの`NFTokenMinter`フィールドで指定します。認可されたアカウントを削除するには、このフラグを有効にして`NFTokenMinter`フィールドを省略します。 _([NonFungibleTokensV1_1 amendment][]によって追加されました。)_ | +| `asfAuthorizedNFTokenMinter` | 10 | (なし) | このアカウントの代わりに、別のアカウントが非代替性トークン(NFToken)をミントすることを許可するために使用します。認可されたアカウントを[AccountRoot](accountroot.html)オブジェクトの`NFTokenMinter`フィールドで指定します。認可されたアカウントを削除するには、このフラグを有効にして`NFTokenMinter`フィールドを省略します。 _([NonFungibleTokensV1_1 amendment][]により追加されました。)_ | | `asfDefaultRipple` | 8 | `lsfDefaultRipple` | このアカウントのトラストラインでの[リップリング](rippling.html)をデフォルトで有効にします。 | | `asfDepositAuth` | 9 | `lsfDepositAuth` | このアカウントに対して[Deposit Authorization](depositauth.html)を有効にします _([DepositAuth Amendment][]によって追加されました)。_ | | `asfDisableMaster` | 4 | `lsfDisableMaster` | マスターキーペアの使用を禁止します。[レギュラーキー](cryptographic-keys.html)や[署名者リスト](multi-signing.html)など、トランザクションに署名するための別の手段がアカウントで設定されている場合のみ有効にできます。 | @@ -86,7 +86,7 @@ AccountSetトランザクションは、[XRP Ledgerのアカウント](accountro | `asfRequireAuth` | 2 | `lsfRequireAuth` | このアドレスによって発行された残高をユーザーが保持することについて、承認を要求します。アドレスにトラストラインが接続されていない場合のみ有効にできます。 | | `asfRequireDest` | 1 | `lsfRequireDestTag` | トランザクションをこのアカウントに送信するための宛先タグを要求します。 | -`asfDisableMaster`フラグまたは`asfNoFreeze`フラグを有効にするには、マスターキーペアで署名することによって[トランザクションを承認](transaction-basics.html#トランザクションの承認)する必要があります。レギュラーキーペアやマルチ署名を使用することはできません。レギュラーキーペアまたはマルチ署名を使用すると、`asfDisableMaster`を無効にする(つまり、マスターキーペアを再び有効にする)ことができます。[新規: rippled 0.28.0][] +`asfDisableMaster`フラグまたは`asfNoFreeze`フラグを有効にするには、マスターキーペアで署名することによって[トランザクションを承認](transactions.html#トランザクションの承認)する必要があります。レギュラーキーペアやマルチ署名を使用することはできません。レギュラーキーペアまたはマルチ署名を使用すると、`asfDisableMaster`を無効にする(つまり、マスターキーペアを再び有効にする)ことができます。[新規: rippled 0.28.0][] 以下の[トランザクションフラグ](transaction-common-fields.html#flagsフィールド)はAccountSetタイプのトランザクションに固有のもので、同様の目的を果たしますが、使用することはお勧めしません。限られたスペースのため、いくつかの設定には関連する `tf` フラグがありません。また、新しい `tf` フラグは `AccountSet` トランザクションタイプには追加されていません。一つのトランザクションで複数の設定を有効にするには、`tf`フラグと`asf`フラグを組み合わせて使用することができます。 diff --git a/content/references/protocol-reference/transactions/transaction-types/accountset.md b/content/references/protocol-reference/transactions/transaction-types/accountset.md index 2a7337aeb8..b0bf40046d 100644 --- a/content/references/protocol-reference/transactions/transaction-types/accountset.md +++ b/content/references/protocol-reference/transactions/transaction-types/accountset.md @@ -37,7 +37,7 @@ An AccountSet transaction modifies the properties of an [account in the XRP Ledg | [`Domain`](#domain) | String | Blob | _(Optional)_ The domain that owns this account, as a string of hex representing the ASCII for the domain in lowercase. [Cannot be more than 256 bytes in length.](https://github.com/XRPLF/rippled/blob/55dc7a252e08a0b02cd5aa39e9b4777af3eafe77/src/ripple/app/tx/impl/SetAccount.h#L34) | | `EmailHash` | String | Hash128 | _(Optional)_ An arbitrary 128-bit value. Conventionally, clients treat this as the md5 hash of an email address to use for displaying a [Gravatar](http://en.gravatar.com/site/implement/hash/) image. | | `MessageKey` | String | Blob | _(Optional)_ Public key for sending encrypted messages to this account. To set the key, it must be exactly 33 bytes, with the first byte indicating the key type: `0x02` or `0x03` for secp256k1 keys, `0xED` for Ed25519 keys. To remove the key, use an empty value. | -| `NFTokenMinter` | String | Blob | _(Optional)_ Another account that can [mint NFTokens for you](authorize-minter.html). _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | +| `NFTokenMinter` | String | Blob | _(Optional)_ Another account that can [mint NFTokens for you](assign-an-authorized-minter-using-javascript.html). _(Added by the [NonFungibleTokensV1_1 amendment][].)_ | | [`SetFlag`](#accountset-flags) | Number | UInt32 | _(Optional)_ Integer flag to enable for this account. | | [`TransferRate`](#transferrate) | Number | UInt32 | _(Optional)_ The fee to charge when users transfer this account's tokens, represented as billionths of a unit. Cannot be more than `2000000000` or less than `1000000000`, except for the special case `0` meaning no fee. | | [`TickSize`](ticksize.html) | Number | UInt8 | _(Optional)_ Tick size to use for offers involving a currency issued by this address. The exchange rates of those offers is rounded to this many significant digits. Valid values are `3` to `15` inclusive, or `0` to disable. _(Added by the [TickSize amendment][])_ | @@ -88,7 +88,7 @@ The available AccountSet flags are: | `asfRequireAuth` | 2 | `lsfRequireAuth` | Require authorization for users to hold balances issued by this address. Can only be enabled if the address has no trust lines connected to it. | | `asfRequireDest` | 1 | `lsfRequireDestTag` | Require a destination tag to send transactions to this account. | -To enable the `asfDisableMaster` or `asfNoFreeze` flags, you must [authorize the transaction](transaction-basics.html#authorizing-transactions) by signing it with the master key pair. You cannot use a regular key pair or a multi-signature. You can disable `asfDisableMaster` (that is, re-enable the master key pair) using a regular key pair or multi-signature. +To enable the `asfDisableMaster` or `asfNoFreeze` flags, you must [authorize the transaction](transactions.html#authorizing-transactions) by signing it with the master key pair. You cannot use a regular key pair or a multi-signature. You can disable `asfDisableMaster` (that is, re-enable the master key pair) using a regular key pair or multi-signature. The following [Transaction flags](transaction-common-fields.html#flags-field) (`tf` flags), specific to the AccountSet transaction type, serve the same purpose. Due to limited space, some settings do not have associated `tf` flags, and new `tf` flags are not being added to the `AccountSet` transaction type. You can use a combination of `tf` and `asf` flags to enable multiple settings with a single transaction. diff --git a/content/references/protocol-reference/transactions/transaction-types/escrowcreate.md b/content/references/protocol-reference/transactions/transaction-types/escrowcreate.md index 3152c1fa1d..d73c6cd459 100644 --- a/content/references/protocol-reference/transactions/transaction-types/escrowcreate.md +++ b/content/references/protocol-reference/transactions/transaction-types/escrowcreate.md @@ -40,13 +40,23 @@ Sequester XRP until the escrow process either finishes or is canceled. | `Amount` | String | Amount | Amount of [XRP, in drops][Currency Amount], to deduct from the sender's balance and escrow. Once escrowed, the XRP can either go to the `Destination` address (after the `FinishAfter` time) or returned to the sender (after the `CancelAfter` time). | | `Destination` | String | AccountID | Address to receive escrowed XRP. | | `CancelAfter` | Number | UInt32 | _(Optional)_ The time, in [seconds since the Ripple Epoch][], when this escrow expires. This value is immutable; the funds can only be returned to the sender after this time. | -| `FinishAfter` | Number | UInt32 | _(Optional)_ The time, in [seconds since the Ripple Epoch][], when the escrowed XRP can be released to the recipient. This value is immutable; the funds cannot move until this time is reached. | +| `FinishAfter` | Number | UInt32 | _(Optional)_ The time, in [seconds since the Ripple Epoch][], when the escrowed XRP can be released to the recipient. This value is immutable, and the funds can't be accessed until this time. | | `Condition` | String | Blob | _(Optional)_ Hex value representing a [PREIMAGE-SHA-256 crypto-condition](https://tools.ietf.org/html/draft-thomas-crypto-conditions-02#section-8.1). The funds can only be delivered to the recipient if this condition is fulfilled. | | `DestinationTag` | Number | UInt32 | _(Optional)_ Arbitrary tag to further specify the destination for this escrowed payment, such as a hosted recipient at the destination address. | -Either `CancelAfter` or `FinishAfter` must be specified. If both are included, the `FinishAfter` time must be before the `CancelAfter` time. +You must specify one of the following combinations of fields: -With the [fix1571 amendment][] enabled, you must supply `FinishAfter`, `Condition`, or both. [New in: rippled 1.0.0][] +| Summary | `FinishAfter` | `Condition` | `CancelAfter` | +|-----------------------------------|---------------|-------------|---------------| +| Time-based | ✅ | | | +| Time-based with expiration | ✅ | | ✅ | +| Timed conditional | ✅ | ✅ | | +| Timed conditional with expiration | ✅ | ✅ | ✅ | +| Conditional with expiration | | ✅ | ✅ | + +It is not possible to create a conditional escrow with no expiration, but you can specify an expiration that is very far in the future. + +**Note:** Before the [fix1571 amendment][] became enabled on 2018-06-19, it was possible to create an escrow with `CancelAfter` only. These escrows could be finished by anyone at any time before the specified expiration. diff --git a/content/references/protocol-reference/transactions/transaction-types/escrowfinish.md b/content/references/protocol-reference/transactions/transaction-types/escrowfinish.md index 0f33df6f34..8d52c06248 100644 --- a/content/references/protocol-reference/transactions/transaction-types/escrowfinish.md +++ b/content/references/protocol-reference/transactions/transaction-types/escrowfinish.md @@ -47,7 +47,7 @@ Any account may submit an EscrowFinish transaction. **Note:** The minimum [transaction cost](transaction-cost.html) to submit an EscrowFinish transaction increases if it contains a fulfillment. If the transaction has no fulfillment, the transaction cost is the standard 10 drops. If the transaction contains a fulfillment, the transaction cost is 330 [drops of XRP][] plus another 10 drops for every 16 bytes in size of the preimage. -In [non-production networks](parallel-networks.html), it may be possible [to delete](accounts.html#deletion-of-accounts) the destination account of a pending escrow. In this case, an attempt to finish the escrow fails with the result `tecNO_TARGET`, but the escrow object remains unless it has expired normally. If another payment re-creates the destination account, the escrow can be finished successfully. The destination account of an escrow can only be deleted if the escrow was created before the [fix1523 amendment](known-amendments.html#fix1523) became enabled. No such escrows exist in the production XRP Ledger, so this edge case is not possible on the production XRP Ledger. This edge case is also not possible in test networks that enable both fix1523 and Escrow amendments at the same time, which is the default when you [start a new genesis ledger](start-a-new-genesis-ledger-in-stand-alone-mode.html). +In [non-production networks](parallel-networks.html), it may be possible [to delete](deleting-accounts.html) the destination account of a pending escrow. In this case, an attempt to finish the escrow fails with the result `tecNO_TARGET`, but the escrow object remains unless it has expired normally. If another payment re-creates the destination account, the escrow can be finished successfully. The destination account of an escrow can only be deleted if the escrow was created before the [fix1523 amendment](known-amendments.html#fix1523) became enabled. No such escrows exist in the production XRP Ledger, so this edge case is not possible on the production XRP Ledger. This edge case is also not possible in test networks that enable both fix1523 and Escrow amendments at the same time, which is the default when you [start a new genesis ledger](start-a-new-genesis-ledger-in-stand-alone-mode.html). {% include '_snippets/rippled-api-links.md' %} diff --git a/content/references/protocol-reference/transactions/transaction-types/nftokenacceptoffer.ja.md b/content/references/protocol-reference/transactions/transaction-types/nftokenacceptoffer.ja.md index a534f5ce3c..92acb51eb3 100644 --- a/content/references/protocol-reference/transactions/transaction-types/nftokenacceptoffer.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/nftokenacceptoffer.ja.md @@ -12,7 +12,7 @@ labels: * 1つのオファーを受け入れることを許可する。これは _ダイレクト_ モードと呼ばれます。 * 2つの異なるオファー、1つは与えられた`NFToken`の購入を提案し、もう1つは同じ`NFToken`の売却を提案し、アトミックに受け入れられることを許可します。これは _ブローカー_ モードと呼ばれます。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## ブローカー vs. ダイレクト モード diff --git a/content/references/protocol-reference/transactions/transaction-types/nftokenburn.ja.md b/content/references/protocol-reference/transactions/transaction-types/nftokenburn.ja.md index 4bee06c5d5..5cfd41fdd0 100644 --- a/content/references/protocol-reference/transactions/transaction-types/nftokenburn.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/nftokenburn.ja.md @@ -13,7 +13,7 @@ NFTokenBurnトランザクションは、`NFToken`オブジェクトを保持し この操作に成功すると、対応する`NFToken`が削除されます。この操作によって`NFToken`を保持している`NFTokenPage`が空になるか、統合されて`NFTokenPage`が削除されると、所有者準備金が1つ減ります。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## {{currentpage.name}} JSONの例 diff --git a/content/references/protocol-reference/transactions/transaction-types/nftokencanceloffer.ja.md b/content/references/protocol-reference/transactions/transaction-types/nftokencanceloffer.ja.md index 42267ee3b1..520ec04ba5 100644 --- a/content/references/protocol-reference/transactions/transaction-types/nftokencanceloffer.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/nftokencanceloffer.ja.md @@ -21,7 +21,7 @@ labels: } ``` -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## アクセス権 diff --git a/content/references/protocol-reference/transactions/transaction-types/nftokencreateoffer.ja.md b/content/references/protocol-reference/transactions/transaction-types/nftokencreateoffer.ja.md index dd79afd3b2..a2d2a2447f 100644 --- a/content/references/protocol-reference/transactions/transaction-types/nftokencreateoffer.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/nftokencreateoffer.ja.md @@ -12,7 +12,7 @@ labels: 成功した場合、トランザクションは[NFTokenOfferオブジェクト][]を作成します。各オファーは、オファーを提示したアカウントの[所有者準備金](reserves.html)に関連づけて1つのオブジェクトとしてカウントされます。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## {{currentpage.name}} JSONの例 diff --git a/content/references/protocol-reference/transactions/transaction-types/nftokenmint.ja.md b/content/references/protocol-reference/transactions/transaction-types/nftokenmint.ja.md index 0cb036e8cf..892d0f8936 100644 --- a/content/references/protocol-reference/transactions/transaction-types/nftokenmint.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/nftokenmint.ja.md @@ -10,7 +10,7 @@ labels: `NFTokenMint`トランザクションは非代替性トークンを作成し、`NFTokenMinter`に紐付く[NFTokenPageオブジェクト][]に[NFToken][]オブジェクトとして追加します。このトランザクションの必須パラメータは`Token`フィールドで、実際のトークンを指定します。このトランザクションは`NFTokenMinter`にとって、不変と定義されているトークンフィールド(例えば`Flags`)を設定することができる唯一の方法です。 -_([NonFungibleTokensV1_1 amendment][]が必要です)_ +_([NonFungibleTokensV1_1 amendment][]により追加されました)_ ## {{currentpage.name}} JSONの例 diff --git a/content/references/protocol-reference/transactions/transaction-types/payment.ja.md b/content/references/protocol-reference/transactions/transaction-types/payment.ja.md index bfc4089604..21b95c584a 100644 --- a/content/references/protocol-reference/transactions/transaction-types/payment.ja.md +++ b/content/references/protocol-reference/transactions/transaction-types/payment.ja.md @@ -66,7 +66,7 @@ Paymentトランザクションタイプは、いくつかの異なるタイプ ## SendMaxおよびAmountで使用する特殊なissuerの値 -ほとんどの場合、XRP以外の[通貨額][]の`issuer`フィールドは、金融機関の[発行アドレス](issuing-and-operational-addresses.html)を示しています。ただし、支払いを記述するにあたって、支払いの`Amount`フィールドと`SendMax`フィールドにある`issuer`フィールドについては、特殊なルールが存在します。 +ほとんどの場合、XRP以外の[通貨額][]の`issuer`フィールドは、金融機関の[発行アドレス](account-types.html)を示しています。ただし、支払いを記述するにあたって、支払いの`Amount`フィールドと`SendMax`フィールドにある`issuer`フィールドについては、特殊なルールが存在します。 * 2つのアドレス間で、同一の通貨に関して存在する残高は常に1つです。つまり、金額の`issuer`フィールドが実際に表しているのは、イシュアンスを作成したアドレスではなく、イシュアンスを換金する相手方であることがあります。 * 宛先`Amount`フィールドの`issuer`フィールドが`Destination`アドレスと一致している場合、「宛先が受け入れるあらゆるイシュアー」を意味する特殊なケースとして取り扱われます。これには、他のトラストラインで保持されている宛先によって作成されたイシュアンスに加え、宛先が当該アドレスまでトラストラインを延長しているすべてのアドレスが含まれます。 @@ -105,7 +105,7 @@ Payment型のトランザクションについては、[`Flags`フィールド]( ## Partial Payments -Partial Paymentsを利用すると、受取られる金額を減額することによって、支払いを成功させることができます。Partial Paymentsが有用なのは、追加的なコストを発生させずに[支払いを返金](become-an-xrp-ledger-gateway.html#bouncing-payments)する場合です。その一方で、成功したトランザクションの`Amount`フィールドに、送金された金額が常に正しく記述されていることを前提としている環境において、悪用されるおそれもあります。 +Partial Paymentsを利用すると、受取られる金額を減額することによって、支払いを成功させることができます。Partial Paymentsが有用なのは、追加的なコストを発生させずに[支払いを返金](stablecoin-issuer.html#bouncing-payments)する場合です。その一方で、成功したトランザクションの`Amount`フィールドに、送金された金額が常に正しく記述されていることを前提としている環境において、悪用されるおそれもあります。 Partial Paymentsとは、**tfPartialPayment**フラグが有効になっている[Paymentトランザクション][]です。Partial Paymentsは、`SendMax`値を超える金額を送金することなく、`DeliverMin`フィールド以上の正の金額(`DeliverMin`が指定されていない場合、任意の正の金額)を送金する場合に成功します。 diff --git a/content/references/protocol-reference/transactions/transaction-types/payment.md b/content/references/protocol-reference/transactions/transaction-types/payment.md index e33812424a..53be251510 100644 --- a/content/references/protocol-reference/transactions/transaction-types/payment.md +++ b/content/references/protocol-reference/transactions/transaction-types/payment.md @@ -51,17 +51,17 @@ Payments are also the only way to [create accounts](#creating-accounts). ## Types of Payments -The Payment transaction type is a general-purpose tool that can represent several different types of abstract actions. You can identify the transaction type based on the transaction's fields, as described in the table below: +The `Payment` transaction type functions differently depending on how you fill in the `Payment` fields: | Payment type | `Amount` | `SendMax` | `Paths` | `Address` = `Destination`? | Description | |:-------------|:----------|:-----------|:----------|:---------------------------|:--| -| [Direct XRP-to-XRP Payment][] | String (XRP) | Omitted | Omitted | No | Transfers XRP directly from one account to another. Always delivers the exact amount. No fee applies other than the basic [transaction cost](transaction-cost.html). | +| [Direct XRP Payment][] | String (XRP) | Omitted | Omitted | No | Transfers XRP directly from one account to another, using one transaction. Always delivers the exact amount. No fee applies other than the basic [transaction cost](transaction-cost.html). | | [Creating or redeeming tokens][] | Object | Object (optional) | Optional | No | Increases or decreases the amount of a non-XRP currency or asset tracked in the XRP Ledger. [Transfer fees](transfer-fees.html) and [freezes](freezes.html) do not apply when sending and redeeming directly. | -| [Cross-currency Payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Send tokens from one holder to another. The `Amount` or `SendMax` can be XRP or tokens, but they cannot both be XRP. These payments [ripple through](rippling.html) the issuer and can take longer [paths](paths.html) through several intermediaries if the transaction specifies a path set. [Transfer fees](transfer-fees.html) set by the issuer(s) apply to this type of transaction. These transactions consume offers in the [decentralized exchange](decentralized-exchange.html) to connect between different currencies, or possibly even between currencies with the same currency code and different issuers. | +| [Cross-currency Payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Send tokens from one holder to another. The `Amount` or `SendMax` can be XRP or tokens, but can't both be XRP. These payments [ripple through](rippling.html) the issuer and can take longer [paths](paths.html) through several intermediaries if the transaction specifies a path set. [Transfer fees](transfer-fees.html) set by the issuer(s) apply to this type of transaction. These transactions consume offers in the [decentralized exchange](decentralized-exchange.html) to connect different currencies, or currencies with the same currency code and different issuers. | | [Partial payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Sends _up to_ a specific amount of any currency. Uses the [`tfPartialPayment` flag](#payment-flags). May include a `DeliverMin` amount specifying the minimum that the transaction must deliver to be successful; if the transaction does not specify `DeliverMin`, it can succeed by delivering _any positive amount_. | -| Currency conversion | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Required | Yes | Consumes offers in the [decentralized exchange](decentralized-exchange.html) to convert one currency to another, possibly taking [arbitrage](https://en.wikipedia.org/wiki/Arbitrage) opportunities. The `Amount` and `SendMax` cannot both be XRP. Also called a _circular payment_ because it delivers money to the sender. The [Data API](data-api.html) tracks this type of transaction as an "exchange" and not a "payment". | +| Currency conversion | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Required | Yes | Consumes offers in the [decentralized exchange](decentralized-exchange.html) to convert one currency to another, possibly taking [arbitrage](https://en.wikipedia.org/wiki/Arbitrage) opportunities. The `Amount` and `SendMax` cannot both be XRP. Also called a _circular payment_ because it delivers money to the sender. This type of transaction may be classified as an "exchange" and not a "payment". | -[Direct XRP-to-XRP Payment]: direct-xrp-payments.html +[Direct XRP Payment]: direct-xrp-payments.html [Creating or redeeming tokens]: tokens.html [Cross-currency Payment]: cross-currency-payments.html [Partial payment]: partial-payments.html @@ -110,7 +110,7 @@ Transactions of the Payment type support additional values in the [`Flags` field ## Partial Payments -A partial payment allows a payment to succeed by reducing the amount received. Partial payments are useful for [returning payments](become-an-xrp-ledger-gateway.html#bouncing-payments) without incurring additional costs to oneself. However, partial payments can also be used to exploit integrations that naively assume the `Amount` field of a successful transaction always describes the exact amount delivered. +A partial payment allows a payment to succeed by reducing the amount received. Partial payments are useful for [returning payments](stablecoin-issuer.html#bouncing-payments) without incurring additional costs to oneself. However, partial payments can also be used to exploit integrations that naively assume the `Amount` field of a successful transaction always describes the exact amount delivered. A partial payment is any [Payment transaction][] with the `tfPartialPayment` flag enabled. A partial payment can be successful if it delivers any positive amount greater than or equal to its `DeliverMin` field (or any positive amount at all if `DeliverMin` is not specified) without sending more than the `SendMax` value. diff --git a/content/references/protocol-reference/transactions/transaction-types/paymentchannelclaim.md b/content/references/protocol-reference/transactions/transaction-types/paymentchannelclaim.md index 7322340f31..25a86ed534 100644 --- a/content/references/protocol-reference/transactions/transaction-types/paymentchannelclaim.md +++ b/content/references/protocol-reference/transactions/transaction-types/paymentchannelclaim.md @@ -56,7 +56,7 @@ The **destination address** of a channel can: | `Signature` | String | Blob | _(Optional)_ The signature of this claim, as hexadecimal. The signed message contains the channel ID and the amount of the claim. Required unless the sender of the transaction is the source address of the channel. | | `PublicKey` | String | Blob | _(Optional)_ The public key used for the signature, as hexadecimal. This must match the `PublicKey` stored in the ledger for the channel. Required unless the sender of the transaction is the source address of the channel and the `Signature` field is omitted. (The transaction includes the public key so that `rippled` can check the validity of the signature before trying to apply the transaction to the ledger.) | -If the payment channel was created before the [fixPayChanRecipientOwnerDir amendment](known-amendments.html#fixpaychanrecipientownerdir) became enabled (on 2020-05-01), it is possible that the destination of the payment channel has been [deleted](accounts.html#deletion-of-accounts) and does not currently exist in the ledger. If the destination has been deleted, the source account cannot send XRP from the channel to the destination; instead, the transaction fails with `tecNO_DST`. (And, of course, the deleted account cannot send any transactions at all.) Other uses of this transaction type are unaffected when the destination account has been deleted, including adjusting the channel expiration, closing a channel with no XRP, or removing a channel that has passed its expiration time. +If the payment channel was created before the [fixPayChanRecipientOwnerDir amendment](known-amendments.html#fixpaychanrecipientownerdir) became enabled (on 2020-05-01), it is possible that the destination of the payment channel has been [deleted](deleting-accounts.html) and does not currently exist in the ledger. If the destination has been deleted, the source account cannot send XRP from the channel to the destination; instead, the transaction fails with `tecNO_DST`. (And, of course, the deleted account cannot send any transactions at all.) Other uses of this transaction type are unaffected when the destination account has been deleted, including adjusting the channel expiration, closing a channel with no XRP, or removing a channel that has passed its expiration time. ## PaymentChannelClaim Flags diff --git a/content/references/protocol-reference/transactions/transaction-types/paymentchannelfund.md b/content/references/protocol-reference/transactions/transaction-types/paymentchannelfund.md index 799a0ec5bf..23d64d8bae 100644 --- a/content/references/protocol-reference/transactions/transaction-types/paymentchannelfund.md +++ b/content/references/protocol-reference/transactions/transaction-types/paymentchannelfund.md @@ -10,7 +10,7 @@ labels: _Added by the [PayChan amendment][]._ -Add additional [XRP](xrp.html) to an open [payment channel](payment-channels.html), and optionally update the expiration time of the channel. Only the source address of the channel can use this transaction. +Add additional [XRP](what-is-xrp.html) to an open [payment channel](payment-channels.html), and optionally update the expiration time of the channel. Only the source address of the channel can use this transaction. Example PaymentChannelFund: diff --git a/content/resources/contribute-code/contribute-code.ja.md b/content/resources/contribute-code/contribute-code.ja.md new file mode 100644 index 0000000000..6ed2e97919 --- /dev/null +++ b/content/resources/contribute-code/contribute-code.ja.md @@ -0,0 +1,94 @@ +--- +html: contribute-code.html +parent: resources.html +blurb: XRP Ledgerプロトコルにどのように機能を実装するかを学びます。 +labels: + - ブロックチェーン +--- +# コードへの貢献 + +XRP Ledgerを動かすソフトウェアはオープンソースです。誰でもダウンロードし、変更し、拡張し、調査することができます。もしあなたがコードに貢献したいのであれば、コミュニティと協力してあなたの変更の仕様を定義し、XRP Ledgerのプロトコルとブロックチェーンの一部になる前にコードをテストすることが重要です。 + +# コアサーバのソースコード + +XRP Ledgerを動かすソフトウェアはオープンソースです。コミュニティが参加することで、より良いものが生まれます。[ドキュメント](docs.html)内の"[Source]"リンクから関連するソースコードに直接ジャンプしたり、GitHubでソースコードを閲覧することができます: + +| XRP Ledger ソースコード | | +|:-----------------------|:----------------------------------------------------| +| リポジトリ | | +| ライセンス | [Multiple; ISC (permissive)](https://github.com/XRPLF/rippled/blob/develop/LICENSE.md) | +| プログラム言語 | C++ | + +何から始めたらいいか分からないという方のために、Dev Null Productionsは、XRP Ledgerサーバー(`rippled`)のコア実装の仕組みや機能を説明した、詳細かつ充実した[**ソースコード・ガイド**](https://xrpintel.com/source)を提供しています。 + + +## XRP Ledgerの規格 + +`rippled`に対する変更はXRP Ledger Standard (XLS)、つまり変更の仕様を特定し詳細に記述した文書によって管理されます。開発にコミットする前に、[XRPL-Standardsリポジトリ](https://github.com/XRPLF/XRPL-Standards/discussions)で議論を始める必要があります。これにより、コミュニティはあなたの変更に関して議論し、フィードバックを提供する機会を得ることができます。 + +**注記:*** バグ修正にはXLSは必要ありませんが、Amendmentが必要になる場合があります。 + +XLSの作成には独自のプロセスがありますが、簡単にまとめると次のようになります: + +1. ディスカッションを開始し、フィードバックを集めます。 +2. StandardリポジトリにXLSドラフトを作成します。 +3. XLSドラフトを仕様候補として公開します。 + +詳細については、[XLS貢献ガイド](https://github.com/XRPLF/XRPL-Standards/blob/master/CONTRIBUTING.md) をご覧ください。 + + +## Amendmentの実装 + +XLSドラフトを作成した後、その変更にAmendmentが必要かどうかを判断する必要があります。特に次のような**トランザクション処理**に影響する変更にはAmendment が必要です。 + +- レジャールールを変更し、異なる結果をもたらすもの。 +- トランザクションの追加または削除。 +- コンセンサスへの影響がある変更。 + +**注記:** 変更にAmendmentが必要ない場合、そのままコーディングとデプロイに進むことができます。 + +コードをAmendmentとして実装するには、次のファイルにAmendment情報を追加する必要があります。 + +- **Feature.cpp**: + + 開発が完了するまで、`Supported`パラメータは`no`に設定してください。 + + バグの修正の場合、`DefaultVote`パラメータを`yes`に設定する必要があります。 + +- **Feature.h**: `numFeatures` カウンタを増やし、`extern uint256 const` 変数を宣言します。 + + +## コーディングとデプロイ + +一般的な開発プロセスは以下の通りです。 + +1. コードを開発するためにはまず、[`rippled` リポジトリ](https://github.com/XRPLF/rippled) をフォークまたはブランチを作成します。 + + **ヒント:** 何から始めたらいいかわからない場合は、_Dev Null Productions_ が詳細かつ充実した [`rippled` ソースコードガイド](https://xrpintel.com/source) を提供しています。 + +2. 単体テストと統合テストを実行します。独立した環境で作業をテストするにはスタンドアロンモードでサーバを実行するのが良いでしょう。 + +3. `XRPLF:develop`にプルリクエストを作成します。 + + **Amendment向けの注記:** **Feature.cpp**の`Supported`パラメータを`yes`に更新します。 + +4. プルリクエストがXRP Ledgerのメンテナによって承認されると、あなたのコードは`develop`にマージされ、Devnet上で追加のテストを行うことができます。 + + **Amendment向けの注記:** + - `DefaultVote`パラメータはロックされます。 + - もしAmendmentに問題が見つかれば、Amendmentの修正と新しいPRの提出を再度行う必要があります。新しいPRでは`DefaultVote`を変更することができます。 + +年に4回、`develop`で承認されたPRからリリース候補がビルドされます。このパッケージはTestnetとMainnet上のいくつかのノードにデプロイされます。リリース候補に問題がなければ、コードは`master`にマージされ、メインネット上のノードはこのビルドにアップグレードできます。 + +6. 新しいAmendmentは合意形成プロセスを経て、バリデーターがそのAmendmentを有効にするかどうかを投票します。 + + +## コードのフローチャート + +![コードのフローチャート](img/Contribute Code Flowchart.png) + + +## 関連項目 + +- **コンセプト:** + - [Amendment](amendments.html) diff --git a/content/concepts/consensus-network/amendments/contribute-code-flow.md b/content/resources/contribute-code/contribute-code.md similarity index 68% rename from content/concepts/consensus-network/amendments/contribute-code-flow.md rename to content/resources/contribute-code/contribute-code.md index c51f1ae044..4740e40436 100644 --- a/content/concepts/consensus-network/amendments/contribute-code-flow.md +++ b/content/resources/contribute-code/contribute-code.md @@ -1,13 +1,25 @@ --- -html: contribute-code-flow.html -parent: amendments.html -blurb: +html: contribute-code.html +parent: resources.html +blurb: Learn how features can be coded into the XRP Ledger protocol. labels: - Blockchain --- -# Contribute Code to the XRP Ledger +# Contribute Code -The software that powers the XRP Ledger is open source. Anyone can download, modify, extend, or explore it. If you want to contribute code, it's important to work with the community to define the specifications of your changes and test the code before adding it to `rippled`. +The software that powers the XRP Ledger is open source. Anyone can download, modify, extend, or explore it. If you want to contribute code, it's important to work with the community to define the specifications of your changes and test the code before it becomes a part of the XRP Ledger protocol and blockchain. + +## Core Server Source + +The software that powers the XRP Ledger is open-source, so anyone can download, modify, extend, or explore it. Community involvement makes it better. Look for "[Source]" links in the [documentation](docs.html) to jump directly into the related source code, or browse the source code on GitHub: + +| XRP Ledger Source Code | | +|:-----------------------|:----------------------------------------------------| +| Repository | | +| License | [Multiple; ISC (permissive)](https://github.com/ripple/rippled/blob/develop/LICENSE.md) | +| Programming Language | C++ | + +If you're not sure where to start, Dev Null Productions provides a detailed and thorough [**Source Code Guide**](https://xrpintel.com/source) that describes the structure and functions of the core XRP Ledger server (`rippled`) implementation. ## XRP Ledger Standards @@ -27,7 +39,7 @@ For details, see the [XLS contributing guide](https://github.com/XRPLF/XRPL-Stan ## Amendment Implementation -After you've created an XLSd, you now need to determine if your change requires an amendment. Changes that affect **transaction processing** require amendments, specifically changes that: +After you've created an XLS draft, you now need to determine if your change requires an amendment. Changes that affect **transaction processing** require amendments, specifically changes that: - Modify ledger rules, resulting in different outcomes. - Add or remove transactions. diff --git a/content/resources/contribute-code/create-custom-transactors.ja.md b/content/resources/contribute-code/create-custom-transactors.ja.md new file mode 100644 index 0000000000..167cbba8ce --- /dev/null +++ b/content/resources/contribute-code/create-custom-transactors.ja.md @@ -0,0 +1,389 @@ +--- +html: create-custom-transactors.html +parent: contribute-code.html +blurb: XRPレジャーとやり取りするためのカスタムトランザクタを作成します。 +labels: + - 開発 + - ブロックチェーン +--- +# カスタムトランザクタの作成 + +_トランザクタ_ はトランザクションを処理し、XRP Ledgerを変更するコードです。カスタムトランザクタを作成することで、`rippled`に新しい機能を追加することができます。このチュートリアルではトランザクタのコーディングについて説明しますが、それをXRPLに追加するにはAmendmentプロセスを経る必要があります。 [XRPレジャーのコードへの貢献](contribute-code-flow.html)をご覧ください。 + +トランザクタは 基本的な処理順序に則って処理されます。 + +1. シリアライズ型レジャーエントリ(SLE/serialized type ledger entry)の _view_ へアクセスします。 +2. _view_ 内の値を更新、削除、挿入します。 +3. 確定した変更を _view_ からレジャーに適用します。 + +**注記:** _view_ はレジャーのサンドボックスです。トランザクタは必要なエラーチェックと変更のすべてをサンドボックス内で行い、レジャーでは直接行いません。値が確定した後、変更はレジャーにアトミックに適用されます。 + +このチュートリアルでは、既存の`CreateCheck`トランザクションを例として使用します。ソースファイルはここで確認できます。 + +- [ヘッダファイル](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/CreateCheck.h) +- [CPPファイル](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/CreateCheck.cpp) + + +## ヘッダファイル + +次の形式でヘッダーファイルを作成します。 + +```c++ +namespace ripple { + +class CreateCheck : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit CreateCheck(ApplyContext& ctx) : Transactor(ctx) + { + } + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace ripple +``` + +`ApplyContext`でトランザクタを初期化すると、トランザクタは以下にアクセスできます: + +- トランザクタをトリガーしたトランザクション。 +- SLEのビュー。 +- エラーを記録するためのジャーナル。 + + +## CPPファイル + +### 1. `preflight`関数の追加 + +`preflight`関数はレジャーにアクセスする前にトランザクション自体にエラーがないかチェックします。無効なトランザクションや正しく設定されていないトランザクションは拒否されなければなりません。 + +- `PreflightContext`はレジャーのビューを持っていません。 +- レジャーやトランザクションからフィールドを取得するには、次のようにブラケット記法を使用します。 + + auto const curExpiration = (*sle*)[~sfExpiration]; + (*sle)[sfBalance] = (*sle)[sfBalance] + reqDelta; + + **注記:** `~`記号は optional型を返します。 + +- レジャーとトランザクションのスキーマはこちらから確認できます。 + - [`LedgerFormats.cpp`](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/LedgerFormats.cpp) + - [`TxFormats.cpp`](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp) + +-` rippled` はトランザクションの結果を結果コードで表します。[トランザクションの結果](transaction-results.html)をご覧ください。 + +```c++ +CreateCheck::preflight(PreflightContext const& ctx) +{ + // Check if this amendment functionality is enabled on the network. + if (!ctx.rules.enabled(featureChecks)) + return temDISABLED; + + NotTEC const ret{preflight1(ctx)}; + if (!isTesSuccess(ret)) + return ret; + + if (ctx.tx.getFlags() & tfUniversalMask) + { + // There are no flags (other than universal) for CreateCheck yet. + JLOG(ctx.j.warn()) << "Malformed transaction: Invalid flags set."; + return temINVALID_FLAG; + } + if (ctx.tx[sfAccount] == ctx.tx[sfDestination]) + { + // They wrote a check to themselves. + JLOG(ctx.j.warn()) << "Malformed transaction: Check to self."; + return temREDUNDANT; + } + + { + STAmount const sendMax{ctx.tx.getFieldAmount(sfSendMax)}; + if (!isLegalNet(sendMax) || sendMax.signum() <= 0) + { + JLOG(ctx.j.warn()) << "Malformed transaction: bad sendMax amount: " + << sendMax.getFullText(); + return temBAD_AMOUNT; + } + + if (badCurrency() == sendMax.getCurrency()) + { + JLOG(ctx.j.warn()) << "Malformed transaction: Bad currency."; + return temBAD_CURRENCY; + } + } + + if (auto const optExpiry = ctx.tx[~sfExpiration]) + { + if (*optExpiry == 0) + { + JLOG(ctx.j.warn()) << "Malformed transaction: bad expiration"; + return temBAD_EXPIRATION; + } + } + + return preflight2(ctx); +} +``` + + +### 2. `preclaim`関数の追加 + +`preclaim`関数は、現在のレジャーの情報を見る必要があるエラーをチェックします。 + +- このステップが結果コード`tesSUCCESS`または`tec`を返した場合、トランザクションはキューに入れられ、ピアに送信されます。 + +```c++ +CreateCheck::preclaim(PreclaimContext const& ctx) +{ + AccountID const dstId{ctx.tx[sfDestination]}; + + // Use the `keylet` function to get the key of the SLE. Views have either `read` or `peek` access. + // `peek` access allows the developer to modify the SLE returned. + auto const sleDst = ctx.view.read(keylet::account(dstId)); + if (!sleDst) + { + JLOG(ctx.j.warn()) << "Destination account does not exist."; + return tecNO_DST; + } + + auto const flags = sleDst->getFlags(); + + // Check if the destination has disallowed incoming checks + if (ctx.view.rules().enabled(featureDisallowIncoming) && + (flags & lsfDisallowIncomingCheck)) + return tecNO_PERMISSION; + + if ((flags & lsfRequireDestTag) && !ctx.tx.isFieldPresent(sfDestinationTag)) + { + // The tag is basically account-specific information we don't + // understand, but we can require someone to fill it in. + JLOG(ctx.j.warn()) << "Malformed transaction: DestinationTag required."; + return tecDST_TAG_NEEDED; + } + + { + STAmount const sendMax{ctx.tx[sfSendMax]}; + if (!sendMax.native()) + { + // The currency may not be globally frozen + AccountID const& issuerId{sendMax.getIssuer()}; + if (isGlobalFrozen(ctx.view, issuerId)) + { + JLOG(ctx.j.warn()) << "Creating a check for frozen asset"; + return tecFROZEN; + } + // If this account has a trustline for the currency, that + // trustline may not be frozen. + // + // Note that we DO allow create check for a currency that the + // account does not yet have a trustline to. + AccountID const srcId{ctx.tx.getAccountID(sfAccount)}; + if (issuerId != srcId) + { + // Check if the issuer froze the line + auto const sleTrust = ctx.view.read( + keylet::line(srcId, issuerId, sendMax.getCurrency())); + if (sleTrust && + sleTrust->isFlag( + (issuerId > srcId) ? lsfHighFreeze : lsfLowFreeze)) + { + JLOG(ctx.j.warn()) + << "Creating a check for frozen trustline."; + return tecFROZEN; + } + } + if (issuerId != dstId) + { + // Check if dst froze the line. + auto const sleTrust = ctx.view.read( + keylet::line(issuerId, dstId, sendMax.getCurrency())); + if (sleTrust && + sleTrust->isFlag( + (dstId > issuerId) ? lsfHighFreeze : lsfLowFreeze)) + { + JLOG(ctx.j.warn()) + << "Creating a check for destination frozen trustline."; + return tecFROZEN; + } + } + } + } + if (hasExpired(ctx.view, ctx.tx[~sfExpiration])) + { + JLOG(ctx.j.warn()) << "Creating a check that has already expired."; + return tecEXPIRED; + } + return tesSUCCESS; +} +``` + + +### 3. Add a `doApply()` function. + +The `doApply()` function has read/write access, enabling you to modify the ledger. + +```c++ +CreateCheck::doApply() +{ + auto const sle = view().peek(keylet::account(account_)); + if (!sle) + return tefINTERNAL; + + // A check counts against the reserve of the issuing account, but we + // check the starting balance because we want to allow dipping into the + // reserve to pay fees. + { + STAmount const reserve{ + view().fees().accountReserve(sle->getFieldU32(sfOwnerCount) + 1)}; + + if (mPriorBalance < reserve) + return tecINSUFFICIENT_RESERVE; + } + + // Note that we use the value from the sequence or ticket as the + // Check sequence. For more explanation see comments in SeqProxy.h. + std::uint32_t const seq = ctx_.tx.getSeqProxy().value(); + Keylet const checkKeylet = keylet::check(account_, seq); + auto sleCheck = std::make_shared(checkKeylet); + + sleCheck->setAccountID(sfAccount, account_); + AccountID const dstAccountId = ctx_.tx[sfDestination]; + sleCheck->setAccountID(sfDestination, dstAccountId); + sleCheck->setFieldU32(sfSequence, seq); + sleCheck->setFieldAmount(sfSendMax, ctx_.tx[sfSendMax]); + if (auto const srcTag = ctx_.tx[~sfSourceTag]) + sleCheck->setFieldU32(sfSourceTag, *srcTag); + if (auto const dstTag = ctx_.tx[~sfDestinationTag]) + sleCheck->setFieldU32(sfDestinationTag, *dstTag); + if (auto const invoiceId = ctx_.tx[~sfInvoiceID]) + sleCheck->setFieldH256(sfInvoiceID, *invoiceId); + if (auto const expiry = ctx_.tx[~sfExpiration]) + sleCheck->setFieldU32(sfExpiration, *expiry); + + view().insert(sleCheck); + + auto viewJ = ctx_.app.journal("View"); + // If it's not a self-send (and it shouldn't be), add Check to the + // destination's owner directory. + if (dstAccountId != account_) + { + auto const page = view().dirInsert( + keylet::ownerDir(dstAccountId), + checkKeylet, + describeOwnerDir(dstAccountId)); + + JLOG(j_.trace()) << "Adding Check to destination directory " + << to_string(checkKeylet.key) << ": " + << (page ? "success" : "failure"); + + if (!page) + return tecDIR_FULL; + + sleCheck->setFieldU64(sfDestinationNode, *page); + } + + { + auto const page = view().dirInsert( + keylet::ownerDir(account_), + checkKeylet, + describeOwnerDir(account_)); + + JLOG(j_.trace()) << "Adding Check to owner directory " + << to_string(checkKeylet.key) << ": " + << (page ? "success" : "failure"); + + if (!page) + return tecDIR_FULL; + + sleCheck->setFieldU64(sfOwnerNode, *page); + } + // If we succeeded, the new entry counts against the creator's reserve. + adjustOwnerCount(view(), sle, 1, viewJ); + return tesSUCCESS; +} +``` + + +## 追加の関数 + +必要に応じて、カスタムトランザクタにヘルパー関数を追加することができます。特殊な場合に役立つ特別な関数がいくつかあります。 + + +### `calculateBaseFee` + +ほとんどのトランザクションはデフォルトの[Referenceトランザクションコスト](transaction-cost.html)をそのまま引き継ぎます。しかし、トランザクションで通常以外のトランザクションコストを定義する必要がある場合、トランザクションの`calculateBaseFee`メソッドをカスタムメソッドに置き換えることができます。 + +次の例では、`EscrowFinish`ランザクションが条件付きエスクローに対して、フルフィルメントの大きさに応じて追加コストを請求する方法を示しています。 + +```c++ +XRPAmount +EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount extraFee{0}; + + if (auto const fb = tx[~sfFulfillment]) + { + extraFee += view.fees().base * (32 + (fb->size() / 16)); + } + + return Transactor::calculateBaseFee(view, tx) + extraFee; +} +``` + + +### `makeTxConsequences` + +`rippled`は[`TxConsequences`](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/applySteps.h#L41-L44)クラスを使用して、トランザクション適用時のアカウントへの結果を記述します。このクラスは手数料、使用可能な最大XRP、トランザクションによって消費されたシーケンス番号の数を追跡します。結果には次の3つのタイプがあります。 + +- **ノーマル:**トランザクションは署名に影響を与えず、XRP手数料を消費するのみです。手数料を超えてXRPを消費するトランザクションは正常とはみなされません。 +- **ブロッカー:**トランザクションの署名に影響を与え、有効なトランザクションがその後ろにキューイングされるのを防ぎます。 +- **カスタム:**トランザクタは結果を決定するために追加の作業を行う必要があります。 + +`makeTxConsequences`関数を使うと、以下のような状況に対してカスタム結果を作成することができます: + +- XRPを送信する支払い。 +- 複数のシーケンス番号を消費するチケット。 +- 設定されたフラグやフィールドによって、正常またはブロッカーとなるトランザクション。 + +**注記:** `TxConsequences`は[トランザクションキュー](transaction-queue.html)にのみ影響します。トランザクションがレジャーに適用されたときに手数料を請求する可能性が高い場合、それはピアに送信されます。手数料を請求する可能性がない場合、またはそれが判断できない場合は、送信されません。 + + +```c++ +SetAccount::makeTxConsequences(PreflightContext const& ctx) +{ + // The SetAccount may be a blocker, but only if it sets or clears + // specific account flags. + auto getTxConsequencesCategory = [](STTx const& tx) { + if (std::uint32_t const uTxFlags = tx.getFlags(); + uTxFlags & (tfRequireAuth | tfOptionalAuth)) + return TxConsequences::blocker; + + if (auto const uSetFlag = tx[~sfSetFlag]; uSetFlag && + (*uSetFlag == asfRequireAuth || *uSetFlag == asfDisableMaster || + *uSetFlag == asfAccountTxnID)) + return TxConsequences::blocker; + + if (auto const uClearFlag = tx[~sfClearFlag]; uClearFlag && + (*uClearFlag == asfRequireAuth || *uClearFlag == asfDisableMaster || + *uClearFlag == asfAccountTxnID)) + return TxConsequences::blocker; + + return TxConsequences::normal; + }; + + return TxConsequences{ctx.tx, getTxConsequencesCategory(ctx.tx)}; +} +``` + + +## 次のステップ + +新しいトランザクタでサーバを再コンパイルし、[スタンドアロンモード](use-stand-alone-mode.html)でテストしてください。もしAmendmentの後ろにトランザクタをコーディングした場合、設定ファイルを使ってその機能を[強制的に有効にする](test-amendments.html)ことができます。 diff --git a/content/resources/contribute-code/create-custom-transactors.md b/content/resources/contribute-code/create-custom-transactors.md new file mode 100644 index 0000000000..e078b5e24f --- /dev/null +++ b/content/resources/contribute-code/create-custom-transactors.md @@ -0,0 +1,389 @@ +--- +html: create-custom-transactors.html +parent: contribute-code.html +blurb: Create custom transactors to interact with the XRP Ledger. +labels: + - Development + - Blockchain +--- +# Create Custom Transactors + +A _transactor_ is code that processes a transaction and modifies the XRP Ledger. Creating custom transactors enables you to add new functionality to `rippled`. This tutorial walks through coding transactors, but you'll have to go through the amendment process to add it to XRPL. See: [Contribute Code to the XRP Ledger](contribute-code.html). + +Transactors follow a basic order of operations: + +1. Access a _view_ into a serialized type ledger entry (SLE). +2. Update, erase, or insert values in the _view_. +3. Apply the finalized changes from the _view_ to the ledger. + +**Note:** _Views_ are sandboxes into ledgers. Transactors make all necessary error checks and changes in sandboxes, not directly on the ledger. After values are finalized, changes are applied atomically to the ledger. + +This tutorial uses the existing `CreateCheck` transactor as an example. You can view the source files here: + +- [Header File](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/CreateCheck.h) +- [CPP File](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/CreateCheck.cpp) + + +## Header File + +Create a header file in this format: + +```c++ +namespace ripple { + +class CreateCheck : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit CreateCheck(ApplyContext& ctx) : Transactor(ctx) + { + } + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace ripple +``` + +Initializing the transactor with `ApplyContext` gives it access to: + +- The transaction that triggered the transactor. +- A view of the SLE. +- A journal to log errors. + + +## CPP File + +### 1. Add a `preflight` function. + +The `preflight` function checks for errors in the transaction itself before accessing the ledger. It should reject invalid and incorrectly formed transactions. + +- `PreflightContext` doesn't have a view of the ledger. +- Use bracket notation to retrieve fields from ledgers and transactions: + + auto const curExpiration = (*sle*)[~sfExpiration]; + (*sle)[sfBalance] = (*sle)[sfBalance] + reqDelta; + + **Note:** The `~` symbol returns an optional type. + +- You can view ledger and transaction schemas here: + - [`LedgerFormats.cpp`](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/LedgerFormats.cpp) + - [`TxFormats.cpp`](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp) + +- `rippled` summarizes transaction results with result codes. See: [Transaction Results](transaction-results.html) + +```c++ +CreateCheck::preflight(PreflightContext const& ctx) +{ + // Check if this amendment functionality is enabled on the network. + if (!ctx.rules.enabled(featureChecks)) + return temDISABLED; + + NotTEC const ret{preflight1(ctx)}; + if (!isTesSuccess(ret)) + return ret; + + if (ctx.tx.getFlags() & tfUniversalMask) + { + // There are no flags (other than universal) for CreateCheck yet. + JLOG(ctx.j.warn()) << "Malformed transaction: Invalid flags set."; + return temINVALID_FLAG; + } + if (ctx.tx[sfAccount] == ctx.tx[sfDestination]) + { + // They wrote a check to themselves. + JLOG(ctx.j.warn()) << "Malformed transaction: Check to self."; + return temREDUNDANT; + } + + { + STAmount const sendMax{ctx.tx.getFieldAmount(sfSendMax)}; + if (!isLegalNet(sendMax) || sendMax.signum() <= 0) + { + JLOG(ctx.j.warn()) << "Malformed transaction: bad sendMax amount: " + << sendMax.getFullText(); + return temBAD_AMOUNT; + } + + if (badCurrency() == sendMax.getCurrency()) + { + JLOG(ctx.j.warn()) << "Malformed transaction: Bad currency."; + return temBAD_CURRENCY; + } + } + + if (auto const optExpiry = ctx.tx[~sfExpiration]) + { + if (*optExpiry == 0) + { + JLOG(ctx.j.warn()) << "Malformed transaction: bad expiration"; + return temBAD_EXPIRATION; + } + } + + return preflight2(ctx); +} +``` + + +### 2. Add a `preclaim` function. + +The `preclaim` function checks for errors that require viewing information on the current ledger. + +- If this step returns a result code of `tesSUCCESS` or any `tec` result, the transaction will be queued and broadcast to peers. + +```c++ +CreateCheck::preclaim(PreclaimContext const& ctx) +{ + AccountID const dstId{ctx.tx[sfDestination]}; + + // Use the `keylet` function to get the key of the SLE. Views have either `read` or `peek` access. + // `peek` access allows the developer to modify the SLE returned. + auto const sleDst = ctx.view.read(keylet::account(dstId)); + if (!sleDst) + { + JLOG(ctx.j.warn()) << "Destination account does not exist."; + return tecNO_DST; + } + + auto const flags = sleDst->getFlags(); + + // Check if the destination has disallowed incoming checks + if (ctx.view.rules().enabled(featureDisallowIncoming) && + (flags & lsfDisallowIncomingCheck)) + return tecNO_PERMISSION; + + if ((flags & lsfRequireDestTag) && !ctx.tx.isFieldPresent(sfDestinationTag)) + { + // The tag is basically account-specific information we don't + // understand, but we can require someone to fill it in. + JLOG(ctx.j.warn()) << "Malformed transaction: DestinationTag required."; + return tecDST_TAG_NEEDED; + } + + { + STAmount const sendMax{ctx.tx[sfSendMax]}; + if (!sendMax.native()) + { + // The currency may not be globally frozen + AccountID const& issuerId{sendMax.getIssuer()}; + if (isGlobalFrozen(ctx.view, issuerId)) + { + JLOG(ctx.j.warn()) << "Creating a check for frozen asset"; + return tecFROZEN; + } + // If this account has a trustline for the currency, that + // trustline may not be frozen. + // + // Note that we DO allow create check for a currency that the + // account does not yet have a trustline to. + AccountID const srcId{ctx.tx.getAccountID(sfAccount)}; + if (issuerId != srcId) + { + // Check if the issuer froze the line + auto const sleTrust = ctx.view.read( + keylet::line(srcId, issuerId, sendMax.getCurrency())); + if (sleTrust && + sleTrust->isFlag( + (issuerId > srcId) ? lsfHighFreeze : lsfLowFreeze)) + { + JLOG(ctx.j.warn()) + << "Creating a check for frozen trustline."; + return tecFROZEN; + } + } + if (issuerId != dstId) + { + // Check if dst froze the line. + auto const sleTrust = ctx.view.read( + keylet::line(issuerId, dstId, sendMax.getCurrency())); + if (sleTrust && + sleTrust->isFlag( + (dstId > issuerId) ? lsfHighFreeze : lsfLowFreeze)) + { + JLOG(ctx.j.warn()) + << "Creating a check for destination frozen trustline."; + return tecFROZEN; + } + } + } + } + if (hasExpired(ctx.view, ctx.tx[~sfExpiration])) + { + JLOG(ctx.j.warn()) << "Creating a check that has already expired."; + return tecEXPIRED; + } + return tesSUCCESS; +} +``` + + +### 3. Add a `doApply()` function. + +The `doApply()` function has read/write access, enabling you to modify the ledger. + +```c++ +CreateCheck::doApply() +{ + auto const sle = view().peek(keylet::account(account_)); + if (!sle) + return tefINTERNAL; + + // A check counts against the reserve of the issuing account, but we + // check the starting balance because we want to allow dipping into the + // reserve to pay fees. + { + STAmount const reserve{ + view().fees().accountReserve(sle->getFieldU32(sfOwnerCount) + 1)}; + + if (mPriorBalance < reserve) + return tecINSUFFICIENT_RESERVE; + } + + // Note that we use the value from the sequence or ticket as the + // Check sequence. For more explanation see comments in SeqProxy.h. + std::uint32_t const seq = ctx_.tx.getSeqProxy().value(); + Keylet const checkKeylet = keylet::check(account_, seq); + auto sleCheck = std::make_shared(checkKeylet); + + sleCheck->setAccountID(sfAccount, account_); + AccountID const dstAccountId = ctx_.tx[sfDestination]; + sleCheck->setAccountID(sfDestination, dstAccountId); + sleCheck->setFieldU32(sfSequence, seq); + sleCheck->setFieldAmount(sfSendMax, ctx_.tx[sfSendMax]); + if (auto const srcTag = ctx_.tx[~sfSourceTag]) + sleCheck->setFieldU32(sfSourceTag, *srcTag); + if (auto const dstTag = ctx_.tx[~sfDestinationTag]) + sleCheck->setFieldU32(sfDestinationTag, *dstTag); + if (auto const invoiceId = ctx_.tx[~sfInvoiceID]) + sleCheck->setFieldH256(sfInvoiceID, *invoiceId); + if (auto const expiry = ctx_.tx[~sfExpiration]) + sleCheck->setFieldU32(sfExpiration, *expiry); + + view().insert(sleCheck); + + auto viewJ = ctx_.app.journal("View"); + // If it's not a self-send (and it shouldn't be), add Check to the + // destination's owner directory. + if (dstAccountId != account_) + { + auto const page = view().dirInsert( + keylet::ownerDir(dstAccountId), + checkKeylet, + describeOwnerDir(dstAccountId)); + + JLOG(j_.trace()) << "Adding Check to destination directory " + << to_string(checkKeylet.key) << ": " + << (page ? "success" : "failure"); + + if (!page) + return tecDIR_FULL; + + sleCheck->setFieldU64(sfDestinationNode, *page); + } + + { + auto const page = view().dirInsert( + keylet::ownerDir(account_), + checkKeylet, + describeOwnerDir(account_)); + + JLOG(j_.trace()) << "Adding Check to owner directory " + << to_string(checkKeylet.key) << ": " + << (page ? "success" : "failure"); + + if (!page) + return tecDIR_FULL; + + sleCheck->setFieldU64(sfOwnerNode, *page); + } + // If we succeeded, the new entry counts against the creator's reserve. + adjustOwnerCount(view(), sle, 1, viewJ); + return tesSUCCESS; +} +``` + + +## Additional Functions + +You can add more helper functions to your custom transactor as necessary. There are a few special functions that are relevant in special cases. + + +### `calculateBaseFee` + +Most transactions inherit the default [reference transaction cost](transaction-cost.html). However, if your transactor needs to define a non-standard transaction cost, you can replace the transactor's `calculateBaseFee` method with a custom one. + +The following example shows how `EscrowFinish` transactions charge an additional cost on conditional escrows based on the size of the fulfillment: + +```c++ +XRPAmount +EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount extraFee{0}; + + if (auto const fb = tx[~sfFulfillment]) + { + extraFee += view.fees().base * (32 + (fb->size() / 16)); + } + + return Transactor::calculateBaseFee(view, tx) + extraFee; +} +``` + + +### `makeTxConsequences` + +`rippled` uses a [`TxConsequences`](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/applySteps.h#L41-L44) class to describe the outcome to an account when applying a transaction. It tracks the fee, maximum possible XRP spent, and how many sequence numbers are consumed by the transaction. There are three types of consequences: + +- **Normal:** The transactor doesn't affect transaction signing and _only_ consumes an XRP fee. Transactions that spend XRP beyond the fee aren't considered normal. +- **Blocker:** The transactor affects transaction signing, preventing valid transactions from queueing behind it. +- **Custom:** The transactor needs to do additional work to determination consequences. + +The `makeTxConsequences` function enables you to create custom consequences for situations such as: + +- Payments sending XRP. +- Tickets consuming more than one sequence number. +- Transactions that are normal or blockers, depending on flags or fields set. + +**Note:** `TxConsequences` only affects the [transaction queue](transaction-queue.html). If a transaction is likely to claim a fee when applied to the ledger, it will be broadcast to peers. If it's not likely to claim a fee, or that can't be determined, it won't be broadcast. + + +```c++ +SetAccount::makeTxConsequences(PreflightContext const& ctx) +{ + // The SetAccount may be a blocker, but only if it sets or clears + // specific account flags. + auto getTxConsequencesCategory = [](STTx const& tx) { + if (std::uint32_t const uTxFlags = tx.getFlags(); + uTxFlags & (tfRequireAuth | tfOptionalAuth)) + return TxConsequences::blocker; + + if (auto const uSetFlag = tx[~sfSetFlag]; uSetFlag && + (*uSetFlag == asfRequireAuth || *uSetFlag == asfDisableMaster || + *uSetFlag == asfAccountTxnID)) + return TxConsequences::blocker; + + if (auto const uClearFlag = tx[~sfClearFlag]; uClearFlag && + (*uClearFlag == asfRequireAuth || *uClearFlag == asfDisableMaster || + *uClearFlag == asfAccountTxnID)) + return TxConsequences::blocker; + + return TxConsequences::normal; + }; + + return TxConsequences{ctx.tx, getTxConsequencesCategory(ctx.tx)}; +} +``` + + +## Next Steps + +Re-compile the server with your new transactor and test it in [stand-alone mode](use-stand-alone-mode.html). If you coded the transactor behind an amendment, you can [force-enable](test-amendments.html) the feature using the config file. \ No newline at end of file diff --git a/content/resources/contribute-documentation/contribute-documentation.ja.md b/content/resources/contribute-documentation/contribute-documentation.ja.md new file mode 100644 index 0000000000..cef486441e --- /dev/null +++ b/content/resources/contribute-documentation/contribute-documentation.ja.md @@ -0,0 +1,168 @@ +--- +html: contribute-documentation.html +parent: resources.html +blurb: XRP Ledgerドキュメントのコントリビューションガイドです。 +--- +# ドキュメントへの貢献 + +XRP Ledger開発者ポータルへの貢献を検討いただきありがとうございます! + + +私たちは、あなたが興味を持ってくださっていることにとても感動しています。XRP Ledger(XRPL)へ貢献することは、XRPLついて学ぶ素晴らしい機会です。 + +私たちはあなたのプルリクエストを喜んでレビューします。プロセスをできるだけ円滑に進めるため、このドキュメントを読み、記載されているガイドラインに従ってください。 + +## 当サイトについて + +XRPL Dev Portalでは、開発者が開発を開始するためのサンプルコードやその他の情報を含む、XRP Ledgerの包括的なドキュメントを提供しています。 + +本プロジェクトの公式リポジトリはとなっています。投稿の著作権はそれぞれの投稿者に帰属しますが、MIT[ライセンス](https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE)の下で提供されなければなりません。 + + + +## リポジトリの構成 + +- [assets/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/assets) - サイトのテンプレートで使用される静的ファイル。 +- [content/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content) - ドキュメントを構築するために使用されるソースファイル。ほとんどがMarkdownです。 + - [content/\_code-samples/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples) - ドキュメントで使用または参照されているコードサンプル。可能な限り、これらは完全に機能する/実行可能なスクリプトです。 + - [content/\_img-sources/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_img-sources) - ドキュメントで使用されている画像の元ファイル。`.uxf`ファイルは[Umlet](https://www.umlet.com/)で作成されたダイアグラムです。 + - [content/\_snippets/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_snippets) - Dactylプリプロセッサを使用して、他のコンテンツファイルに挿入される再利用可能なMarkdownテキストの断片。 +- [img/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/img) - ドキュメントコンテンツで使用される画像。 +- [template/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/template) - HTMLを構築するためのテンプレートファイル。 +- [tool/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/tool) - フィルター、スタイルチェッカー・ルール等のスクリプト。 +- [styles/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/styles) - assetsフォルダにCSSファイルを生成するための元ファイル(SCSS)。 +- [`dactyl-config.yml`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/dactyl-config.yml) - サイトのメタデータを含むメイン設定ファイル。設定ファイルのフォーマットについては、[設定フォーマット](#設定ファイルのフォーマット)を参照してください。 + +## プルリクエストが承認されるための条件 + +レビューやマージが承認される前に、それぞれのプルリクエストは以下の条件を満たしていなければなりません。 +- インテグレーションテストに合格すること。 +- レビューの準備が整うまで、[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のセットアップ + +ポータルは[Dactyl](https://github.com/ripple/dactyl)を使用して構築されています。 + +Dactylには[Python 3](https://python.org/)が必要です。[pip](https://pip.pypa.io/en/stable/)を使ってインストールしてください: + +``` +pip3 install dactyl +``` + +## サイトの構築 + +このリポジトリでは、[**Dactyl**](https://github.com/ripple/dactyl)を使用して、すべてのドキュメントのHTMLをビルドしています。[Dactylのセットアップ](#dactylのセットアップ)を行った後、プロジェクトのルートディレクトリからサイトをビルドすることができます。 + +``` +dactyl_build +``` + +生成されたコンテンツは`out/`ディレクトリに出力されます。これらのコンテンツはウェブブラウザでファイルとして開いたり、ウェブサーバで静的コンテンツとして扱うことができます。 + +ルートディレクトリからリンクチェックやスタイルチェックを実行することもできます。 + +リンクチェックは出力フォルダを空にしてからビルドしてください。 + +``` +dactyl_link_checker +``` + +スタイルチェックは実験的なものです。 + +``` +dactyl_style_checker +``` + +## 設定ファイルのフォーマット + +このリポジトリでは、`dactyl-config.yml`ファイルのメタデータとページの[frontmatter](https://dactyl.link/frontmatter.html)を使って、ヘッダー、フッター、サイドバー、パンくずリストなどのナビゲーション要素を生成します。 + +新しいページを追加する場合、`dactyl-config.yml`ファイルのpages配列の適切な位置に追加する必要があります。追加例は次のようになります。 + +```yaml + - md: concepts/the-rippled-server/the-rippled-server.md + targets: + - en + - ja # 翻訳コンテンツがない場合、全てのターゲットを対象とします。 +``` + +Markdownファイル自体は、以下のようなfrontmatterで始まる必要があります。 + +```yaml +--- +html: the-rippled-server.html +parent: concepts.html +template: pagetype-category.html.jinja +blurb: 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`フィールドも必要です)。ここに、またはページの設定ファイルのエントリに任意のキーと値のペアを記述することができますが、以下のものが関係しています。 + +### 規約 + +ページを作成する際には、以下の規約に従ってください。 + +- HTMLのファイル名とMDのファイル名は、拡張子を除いて完全に一致していなければなりません。 +- ファイル名は"and"や"the"のような単語を含め、ページのタイトルと密接に一致する必要がありますが、スペースや句読点の代わりにハイフンを使用し、すべて小文字にする必要があります。例えば、`cash-a-check-for-an-exact-amount.md`のようにします。ページのタイトルを変更した場合は、ファイル名も変更する必要があります。(すでに別のURLで公開されている場合は、古いURLからのリダイレクトを残してください) +- 常にh1ヘッダーでページを始めます。 +- ページの一番上のh1アンカーにはリンクせず、アンカーなしでページ自体にリンクしてください。これは翻訳時のリンク切れを防ぐのに役立ちます。以降のヘッダーへのリンクは問題ありません。 +- ページのタイトルに書式( _italics_ や`code font`など)を使わないでください。 +- Markdownファイルのテキストを折り返さないでください。 +- コードサンプルの場合、行は80文字以下になるようにしてください。 +- 迷ったら、[Ciro SantilliのMarkdownスタイルガイド (Writability Profile)](https://cirosantilli.com/markdown-style-guide/)に従ってください。 +- ランディングページはサブフォルダに入れ、フォルダと同じファイル名とします。例えば、"Accounts"ページグループのランディングページは`accounts/accounts.md`で、HTMLファイル名は`accounts.html`です。 + + **注意:** `index.md`は利用しないでください。 + +- Markdownやコードサンプルでは、インデントにタブ文字を使用しないでください。**JavaScript**のコードサンプルでは、1字下げにつき2個のスペースを使用してください。 + +### 技術用語 + +以下の単語やフレーズを説明通りに使用してください。 + +| 用語 | 避けるべき用語 | 備考 | +|-------------------|----------------|-------| +| API, APIs | API's, RPC | Application Programming Interface (アプリケーション・プログラミング・インターフェース)、ソフトウェアが他のソフトウェアと接続するための機能と定義のセット。 | +| コアサーバ, XRP Ledgerのコアサーバ | `rippled` | `rippled`という名前は近い将来廃止される可能性が高いので、より一般的な名前で呼ぶことを推奨します。必要なときは、`rippled` をすべて小文字で、コードフォントで呼んでください。(発音は "リップルディー" で、"d" は UNIX の伝統に従って"daemon"を意味します)。 +| 金融機関 | 銀行, FI, PSP (決済サービスプロバイダ) | この用語は、_銀行_ や他の用語よりも幅広いビジネスを包含し、業界の専門用語の理解に依存しません。 | +| レジャーエントリ | レジャーオブジェクト, ノード | XRP Ledgerの状態データ内の単一のオブジェクト。_レジャーオブジェクト_ という用語は、これらの一つを指すこともあれば、レジャー全体を指すこともあります。レジャーの状態データはグラフとして想定できるため、_ノード_ という用語が使われることもありましたが、_ノード_ には他の用途もあるため、混乱を招きます。 | +| 流動性提供者 | マーケットメイカー | 2つの通貨または資産間の売買を提供し、多くの場合、取引間の価格差から利益を得る企業または個人。マーケットメーカーという用語は、法域によっては特定の法律上の定義があり、すべての同じ状況で適用されるとは限りません。 | +| 悪質業者 | ハッカー | 個人、組織、または自動化されたツールなどによる、機密情報の取得、暗号化の解除、サービスの拒否、その他の安全なリソースへの攻撃を試みる可能性のあるもの。 | +| PostgreSQL | Postgres | リレーショナルデータベース・ソフトウェアの特定のブランド。非公式な短いバージョンではなく、常に完全な名前を使用します。 | +| オーダーブック | オファーブック | マッチングされ約定されるのを待っているトレード注文のコレクション。通常は取引レートごとにソートされています。 | +| サーバ | ノード | サーバとは、ソフトウェアやハードウェアのことで、特にXRP Ledgerのピアツーピアネットワークに接続するものを指します。_ノード_ という用語はこの目的のために使われることもありますが、グラフのエントリやJavaScriptインタプリタであるNode.jsなど、他の意味でも多用されます。 | +| ステーブルコイン発行者 | ゲートウェイ | 発行者とは、XRP Ledgerにおいてトークンを発行する組織です。ステーブルコインとは、発行者が外部の資産(例えば不換紙幣)に完全に裏付けられていることを約束しているトークンのことで、ステーブルコインの発行者は、その2つの資産を(場合によっては手数料を払って)交換する入出金操作を提供します。以前は、このユースケースを表現するために(特にリップル社によって)_ゲートウェイ_ という用語が使用されていましたが、業界の他の部分は代わりに _ステーブルコイン発行者_ を採用しました。 | +| トランザクションコスト | トランザクション手数料 | XRP Ledgerでトランザクションを送信するために消費されるXRPの金額。これはトランザクションの`Fee`フィールドで指定されますが、_手数料_ という用語は誰かにお金を支払うことを意味するため、_コスト_ の方が望ましいです。 | +| トークン | IOU, issuances, issues, 発行済み通貨 | XRP Ledgerのトークンは、_IOU_ という名前から想像されるように、レジャーの外部にある価値を表すことはできません。必要であれば、_代替可能トークン_ を使用して、非代替性トークン(NFT)と区別してください。 | +| ウォレット | ウォレット | 文脈によっては、_ウォレット_ はハードウェア、ソフトウェア、暗号鍵ペア、またはオンラインサービスを指します。意味が明確になるように十分な文脈を提供するか、_キーペア_ や _クライアントアプリケーション_ などの別の表現を使用してください。 | +| XRP | Ripple, リップル | XRPレジャーのネイティブデジタルアセットまたは暗号通貨。XRPはレジャーの外部の価値を表すトークンではありません。 | +| XRP Ledger | Ripple, リップル, Ripple Network, リップルネットワーク, RCL | XRP Ledgerは、過去に様々な場面で「リップルネットワーク」や「リップルコンセンサスレジャー」あるいは「RCL」と呼ばれていました。これらの名称は、コアサーバーのリファレンス実装を開発しているRipple(Ripple Labs)の社名と類似しているため、紛らわしく、廃止されました。 | +| XRPL | XRPL | _XRP Ledger_ の略です。_XRPL_ は不明瞭で、_XRP_ のタイプミスのように見えることがあります。 | + +## Frontmatterのフィールド + +このリポジトリのMarkdownファイルのfronmatterは任意のキーと値のペアを含むことができます。以下のフィールドは特定の用途や意味を持ちます。 + +| フィールド | 型 | 内容 | +|:---------------------|:-----------------|:-----------------------------------| +| `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`を使用してください。 | diff --git a/content/resources/contribute-documentation/contribute-documentation.md b/content/resources/contribute-documentation/contribute-documentation.md new file mode 100644 index 0000000000..e3e746752d --- /dev/null +++ b/content/resources/contribute-documentation/contribute-documentation.md @@ -0,0 +1,171 @@ +--- +html: contribute-documentation.html +parent: resources.html +blurb: Contribution guides for XRP Ledger documentation. +--- +# Contribute Documentation + +Thanks for considering a contribution to the XRP Ledger Developer Portal! + +We're thrilled you're interested and your help is greatly appreciated. Contributing is a great way to learn about the XRP Ledger (XRPL). + +We are happy to review your pull requests. To make the process as smooth as possible, please read this document and follow the stated guidelines. + + +## About This Site + +The XRPL Dev Portal provides comprehensive documentation of the the XRP Ledger, including sample code and other information for developers to start building. + +The official source repository for the site is at . Contributions are copyright their respective contributors, but must be provided under the MIT [LICENSE](https://github.com/XRPLF/xrpl-dev-portal/blob/master/LICENSE). + + + +## Repository Layout + +- [assets/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/assets) - Static files used by the site's templates. +- [content/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content) - Source files used to build the documentation. Mostly in Markdown. + - [content/\_code-samples/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples) - Code samples used or referenced by the documentation. Where possible, these are fully functional / executable scripts. + - [content/\_img-sources/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_img-sources) - Source files for images used in the documentation. Any `.uxf` files are diagrams made with [Umlet](https://www.umlet.com/). + - [content/\_snippets/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_snippets) - Reusable chunks of Markdown text that are included in other content files, using the Dactyl preprocessor. +- [img/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/img) - Images used by the documentation contents. +- [template/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/template) - Template files for building the HTML outputs. +- [tool/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/tool) - Filters, style-checker rules, and other scripts. +- [styles/](https://github.com/XRPLF/xrpl-dev-portal/tree/master/styles) - Source files (SCSS) to generate the CSS files in the assets folder. +- [`dactyl-config.yml`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/dactyl-config.yml) - Main config file, which contains the metadata for the site. For information on our conventions, see [Config Formatting](#config-formatting). + +## Requirements for a Successful Pull Request + +Before being considered for review or merging, each pull request must: +- Pass continuous integration tests. +- Be [marked as drafts](https://github.blog/2019-02-14-introducing-draft-pull-requests/) until they are ready for review. +- Adhere to the [code of conduct](https://github.com/XRPLF/xrpl-dev-portal/blob/master/CODE_OF_CONDUCT.md) for this repository. + +## Dactyl Setup + +The portal is built using [Dactyl](https://github.com/ripple/dactyl). + +Dactyl requires [Python 3](https://python.org/). Install it with [pip](https://pip.pypa.io/en/stable/): + +``` +pip3 install dactyl +``` + +## Building the Site + +This repo uses [**Dactyl**](https://github.com/ripple/dactyl) to build HTML display versions of all the documentation. After you've done the [Dactyl Setup](#dactyl-setup), you can build the site from the project root directory: + +``` +dactyl_build +``` + +This outputs the generated contents to the `out/` directory. These contents can be opened in a web browser as files or served as static content by a web server. + +You can also run link checking or style checking from the root directory. + +Link checking should be run after emptying the output folder and then building: + +``` +dactyl_link_checker +``` + +Style checking is experimental: + +``` +dactyl_style_checker +``` + +## Config Formatting + +The templates in this repository use metadata from the `dactyl-config.yml` file as well as the pages' [frontmatter](https://dactyl.link/frontmatter.html) to generate navigation elements in the site, including header, footer, sidebars, and breadcrumbs. + +If you add a new page, you must add it to the appropriate page in the pages array of the `dactyl-config.yml` file. An example entry looks like this: + +```yaml + - md: concepts/the-rippled-server/the-rippled-server.md + targets: + - en + - ja # Include in all targets unless you have a translation +``` + +The Markdown file itself should start with a frontmatter stanza such as the following: + +```yaml +--- +html: the-rippled-server.html +parent: concepts.html +template: pagetype-category.html.jinja +blurb: 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. +--- +``` + +Most pages should have `html`, `parent` and `blurb` fields in the frontmatter, and the `md` and `targets` fields in the config file. For a fill list + +### Conventions + +Use the following conventions when creating a page: + +- The HTML filename and MD filename should match exactly except for the file extension. +- The filenames should closely match the title of the page, including words like "and" and "the", but should be in all lowercase with hyphens instead of spaces and punctuation. For example, `cash-a-check-for-an-exact-amount.md`. If you change the title of a page, change the filename too. (If it has already been published at another URL, leave a redirect from the old URL.) +- Always start a page with a h1 header. +- Don't link to the top h1 anchor of a page, link to the page itself without an anchor. This helps prevent broken links in translation. It's OK to link to later headers. +- Don't use any formatting (like _italics_ or `code font`) in the title of the page. +- Don't hard-wrap text in Markdown files. +- For code samples, try to keep lines no longer than 80 columns wide. +- When in doubt, follow [Ciro Santilli's Markdown Style Guide (Writability Profile)](https://cirosantilli.com/markdown-style-guide/). +- Landing pages should be in subfolders and should have the same filename as the folder. For example, the landing page of the "Accounts" page group should be `accounts/accounts.md` with the HTML filename `accounts.html`. + + **Warning:** Don't use `index.md`. + +- Don't use tab characters for indentation in Markdown or code samples. Use 4 spaces per indent, except in **JavaScript** code samples, which should use 2 spaces per indent. + +### Terminology + +Use the following words and phrases as described: + +| Term | Terms to Avoid | Notes | +|-------------------|----------------|-------| +| API, APIs | API's, RPC | Application Programming Interface, a set of functions and definitions for software to connect to other software. | +| core server, core XRP Ledger server | `rippled` | The `rippled` name is probably going to be retired in the near future, so it's better to refer to it by the more generic name. When necessary, refer to `rippled` in all lowercase and code font. (It's pronounced "ripple dee", and the "d" stands for "daemon" per UNIX tradition.) +| financial institution | bank, FI, PSP (payment services provider) | This term encompasses a wider range of businesses than just _bank_ or other terms and does not rely on an understanding of industry jargon. | +| ledger entry | ledger object, node | A single object inside the state data of the XRP Ledger. The term _ledger object_ could refer to one of these or to the whole ledger. The term _node_ was sometimes used for this case because the ledger's state data can be envisioned as a graph, but this is confusing because _node_ has other uses. | +| liquidity provider | market maker | A business or individual who offers to exchange between two currencies or assets, often deriving income from the price differential between trades. The term _market maker_ has a specific legal definition in some jurisdictions and may not apply in all the same circumstances. | +| malicious actor | hacker | A person, organization, or even an automated tool which might attempt to acquire secrets, break encryption, deny service, or otherwise attack a secure resource. | +| a NFT | an NFT | A NFT object in the XRP Ledger tracks or represents a non-fungible token. Pronounced "nifty" and written _a NFT_ rather than _an NFT_. | +| PostgreSQL | Postgres | A specific brand of relational database software. Always use the full name, not an informal short version. | +| order book | orderbook, offer book | A collection of trade orders waiting to be matched and executed, typically sorted by exchange rate. Use two words. | +| server | node | A server is software and/or hardware, especially the ones that connect to the XRP Ledger peer-to-peer network. The term _node_ is sometimes used for this purpose but is also overloaded with other meanings including entries in a graph and Node.js, a JavaScript interpreter. | +| stablecoin issuer | gateway | An issuer is the organization that issues a token in the XRP Ledger. A stablecoin is a token where the issuer promises that it is fully backed by some outside asset (such as fiat currency), with the stablecoin issuer providing deposit and withdraw operations to convert between the two (possibly for a fee). Previously the term _gateway_ was used (especially by Ripple, the company) to describe this use case, but the rest of the industry adopted _stablecoin issuer_ instead. | +| transaction cost | transaction fee | The amount of XRP burnt to send a transaction in the XRP Ledger. Even though this is specified in the `Fee` field of transactions, the term _fee_ implies that the money is paid to someone, so _cost_ is preferable. |_ +| trust line | trustline | Use two words. A trust line is a relationship between two accounts in the XRP Ledger that tracks a balance of tokens between those accounts. | +| tokens | IOUs, issuances, issues, issued currencies | A token in the XRP ledger may not represent money owed outside of the ledger as the name _IOU_ implies. Specify _fungible tokens_ if necessary to distinguish from non-fungible tokens. | +| wallet | wallet | Depending on the context, _wallet_ could refer to hardware, software, a cryptographic key pair, or an online service. Be sure to provide enough context that the meaning is clear, or use an alternative such as _key pair_ or _client application_. | +| WebSocket | web socket, Websockets | A two way protocol for communication on the web. Always singular and in CamelCase. | +| XRP | XRPs, ripples | The native digital asset, or cryptocurrency, of the XRP Ledger. XRP is not a token. | +| the XRP Ledger | XRP Ledger (no the), Ripple, Ripple Network, RCL | The XRP Ledger was called _the Ripple network_ and the _Ripple Consensus Ledger_ or _RCL_ at various times in the past. These names were confusing and have been retired because of their similarity to the name of the company, Ripple (formerly Ripple Labs) which develops the reference implementation of the core server. | +| XRPL | XRPL | Short for _XRP Ledger_. As much as possible, spell out _XRP Ledger_ instead; _XRPL_ is cryptic and looks like it could be a typo for _XRP_. | + +## Frontmatter Fields + +The fronmatter for a Markdown file in this repo can contain arbitrary key-value pairs; the config file entry for the page can add to those or override them. The following fields have specific uses or meaning: + +| Field | Type | Contents | +|:---------------------|:-----------------|:-----------------------------------| +| `html` | String | Output filename for the page. Should end in `.html` and MUST be unique within the target. For translated pages, leave the filename the same as the English version page. | +| `parent` | String | The exact, unique `html` value of this page's "parent" page. Indicates where this page should appear in the navigation. | +| `blurb` | String | Human-readable summary of the page. (Plain text only.) Should be about 1 sentence long. This appears in various places, including landing pages and metadata used in unfurling links on social media. | +| `name` | String | Human-readable page name. (Plain text only.) For files with Markdown content, you should omit this so that Dactyl can automatically detect it from a header on the first line of the contents instead. This is usually only provided on landing pages or other special pages with no Markdown source file. | +| `template` | String | The filename of a template file to use (in the `template/` directory) for this page. Most pages should use the default template. The `pagetype-category.html.jinja` template shows a list of child pages at the end. Pages with special or particularly unique layouts may need individual templates (conventionally, starting with `page-`). | +| `status` | String | Use the value `not_enabled` on pages relating to an amendment that is not yet enabled on the XRP Ledger mainnet. This displays a "flask" badge with a tooltip next to the page in the navigation. | +| `nav_omit` | Boolean | Use `true` to cause this page not to appear in any navigation elements. | +| `top_nav_omit` | Boolean | Use `true` to cause this page not to appear in the page top dropdown navigation. | +| `top_nav_level` | Number | Adjust the indentation level for the page in the top nav dropdowns. Level `2` is indented to appear like a child of the page above it in the dropdown. | +| `sidebar` | String | Use `disabled` to hide the left and right sidebars (if the page uses a template derived from the base template) | +| `fb_card` | String | Filename of an image (in `assets/img/`) to use when unfurling links to this page on Facebook. | +| `twitter_card` | String | Filename of an image (in `assets/img/`) to use when unfurling links to this page on Twitter. | +| `redirect_url` | String | Use with `template: pagetype-redirect.html.jinja` only. Automatically redirect the user to the provided URL when they navigate to this page. | +| `cta_text` | String | Text to appear in "call to action" buttons that link to this page (on special landings). | +| `curated_anchors` | Array of Objects | A set of anchors in this page to show, similar to child pages, in landings. Each object in the array should have a human-readable `name` field (such as `"Available Modes"`) and an `anchor` field with the HTML ID to link to (such as `"#available-modes"`). | +| `skip_spell_checker` | Boolean | Use `true` to make the Dactyl's style checker skip spell-checking this page. | +| `filters` | Array of Strings | A list of additional filters to use on this page. [Filters](https://github.com/ripple/dactyl/blob/master/README.md#filters) are Python scripts that provide additional pre- or post-processing of page contents. | +| `canonical_url` | String | Provides the canonical URL for a page that takes query parameters. Search engines and other tools may use this when linking to the page. | +| `embed_xrpl_js` | Boolean | Use `true` to have the latest version of [xrpl.js](https://js.xrpl.org) loaded on the page. | diff --git a/content/resources/contribute-documentation/creating-diagrams.ja.md b/content/resources/contribute-documentation/creating-diagrams.ja.md new file mode 100644 index 0000000000..627296b916 --- /dev/null +++ b/content/resources/contribute-documentation/creating-diagrams.ja.md @@ -0,0 +1,33 @@ +--- +html: creating-diagrams.html +parent: contribute-documentation.html +blurb: ライトモードとダークモードの設定で適切に動作する図を作成します。 +--- +# 図の作成 + +このサイトには、SVGの図をライト・ダークモード用に自動的に再カラーリングするコードが含まれています。これは単に画像を反転させるだけではありません。再カラーリングは(ボトムライトに見えないように)グラデーションを同じ方向に保ち、色をその逆ではなくテーマに合った同等なものに置き換えます。例えば、"Ripple blue"は、その逆のオレンジではなく、XRPLグリーンに再カラーリングされます。 + +![色の反転とテーマ対応再カラーリングの比較](img/theme-aware-recolor.png) + +テーマを意識した再カラーリングでは、図のSVG形式の単一のソースファイルを使用し、CSSを使用して現在のテーマ(明暗)に合わせて再カラーリングされた図を生成します。ユーザがテーマを変更すると、図は即座にそれに合わせて変更されます。 + +テーマに対応した図をドキュメントに含めるには、以下のような構文で`include_svg`フィルタを使用します。 + +```jinja +{{ include_svg("img/anatomy-of-a-ledger-complete.svg", "図1:XRP Ledgerの要素") }} +``` + +この構文の前後は空行にしてください。該当のSVGファイルは、リポジトリのトップレベルにある[`img/`](https://github.com/XRPLF/xrpl-dev-portal/tree/master/img)フォルダか、そのサブフォルダにあるはずです。2番目の引数は _表題_ で、ユーザが図の上にマウスを置いたときに表示されます。 + +作成されたSVGファイルはMarkdownファイルに直接挿入されます。1点制限事項として、箇条書きリストやテーブルのような他のMarkdown構造の中では使用することはできません。 + +> **注記:** フィルタのソースコードは[`tool/filter_include_svg.py`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/tool/filter_include_svg.py)です。これは`lxml`がサイトを構築するための依存関係の一つである理由でもあります。 + +## Making Diagrams + +図を作成する際には、再カラーリングが正しく適用されるように注意する必要があります。そうしないと、もう一方のテーマ用に再カラーリングしたときに、一部の要素が見えなくなる可能性があります(例えば、白地に白や黒地に黒など)。テーマを考慮したダイアグラムのコードは、[Umlet](https://www.umlet.com/)または[Google Draw](https://docs.google.com/drawings/)のいずれかを使用して作成され、SVGとしてエクスポートされた図をサポートしています。また、図を作成する際には、以下のガイドラインに従ってください。 + +- デフォルトでライトモード用の図を作成します。透明な背景色を使用してください。 +- テーマ対応ダイアグラムのコードがマッピングしている色のみを使用します。色の完全なリストを含む、このためのコードは[`styles/_diagrams.scss`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/styles/_diagrams.scss)にあります。必要であれば、SCSSコードを拡張することで、新しい色を追加することができます。(作業が終わったら、CSSを再エクスポートすることを忘れないでください。[style README](https://github.com/XRPLF/xrpl-dev-portal/blob/master/styles/README.md)を参照してください)。 +- 可能な限り、埋め込みアイコン/画像の代わりにベクター図形を使用してください。画像の上にテキストを配置する必要がある場合は、テキスト要素に無地の背景を追加し、テーマがマッピングしている色のいずれかを使用してください。 +- テキストを含む透明な要素を、異なる背景色を持つ要素の上に重ねないでください。テキストを含む要素に直接背景色を適用してください。 diff --git a/content/resources/contribute-documentation/creating-diagrams.md b/content/resources/contribute-documentation/creating-diagrams.md new file mode 100644 index 0000000000..976886553a --- /dev/null +++ b/content/resources/contribute-documentation/creating-diagrams.md @@ -0,0 +1,33 @@ +--- +html: creating-diagrams.html +parent: contribute-documentation.html +blurb: Create diagrams that interact properly with light and dark mode settings. +--- +# Creating Diagrams + +The site contains code to automatically recolor SVG diagrams for light and dark mode. This is more than just inverting images. The recoloring keeps gradients going the same direction (so that things don't look bottom-lit) and replaces colors with equivalents that fit with the theme rather than their inverse. For example, "Ripple blue" gets recolored to XRPL green, not its inverse orange. Example: + +![Comparison of invert and theme-aware recoloring](img/theme-aware-recolor.png) + +Theme-aware recoloring uses a single source file in SVG format for diagrams, and produces diagrams that are recolored to match the current theme (light/dark) using CSS. If the user changes their theme, the diagrams immediately change to match it. + +To include a theme-aware diagram in a document, use the `include_svg` filter with syntax such as the following: + +```jinja +{{ include_svg("img/anatomy-of-a-ledger-complete.svg", "Figure 1: XRP Ledger Elements") }} +``` + +Leave empty lines before and after this syntax. The SVG file in question should be in the [`img/`](https://github.com/XRPLF/xrpl-dev-portal/tree/master/img) folder at the top level of the repo, or a subfolder of it. The second argument is _title text_, which appears when the user hovers their mouse over the diagram, and can also be used by other software (such as screen readers) to caption the diagram. + +The resulting SVG file is inlined directly into the Markdown file. One limitation is that you can't use it inside other Markdown structures such as bulleted lists or tables. + +> **Note:** The filter source code is [`tool/filter_include_svg.py`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/tool/filter_include_svg.py). This is also the reason that `lxml` is one of the dependencies for building the site. + +## Making Diagrams + +You have to take care when creating diagrams so that the recoloring applies correctly; otherwise, some elements might be invisible (white-on-white or black-on-black, for example) when recolored for the other theme. The theme-aware diagrams code supports diagrams created using either [Umlet](https://www.umlet.com/) or [Google Draw](https://docs.google.com/drawings/) and exported as SVG. Additionally, you should follow these guidelines when making diagrams: + +- Create diagrams for light mode by default. Use a transparent background color. +- Only use colors that the theme-aware diagrams code has mappings for. The code for this, including the full list of colors, is in [`styles/_diagrams.scss`](https://github.com/XRPLF/xrpl-dev-portal/blob/master/styles/_diagrams.scss). If needed, you can add new colors by extending the SCSS code. (Don't forget to re-export the CSS when you're done. See the [styles README](https://github.com/XRPLF/xrpl-dev-portal/blob/master/styles/README.md).) +- Use actual vector shapes instead of embedded icons/images whenever possible. If you need to put text on top of an image, add a solid background to the text element and use one of the colors the theme has mappings for. +- Don't layer transparent elements containing text on top of elements with different background colors. Apply a background color directly to the element that contains the text. \ No newline at end of file diff --git a/content/resources/contribute-documentation/documentation-translations.ja.md b/content/resources/contribute-documentation/documentation-translations.ja.md new file mode 100644 index 0000000000..7d5b610f2f --- /dev/null +++ b/content/resources/contribute-documentation/documentation-translations.ja.md @@ -0,0 +1,79 @@ +--- +html: documentation-translations.html +parent: contribute-documentation.html +blurb: このウェブサイトにある文書の翻訳に貢献し、維持する方法を学びましょう。 +--- +# 翻訳 + +XRP Ledger Dev Portalは大部分が英語で書かれているため、一般的には英語版が最新かつ正確なバージョンです。しかしながら、XRP Ledgerのソフトウェアとコミュニティへのリーチを広げるために、このリポジトリには翻訳版のドキュメントも含まれています。私たちは、他の言語を理解するコミュニティのメンバーが、開発ポータルの内容を母国語で翻訳することを大いに歓迎します。 + +`dactyl-config.yml`には利用可能な言語ごとに"target"項目があります(現在、利用可能な言語は英語と日本語です)。このエントリには、次のようにテンプレートファイルで使用される文字列の定義が含まれます。 + +```yaml +- name: en + lang: en + display_name: XRP Ledger Dev Portal + # These github_ fields are used by the template's "Edit on GitHub" link. + # Override them with --vars to change which fork/branch to edit. + github_forkurl: https://github.com/XRPLF/xrpl-dev-portal + github_branch: master + strings: + blog: "Blog" + search: "Search site with Google..." + bc_home: "Home" + # ... +``` + +また、トップレベルの`languages`リストもあり、サポートされている各言語が定義されています。各言語のショートコードは[IETF BCP47](https://tools.ietf.org/html/bcp47)に従ったショートコードでなければなりません。例えば、"en"は英語、"es"はスペイン語、"ja"は日本語、"zh-CN"は簡体字中国語、"zh-TW" は繁体字中国語 (台湾で使用) などです。`display_name`フィールドはその言語でネイティブに書かれた言語名を定義します。`prefix`フィールドはその言語のサイトへのハイパーリンクで使用する接頭辞を定義します。次に`languages`の定義例を示します。 + +```yaml +languages: + - code: en + display_name: English + prefix: "/" + - code: ja + display_name: 日本語 + prefix: "/ja/" +``` + +同じ`dactyl-config.yml`ファイルには、XRP Ledger Dev Portalの各コンテンツページのエントリがあります。ページが翻訳されている場合、各翻訳ごとに個別の項目があり、その翻訳の“ターゲット"にリンクされています。ページがまだ翻訳されていない場合、すべてのターゲットで英語版が使用されます。(新しいページが英語のみ追加され、他の言語が提供されない場合、リンクチェッカーはそれをリンク切れとして報告します。) + +ページを翻訳するということは、そのページのエントリを他の言語と分割するということです。ページのメタデータは`dactyl-config.yml`ファイルか、ページのMarkdownファイルの先頭にあるfrontmatterに設定します。 + +| フィールド | 備考 | +|----------|------| +| `html` | ページのHTMLファイル名。慣例により、これはすべての言語バージョンで同じであるべきです。 | +| `md` | ページのMarkdownソースファイル。翻訳されたMarkdownソースファイルは英語版と同じファイル名を使用してください。ただし、拡張子は英語版の`.md`ではなく、`.{言語コード}.md`を使用してください。例えば、日本語の翻訳ファイルの拡張子は `.ja.md` です。 | +| `blurb` | ページの簡単な要約。これは翻訳されるべきです。このテキストは、検索エンジン最適化のためのメタデータや、自動生成されるランディングページで使用されます。 | + +`server_info`メソッドページの英語と日本語の記入例: + +```yaml + - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.md + targets: + - en + + - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.ja.md + targets: + - ja +``` + +翻訳されていないページの記入例: + +```yaml + - md: concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md + targets: + - en + - ja +``` + +## 始めるにあたって + +XRP Ledger Dev Portalをあなたの母国語に翻訳したい場合は、まず["What is the XRP Ledger?" file]({{target.github_forkurl}}/blob/{{target.github_branch}}/content/concepts/introduction/what-is-the-xrp-ledger.md)から始めてください。 + +このファイルを`xrp-ledger-overview.{言語コード}.md`として保存します。ここで`{言語コード}`は[IETF BCP47](https://tools.ietf.org/html/bcp47)の言語コードです。(例えば、スペイン語は"es"、日本語は"ja"、簡体字中国語は"zh-CN"、台湾で使われている繁体字中国語は"zh-TW"などです)。そして、あなたのファイルをこのリポジトリに追加する[プルリクエスト](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests)を作成してください。リポジトリメンテナの誰かが、サイトに言語を追加するために必要なその他の設定を手伝ってくれるでしょう。 + +Markdownコンテンツファイルでは、以下の規則に従ってください。 + +- 改行文字(`\n`)のみ(Unixスタイル)。キャリッジリターン文字(`\r`)は使用しないでください(Windowsスタイル)。 +- UTF-8エンコーディングを使用してください。バイトオーダーマークの使用は避けてください。 diff --git a/content/resources/contribute-documentation/documentation-translations.md b/content/resources/contribute-documentation/documentation-translations.md new file mode 100644 index 0000000000..186251fc86 --- /dev/null +++ b/content/resources/contribute-documentation/documentation-translations.md @@ -0,0 +1,80 @@ +--- +html: documentation-translations.html +parent: contribute-documentation.html +blurb: Learn how to contribute and maintain translations of the documentation on this website. +--- +# Translations + +The XRP Ledger Dev Portal is mostly written in English, so the English version is generally the most up-to-date and accurate version. However, to broaden the reach of the XRP Ledger software and community, this repository also contains translated versions of the documentation. We strongly encourage members of the community who understand other languages to contribute translations of the dev portal contents in their native languages. + +The `dactyl-config.yml` contains a "target" entry for each available language. (Currently, the available languages are English and Japanese.) This entry includes a dictionary of strings used in the template files. For example: + +```yaml +- name: en + lang: en + display_name: XRP Ledger Dev Portal + # These github_ fields are used by the template's "Edit on GitHub" link. + # Override them with --vars to change which fork/branch to edit. + github_forkurl: https://github.com/XRPLF/xrpl-dev-portal + github_branch: master + strings: + blog: "Blog" + search: "Search site with Google..." + bc_home: "Home" + # ... +``` + +There is also a top-level `languages` listing that defines some properties for each supported language. The short code for each language should be short code according to [IETF BCP47](https://tools.ietf.org/html/bcp47). For example, "en" for English, "es" for Spanish, "ja" for Japanese, "zh-CN" for Simplified Chinese, "zh-TW" for Traditional Chinese (as used in Taiwan), and so on. The `display_name` field defines the language's name as written natively in that language. The `prefix` field defines a prefix to be used in hyperlinks to that language's version of the site. Example `languages` definition: + +```yaml +languages: + - code: en + display_name: English + prefix: "/" + - code: ja + display_name: 日本語 + prefix: "/ja/" +``` + +The same `dactyl-config.yml` file contains an entry for each content page in the XRP Ledger Dev Portal. If a page has been translated, there is a separate entry for each translation, linked to the "target" for that translation. If a page has not yet been translated, the English version is used across all targets. (If a new page is added only to English and not other languages, the link checker reports that as a broken link.) + +Translating a page means separating out the entry for that page in the other language. Here are some tips for translating the page's metadata, which can be in either the `dactyl-config.yml` file or the frontmatter at the top of the page's Markdown file: + +| Field | Notes | +|-------|-------| +| `html` | The HTML file name of the page. By convention, this should be the same across all language versions. | +| `md` | The Markdown source file for the page. Translated Markdown source files should use the same filename as the English-language version except that the file extension should be `.{language code}.md` instead of only `.md` for English. For example, Japanese translated files end in `.ja.md`. | +| `blurb` | A short summary of the page. This should be translated. This text is used in metadata for search engine optimization and also on automatically-generated landing pages. | + + +Example of English and Japanese entries for the `server_info` method page: + +```yaml + - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.md + targets: + - en + + - md: references/http-websocket-apis/public-api-methods/server-info-methods/server_info.ja.md + targets: + - ja +``` + +Example entry for a page that isn't translated: + +```yaml + - md: concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md + targets: + - en + - ja +``` + +## Where to Start + +If you want to translate the XRP Ledger Dev Portal into your native language of choice, start with the ["What is the XRP Ledger?" page]({{target.github_forkurl}}/blob/{{target.github_branch}}/content/concepts/introduction/what-is-the-xrp-ledger.md), which introduces the core concepts behind the XRP Ledger. + +Save the file as `what-is-the-xrp-ledger.{language code}.md`, where `{language code}` is the [IETF BCP47](https://tools.ietf.org/html/bcp47) language code. (For example, "es" for Spanish, "ja" for Japanese, "zh-CN" for Simplified Chinese, "zh-TW" for Traditional Chinese as used in Taiwan, and so on.) Then open a [pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) adding your file to this repository. One of the repository's maintainers can help with the other necessary setup to add the language to the site. + +For the Markdown content files, please use the following conventions: + +- Line-feed newline characters (`\n`) only (Unix style). Do not use carriage return (`\r`) characters (Windows style). +- Use UTF-8 encoding. Avoid the use of Byte-order marks. diff --git a/content/resources/contribute-documentation/tutorial-guidelines.ja.md b/content/resources/contribute-documentation/tutorial-guidelines.ja.md new file mode 100644 index 0000000000..7b68af491b --- /dev/null +++ b/content/resources/contribute-documentation/tutorial-guidelines.ja.md @@ -0,0 +1,83 @@ +--- +html: tutorial-guidelines.html +parent: contribute-documentation.html +blurb: このサイトのチュートリアルの構成と、質の高いチュートリアルを投稿するためのガイドラインを学びましょう。 +--- +# チュートリアルガイドライン + +私たちは、開発者がXRP Ledger上でのトランザクションやリクエストの仕組みを学ぶことができる、モジュール式のチュートリアルフレームワークを作成しています。開発者は、ビジネスソリューションについて学ぶためにモジュールを確認し、自身のアプリケーションでスクリプトを再利用することができます。 + + +# 根拠 + +開発者は次の2つのことを求めています。 + +1. 自分のアプリケーションにコピー&ペーストできるコードのサンプル。 +2. 完全なAPIリファレンスのドキュメント。 + +コンセプトに関する情報は最小限としチュートリアルを完了するために必要な情報のみとしてください。背景やより深い理解のために、必要であれば、チュートリアルの最後にコンセプトに関するトピックへのリンクを提供してください。 + +チュートリアルプログラムは、マルコム・ノウルズが提唱する、社会人の学習を支援するための6つの前提に沿って構成されています。 + +1. 大人は、なぜ何かを学ぶ必要があるのかを知る必要があります。 +2. 大人は、経験を積み重ねる必要があります。 +3. 大人は、自分の学習に責任を感じる必要があります。 +4. 大人は、トレーニングが当面の問題を解決してくれるなら、学ぶ準備が整っています。 +5. 大人は、トレーニングが問題に焦点を当てたものであることを望みます。 +6. 大人は、動機づけが内発的にもたらされるときに最もよく学びます。 + +さらに、ラルフ・スメドレーの「人は楽しいときに最もよく学ぶ」という言葉も付け加えておきましょう。軽い気持ちで学ぶと、学習者をリラックスさせることができ、教材が抵抗なく頭に入ってくるのです。 + + +# サンプルコード vs タスク vs コンセプト vs チュートリアル + +これまで、異なるタイプのドキュメントが _チュートリアル_ として表示されたり、境界線が曖昧なことがありました。ここでは、その違いを定義するのに役立ついくつかの比較を紹介します。 + + +## サンプルコード + +サンプルコードとは、APIの機能を実装するためのベストプラクティスを示す、適切にコメントされたスニペットやアプリケーションのことです。サンプルコードはモジュール化されており、カスタマイズをほとんど必要とせず、再利用可能です。 + +サンプルコードは理想的です。なぜなら、上級者は通常、正式なチュートリアルがなくても、サンプルをスキャンしてすぐに使うことができるからです。また、他の人がチュートリアルの基礎として使うこともできます。サンプルコードの開発者は、自分の得意なことに集中することができ、テクニカルライターやサポート担当者は、サンプルを使って質の高いトレーニング資料を作成することができます。 + + +## タスク + +タスクは、特定の目的を達成するためのステップバイステップの指示です。例えば、"Red Hat Linux Serverにrippledをインストールする"などです。タスクドキュメントはあまり教育的なものではありません。実装ごとに一度だけ実行されるタスクや、常におなじみのパターンに従うメンテナンスタスクが頻繁に記述されています。タスクはトラブルシューティングのガイダンスを示します。 + + +## コンセプト + +コンセプトでは、API の要素やそれらがどのように動作するか、どのような場合にそれらを使用するかについて説明します。もしチュートリアルがプログラミングのタスクの前や途中に長い説明を必要とする場合、説明を新しいトピックに分けるか、既存のトピックにリンクして適切なコンテキストを設定する方法を検討してください。 + +例えば、3段落のコンテキストと1行のコードは、チュートリアルではなく、コンセプトとして扱うべきでしょう。 + + +## チュートリアル + +チュートリアルは、機能を実装するためのベストプラクティスを示すサンプルコードから始まります。チュートリアルでは、コードの各ブロックの目的を説明しながら、開発のプロセスを段階的に進めていきます。 + +チュートリアルではさらに、ビジネス上の問題を解決するために、いくつかの機能を組み合わせます。チュートリアルでは、あるタスクを完了するための簡単な手順を説明します。そして、開発者がいくつかの異なるシナリオを試せるように修正を提案するかもしれません。チュートリアルは、ある限られた範囲の動作に焦点を当てているため、広範なトラブルシューティング情報を必要としないようにすべきです。 + + +## ユースケース + +ユースケースでは、複数の機能を組み合わせて、ビジネス上の問題を解決する実用的なアプリケーションを作成する方法を説明します。ユースケースは、コンテキストを提供し、意思決定プロセスを支援し、実装の各ステップに適切なトピックへのリンクを提供します。 + + +# チュートリアルの構成要素 + +このセクションでは、XRPL.orgで使用されているチュートリアルモジュールの要素について説明します。 + + +## サンプルアプリケーション + +XRPLチュートリアルのサンプルコードはモジュール式になっています。例えば、スクリプト1はテストアカウントの作成方法、XRP Ledgerへのアクセス方法、アカウント間でのXRP送金方法を示しています。それ以降のサンプルはスクリプト1の機能を再利用することができます。 + +ビジネス上の問題に対する実用的な解決策を示すために必要な、特定の最小限の関数コードを持つ新しいスクリプトを作成してください。サンプルは、ビジネスプロセスを説明するのに十分な動作を持つ逐次的なものでなければなりません。 + +たとえば、最初のNFTチュートリアルでは、NFTのミント、取得、バーンの方法を示します。次のチュートリアルでは、売りオファーの作成と受け入れ、買いオファーの作成と受け入れの方法を示します。 + +アプリケーションのUXは、トピックに関連するものでない限り、過度に重視しないでください。すべてのチュートリアルで、標準的な外観と操作感のCSSファイルを使用してください。 + +可能な限り、他のモジュールのコードを再利用してください。以前のモジュールの動作を変更する必要がある場合があります。関数名をオーバーロードするか、モジュールを修正して別の名前で保存してください。 diff --git a/content/contributing/tutorial-guidelines.md b/content/resources/contribute-documentation/tutorial-guidelines.md similarity index 94% rename from content/contributing/tutorial-guidelines.md rename to content/resources/contribute-documentation/tutorial-guidelines.md index b0d66fa2da..71527eda78 100644 --- a/content/contributing/tutorial-guidelines.md +++ b/content/resources/contribute-documentation/tutorial-guidelines.md @@ -1,8 +1,8 @@ --- html: tutorial-guidelines.html -parent: contribute.html +parent: contribute-documentation.html +blurb: Learn how this site's tutorials are structured and guidelines for contributing quality tutorials. --- - # Tutorial Guidelines We are creating a modular tutorial framework that allows developers to learn how transactions and requests work on the XRP Ledger. Developers can review the modules to learn about business solutions, and potentially repurpose the scripts in their own applications. @@ -31,12 +31,12 @@ Add into that Ralph Smedley’s quote, “We learn best in moments of enjoyment. # Sample Code vs. Tasks vs. Concepts vs. Tutorials -To date, there have been some blurred lines where different types of documentation show up as _Tutorials._ Here are some comparisons that help define the distinction. +To date, there have been some blurred lines where different types of documentation show up as _Tutorials_. Here are some comparisons that help define the distinction. ## Sample Code -Sample code is well commented snippets or applications that illustrate best practices for implementing a feature of the API. Sample code is modular and reusable with little customization required. +Sample code is well commented snippets or applications that illustrate best practices for implementing a feature of the API. Sample code is modular and reusable with little customization required. Sample code is desirable, because advanced users can typically scan the example and use it immediately without a formal tutorial. It can also be used by others as a basis for tutorials. Sample code developers can focus on what they do well, while technical writers and support personnel can use the samples to create quality training materials. @@ -48,7 +48,7 @@ Tasks are step-by-step instructions for how to accomplish a specific result. For ## Concepts -Conceptual information describes elements of the API, how they work, and when to use them. If a tutorial requires lengthy explanations before or during the programming tasks, consider how you might separate the exposition into a new topic, or link to existing topics that set the proper context. +Conceptual information describes elements of the API, how they work, and when to use them. If a tutorial requires lengthy explanations before or during the programming tasks, consider how you might separate the exposition into a new topic, or link to existing topics that set the proper context. For example, three paragraphs of context and a single line of code would be a concept, not a tutorial. @@ -62,7 +62,7 @@ Tutorials further combine a number of features to work together to solve a busin ## Use Cases -Use cases describe how to pull together multiple features to create a practical application that solves a business problem. They provide context and assistance with the decision making process, then provide links to the appropriate topics for each step of implementation. +Use cases describe how to pull together multiple features to create a practical application that solves a business problem. They provide context and assistance with the decision making process, then provide links to the appropriate topics for each step of implementation. # Tutorial Components @@ -81,5 +81,3 @@ For example, the first NFT tutorial shows how to mint, retrieve, and burn an NFT Don’t focus too much on the UX of the application, unless the look and feel is pertinent to the topic. Use the standard CSS file with the look and feel for all of the tutorials. Reuse the code from other modules when possible. There might be situations where you need to modify the behavior from an earlier module. You can either overload the function name or modify the module and save it with a different name. - - diff --git a/content/resources/contribute-documentation/tutorial-structure.ja.md b/content/resources/contribute-documentation/tutorial-structure.ja.md new file mode 100644 index 0000000000..a63e3dbde8 --- /dev/null +++ b/content/resources/contribute-documentation/tutorial-structure.ja.md @@ -0,0 +1,54 @@ +--- +html: tutorial-structure.html +parent: contribute-documentation.html +blurb: 一般的なチュートリアルの構成要素の要約です。 +--- +# チュートリアルの構成 + +各XRP Ledgerチュートリアルは、同一のフォーマットで構成されています。 + +1. チュートリアルで説明する機能の簡単な説明。 +2. コードを実行するための前提条件(必要な場合)、またはサンプルコードへのリンク。 +3. チュートリアルの機能の使用例。 +4. サンプルコードの解説と、そのスクリプトの特徴的な要素の紹介。 +5. 次のステップとして試すべき概念的な情報や優れたチュートリアルへのリンク。 + +セットアップ(前提条件)と使用方法とコード開発は分けて考えましょう。これらはそれぞれ異なる活動であり、それぞれ脳の異なる領域を動かします。この3つの要素を一度に考えようとすると、混乱につながります。 + +## 説明 + +![説明](img/tut-struct1.png) + +そのサンプルが何を示しているかを記載してください。可能であれば、各サンプルには関連する特定のタスクを達成するための手順を記述してください。(NFTの売却オファーの作成、売却オファーの受け入れ、売却オファーの削除など)。チュートリアルで説明されている内容を理解するのに十分なコンセプトに関する情報を記載し、必要であれば、追加情報へのリンクも記載します。 + +## 前提条件 + +![前提条件](img/tut-struct2.png) + +必要なソフトウェアと、チュートリアルを実行するために必要なすべてのサンプルコードへのリンクを提供します。必要であれば、サードパーティのツールの使い方を簡単に説明しますが、ユーザが自由に深く掘り下げることができるように、ソースとなるウェブサイトへのリンクを提供します。 + +## 使用例 + +![使用例](img/tut-struct3.png) + +チュートリアルのアプリケーションの完成した動作例を提供することから始めましょう。これは、ソフトウェアを使って問題を解決するチャンスです。 +  +チュートリアルの各ステップにはスクリーンショットを使用してください。これによって、ユーザは自分でコードを実行しなくてもチュートリアルを理解することができます。もちろん、コードを実行することが _望ましい_ ですが、これにりユーザに選択肢を与えることができます。 + +適切な条件におけるシナリオを記述してください。インターネットへの接続が途切れなければ、アプリケーションは問題なく動作するはずです。チュートリアルに関連しないトラブルシューティングの情報を提供しないでください。 + +## コード解説 + +![コード解説](img/tut-struct4.png) + +コードを1ブロックずつ見ていきましょう。既に説明したトピックを繰り返さないでください。サンプルコードには、HTML構文のような基本的な部分のプログラミング方法については、その実装に独自なものがない限り、詳細な説明はしないでください。 + +強調すべき重要なことは、XRPLとのやりとりはすべてトランザクションかリクエストであり、すべてのトランザクションとリクエストは本質的に同じであるということです。私たちが提供するサンプルコードは、トランザクションやリクエストを準備する方法と、返された結果を処理する方法を示しています。1つのトランザクションやリクエストをどのように送信しどのようなレスポンスを返すかを知ることは、他のトランザクションやリクエストの処理について非常に良いヒントとなります。 + +(技術的には、リクエストに似た第3のカテゴリーがあります。[Subscriptionメソッド](subscription-methods.html)をご覧ください)。 + +## 関連項目 + +![関連項目](img/tut-struct5.png) + +チュートリアルの最後には、追加の資料、概念的な情報、学習のにおいて有益な次のステップとなるチュートリアルへのリンクを提供します。 diff --git a/content/contributing/tutorial-structure.md b/content/resources/contribute-documentation/tutorial-structure.md similarity index 97% rename from content/contributing/tutorial-structure.md rename to content/resources/contribute-documentation/tutorial-structure.md index ebe6d0c708..fac45e18b4 100644 --- a/content/contributing/tutorial-structure.md +++ b/content/resources/contribute-documentation/tutorial-structure.md @@ -1,8 +1,8 @@ --- html: tutorial-structure.html -parent: contribute.html +parent: contribute-documentation.html +blurb: A summary of the parts of a standard tutorial. --- - # Tutorial Structure Each XRP Ledger tutorial follows the same format. diff --git a/content/concepts/consensus-network/amendments/known-amendments.ja.md b/content/resources/known-amendments.ja.md similarity index 99% rename from content/concepts/consensus-network/amendments/known-amendments.ja.md rename to content/resources/known-amendments.ja.md index 3a532dc2e5..97a09b5267 100644 --- a/content/concepts/consensus-network/amendments/known-amendments.ja.md +++ b/content/resources/known-amendments.ja.md @@ -1,6 +1,6 @@ --- html: known-amendments.html -parent: amendments.html +parent: resources.html blurb: 本番環境のXRP Ledgerに関する既知のAmendmentのすべてとそのステータスをまとめた総合リストです。 labels: - ブロックチェーン diff --git a/content/concepts/consensus-network/amendments/known-amendments.md b/content/resources/known-amendments.md similarity index 99% rename from content/concepts/consensus-network/amendments/known-amendments.md rename to content/resources/known-amendments.md index edb1020513..a0ff0e316e 100644 --- a/content/concepts/consensus-network/amendments/known-amendments.md +++ b/content/resources/known-amendments.md @@ -1,6 +1,6 @@ --- html: known-amendments.html -parent: amendments.html +parent: resources.html blurb: List of all known amendments to the XRP Ledger protocol and their status. labels: - Blockchain @@ -323,8 +323,8 @@ Examples of invariant checks: - The total amount of XRP destroyed by a transaction must match the [transaction cost](transaction-cost.html) exactly. - XRP cannot be created. -- [`AccountRoot` objects in the ledger](accountroot.html) cannot be deleted unless [DeletableAccounts](#deletableaccounts) is enabled. (See also: [Deletion of Accounts](accounts.html#deletion-of-accounts).) -- [An object in the ledger](ledger-object-types.html) cannot change its type. (The `LedgerEntryType` field is immutable.) +- [`AccountRoot` objects in the ledger](accountroot.html) cannot be deleted unless [DeletableAccounts](#deletableaccounts) is enabled. (See also: [Deleting Accounts](deleting-accounts.html).) +- [An entry in the ledger](ledger-object-types.html) cannot change its type. (The `LedgerEntryType` field is immutable.) - There cannot be a trust line for XRP. diff --git a/content/tutorials/build-apps/build-a-browser-wallet-in-js.md b/content/tutorials/build-apps/build-a-browser-wallet-using-javascript.md similarity index 99% rename from content/tutorials/build-apps/build-a-browser-wallet-in-js.md rename to content/tutorials/build-apps/build-a-browser-wallet-using-javascript.md index 4bceaff33a..1a4f8cb0f1 100644 --- a/content/tutorials/build-apps/build-a-browser-wallet-in-js.md +++ b/content/tutorials/build-apps/build-a-browser-wallet-using-javascript.md @@ -1,11 +1,12 @@ --- -parent: build-apps.html +html: build-a-browser-wallet-using-javascript.html +parent: javascript.html targets: - en - ja # TODO: translate this page blurb: Build a graphical browser wallet for the XRPL using Javascript. --- -# Build A Browser Wallet Using JS +# Build A Browser Wallet Using JavaScript This tutorial demonstrates how to build a browser wallet for the XRP Ledger using the Javascript programming language and various libraries. This application can be used as a starting point for building a more complete and powerful application, as a reference point for building comparable apps, or as a learning experience to better understand how to integrate XRP Ledger functionality into a larger project. diff --git a/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md b/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md index 1aced38c15..ce0ab29ee7 100644 --- a/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md +++ b/content/tutorials/build-apps/build-a-desktop-wallet-in-python.md @@ -1,6 +1,7 @@ --- -parent: build-apps.html -blurb: Build a graphical desktop wallet for the XRPL using Python. +html: build-a-desktop-wallet-in-python.html +parent: python.html +blurb: Build a graphical desktop wallet for the XRPL in Python. --- # Build a Desktop Wallet in Python @@ -32,12 +33,12 @@ The exact look and feel of the user interface depend on your computer's operatin - Shows how much XRP is set aside for the account's [reserve requirement](reserves.html). - Can send [direct XRP payments](direct-xrp-payments.html), and provides feedback about the intended destination address, including: - Whether the intended destination already exists in the XRP Ledger, or the payment would have to fund its creation. - - If the address doesn't want to receive XRP ([`DisallowXRP` flag](become-an-xrp-ledger-gateway.html#disallow-xrp) enabled). - - If the address has a [verified domain name](https://xrpl.org/xrp-ledger-toml.html#account-verification) associated with it. + - If the address doesn't want to receive XRP ([`DisallowXRP` flag](stablecoin-issuer.html#disallow-xrp) enabled). + - If the address has a [verified domain name](xrp-ledger-toml.html#account-verification) associated with it. The application in this tutorial _doesn't_ have the ability to send or trade [tokens](issued-currencies.html) or use other [payment types](payment-types.html) like Escrow or Payment Channels. However, it provides a foundation that you can implement those and other features on top of. -In addition to the above features, you'll also learn a little bit about graphical user interface (GUI) programming, threading, and asynchronous (async) code in Python. +Other topics mentioned in this tutorial include graphical user interface (GUI) programming, threading, and asynchronous (async) code in Python. ## Steps @@ -66,8 +67,6 @@ On Windows, you can build apps using either Windows natively or by using the Win On native Windows, the GUI uses native Windows controls and should run without any dependencies beyond those mentioned above. -**Caution:** As of 2022-02-01, the latest wxPython is not compatible with Python 3.10 on Windows. You should be able to follow this tutorial if you downgrade to the latest release of Python 3.9. - On WSL, you may need to install `libnotify-dev` as follows: ```sh @@ -142,9 +141,9 @@ Finally, change the code to start the app (at the end of the file) slightly: {{ include_code("_code-samples/build-a-wallet/py/2_threaded.py", language="py", start_with="if __name__") }} -Since the app uses a WebSocket client instead of the JSON-RPC client now, the code has to be use WebSocket URL to connect. +Since the app uses a WebSocket client instead of the JSON-RPC client now, the code has to use a WebSocket URL to connect. -**Tip:** If you [run your own `rippled` server](xrpl-servers.html#reasons-to-run-your-own-server) you can connect to it using `ws://localhost:6006` as the URL. You can also use the WebSocket URLs of [public servers](public-servers.html) to connect to the Mainnet or other test networks. +**Tip:** If you [run your own `rippled` server](networks-and-servers.html#reasons-to-run-your-own-server) you can connect to it using `ws://localhost:6006` as the URL. You can also use the WebSocket URLs of [public servers](public-servers.html) to connect to the Mainnet or other test networks. #### Troubleshooting SSL Certificate Errors @@ -211,7 +210,7 @@ Add a new `prompt_for_account()` method to the `TWaXLFrame` class: {{ include_code("_code-samples/build-a-wallet/py/3_account.py", language="py", start_with="def prompt_for_account", end_before="def update_ledger") }} -The constructor calls this method to prompt the user for their [address](accounts.html#addresses) or [master seed](cryptographic-keys.html#seed), then processes the user input to decode whatever value the user put in, and use it accordingly. With wxPython, you usually follow this pattern with dialog boxes: +The constructor calls this method to prompt the user for their [address](addresses.html) or [master seed](cryptographic-keys.html#seed), then processes the user input to decode whatever value the user put in, and use it accordingly. With wxPython, you usually follow this pattern with dialog boxes: 1. Create a new instance of a dialog class, such as a [`wx.TextEntryDialog`](https://docs.wxpython.org/wx.TextEntryDialog.html). 2. Use `showModal()` to display it to the user and get a return code based on which button the user clicked. diff --git a/content/tutorials/get-started/get-started-using-http-websocket-apis.ja.md b/content/tutorials/get-started/get-started-using-http-websocket-apis.ja.md index 75805e0de2..42995dbda4 100644 --- a/content/tutorials/get-started/get-started-using-http-websocket-apis.ja.md +++ b/content/tutorials/get-started/get-started-using-http-websocket-apis.ja.md @@ -1,6 +1,6 @@ --- html: get-started-using-http-websocket-apis.html -parent: get-started.html +parent: http-websocket-apis-tutorials.html blurb: XRP Ledgerの操作に使用できるAPIとライブラリを使い始めましょう。 cta_text: 開始しよう labels: diff --git a/content/tutorials/get-started/get-started-using-http-websocket-apis.md b/content/tutorials/get-started/get-started-using-http-websocket-apis.md index 1ca39aa782..deac778abd 100644 --- a/content/tutorials/get-started/get-started-using-http-websocket-apis.md +++ b/content/tutorials/get-started/get-started-using-http-websocket-apis.md @@ -1,6 +1,6 @@ --- html: get-started-using-http-websocket-apis.html -parent: get-started.html +parent: http-websocket-apis-tutorials.html blurb: Unleash the full power of the XRP Ledger's native APIs. cta_text: Get Started top_nav_name: HTTP / WebSocket diff --git a/content/tutorials/get-started/get-started-using-java.md b/content/tutorials/get-started/get-started-using-java.md index e983b83d03..e998789cdc 100644 --- a/content/tutorials/get-started/get-started-using-java.md +++ b/content/tutorials/get-started/get-started-using-java.md @@ -1,6 +1,6 @@ --- html: get-started-using-java.html -parent: get-started.html +parent: java.html funnel: Build doc_type: Tutorials category: Get Started @@ -12,7 +12,6 @@ labels: - Development showcase_icon: assets/img/logos/java.svg --- - # Get Started Using Java This tutorial walks you through the basics of building an XRP Ledger-connected application using [`xrpl4j`](https://github.com/XRPLF/xrpl4j), a pure Java library built to interact with the XRP Ledger. @@ -98,7 +97,7 @@ you can use an [`XrplClient`](https://javadoc.io/doc/org.xrpl/xrpl4j-client/3.0. The sample code in the previous section shows you how to connect to the Testnet, which is one of the available [parallel networks](parallel-networks.html). When you're ready to integrate with the production XRP Ledger, you'll need to connect to the Mainnet. You can do that in two ways: -* By [installing the core server](install-rippled.html) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](connect-your-rippled-to-the-xrp-test-net.html). [There are good reasons to run your own core server](xrpl-servers.html#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: +* By [installing the core server](install-rippled.html) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](connect-your-rippled-to-the-xrp-test-net.html). [There are good reasons to run your own core server](networks-and-servers.html#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: final HttpUrl rippledUrl = HttpUrl.get("http://localhost:5005/"); XrplClient xrplClient = new XrplClient(rippledUrl); @@ -112,7 +111,7 @@ The sample code in the previous section shows you how to connect to the Testnet, ### {{n.next()}}. Get account -To store value and execute transactions on the XRP Ledger, you need to get an account: a [set of keys](cryptographic-keys.html#key-components) and an [address](accounts.html#addresses) that's been [funded with enough XRP](accounts.html#creating-accounts) to meet the [account reserve](reserves.html). The address is the identifier of your account and you use the [private key](cryptographic-keys.html#private-key) to sign transactions that you submit to the XRP Ledger. For production purposes, you should take care to store your keys and set up a [secure signing method](set-up-secure-signing.html). +To store value and execute transactions on the XRP Ledger, you need to get an account: a [set of keys](cryptographic-keys.html#key-components) and an [address](addresses.html) that's been [funded with enough XRP](accounts.html#creating-accounts) to meet the [account reserve](reserves.html). The address is the identifier of your account and you use the [private key](cryptographic-keys.html#private-key) to sign transactions that you submit to the XRP Ledger. For production purposes, you should take care to store your keys and set up a [secure signing method](secure-signing.html). To generate a new account, `xrpl4j` provides the [`DefaultWalletFactory`](https://javadoc.io/doc/org.xrpl/xrpl4j-keypairs/latest/org/xrpl/xrpl4j/wallet/DefaultWalletFactory.html). @@ -212,7 +211,7 @@ The response fields contained in `AccountInfoResult` that you want to inspect in * `accountData.balance` — This is the account's balance of XRP, in drops. You can use this to confirm that you have enough XRP to send (if you're making a payment) and to meet the [current transaction cost](transaction-cost.html#current-transaction-cost) for a given transaction. -* `validated` — Indicates whether the returned data is from a [validated ledger](ledgers.html#open-closed-and-validated-ledgers). When inspecting transactions, it's important to confirm that [the results are final](finality-of-results.html) before further processing the transaction. If `validated` is `true` then you know for sure the results won't change. For more information about best practices for transaction processing, see [Reliable Transaction Submission](reliable-transaction-submission.html). +* `validated` — Indicates whether the returned data is from a [validated ledger](open-closed-validated-ledgers.html). When inspecting transactions, it's important to confirm that [the results are final](finality-of-results.html) before further processing the transaction. If `validated` is `true` then you know for sure the results won't change. For more information about best practices for transaction processing, see [Reliable Transaction Submission](reliable-transaction-submission.html). For a detailed description of every response field, see [account_info](account_info.html#response-format). @@ -222,7 +221,7 @@ For a detailed description of every response field, see [account_info](account_i Now that you know how to use `xrpl4j` to connect to the XRP Ledger, get an account, and look up information about it, you can also use `xrpl4j` to: * [Send XRP](send-xrp.html). -* [Set up secure signing](set-up-secure-signing.html) for your account. +* [Set up secure signing](secure-signing.html) for your account. diff --git a/content/tutorials/get-started/get-started-using-javascript.ja.md b/content/tutorials/get-started/get-started-using-javascript.ja.md index ad0b354d68..f3f9062b95 100644 --- a/content/tutorials/get-started/get-started-using-javascript.ja.md +++ b/content/tutorials/get-started/get-started-using-javascript.ja.md @@ -1,6 +1,6 @@ --- html: get-started-using-javascript.html -parent: get-started.html +parent: javascript.html blurb: XRP Ledgerを参照するためのエントリーレベルのJavaScriptアプリケーションを構築します。 top_nav_name: JavaScript top_nav_grouping: Get Started @@ -95,7 +95,7 @@ const xrpl = require("xrpl") 前節のサンプルコードでは、利用可能な[並列ネットワーク](parallel-networks.html)の1つであるTestnetに接続する方法を紹介しました。本番環境に移行するには、XRP Ledger Mainnetに接続する必要があります。それには2つの方法があります。 -* [コアサーバをインストール](install-rippled.html) (`rippled`)して、自分でノードを動かしてみましょう。コアサーバーはデフォルトではMainnetに接続しますが、設定を変更してTestnetやDevnetを使うこともできます](connect-your-rippled-to-thexrp-test-net.html)。[独自のコアサーバーを運用するのには良い理由があります](xrpl-servers.html#reasons-to-run-your-own-server)。独自のサーバーを走らせた場合、次のようにして接続することができます。 +* [コアサーバをインストール](install-rippled.html) (`rippled`)して、自分でノードを動かしてみましょう。コアサーバーはデフォルトではMainnetに接続しますが、設定を変更してTestnetやDevnetを使うこともできます](connect-your-rippled-to-thexrp-test-net.html)。[独自のコアサーバーを運用するのには良い理由があります](networks-and-servers.html#reasons-to-run-your-own-server)。独自のサーバーを走らせた場合、次のようにして接続することができます。 const MY_SERVER = "ws://localhost:6006/" const client = new xrpl.Client(MY_SERVER) @@ -130,14 +130,14 @@ const test_wallet = xrpl.Wallet.fromSeed("sn3nxiW7v8KXzPzAqzyHXbSSKNuN9") // テ ### 4. XRP Ledgerの参照 -クライアントの`request()`メソッドを使って、XRP Ledgerの[WebSocket API](https://xrpl.org/request-formatting.html)にアクセスします。例えば、以下のようになります。 +クライアントの`request()`メソッドを使って、XRP Ledgerの[WebSocket API](request-formatting.html)にアクセスします。例えば、以下のようになります。 {{ include_code("_code-samples/get-started/js/get-acct-info.js", start_with="// Get info", end_before="// Listen to ledger close events", language="js") }} ### 5. イベントのListen -XRP Ledgerの[コンセンサス プロセス](intro-to-consensus.html)が新しい[レジャーバージョン](ledgers.html)を生成したときなど、`xrpl.js`ではさまざまなタイプのイベントのハンドラを設定することができます。そのためには、まず[subscribeメソッド][]を呼び出して欲しいイベントの種類を取得し、クライアントの`on(eventType, callback)`メソッドを使ってイベントハンドラをアタッチします。 +XRP Ledgerの[コンセンサス プロセス](consensus.html)が新しい[レジャーバージョン](ledgers.html)を生成したときなど、`xrpl.js`ではさまざまなタイプのイベントのハンドラを設定することができます。そのためには、まず[subscribeメソッド][]を呼び出して欲しいイベントの種類を取得し、クライアントの`on(eventType, callback)`メソッドを使ってイベントハンドラをアタッチします。 {{ include_code("_code-samples/get-started/js/get-acct-info.js", start_with="// Listen to ledger close events", end_before="// Disconnect when done", language="js") }} @@ -149,7 +149,7 @@ XRP Ledgerの[コンセンサス プロセス](intro-to-consensus.html)が新し * [XRPの送信](send-xrp.html). * [代替可能トークンの発行](issue-a-fungible-token.html) -* アカウントに[安全な署名](set-up-secure-signing.html) を設定する。 +* アカウントに[安全な署名](secure-signing.html) を設定する。 ## 関連記事 diff --git a/content/tutorials/get-started/get-started-using-javascript.md b/content/tutorials/get-started/get-started-using-javascript.md index 3d91f36b6c..678c9a0b38 100644 --- a/content/tutorials/get-started/get-started-using-javascript.md +++ b/content/tutorials/get-started/get-started-using-javascript.md @@ -1,6 +1,6 @@ --- html: get-started-using-javascript.html -parent: get-started.html +parent: javascript.html blurb: Build an entry-level JavaScript application for querying the XRP Ledger. top_nav_name: JavaScript top_nav_grouping: Get Started @@ -95,7 +95,7 @@ To make queries and submit transactions, you need to connect to the XRP Ledger. The sample code in the previous section shows you how to connect to the Testnet, which is one of the available [parallel networks](parallel-networks.html). When you're ready to move to production, you'll need to connect to the XRP Ledger Mainnet. You can do that in two ways: -* By [installing the core server](install-rippled.html) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](connect-your-rippled-to-the-xrp-test-net.html). [There are good reasons to run your own core server](xrpl-servers.html#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: +* By [installing the core server](install-rippled.html) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](connect-your-rippled-to-the-xrp-test-net.html). [There are good reasons to run your own core server](networks-and-servers.html#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: const MY_SERVER = "ws://localhost:6006/" const client = new xrpl.Client(MY_SERVER) @@ -130,14 +130,14 @@ const test_wallet = xrpl.Wallet.fromSeed("sn3nxiW7v8KXzPzAqzyHXbSSKNuN9") // Tes ### 4. Query the XRP Ledger -Use the Client's `request()` method to access the XRP Ledger's [WebSocket API](https://xrpl.org/request-formatting.html). For example: +Use the Client's `request()` method to access the XRP Ledger's [WebSocket API](request-formatting.html). For example: {{ include_code("_code-samples/get-started/js/get-acct-info.js", start_with="// Get info", end_before="// Listen to ledger close events", language="js") }} ### 5. Listen for Events -You can set up handlers for various types of events in `xrpl.js`, such as whenever the XRP Ledger's [consensus process](intro-to-consensus.html) produces a new [ledger version](ledgers.html). To do that, first call the [subscribe method][] to get the type of events you want, then attach an event handler using the `on(eventType, callback)` method of the client. +You can set up handlers for various types of events in `xrpl.js`, such as whenever the XRP Ledger's [consensus process](consensus.html) produces a new [ledger version](ledgers.html). To do that, first call the [subscribe method][] to get the type of events you want, then attach an event handler using the `on(eventType, callback)` method of the client. {{ include_code("_code-samples/get-started/js/get-acct-info.js", start_with="// Listen to ledger close events", end_before="// Disconnect when done", language="js") }} @@ -148,7 +148,7 @@ Now that you know how to use `xrpl.js` to connect to the XRP Ledger, get an acco * [Send XRP](send-xrp.html). * [Issue a Fungible Token](issue-a-fungible-token.html) -* [Set up secure signing](set-up-secure-signing.html) for your account. +* [Set up secure signing](secure-signing.html) for your account. ## See Also diff --git a/content/tutorials/get-started/get-started-using-python.md b/content/tutorials/get-started/get-started-using-python.md index 523cb7db9e..5f579c4fe1 100644 --- a/content/tutorials/get-started/get-started-using-python.md +++ b/content/tutorials/get-started/get-started-using-python.md @@ -1,6 +1,6 @@ --- html: get-started-using-python.html -parent: get-started.html +parent: python.html blurb: Build a Python app that interacts with the XRP Ledger. cta_text: Build an XRP Ledger-connected app top_nav_name: Python @@ -9,7 +9,6 @@ labels: - Development showcase_icon: assets/img/logos/python.svg --- - # Get Started Using Python This tutorial walks you through the basics of building an XRP Ledger-connected application using [`xrpl-py`](https://github.com/XRPLF/xrpl-py), a pure [Python](https://www.python.org) library built to interact with the XRP Ledger using native Python models and methods. @@ -62,7 +61,7 @@ To make queries and submit transactions, you need to connect to the XRP Ledger. The sample code in the previous section shows you how to connect to the Testnet, which is a [parallel network](parallel-networks.html) for testing where the money has no real value. When you're ready to integrate with the production XRP Ledger, you'll need to connect to the Mainnet. You can do that in two ways: -* By [installing the core server](install-rippled.html) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](connect-your-rippled-to-the-xrp-test-net.html). [There are good reasons to run your own core server](xrpl-servers.html#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: +* By [installing the core server](install-rippled.html) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](connect-your-rippled-to-the-xrp-test-net.html). [There are good reasons to run your own core server](networks-and-servers.html#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: from xrpl.clients import JsonRpcClient JSON_RPC_URL = "http://localhost:5005/" @@ -79,9 +78,9 @@ The sample code in the previous section shows you how to connect to the Testnet, ### {{n.next()}}. Get account -To store value and execute transactions on the XRP Ledger, you need an account: a [set of keys](cryptographic-keys.html#key-components) and an [address](accounts.html#addresses) that's been [funded with enough XRP](accounts.html#creating-accounts) to meet the [account reserve](reserves.html). The address is the identifier of your account and you use the [private key](cryptographic-keys.html#private-key) to sign transactions that you submit to the XRP Ledger. +To store value and execute transactions on the XRP Ledger, you need an account: a [set of keys](cryptographic-keys.html#key-components) and an [address](addresses.html) that's been [funded with enough XRP](accounts.html#creating-accounts) to meet the [account reserve](reserves.html). The address is the identifier of your account and you use the [private key](cryptographic-keys.html#private-key) to sign transactions that you submit to the XRP Ledger. -For testing and development purposes, you can use the [XRP Faucets](xrp-testnet-faucet.html) to generate keys and fund the account on the Testnet or Devnet. For production purposes, you should take care to store your keys and set up a [secure signing method](set-up-secure-signing.html). Another difference in production is that XRP has real worth, so you can't get it for free from a faucet. +For testing and development purposes, you can use the [XRP Faucets](xrp-testnet-faucet.html) to generate keys and fund the account on the Testnet or Devnet. For production purposes, you should take care to store your keys and set up a [secure signing method](secure-signing.html). Another difference in production is that XRP has real worth, so you can't get it for free from a faucet. To create and fund an account on the Testnet, `xrpl-py` provides the [`generate_faucet_wallet`](https://xrpl-py.readthedocs.io/en/latest/source/xrpl.wallet.html#xrpl.wallet.generate_faucet_wallet) method: @@ -199,7 +198,7 @@ The response fields that you want to inspect in most cases are: * `account_data.Balance` — This is the account's balance of [XRP, in drops][]. You can use this to confirm that you have enough XRP to send (if you're making a payment) and to meet the [current transaction cost](transaction-cost.html#current-transaction-cost) for a given transaction. -* `validated` — Indicates whether the returned data is from a [validated ledger](ledgers.html#open-closed-and-validated-ledgers). When inspecting transactions, it's important to confirm that [the results are final](finality-of-results.html) before further processing the transaction. If `validated` is `true` then you know for sure the results won't change. For more information about best practices for transaction processing, see [Reliable Transaction Submission](reliable-transaction-submission.html). +* `validated` — Indicates whether the returned data is from a [validated ledger](open-closed-validated-ledgers.html). When inspecting transactions, it's important to confirm that [the results are final](finality-of-results.html) before further processing the transaction. If `validated` is `true` then you know for sure the results won't change. For more information about best practices for transaction processing, see [Reliable Transaction Submission](reliable-transaction-submission.html). For a detailed description of every response field, see [account_info](account_info.html#response-format). @@ -209,7 +208,7 @@ For a detailed description of every response field, see [account_info](account_i Now that you know how to use `xrpl-py` to connect to the XRP Ledger, get an account, and look up information about it, you can also use `xrpl-py` to: * [Send XRP](send-xrp.html). -* [Set up secure signing](set-up-secure-signing.html) for your account. +* [Set up secure signing](secure-signing.html) for your account. diff --git a/content/tutorials/get-started/get-started.ja.md b/content/tutorials/get-started/get-started.ja.md deleted file mode 100644 index 03987210e6..0000000000 --- a/content/tutorials/get-started/get-started.ja.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -html: get-started.html -parent: tutorials.html -blurb: XRP Ledgerを使用する際に必要となるリソースの一部をご紹介します。 -filters: - - js_editor -labels: - - 開発 ---- -# 始めましょう - -XRP Ledgerは常にオンラインで、完全に公開されています。このページにあるようなソースコードがあれば、誰でも**ブラウザから直接**アクセスすることができます。 - -次の例では、最新の[レジャーバージョン](ledgers.html)と、そのレジャーバージョンで新たに検証されたトランザクションのリストを、[ledger メソッド][]を使って取得しています。このまま実行してみたり、コードを変更して何が起こるか見てみましょう。 - -**ヒント:**可能であれば、**F12**を押して、ブラウザの開発者ツールを開いてください。コンソールタブには、JavaScriptのネイティブコンソールが用意されており、どのウェブページでどのようなコードが実行されているかを知ることができます。 - - -{{currentpage.ripple_lib_tag}} - - - -```js -async function main() { - const api = new xrpl.Client('wss://xrplcluster.com'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - console.log(response); -} -main(); -``` - -```js -async function main() { - const api = new xrpl.Client('wss://s.altnet.rippletest.net/'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - console.log(response); -} -main(); -``` - -```js -async function main() { - const api = new xrpl.Client('wss://xrplcluster.com'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - - let tx_id = response.result.ledger.transactions[0]; - let response2 = await api.request({ - "command": "tx", - "transaction": tx_id - }); - console.log(response2); -} -main(); -``` - -```js -async function main() { - const api = new xrpl.Client('wss://xrplcluster.com'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - console.log('Total XRP: '+xrpl.dropsToXrp(response.result.ledger.total_coins)); -} -main(); -``` - - - - -## 提案 - -上のコードを編集して、何か別のことをしてみてください。 - -- 代わりに、`wss://s.altnet.rippletest.net/`の[Testnet](parallel-networks.html)公開サーバに接続してみましょう。 [Answer >](javascript:js_interactives.step2.ex_1()) -- [tx メソッド][]を使って、台帳の取引の1つの詳細を調べてみましょう。[Answer >](javascript:js_interactives.step2.ex_2()) -- レスポンスの`total_coins`を10進数のXRPに変換してみましょう。 [Answer >](javascript:js_interactives.step2.ex_3()) - - -## セットアップ手順 - -このページには必要な前提条件がすでに読み込まれていますが、そのページのHTMLに[xrpl.js](https://github.com/XRPLF/xrpl.js/)を読み込めば、**あらゆるウェブページ**からXRP Ledgerにアクセスすることができます。 -例えば、以下のようになります。 - -```html - -``` - - -## 参考文献 - -準備ができたら、これらのリソースを使ってXRP Ledgerを使い続けましょう。 - -- [XRPを送信](send-xrp.html)して、最初の取引を行う。 -- XRP Ledgerの設計の背景にある[コンセプトを理解](concepts.html)する。 -- ネットワークに参加するために[`rippled`をインストール](install-rippled.html)する。 -- [Testnet XRPを入手](xrp-testnet-faucet.html)して、支払いの送受信を試す。 - - -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} -{% include '_snippets/rippled_versions.md' %} diff --git a/content/tutorials/get-started/get-started.md b/content/tutorials/get-started/get-started.md deleted file mode 100644 index 22a463f2d7..0000000000 --- a/content/tutorials/get-started/get-started.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -html: get-started.html -parent: tutorials.html -blurb: Get up and running with some of the resources you'll use to work with the XRP Ledger. -filters: - - js_editor -labels: - - Development ---- -# Get Started - -The XRP Ledger is always online and entirely public. Anyone can access it **directly from a web browser** with source code like what's on this page. - -The following example gets the latest [ledger version](ledgers.html) and a list of transactions that were newly-validated in that ledger version, using the [ledger method][]. Try running it as-is, or change the code and see what happens. - -**Tip:** If you can, open your browser's Developer Tools by pressing **F12**. The "Console" tab provides a native JavaScript console and can give insight into what code is running on any webpage. - - -{{currentpage.ripple_lib_tag}} - - - -```js -async function main() { - const api = new xrpl.Client('wss://xrplcluster.com'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - console.log(response); -} -main(); -``` - -```js -async function main() { - const api = new xrpl.Client('wss://s.altnet.rippletest.net/'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - console.log(response); -} -main(); -``` - -```js -async function main() { - const api = new xrpl.Client('wss://xrplcluster.com'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - - let tx_id = response.result.ledger.transactions[0]; - let response2 = await api.request({ - "command": "tx", - "transaction": tx_id - }); - console.log(response2); -} -main(); -``` - -```js -async function main() { - const api = new xrpl.Client('wss://xrplcluster.com'); - await api.connect(); - - let response = await api.request({ - "command": "ledger", - "ledger_index": "validated", - "transactions": true - }); - console.log('Total XRP: '+xrpl.dropsToXrp(response.result.ledger.total_coins)); -} -main(); -``` - - - - -## Suggestions - -Try editing the code above to do something different: - -- Connect to the [Testnet](parallel-networks.html) public server at `wss://s.altnet.rippletest.net/` instead. [Answer >](javascript:js_interactives.step2.ex_1()) -- Look up the details of one of the ledger's transaction using the [tx method][]. [Answer >](javascript:js_interactives.step2.ex_2()) -- Convert the `total_coins` from the response to decimal XRP. [Answer >](javascript:js_interactives.step2.ex_3()) - - -## Setup Steps - -This page has the necessary prerequisites already loaded, but you can access the XRP Ledger from **any webpage** if you load [xrpl.js](https://github.com/XRPLF/xrpl.js/) in that page's HTML. For example: - -```html - -``` - - -## Further Reading - -When you're ready to move on, continue using the XRP Ledger with these resources: - -- [Send XRP](send-xrp.html) to send your first transaction. -- [Understand the Concepts](concepts.html) behind the XRP Ledger's design. -- [Install `rippled`](install-rippled.html) to participate in the network. -- [Get Testnet XRP](xrp-testnet-faucet.html) to try sending and receiving payments. - - -{% include '_snippets/rippled-api-links.md' %} -{% include '_snippets/tx-type-links.md' %} -{% include '_snippets/rippled_versions.md' %} diff --git a/content/tutorials/get-started/monitor-incoming-payments-with-websocket.ja.md b/content/tutorials/get-started/monitor-incoming-payments-with-websocket.ja.md index eba6809dc8..d5bf276a62 100644 --- a/content/tutorials/get-started/monitor-incoming-payments-with-websocket.ja.md +++ b/content/tutorials/get-started/monitor-incoming-payments-with-websocket.ja.md @@ -1,6 +1,6 @@ --- html: monitor-incoming-payments-with-websocket.html -parent: get-started.html +parent: http-websocket-apis-tutorials.html blurb: WebSocket APIを使用して、新しいXRPペイメントなどを積極的に監視します。 filters: - interactive_steps @@ -497,7 +497,7 @@ _Go_ ## 関連項目 - **コンセプト:** - - [トランザクションの基本](transaction-basics.html) + - [トランザクション](transactions.html) - [結果のファイナリティー](finality-of-results.html) - トランザクションの成功また失敗が最終的なものとなるタイミングを判断する方法(簡単な説明: トランザクションが検証済みレジャーにある場合は、その結果とメタデータは最終的なものです)。 - **チュートリアル:** - [信頼できるトランザクションの送信](reliable-transaction-submission.html) diff --git a/content/tutorials/get-started/monitor-incoming-payments-with-websocket.md b/content/tutorials/get-started/monitor-incoming-payments-with-websocket.md index edc6587d2d..325c0990c6 100644 --- a/content/tutorials/get-started/monitor-incoming-payments-with-websocket.md +++ b/content/tutorials/get-started/monitor-incoming-payments-with-websocket.md @@ -1,6 +1,6 @@ --- html: monitor-incoming-payments-with-websocket.html -parent: get-started.html +parent: http-websocket-apis-tutorials.html blurb: Use the WebSocket API to actively monitor for new XRP payments (and more). filters: - interactive_steps @@ -499,7 +499,7 @@ _Python_ ## See Also - **Concepts:** - - [Transaction Basics](transaction-basics.html) + - [Transactions](transactions.html) - [Finality of Results](finality-of-results.html) - How to know when a transaction's success or failure is final. (Short version: if a transaction is in a validated ledger, its outcome and metadata are final.) - **Tutorials:** - [Reliable Transaction Submission](reliable-transaction-submission.html) diff --git a/content/tutorials/get-started/public-servers.md b/content/tutorials/get-started/public-servers.md index 72d1775089..3195c9fa90 100644 --- a/content/tutorials/get-started/public-servers.md +++ b/content/tutorials/get-started/public-servers.md @@ -1,6 +1,6 @@ --- html: public-servers.html -parent: get-started.html +parent: tutorials.html blurb: Use these public servers to access the XRP Ledger without needing your own infrastructure. labels: - Core Server diff --git a/content/tutorials/get-started/send-xrp.ja.md b/content/tutorials/get-started/send-xrp.ja.md index c6bd0859c5..32318a78f6 100644 --- a/content/tutorials/get-started/send-xrp.ja.md +++ b/content/tutorials/get-started/send-xrp.ja.md @@ -323,7 +323,6 @@ XrplClient xrplClient = new XrplClient(rippledUrl); - [アカウント設定](manage-account-settings.html)をカスタマイズする - [トランザクションのメタデータ](transaction-metadata.html)にトランザクションの結果の詳細がどのように記述されているかを知る - escrowやPayment Channelなどの[複雑な支払いタイプ](complex-payment-types.html)について調べる -- [XRP Ledgerビジネス](xrp-ledger-businesses.html)のベストプラクティスを読む {% include '_snippets/rippled-api-links.md' %} diff --git a/content/tutorials/get-started/send-xrp.md b/content/tutorials/get-started/send-xrp.md index 61efaf7ba5..db63d6b61d 100644 --- a/content/tutorials/get-started/send-xrp.md +++ b/content/tutorials/get-started/send-xrp.md @@ -1,6 +1,6 @@ --- html: send-xrp.html -parent: get-started.html +parent: tasks.html blurb: Learn how to send test payments right from your browser. cta_text: Send XRP embed_xrpl_js: true @@ -57,7 +57,7 @@ The secret key shown here is for example only. For development purposes, you can {% include '_snippets/interactive-tutorials/generate-step.md' %} -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). ### {{n.next()}}. Connect to a Testnet Server @@ -417,7 +417,6 @@ After completing this tutorial, you may want to try the following: - Customize your [Account Settings](manage-account-settings.html). - Learn how [Transaction Metadata](transaction-metadata.html) describes the outcome of a transaction in detail. - Explore more [Payment Types](payment-types.html) such as Escrows and Payment Channels. -- Read best practices for [XRP Ledger Businesses](xrp-ledger-businesses.html). diff --git a/content/tutorials/manage-account-settings/assign-a-regular-key-pair.ja.md b/content/tutorials/manage-account-settings/assign-a-regular-key-pair.ja.md index ddae3642f0..8eb1d38ffb 100644 --- a/content/tutorials/manage-account-settings/assign-a-regular-key-pair.ja.md +++ b/content/tutorials/manage-account-settings/assign-a-regular-key-pair.ja.md @@ -674,7 +674,7 @@ rippled submit 1200032280000000240000000468400000000000000A73210330E7FC9D56BB25D - [レギュラーキーペアの変更または削除](change-or-remove-a-regular-key-pair.html) - [マルチシグの設定](set-up-multi-signing.html) -- [発行アドレスと運用アドレス](issuing-and-operational-addresses.html) +- [発行アドレスと運用アドレス](account-types.html) - [取引所としてのXRPの上場](list-xrp-as-an-exchange.html) diff --git a/content/tutorials/manage-account-settings/assign-a-regular-key-pair.md b/content/tutorials/manage-account-settings/assign-a-regular-key-pair.md index 7290ce24e9..f2ce290e06 100644 --- a/content/tutorials/manage-account-settings/assign-a-regular-key-pair.md +++ b/content/tutorials/manage-account-settings/assign-a-regular-key-pair.md @@ -133,7 +133,7 @@ In the next step, you'll use the address from this response (`account_id` in the Use a [SetRegularKey transaction][] to assign the key pair you generated in step 1 to your account as a regular key pair. -When assigning a regular key pair to your account for the first time, the SetRegularKey transaction requires signing with your account's master private key (secret). There are [several ways of securely signing transactions](set-up-secure-signing.html), but this tutorial uses a local `rippled` server. +When assigning a regular key pair to your account for the first time, the SetRegularKey transaction requires signing with your account's master private key (secret). There are [several ways of securely signing transactions](secure-signing.html), but this tutorial uses a local `rippled` server. When you send later SetRegularKey transactions, you can sign using the existing regular private key to replace or [remove itself](change-or-remove-a-regular-key-pair.html). Note that you should still not submit your regular private key across the network. @@ -414,7 +414,7 @@ Note that the response contains a `hash` of the transaction, which you can use t At this point, the regular key pair is assigned to your account and you should be able to send transactions using the regular key pair. **To avoid losing control of your account,** it is important that you test your regular key before you take any additional steps such as [disabling the master key pair](disable-master-key-pair.html). If you make a mistake and lose access to your account, no one can restore it for you. -To verify that your account has the regular key pair set correctly, submit an [AccountSet transaction][] from your account, signing it with the regular private key you assigned to your account in step 2. As in step 1, this tutorial uses a local `rippled` server as a [way of securely signing transactions](set-up-secure-signing.html). +To verify that your account has the regular key pair set correctly, submit an [AccountSet transaction][] from your account, signing it with the regular private key you assigned to your account in step 2. As in step 1, this tutorial uses a local `rippled` server as a [way of securely signing transactions](secure-signing.html). ### Sign Your Transaction @@ -692,7 +692,7 @@ Now that you're familiar with the benefits of assigning a regular key pair to an - **Concepts:** - [Cryptographic Keys](cryptographic-keys.html) - [Multi-Signing](multi-signing.html) - - [Issuing and Operational Addresses](issuing-and-operational-addresses.html) + - [Issuing and Operational Addresses](account-types.html) - **Tutorials:** - [Change or Remove a Regular Key Pair](change-or-remove-a-regular-key-pair.html) - [Set Up Multi-Signing](set-up-multi-signing.html) diff --git a/content/tutorials/manage-account-settings/disable-master-key-pair.ja.md b/content/tutorials/manage-account-settings/disable-master-key-pair.ja.md index 0950219fd4..f6c80820c9 100644 --- a/content/tutorials/manage-account-settings/disable-master-key-pair.ja.md +++ b/content/tutorials/manage-account-settings/disable-master-key-pair.ja.md @@ -10,7 +10,7 @@ labels: このページでは、[アカウント](accounts.html)のアドレスに数学的に関連付けられた[マスターキーペア](cryptographic-keys.html)を無効化する方法について説明します。あなたのアカウントのマスターキーペアが漏洩した可能性がある場合、または[マルチシグ](multi-signing.html)をあなたのアカウントからトランザクションを送信する _唯一_ の方法としたい場合、これを行う必要があります。 -**注意:** マスターキーペアを無効にすると、[トランザクションの承認](transaction-basics.html#トランザクションの承認)の方法の1つが削除されます。マスターキーペアを無効にする前に、レギュラーキーやマルチ・サインなど、他のトランザクションの承認方法のいずれかを使用できることを確認する必要があります。(例えば、[レギュラーキーペアを割り当てた場合](assign-a-regular-key-pair.html)は、そのレギュラーキーで正常にトランザクションを送信できることを確認してください)。XRP Ledgerは分散型であるため、残りの取引承認方法を使用できない場合、誰もあなたのアカウントへのアクセスを回復することができません。 +**注意:** マスターキーペアを無効にすると、[トランザクションの承認](transactions.html#トランザクションの承認)の方法の1つが削除されます。マスターキーペアを無効にする前に、レギュラーキーやマルチ・サインなど、他のトランザクションの承認方法のいずれかを使用できることを確認する必要があります。(例えば、[レギュラーキーペアを割り当てた場合](assign-a-regular-key-pair.html)は、そのレギュラーキーで正常にトランザクションを送信できることを確認してください)。XRP Ledgerは分散型であるため、残りの取引承認方法を使用できない場合、誰もあなたのアカウントへのアクセスを回復することができません。 **マスターキーペアを無効にするには、マスターキーペアを使用する必要があります。** ただし、他のトランザクションの認証方法を使用してマスターキーペアを _再有効化_ することは可能です。 @@ -19,9 +19,9 @@ labels: アカウントのマスターキーペアを無効にするには、次の前提条件を満たしている必要があります。 -- XRPレジャー[アカウント](accounts.html)を持ち、そのアカウントからマスターキーペアを用いてトランザクションの署名と提出ができることが必要です。[安全な署名の設定](set-up-secure-signing.html) を参照してください。これには2つの一般的な方法があります。 +- XRPレジャー[アカウント](accounts.html)を持ち、そのアカウントからマスターキーペアを用いてトランザクションの署名と提出ができることが必要です。[安全な署名の設定](secure-signing.html) を参照してください。これには2つの一般的な方法があります。 - アカウントのマスターシード値を知っている。シード値は一般的に `sn3nxiW7v8KXzPzAqzyHXbSSKNuN9`のような "s" で始まる [base58][] 値で表されます。 - - あるいは、シード値を知る必要がなく、安全に保存する[専用の署名デバイス](set-up-secure-signing.html#専用の署名デバイスを使用する) を使用します + - あるいは、シード値を知る必要がなく、安全に保存する[専用の署名デバイス](secure-signing.html#専用の署名デバイスを使用する) を使用します - あなたのアカウントには、マスターキーペア以外のトランザクションを認証する方法が少なくとも1つ必要です。つまり、以下のいずれか、または両方を行う必要があります。 - [レギュラーキーペアを割り当てる](assign-a-regular-key-pair.html). - [マルチシグの設定](set-up-multi-signing.html). @@ -48,7 +48,7 @@ labels: トランザクションの署名には、**マスターキーペア**を使用する必要があります。 -**注意:** 自分が管理していないサーバーに秘密鍵を提出したり、暗号化されていない状態でネットワーク上に送信したりしないでください。これらの例は、[ローカルの `rippled` サーバー](set-up-secure-signing.html#ローカルでrippledを実行する) を使っていることを前提にしています。他の[安全な署名方法](set-up-secure-signing.html)を使っている場合は、これらの手順を変更する必要があります。 +**注意:** 自分が管理していないサーバーに秘密鍵を提出したり、暗号化されていない状態でネットワーク上に送信したりしないでください。これらの例は、[ローカルの `rippled` サーバー](secure-signing.html#ローカルでrippledを実行する) を使っていることを前提にしています。他の[安全な署名方法](secure-signing.html)を使っている場合は、これらの手順を変更する必要があります。 #### リクエストの例 diff --git a/content/tutorials/manage-account-settings/disable-master-key-pair.md b/content/tutorials/manage-account-settings/disable-master-key-pair.md index d2fc92efe9..f27e456043 100644 --- a/content/tutorials/manage-account-settings/disable-master-key-pair.md +++ b/content/tutorials/manage-account-settings/disable-master-key-pair.md @@ -10,7 +10,7 @@ labels: This page describes how to disable the [master key pair](cryptographic-keys.html) that is mathematically associated with an [account](accounts.html)'s address. You should do this if your account's master key pair may have been compromised, or if you want to make [multi-signing](multi-signing.html) the _only_ way to submit transactions from your account. -**Warning:** Disabling the master key pair removes one method of [authorizing transactions](transaction-basics.html#authorizing-transactions). You should be sure you can use one of the other ways of authorizing transactions, such as with a regular key or by multi-signing, before you disable the master key pair. (For example, if you [assigned a regular key pair](assign-a-regular-key-pair.html), make sure that you can successfully submit transactions with that regular key.) Due to the decentralized nature of the XRP Ledger, no one can restore access to your account if you cannot use the remaining ways of authorizing transactions. +**Warning:** Disabling the master key pair removes one method of [authorizing transactions](transactions.html#authorizing-transactions). You should be sure you can use one of the other ways of authorizing transactions, such as with a regular key or by multi-signing, before you disable the master key pair. (For example, if you [assigned a regular key pair](assign-a-regular-key-pair.html), make sure that you can successfully submit transactions with that regular key.) Due to the decentralized nature of the XRP Ledger, no one can restore access to your account if you cannot use the remaining ways of authorizing transactions. **To disable the master key pair, you must use the master key pair.** However, you can _re-enable_ the master key pair using any other method of authorizing transactions. @@ -18,9 +18,9 @@ This page describes how to disable the [master key pair](cryptographic-keys.html To disable the master key pair for an account, you must meet the following prerequisites: -- You must have an XRP Ledger [account](accounts.html) and you must be able to sign and submit transactions from that account using the master key pair. See also: [Set Up Secure Signing](set-up-secure-signing.html). Two common ways this can work are: +- You must have an XRP Ledger [account](accounts.html) and you must be able to sign and submit transactions from that account using the master key pair. See also: [Set Up Secure Signing](secure-signing.html). Two common ways this can work are: - You know the account's master seed value. A seed value is commonly represented as a [base58][] value starting with "s", such as `sn3nxiW7v8KXzPzAqzyHXbSSKNuN9`. - - Or, you use a [dedicated signing device](set-up-secure-signing.html#use-a-dedicated-signing-device) that stores the seed value securely, so you don't need to know it. + - Or, you use a [dedicated signing device](secure-signing.html#use-a-dedicated-signing-device) that stores the seed value securely, so you don't need to know it. - Your account must have at least one method of authorizing transactions other than the master key pair. In other words, you must do one or both of the following: - [Assign a Regular Key Pair](assign-a-regular-key-pair.html). - [Set Up Multi-Signing](set-up-multi-signing.html). @@ -47,7 +47,7 @@ Prepare an [AccountSet transaction][] from your account with the field `"SetValu You must use the **master key pair** to sign the transaction. -**Warning:** Do not submit your secret to a server you don't control, and do not send it over the network unencrypted. These examples assume you are using a [local `rippled` server](set-up-secure-signing.html#run-rippled-locally). You should adapt these instructions if you are using another [secure signing configuration](set-up-secure-signing.html). +**Warning:** Do not submit your secret to a server you don't control, and do not send it over the network unencrypted. These examples assume you are using a [local `rippled` server](secure-signing.html#run-rippled-locally). You should adapt these instructions if you are using another [secure signing configuration](secure-signing.html). #### Example Request diff --git a/content/tutorials/manage-account-settings/offline-account-setup.ja.md b/content/tutorials/manage-account-settings/offline-account-setup.ja.md index 98f84940b4..a3251667fb 100644 --- a/content/tutorials/manage-account-settings/offline-account-setup.ja.md +++ b/content/tutorials/manage-account-settings/offline-account-setup.ja.md @@ -8,7 +8,7 @@ labels: --- # オフラインでのアカウント設定のチュートリアル -きわめて安全な[署名構成](set-up-secure-signing.html)では、XRP Ledger[アカウント](accounts.html)の[暗号鍵](cryptographic-keys.html)をオフラインの物理的に隔離されたマシンに安全に保管します。この構成を設定すると、さまざまなトランザクションに署名して、署名済みトランザクションのみをオンラインコンピューターに転送し、秘密鍵をオンラインにいる不正使用者に見せることなくそれらのトランザクションをXRP Ledgerネットワークに送信できます。 +きわめて安全な[署名構成](secure-signing.html)では、XRP Ledger[アカウント](accounts.html)の[暗号鍵](cryptographic-keys.html)をオフラインの物理的に隔離されたマシンに安全に保管します。この構成を設定すると、さまざまなトランザクションに署名して、署名済みトランザクションのみをオンラインコンピューターに転送し、秘密鍵をオンラインにいる不正使用者に見せることなくそれらのトランザクションをXRP Ledgerネットワークに送信できます。 **注意:** オフラインマシンを保護するためには、適切な運用セキュリティ対策が必要です。例えば、オフラインマシンは信頼できない人がアクセスできない場所に物理的に設置する必要があり、信頼できるオペレーターはマシンに悪用されたソフトウェアを転送しないように注意する必要があります。(例えば、ネットワークに接続されたコンピューターに接続したことがあるUSBドライブは使用してはいけません。) @@ -30,13 +30,13 @@ labels: ### {{n.next()}}. オフラインマシンの設定 -オフラインマシンには、安全な永続ストレージ(暗号化されたディスクドライブなど)と[トランザクションに署名する](set-up-secure-signing.html)ための方法が必要です。一般的には、必要なソフトウェアをオンラインマシンでダウンロードして、物理メディアを使ってオフラインマシンに転送します。オンラインマシン、物理メディア、ソフトウェア自体がマルウェアに感染していないことを確認する必要があります。 +オフラインマシンには、安全な永続ストレージ(暗号化されたディスクドライブなど)と[トランザクションに署名する](secure-signing.html)ための方法が必要です。一般的には、必要なソフトウェアをオンラインマシンでダウンロードして、物理メディアを使ってオフラインマシンに転送します。オンラインマシン、物理メディア、ソフトウェア自体がマルウェアに感染していないことを確認する必要があります。 XRP Ledgerで署名するためのソフトウェアオプションは次のとおりです。 - パッケージ(`.deb`または`.rpm`。使用するLinuxディストリビューションによって異なる)ファイルから[`rippled`をインストール](install-rippled.html)し、[スタンドアロンモードで実行します](rippled-server-modes.html)。 - [xrpl.js](https://github.com/XRPLF/xrpl.js/)とその依存関係をオフラインでインストールします。例えば、Yarn Package Managerでは、[オフラインでの使用に関して推奨される手順](https://yarnpkg.com/blog/2016/11/24/offline-mirror/)があります。 -- 関連項目: [安全な署名の設定](set-up-secure-signing.html) +- 関連項目: [安全な署名の設定](secure-signing.html) オフラインマシンでトランザクションの指示を生成するプロセスを容易にするために、カスタムソフトウェアを設定することもできます。例えば、ソフトウェアで次に使用する[シーケンス番号][]を追跡したり、送信するトランザクションのタイプに応じた設定済みテンプレートを含めるといったことが可能です。 @@ -146,9 +146,9 @@ Loading: "/etc/opt/ripple/rippled.cfg" - アカウントセキュリティを強化するために、[マルチシグを設定する](set-up-multi-signing.html)。 - 明示的に承認した送金、または事前に承認した相手からの送金のみを受け取れるようにするために、[DepositAuthを有効にする](depositauth.html)。 - ユーザーがあなたの許可なくあなたへの[トラストライン](trust-lines-and-issuing.html)を開けないようにするために、[RequireAuthを有効にする](authorized-trust-lines.html#requireauthの有効化)。XRP Ledgerの分散型取引所や発行済み通貨機能を使用する予定がない場合は、これを対策として行うことをお勧めします。 -- 発行済み通貨[ゲートウェイ](become-an-xrp-ledger-gateway.html)には次のような追加の設定がある場合があります。 - - 発行済み通貨を送金するユーザーに対して[TransferRateを設定する](become-an-xrp-ledger-gateway.html#transfer-fees)。 - - このアドレスを発行済み通貨のみに使用する予定の場合は、[XRPペイメントを禁止する](become-an-xrp-ledger-gateway.html#disallow-xrp)。 +- 発行済み通貨[ゲートウェイ](stablecoin-issuer.html)には次のような追加の設定がある場合があります。 + - 発行済み通貨を送金するユーザーに対して[TransferRateを設定する](stablecoin-issuer.html#transfer-fees)。 + - このアドレスを発行済み通貨のみに使用する予定の場合は、[XRPペイメントを禁止する](stablecoin-issuer.html#disallow-xrp)。 この段階では、トランザクションに署名をするだけで、まだ送信しません。各トランザクションに対して、`Fee`([トランザクションコスト](transaction-cost.html))や`Sequence`([シーケンス番号][])など、通常は自動入力可能なフィールドを含めて、すべてのフィールドに入力する必要があります。一度に複数のトランザクションを準備する場合は、トランザクションの実行順にシーケンシャルに増やした`Sequence`番号を使用する必要があります。 @@ -330,7 +330,7 @@ Loading: "/etc/opt/ripple/rippled.cfg" - [アカウント](accounts.html) - [暗号鍵](cryptographic-keys.html) - **チュートリアル:** - - [安全な署名の設定](set-up-secure-signing.html) + - [安全な署名の設定](secure-signing.html) - [レギュラーキーペアの割り当て](assign-a-regular-key-pair.html) - [マルチシグの設定](set-up-multi-signing.html) - **リファレンス:** diff --git a/content/tutorials/manage-account-settings/offline-account-setup.md b/content/tutorials/manage-account-settings/offline-account-setup.md index ad1a1bd0de..eeaca70edc 100644 --- a/content/tutorials/manage-account-settings/offline-account-setup.md +++ b/content/tutorials/manage-account-settings/offline-account-setup.md @@ -8,7 +8,7 @@ labels: --- # Offline Account Setup Tutorial -A highly secure [signing configuration](set-up-secure-signing.html) involves keeping an XRP Ledger [account](accounts.html)'s [cryptographic keys](cryptographic-keys.html) securely on an offline, air-gapped machine. After setting up this configuration, you can sign a variety of transactions, transfer only the signed transactions to an online computer, and submit them to the XRP Ledger network without ever exposing your secret key to malicious actors online. +A highly secure [signing configuration](secure-signing.html) involves keeping an XRP Ledger [account](accounts.html)'s [cryptographic keys](cryptographic-keys.html) securely on an offline, air-gapped machine. After setting up this configuration, you can sign a variety of transactions, transfer only the signed transactions to an online computer, and submit them to the XRP Ledger network without ever exposing your secret key to malicious actors online. **Caution:** Proper operational security is necessary to protect your offline machine. For example, the offline machine must be physically located where untrusted people cannot get access to it, and trusted operators must be careful not to transfer compromised software onto the machine. (For example, do not use a USB drive that was previously attached to a network-connected computer.) @@ -30,13 +30,13 @@ To use offline signing, you must meet the following prerequisites: ### {{n.next()}}. Set up offline machine -The offline machine needs secure persistent storage (for example, an encrypted disk drive) and a way to [sign transactions](set-up-secure-signing.html). For an offline machine, you typically use physical media to transfer any necessary software after downloading it from an online machine. You must be sure that the online machine, the physical media, and the software itself are not infected with malware. +The offline machine needs secure persistent storage (for example, an encrypted disk drive) and a way to [sign transactions](secure-signing.html). For an offline machine, you typically use physical media to transfer any necessary software after downloading it from an online machine. You must be sure that the online machine, the physical media, and the software itself are not infected with malware. Software options for signing on the XRP Ledger include: - [Install `rippled`](install-rippled.html) from a package (`.deb` or `.rpm` depending on which Linux distribution you use) file, then [run it in stand-alone mode](rippled-server-modes.html). - Install [xrpl.js](https://github.com/XRPLF/xrpl.js/) (or another [client library](client-libraries.html)) and its dependencies offline. The Yarn package manager, for example, has [recommended instructions for offline usage](https://yarnpkg.com/blog/2016/11/24/offline-mirror/). -- See also: [Set Up Secure Signing](set-up-secure-signing.html) +- See also: [Set Up Secure Signing](secure-signing.html) You may want to set up custom software to help construct transaction instructions on the offline machine. For example, your software may track what [sequence number][] to use next, or contain preset templates for certain types of transactions you expect to send. @@ -148,9 +148,9 @@ On the offline machine, prepare and sign transactions for configuring your accou - [Set Up Multi-Signing](set-up-multi-signing.html) for a higher bar of account security. - [Enable DepositAuth](depositauth.html) so you can only receive payments you've explicitly accepted or from parties you've pre-approved. - [Require Auth](authorized-trust-lines.html#enabling-require-auth) so that users can't open [trust lines](trust-lines-and-issuing.html) to you without your permission. If you don't plan to use the XRP Ledger's decentralized exchange or [token](tokens.html) features, you may want to do this as a precaution. -- [Token Issuers](become-an-xrp-ledger-gateway.html) may have additional setup, such as: - - [Set a Transfer Fee](become-an-xrp-ledger-gateway.html#transfer-fees) for users transferring your tokens. - - [Disallow XRP payments](become-an-xrp-ledger-gateway.html#disallow-xrp) if you plan to use this address for tokens only. +- [Token Issuers](stablecoin-issuer.html) may have additional setup, such as: + - Set a Transfer Fee for users transferring your tokens. + - Disallow XRP payments if you plan to use this address for tokens only. At this stage, you are only signing the transactions, not submitting them. For each transaction, you must provide all fields, including fields that are normally auto-fillable such as the `Fee` ([transaction cost](transaction-cost.html)) and `Sequence` ([sequence number][]). If you prepare multiple transactions at the same time, you must use sequentially increasing `Sequence` numbers in the order you want the transactions to execute. @@ -332,7 +332,7 @@ Then adjust and sign any replacement transactions for transactions that failed i - [Accounts](accounts.html) - [Cryptographic Keys](cryptographic-keys.html) - **Tutorials:** - - [Set Up Secure Signing](set-up-secure-signing.html) + - [Set Up Secure Signing](secure-signing.html) - [Assign a Regular Key Pair](assign-a-regular-key-pair.html) - [Set Up Multi-Signing](set-up-multi-signing.html) - **References:** diff --git a/content/tutorials/manage-account-settings/require-destination-tags.ja.md b/content/tutorials/manage-account-settings/require-destination-tags.ja.md index ec88328b5c..a174b8967d 100644 --- a/content/tutorials/manage-account-settings/require-destination-tags.ja.md +++ b/content/tutorials/manage-account-settings/require-destination-tags.ja.md @@ -85,8 +85,6 @@ Content-Type: application/json - [ソースタグと宛先タグ](source-and-destination-tags.html) - [トランザクションコスト](transaction-cost.html) - [支払いタイプ](payment-types.html) -- **チュートリアル:** - - [XRP Ledgerのビジネス](xrp-ledger-businesses.html) - **リファレンス:** - [account_infoメソッド][] - [AccountSetトランザクション][] diff --git a/content/tutorials/manage-account-settings/require-destination-tags.md b/content/tutorials/manage-account-settings/require-destination-tags.md index bf8de00596..f6eb763d33 100644 --- a/content/tutorials/manage-account-settings/require-destination-tags.md +++ b/content/tutorials/manage-account-settings/require-destination-tags.md @@ -43,7 +43,7 @@ To transact on the XRP Ledger, you need an address and secret key, and some XRP. {% include '_snippets/interactive-tutorials/generate-step.md' %} -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). ### {{n.next()}}. Connect to the Network @@ -140,8 +140,6 @@ For further confirmation, you can send test transactions (from a different addre - [Source and Destination Tags](source-and-destination-tags.html) - [Transaction Cost](transaction-cost.html) - [Payment Types](payment-types.html) -- **Tutorials:** - - [XRP Ledger Businesses](xrp-ledger-businesses.html) - **References:** - [account_info method][] - [AccountSet transaction][] diff --git a/content/tutorials/manage-account-settings/set-up-multi-signing.ja.md b/content/tutorials/manage-account-settings/set-up-multi-signing.ja.md index 3c5bab38b0..01f55d4206 100644 --- a/content/tutorials/manage-account-settings/set-up-multi-signing.ja.md +++ b/content/tutorials/manage-account-settings/set-up-multi-signing.ja.md @@ -7,7 +7,7 @@ labels: --- # マルチシグの設定 -[マルチシグ](multi-signing.html)は、XRP Ledgerの[トランザクション](transaction-basics.html)を承認する3種類の方法の1つです。マルチシグの他に[レギュラーキーとマスターキー](cryptographic-keys.html)で署名する方法があります。3種類のトランザクション承認方法を自由に組み合わせて使用できるように[アドレス](accounts.html)を設定できます。 +[マルチシグ](multi-signing.html)は、XRP Ledgerの[トランザクション](transactions.html)を承認する3種類の方法の1つです。マルチシグの他に[レギュラーキーとマスターキー](cryptographic-keys.html)で署名する方法があります。3種類のトランザクション承認方法を自由に組み合わせて使用できるように[アドレス](accounts.html)を設定できます。 このチュートリアルでは、アドレスのマルチシグを有効にする方法を説明します。 @@ -58,7 +58,7 @@ labels: ## 3. SignerListSetトランザクションの送信 -通常の方法(シングルシグネチャー)で[SignerListSetトランザクション][]に[署名して送信](transaction-basics.html#トランザクションへの署名とトランザクションの送信)します。これによりSignerListがXRP Ledgerのアドレスに関連付けられるので、これ以降はSignerListの複数メンバーがあなたの代わりにトランザクションに署名するマルチシグが可能となります。 +通常の方法(シングルシグネチャー)で[SignerListSetトランザクション][]に[署名して送信](transactions.html#トランザクションへの署名とトランザクションの送信)します。これによりSignerListがXRP Ledgerのアドレスに関連付けられるので、これ以降はSignerListの複数メンバーがあなたの代わりにトランザクションに署名するマルチシグが可能となります。 この例ではSignerListに3人のメンバーが含まれています。また、マルチシグトランザクションにはrsA2LpzuawewSBQXkiju3YQTMzW13pAAdWの署名と、リストの他の2人のメンバーからの少なくとも1つの署名を必要とするように、重みと定数が設定されています。 diff --git a/content/tutorials/manage-account-settings/set-up-multi-signing.md b/content/tutorials/manage-account-settings/set-up-multi-signing.md index 5d42e294b5..39b38e1cc8 100644 --- a/content/tutorials/manage-account-settings/set-up-multi-signing.md +++ b/content/tutorials/manage-account-settings/set-up-multi-signing.md @@ -7,7 +7,7 @@ labels: --- # Set Up Multi-Signing -[Multi-signing](multi-signing.html) is one of three ways to authorize [transactions](transaction-basics.html) for the XRP Ledger, alongside signing with [regular keys and master keys](cryptographic-keys.html). You can configure your [address](accounts.html) to allow any combination of the three methods to authorize transactions. +[Multi-signing](multi-signing.html) is one of three ways to authorize [transactions](transactions.html) for the XRP Ledger, alongside signing with [regular keys and master keys](cryptographic-keys.html). You can configure your [address](accounts.html) to allow any combination of the three methods to authorize transactions. This tutorial demonstrates how to enable multi-signing for an address. @@ -58,7 +58,7 @@ Take note of the `account_id` (XRP Ledger Address) and `master_seed` (secret key ## 3. Send SignerListSet transaction -[Sign and submit](transaction-basics.html#signing-and-submitting-transactions) a [SignerListSet transaction][] in the normal (single-signature) way. This associates a signer list with your XRP Ledger address, so that a combination of signatures from the members of that signer list can multi-sign later transactions on your behalf. +[Sign and submit](transactions.html#signing-and-submitting-transactions) a [SignerListSet transaction][] in the normal (single-signature) way. This associates a signer list with your XRP Ledger address, so that a combination of signatures from the members of that signer list can multi-sign later transactions on your behalf. In this example, the signer list has 3 members, with the weights and quorum set up such that multi-signed transactions need a signature from `rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW` plus at least one signature from the other two members of the list. diff --git a/content/tutorials/manage-account-settings/use-tickets.ja.md b/content/tutorials/manage-account-settings/use-tickets.ja.md index a11991bfe3..0184a7c33b 100644 --- a/content/tutorials/manage-account-settings/use-tickets.ja.md +++ b/content/tutorials/manage-account-settings/use-tickets.ja.md @@ -40,7 +40,7 @@ XRP Ledgerでトランザクションを送信するには、アドレスと秘 {% include '_snippets/interactive-tutorials/generate-step.md' %} -[本番環境のソフトウェアを作成する場合](production-readiness.html)には、既存のアカウントを使用し、[安全な署名](set-up-secure-signing.html)を使用して鍵を管理する必要があります。 +[本番環境のソフトウェアを作成する場合](production-readiness.html)には、既存のアカウントを使用し、[安全な署名](secure-signing.html)を使用して鍵を管理する必要があります。 ### {{n.next()}}. ネットワークへの接続 diff --git a/content/tutorials/manage-account-settings/use-tickets.md b/content/tutorials/manage-account-settings/use-tickets.md index c0bcbbcc67..5e8a236c25 100644 --- a/content/tutorials/manage-account-settings/use-tickets.md +++ b/content/tutorials/manage-account-settings/use-tickets.md @@ -40,7 +40,7 @@ To transact on the XRP Ledger, you need an address and secret key, and some XRP. {% include '_snippets/interactive-tutorials/generate-step.md' %} -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). ### {{n.next()}}. Connect to Network diff --git a/content/tutorials/manage-the-rippled-server/configuration/api-over-lan.md b/content/tutorials/manage-the-rippled-server/configuration/api-over-lan.md deleted file mode 100644 index 89084b048f..0000000000 --- a/content/tutorials/manage-the-rippled-server/configuration/api-over-lan.md +++ /dev/null @@ -1,58 +0,0 @@ -# Configure rippled to Serve APIs Over LAN - - - -***TODO: Describe how to generate a self-signed cert and use certificate-pinning on the client side to protect against MITM attacks AND/OR describe how to use Let's Encrypt to get and renew a ceritificate automatically. In either case, instruct how to configure the server w/ the cert.*** - -**Warning:** This configuration comes with the additional downside that anyone on the LAN can sniff traffic between your machines, potentially gaining access to your secret keys. Do not use this configuration on a network that may have strangers on it. For example, on the LAN at a colocation facility or cloud host, other customers may be able to get access to the traffic between your machines. If you employ several developers sending test transactions, you could run one `rippled` machine for your whole office, while the developers use cheaper hardware, but any user on your office network could potentially use a packet sniffer to get access to developers' secret keys. ***TODO: with proper certs set up this mostly doesn't apply*** - -To use this configuration: - -1. [Install `rippled`](install-rippled.html) on the chosen machine. - - Be sure that this machine meets the minimum [system requirements for `rippled`](system-requirements.html). - -2. Configure the `rippled` machine to have a static IP address in your private LAN. - - Consult your network administrator for instructions for setting up a static IP in your LAN. If you do not have a static IP, you must change your config and restart `rippled` every time the machine's IP changes. - - With IPv4, private LAN addresses commonly start with `10.`, `192.168.`, or `172.(16 to 31).`. With IPv6, private LAN addresses typically start with `fc` or `fd`. - -3. Configure the `rippled` machine to accept connections from your local private network. - - ***TODO: These configuration options need some adjustment*** - - In the `rippled`'s config file, modify the `[port_rpc_admin_local]` and `[port_ws_admin_local]` stanzas to use your server's private-LAN address: - - [port_rpc_admin_local] - port = 5005 - # Change the IP port to match the server's static IP - ip = 10.1.10.13 - # Only the client with the following IP is treated as admin - admin = 10.1.10.2 - protocol = http - - [port_ws_admin_local] - port = 6006 - # Change the IP port to match the server's static IP - ip = 10.1.10.13 - # Only the client with the following IP is treated as admin - admin = 10.1.10.2 - protocol = ws - -4. If your `rippled` machine runs a software firewall, configure the firewall to accept connections on your local private network at the JSON-RPC and Websocket ports you configured in the previous step. (Ports `5005` and `6006` in the previous example.) - - The exact configuration depends on your firewall software. - - If you use Network Address Translation (NAT), **do not** configure your router or hardware firewall to forward these ports from the outside. - -5. On the machine(s) that will submit transactions, connect to your server using your `rippled` server's private IP address and the configured ports. Use the [sign method][] (for single signatures) or [sign_for method][] (for multi-signatures). - - The example configuration from the previous steps uses port `5005` for JSON-RPC connections and port `6006` for Websocket connections. - - - ***TODO: cert pinning stuff here?*** - -6. Keep the `rippled` server running, updated, and in sync with the network while you're using it. - - **Note:** You _can_ turn off your `rippled` server when you're not sending transactions, but it can take up to 15 minutes to sync with the network when you start it up again. diff --git a/content/tutorials/quickstart/authorize-minter.md b/content/tutorials/quickstart/assign-an-authorized-minter-using-javascript.md similarity index 98% rename from content/tutorials/quickstart/authorize-minter.md rename to content/tutorials/quickstart/assign-an-authorized-minter-using-javascript.md index b785023fef..5a8a00d8ab 100644 --- a/content/tutorials/quickstart/authorize-minter.md +++ b/content/tutorials/quickstart/assign-an-authorized-minter-using-javascript.md @@ -1,6 +1,6 @@ --- -html: authorize-minter.html -parent: quickstart-javascript.html +html: assign-an-authorized-minter-using-javascript.html +parent: nfts-using-javascript.html blurb: Authorize another account to mint NFTs for you. labels: - Accounts @@ -8,8 +8,7 @@ labels: - XRP - NFTs, NFTokens --- - -# Assign an Authorized Minter +# Assign an Authorized Minter Using JavaScript You can assign another account permission to mint NFTs for you. @@ -22,7 +21,7 @@ This example shows how to: # Usage -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} archive to try the sample in your own browser. +You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/){.github-code-download} archive to try the sample in your own browser. ## Get Accounts @@ -205,7 +204,7 @@ Report success standbyResultField.value = results ``` -This transaction blob is the same as the one used for the previous [`mintToken()` function](mint-and-burn-nfts.html#mint-token), with the addition of the `Issuer` field. +This transaction blob is the same as the one used for the previous [`mintToken()` function](mint-and-burn-nfts-using-javascript.html#mint-token), with the addition of the `Issuer` field. ```javascript const tx_json = { diff --git a/content/tutorials/quickstart/batch-minting.md b/content/tutorials/quickstart/batch-mint-nfts-using-javascript.md similarity index 99% rename from content/tutorials/quickstart/batch-minting.md rename to content/tutorials/quickstart/batch-mint-nfts-using-javascript.md index 1f352ee301..69f47ce9da 100644 --- a/content/tutorials/quickstart/batch-minting.md +++ b/content/tutorials/quickstart/batch-mint-nfts-using-javascript.md @@ -1,6 +1,6 @@ --- -html: batch-minting.html -parent: quickstart-javascript.html +html: batch-mint-nfts-using-javascript.html +parent: nfts-using-javascript.html blurb: Broker a sale between a sell offer and a buy offer. labels: - Accounts @@ -8,8 +8,7 @@ labels: - Broker - XRP --- - -# Batch Mint NFTs +# Batch Mint NFTs Using JavaScript You can create an application that mints multiple NFTs at one time. You can use a `for` loop to send one transaction after another. diff --git a/content/tutorials/quickstart/broker-sale.md b/content/tutorials/quickstart/broker-an-nft-sale-using-javascript.md similarity index 99% rename from content/tutorials/quickstart/broker-sale.md rename to content/tutorials/quickstart/broker-an-nft-sale-using-javascript.md index d0ade9aaae..b8f124896b 100644 --- a/content/tutorials/quickstart/broker-sale.md +++ b/content/tutorials/quickstart/broker-an-nft-sale-using-javascript.md @@ -1,6 +1,6 @@ --- -html: broker-sale.html -parent: quickstart-javascript.html +html: broker-an-nft-sale-using-javascript.html +parent: nfts-using-javascript.html blurb: Broker a sale between a sell offer and a buy offer. labels: - Accounts @@ -8,8 +8,7 @@ labels: - Broker - XRP --- - -# Broker an NFT Sale +# Broker an NFT Sale Using JavaScript Earlier examples showed how to make buy and sell offers directly between two accounts. Another option is to use a third account as a broker for the sale. The broker acts on behalf of the NFT owner. The seller creates an offer with the broker account as its destination. The broker gathers and evaluates buy offers and chooses which one to accept, adding an agreed-upon fee for arranging the sale. When the broker account accepts a sell offer with a buy offer, the funds and ownership of the NFT are transferred simultaneously, completing the deal. This allows an account to act as a marketplace or personal agent for NFT creators and traders. diff --git a/content/tutorials/quickstart/create-accounts-send-xrp.md b/content/tutorials/quickstart/create-accounts-send-xrp-using-javascript.md similarity index 99% rename from content/tutorials/quickstart/create-accounts-send-xrp.md rename to content/tutorials/quickstart/create-accounts-send-xrp-using-javascript.md index 187d0b5d4b..882cb71d4c 100644 --- a/content/tutorials/quickstart/create-accounts-send-xrp.md +++ b/content/tutorials/quickstart/create-accounts-send-xrp-using-javascript.md @@ -1,14 +1,14 @@ --- -html: create-accounts-send-xrp.html -parent: quickstart-javascript.html -blurb: Quickstart 1, create two accounts and transfer XRP between them. +html: create-accounts-send-xrp-using-javascript.html +parent: send-payments-using-javascript.html +blurb: Create two accounts and transfer XRP between them. labels: - Accounts - Quickstart - Transaction Sending - XRP --- -# 1. Create Accounts and Send XRP +# Create Accounts and Send XRP Using JavaScript This example shows how to: diff --git a/content/tutorials/quickstart/create-conditional-escrows-using-javascript.md b/content/tutorials/quickstart/create-conditional-escrows-using-javascript.md new file mode 100644 index 0000000000..311336b109 --- /dev/null +++ b/content/tutorials/quickstart/create-conditional-escrows-using-javascript.md @@ -0,0 +1,661 @@ +--- +html: create-conditional-escrows-using-javascript.html +parent: send-payments-using-javascript.html +blurb: Create, finish, or cancel condition-based escrow transactions. +labels: + - Accounts + - Quickstart + - Transaction Sending + - XRP +--- +# Create Conditional Escrows Using JavaScript + +This example shows how to: + +1. Create escrow payments that become available when any account enters a fulfillment code. + +2. Complete a conditional escrow transaction. + +3. Cancel a conditional escrow transaction. + +[![Conditional Escrow Tester Form](img/conditional-escrow1.png)](img/conditional-escrow1.png) + + +## Prerequisites + +Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} archive. + +## Usage + +### Create Escrow + +You create a condition-based escrow using a fulfillment code associated with a condition code. Create the condition/fulfillment pair using the `five-bells-condition` application. + +Install `five-bells-condition`: + +1. In a terminal window, navigate to your local `Quickstart` directory (for convenience). +2. Enter the command `npm install five-bells-condition`. + +To create a condition/fulfillment pair: + +1. In a terminal window, navigate to your `Quickstart` directory. +2. Enter the command `node getConditionAndFulfillment.js`. +3. Copy and save the generated Condition and Fulfillment pair. + +[![Condition and Fulfillment](img/conditional-escrow2.png)](img/conditional-escrow2.png) + +To get test accounts: + +1. Open `9.escrow-condition.html` in a browser +2. Choose **Testnet** or **Devnet**. +3. Get test accounts. + 1. If you have existing account seeds + 1. Paste account seeds in the **Seeds** field. + 2. Click **Get Accounts from Seeds**. + 2. If you do not have account seeds: + 1. Click **Get New Standby Account**. + 2. Click **Get New Operational Account**. + +[![Escrow Tester with Account Information](img/conditional-escrow3.png)](img/conditional-escrow3.png) + +### Create Conditional Escrow: + +When you create a conditional escrow, you need to specify the `Condition` value you generated above. You must also set a cancel date and time, after which the escrow is no longer available. + +To create a conditional escrow: + +1. Enter an **Amount** to transfer. +2. Copy the **Operational Account** value. +3. Paste it in the **Destination Account** field. +4. Enter the **Escrow Condition** value. +5. Enter the **Escrow Cancel (seconds)** value. +6. Click **Create Escrow**. +7. Copy and save the _Sequence Number_ of the escrow called out in the **Standby Result** field. + +The escrow is created on the XRP Ledger instance, reserving your requested XRP amount plus the transaction cost. + +When you create an escrow, capture and save the _Sequence Number_ so that you can use it to finish the escrow transaction. + +[![Created Escrow Transaction](img/conditional-escrow4.png)](img/conditional-escrow4.png) + +## Finish Conditional Escrow + +Any account can finish the conditional escrow any time before the _Escrow Cancel_ time. Following on the example above, you can use the _Sequence Number_ to finish the transaction once the Escrow Cancel time has passed. + +To finish a time-based escrow: + +1. Paste the sequence number in the Operational account **Escrow Sequence Number** field. +2. Enter the `Fulfillment` code for the `Condition`. +3. Click **Finish Conditional Escrow**. + +The transaction completes and balances are updated for both the Standby and Operational accounts. + +[![Finished Escrow Transaction](img/conditional-escrow5.png)](img/conditional-escrow5.png) + +## Get Escrows + +Click **Get Escrows** for either the Standby account or the Operational account to see their current list of escrows. + +## Cancel Escrow + +When the Escrow Cancel time passes, the escrow is no longer available to the recipient. The initiator of the escrow can reclaim the XRP, less the transaction fees. Any account can cancel an escrow once the cancel time has elapsed. Accounts that try to cancel the transaction prior to the **Escrow Cancel** time are charged the nominal transaction cost (12 drops), but the actual escrow cannot be cancelled until after the Escrow Cancel time. + +## Oh No! I Forgot to Save the Sequence Number! + +If you forget to save the sequence number, you can find it in the escrow transaction record. + +1. Create a new escrow as described in [Create Escrow](#create-escrow), above. +2. Click **Get Escrows** to get the escrow information. +3. Copy the _PreviousTxnID_ value from the results. + ![Transaction ID in Get Escrows results](img/quickstart-escrow7.png) +4. Paste the _PreviousTxnID_ in the **Transaction to Look Up** field. + ![Transaction to Look Up field](img/quickstart-escrow8.png) +5. Click **Get Transaction**. +6. Locate the _Sequence_ value in the results. + ![Sequence number in results](img/quickstart-escrow9.png) + +# Code Walkthrough + +You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} in the source repository for this website. + +## getConditionAndFulfillment.js + +To generate a condition/fulfillment pair, use Node.js to run the `getConditionAndFulfillment.js` script. + +```javascript +function getConditionAndFulfillment() { +``` + +Instantiate the `five-bells-condition` and `crypto` libraries. + +```javascript + const cc = require('five-bells-condition') + const crypto = require('crypto') +``` + +Create a random 32-byte seed string. + +```javascript + const preimageData = crypto.randomBytes(32) +``` + +Create a fulfillment object. + +```javascript + const fulfillment = new cc.PreimageSha256() +``` + +Generate a fulfillment code. + +```javascript + fulfillment.setPreimage(preimageData) +``` + +Generate the condition value based on the fulfillment value. + +```javascript + const condition = fulfillment.getConditionBinary().toString('hex').toUpperCase() +``` + +Return the condition. + +```javascript + console.log('Condition:', condition) +``` + +Convert the fulfillment code to a hexadecimal string. + +```javascript + const fulfillment_hex = fulfillment.serializeBinary().toString('hex').toUpperCase() +``` + +Return the fulfillment code. Keep it secret until you want to finish the escrow. + +```javascript + console.log('Fulfillment:', fulfillment_hex) +} +getConditionAndFulfillment() +``` + +## ripplex9-escrow-condition.js + + +### Create Conditional Escrow + +```javascript +async function createConditionalEscrow() { +``` + +Connect to your preferred ledger. + +```javascript + results = "Connecting to the selected ledger.\n" + standbyResultField.value = results + let net = getNet() + results = "Connecting to " + net + "....\n" + const client = new xrpl.Client(net) + await client.connect() + + results += "Connected. Creating conditional escrow.\n" + standbyResultField.value = results +``` + +Instantiate the standby and operational wallets + +```javascript + const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) + const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) +``` + +Capture the amount to send in the escrow. + +```javascript + const sendAmount = standbyAmountField.value +``` + +Update the results field. + +```javascript + results += "\nstandby_wallet.address: = " + standby_wallet.address + standbyResultField.value = results +``` + +Create a date value and add your requested number of seconds. + +```javascript + let escrow_cancel_date = new Date() + escrow_cancel_date = addSeconds(parseInt(standbyEscrowCancelDateField.value)) +``` + +Prepare the `EscrowCreate` transaction. + +```javascript + const escrowTx = await client.autofill({ + "TransactionType": "EscrowCreate", + "Account": standby_wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": standbyDestinationField.value, + "CancelAfter": escrow_cancel_date, + "Condition": standbyEscrowConditionField.value + }) +``` + +Sign the transaction. + +```javascript + const signed = standby_wallet.sign(escrowTx) +``` + +Submit the transaction and wait for the results. + +```javascript + const tx = await client.submitAndWait(signed.tx_blob) +``` + +Report the results and update balance fields. + +```javascript + results += "\nSequence Number (Save!): " + JSON.stringify(tx.result.Sequence) + results += "\n\nBalance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) + operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + standbyResultField.value = results +``` + +Disconnect from the XRPL + +```javascript +client.disconnect() + +} // End of createTimeEscrow() +``` + +### Finish Conditional Escrow + +Finish the escrow by submitting the condition and fulfillment codes. + +```javascript +async function finishConditionalEscrow() { +``` + +Connect to your preferred XRP Ledger instance. + +```javascript + results = "Connecting to the selected ledger.\n" + operationalResultField.value = results + let net = getNet() + results += 'Connecting to ' + getNet() + '....' + const client = new xrpl.Client(net) + await client.connect() + results += "\nConnected. Finishing escrow.\n" + operationalResultField.value = results +``` + +Get the standby and operational account wallets. + +```javascript + const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) + const sendAmount = operationalAmountField.value + + results += "\noperational_wallet.address: = " + operational_wallet.address + operationalResultField.value = results +``` + +Prepare the transaction. + +```javascript + const prepared = await client.autofill({ + "TransactionType": "EscrowFinish", + "Account": operationalAccountField.value, + "Owner": standbyAccountField.value, + "OfferSequence": parseInt(operationalEscrowSequenceField.value), + "Condition": standbyEscrowConditionField.value, + "Fulfillment": operationalFulfillmentField.value + }) +``` + +Sign the transaction. + +```javascript + + const signed = operational_wallet.sign(prepared) +``` + +Submit the transaction and wait for the results. + +```javascript + const tx = await client.submitAndWait(signed.tx_blob) +``` + +Report the results. + +```javascript + results += "\nBalance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + operationalResultField.value = results + standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) + operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) +``` + +Disconnect from the XRPL. + +```javascript + client.disconnect() + +} // End of finishEscrow() +``` + + +## 9.escrow-condition.html + +```html + + + Conditional Escrow Test Harness + + + + + + + + + + + + + + +

Conditional Escrow Test Harness

+
+ Choose your ledger instance: +    + + +    + + +

+ +
+ +

+ + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Standby Account + + +
+
+ XRP Balance + + +
+
+ Amount + + +
+
+ Destination Account + + +
+
+ Escrow Condition + + +
+
+ Escrow Cancel (seconds) + + +
+
+ Escrow Sequence Number + + +
+
+ + +
+ Public Key + + +
+
+ Private Key + + +
+
+ Seed + + +
+
+

+ +

+
+ + + + + + + +
+ +

+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + + + + + + + + +
+ +

+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Operational Account + + +
+
+ XRP Balance + + +
+
+ Amount + + +
+
+ Fulfillment Code + + +
+
+ Escrow Sequence Number + + +
+
+ Transaction to Look Up + + +
+
+ + + + +
+ Public Key + + +
+
+ Private Key + + +
+
+ Seed + + +
+
+

+ +

+
+
+
+
+ + +``` + diff --git a/content/tutorials/quickstart/create-time-based-escrows-using-javascript.md b/content/tutorials/quickstart/create-time-based-escrows-using-javascript.md new file mode 100644 index 0000000000..23608eb8fa --- /dev/null +++ b/content/tutorials/quickstart/create-time-based-escrows-using-javascript.md @@ -0,0 +1,825 @@ +--- +html: create-time-based-escrows-using-javascript.html +parent: send-payments-using-javascript.html +blurb: Create, finish, or cancel time-based escrow transactions. +labels: + - Accounts + - Quickstart + - Transaction Sending + - XRP +--- +# Create Time-based Escrows Using JavaScript + +This example shows how to: + + +1. Create escrow payments that become available at a specified time and expire at a specified time. +2. Finish an escrow payment. +3. Retrieve information on escrows attached to an account. +3. Cancel an escrow payment and return the XRP to the sending account. + + +[![Escrow Tester Form](img/quickstart-escrow1.png)](img/quickstart-escrow1.png) + +## Prerequisites + +Download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/){.github-code-download}. + +## Usage + +To get test accounts: + +1. Open `8.escrow.html` in a browser +2. Choose **Testnet** or **Devnet**. +3. Get test accounts. + 1. If you have existing account seeds + 1. Paste account seeds in the **Seeds** field. + 2. Click **Get Accounts from Seeds**. + 2. If you do not have account seeds: + 1. Click **Get New Standby Account**. + 2. Click **Get New Operational Account**. + +[![Escrow Tester with Account Information](img/quickstart-escrow2.png)](img/quickstart-escrow2.png) + +## Create Escrow + +You can create a time-based escrow with a minimum time to finish the escrow and a cancel time after which the funds in escrow are no longer available to the recipient. This is a test harness: while a practical scenario might express time in days or weeks, this form lets you set the finish and cancel times in seconds so that you can quickly run through a variety of scenarios. (There are 86,400 seconds in a day, if you want to play with longer term escrows.) + +To create a time-based escrow: + +1. Enter an **Amount** to transfer. +2. Copy the **Operational Account** value. +3. Paste it in the **Destination Account** field. +4. Set the **Escrow Finish (seconds)** value. For example, enter _10_. +5. Set the **Escrow Cancel (seconds)** value. For example, enter _120_. +6. Click **Create Escrow**. +7. Copy the _Sequence Number_ of the escrow called out in the **Standby Result** field. + +The escrow is created on the XRP Ledger instance, reserving 100 XRP plus the transaction cost. When you create an escrow, capture and save the **Sequence Number** so that you can use it to finish the escrow transaction. + +[![Completed Escrow Transaction](img/quickstart-escrow3.png)](img/quickstart-escrow3.png) + +## Finish Escrow + +The recipient of the XRP held in escrow can finish the transaction any time within the time window after the Escrow Finish date and time but before the Escrow Cancel date and time. Following on the example above, you can use the _Sequence Number_ to finish the transaction once 10 seconds have passed. + +To finish a time-based escrow: + +1. Paste the sequence number in the Operational account **Escrow Sequence Number** field. +2. Click **Finish Escrow**. + +The transaction completes and balances are updated for both the Standby and Operational accounts. + +[![Completed Escrow Transaction](img/quickstart-escrow4.png)](img/quickstart-escrow4.png) + +## Get Escrows + +Click **Get Escrows** for either the Standby account or the Operational account to see their current list of escrows. If you click the buttons now, there are no escrows at the moment. + +For the purposes of this tutorial, follow the steps in [Create Escrow](#create-escrow), above, to create a new escrow transaction, perhaps setting **Escrow Cancel (seconds)** field to _600_ seconds to give you extra time to explore. Remember to capture the _Sequence Number_ from the transaction results. + +Click **Get Escrows** for both the Standby and the Operational account. The `account_info` request returns the same `account_object` for both accounts, demonstrating the link between the accounts created by the escrow transaction. + +[![Get Escrows results](img/quickstart-escrow5.png)](img/quickstart-escrow5.png) + + +## Cancel Escrow + +When the Escrow Cancel time passes, the escrow is no longer available to the recipient. The initiator of the escrow can reclaim the XRP, less the transaction fees. If you try to cancel the transaction prior to the **Escrow Cancel** time, you are charged for the transaction, but the actual escrow cannot be cancelled until the time limit is reached. + +You can wait the allotted time for the escrow you created in the previous step, then use it to try out the **Cancel Escrow** button + +To cancel an expired escrow: + +1. Enter the sequence number in the Standby **Escrow Sequence Number** field. +2. Click **Cancel Escrow**. + +The funds are returned to the Standby account, less the initial transaction fee. + +[![Cancel Escrow results](img/quickstart-escrow6.png)](img/quickstart-escrow6.png) + +## Oh No! I Forgot to Save the Sequence Number! + +If you forget to save the sequence number, you can find it in the escrow transaction record. + +1. Create a new escrow as described in [Create Escrow](#create-escrow), above. +2. Click **Get Escrows** to get the escrow information. +3. Copy the _PreviousTxnID_ value from the results. + ![Transaction ID in Get Escrows results](img/quickstart-escrow7.png) +4. Paste the _PreviousTxnID_ in the **Transaction to Look Up** field. + ![Transaction to Look Up field](img/quickstart-escrow8.png) +5. Click **Get Transaction**. +6. Locate the _Sequence_ value in the results. + ![Sequence number in results](img/quickstart-escrow9.png) + +# Code Walkthrough + +You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} in the source repository for this website. + +## ripple8-escrow.js + +This example can be used with any XRP Ledger network, _Testnet_, or _Devnet_. You can update the code to choose different or additional XRP Ledger networks. + +### Add Seconds to Date + +This function accomplishes two things. It creates a new date object and adds the number of seconds taken from a form field. Then, it adjusts the date from the JavaScript format to the XRP Ledger format. + +You provide the _numOfSeconds_ argument, the second parameter is a new Date object. +```javascript +function addSeconds(numOfSeconds, date = new Date()) { +``` + +Set the _seconds_ value to the date seconds plus the number of seconds you provide. + +```javascript + date.setSeconds(date.getSeconds() + numOfSeconds); +``` + +JavaScript dates are in milliseconds. Divide the date by 1000 to base it on seconds. + +```javascript + date = Math.floor(date / 1000) +``` + +Subtract the number of seconds in the Ripple epoch to convert the value to an XRP Ledger compatible date value. + +```javascript + date = date - 946684800 +``` + +Return the result. + +```javascript + return date; +} +``` + +### Create Time-based Escrow + +```javascript +async function createTimeEscrow() { +``` + +Instantiate two new date objects, then set the dates to the current date plus the set number of seconds for the finish and cancel dates. + +```javascript + let escrow_finish_date = new Date() + let escrow_cancel_date = new Date() + escrow_finish_date = addSeconds(parseInt(standbyEscrowFinishDateField.value)) + escrow_cancel_date = addSeconds(parseInt(standbyEscrowCancelDateField.value)) +``` + +Connect to the ledger. + +```javascript + results = "Connecting to the selected ledger.\n" + standbyResultField.value = results + let net = getNet() + results = "Connecting to " + net + "....\n" + const client = new xrpl.Client(net) + await client.connect() + results += "Connected. Creating time-based escrow.\n" + standbyResultField.value = results +``` + +Get the wallet information based on the account seed values. + +```javascript + const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) + const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + const sendAmount = standbyAmountField.value + results += "\nstandby_wallet.address: = " + standby_wallet.address + standbyResultField.value = results +``` + +Define the `EscrowCreate` transaction, automatically filling values in common fields. + +```javascript + const escrowTx = await client.autofill({ + "TransactionType": "EscrowCreate", + "Account": standby_wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": standbyDestinationField.value, + "FinishAfter": escrow_finish_date, + "CancelAfter": escrow_cancel_date + }) +``` + +Sign the escrow transaction definition. + +```javascript + const signed = standby_wallet.sign(escrowTx) +``` + +Submit the transaction. + +```javascript + const tx = await client.submitAndWait(signed.tx_blob) +``` + +Report the results. + +```javascript + results += "\nSequence Number (Save!): " + JSON.stringify(tx.result.Sequence) + results += "\n\nBalance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) + operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + standbyResultField.value = results +``` + +Disconnect from the XRP Ledger. + +```javascript + client.disconnect() +} // End of createTimeEscrow() +``` + +### Finish Time-based Escrow + +```javascript +async function finishEscrow() { +``` + +Connect to the XRP Ledger and get the account wallets. + +```javascript + results = "Connecting to the selected ledger.\n" + operationalResultField.value = results + let net = getNet() + results = 'Connecting to ' + getNet() + '....' + const client = new xrpl.Client(net) + await client.connect() + + results += "\nConnected. Finishing escrow.\n" + operationalResultField.value = results + + const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) + const sendAmount = operationalAmountField.value + + results += "\noperational_wallet.address: = " + operational_wallet.address + operationalResultField.value = results +``` + +Define the transaction. The _Owner_ is the account that created the escrow. The _OfferSequence_ is the sequence number of the escrow transaction. Automatically fill in the common fields for the transaction. + +```javascript + const prepared = await client.autofill({ + "TransactionType": "EscrowFinish", + "Account": operationalAccountField.value, + "Owner": standbyAccountField.value, + "OfferSequence": parseInt(operationalEscrowSequenceField.value) + }) +``` + +Sign the transaction definition. + +```javascript + const signed = operational_wallet.sign(prepared) +``` + +Submit the signed transaction to the XRP ledger. + +```javascript + + const tx = await client.submitAndWait(signed.tx_blob) +``` + +Report the results. + +```javascript + results += "\nBalance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + operationalResultField.value = results + + standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) + operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) +``` + +Disconnect from the XRP Ledger. + +```javascript + client.disconnect() +} // End of finishEscrow() +``` + +### Get Standby Escrows + +Get the escrows associated with the Standby account. + +```javascript +async function getStandbyEscrows() { +``` + +Connect to the network. The information you are looking for is public information, so there is no need to instantiate your wallet. + +```javascript + let net = getNet() + const client = new xrpl.Client(net) + results = 'Connecting to ' + getNet() + '....' + standbyResultField.value = results + + await client.connect() + results += '\nConnected.' + standbyResultField.value = results + + results= "\nGetting standby account escrows...\n" +``` + +Create the `account_objects` request. Specify that you want objects of the type _escrow_. + +```javascript + const escrow_objects = await client.request({ + "id": 5, + "command": "account_objects", + "account": standbyAccountField.value, + "ledger_index": "validated", + "type": "escrow" + }) +``` + +Report the results. + +```javascript + results += JSON.stringify(escrow_objects.result, null, 2) + standbyResultField.value = results +``` + +Disconnect from the XRP Ledger + +```javascript + client.disconnect() +} // End of getStandbyEscrows() +``` + +### Get Operational Escrows + +This function is the same as `getStandbyEscrows()`, but for the Operational account. + +```javascript +async function getOperationalEscrows() { +``` + +Connect to the network. The information you are looking for is public information, so there is no need to instantiate your wallet. + +```javascript + let net = getNet() + const client = new xrpl.Client(net) + results = 'Connecting to ' + getNet() + '....' + operationalResultField.value = results + + await client.connect() + results += '\nConnected.' + operationalResultField.value = results + + results= "\nGetting operational account escrows...\n" +``` + +Create the `account_objects` request. Specify that you want objects of the type _escrow_. + +```javascript + const escrow_objects = await client.request({ + "id": 5, + "command": "account_objects", + "account": operationalAccountField.value, + "ledger_index": "validated", + "type": "escrow" + }) +``` + +Report the results. + +```javascript + results += JSON.stringify(escrow_objects.result, null, 2) + operationalResultField.value = results +``` + +Disconnect from the XRP Ledger instance. + +```javascript + client.disconnect() +} // End of getOperationalEscrows() +``` + +### Get Transaction Info + +```javascript +async function getTransaction() { +``` + +Connect to the XRP Ledger. + +```javascript + let net = getNet() + const client = new xrpl.Client(net) + results = 'Connecting to ' + getNet() + '....' + operationalResultField.value = results + + await client.connect() + results += '\nConnected.' + operationalResultField.value = results + + results= "\nGetting transaction information...\n" +``` + +Prepare and send the transaction information request. The only required parameter is the transaction ID. + +```javascript + const tx_info = await client.request({ + "id": 1, + "command": "tx", + "transaction": operationalTransactionField.value, + }) +``` +Report the results. + +```javascript + results += JSON.stringify(tx_info.result, null, 2) + operationalResultField.value = results +``` + +Disconnect from the XRP Ledger instance. + +```javascript + client.disconnect() +} // End of getTransaction() +``` + +### Cancel Escrow + +Cancel an escrow after it passes the expiration date. + +```javascript +async function cancelEscrow() { +``` + +Connect to the XRP Ledger instance. + +```javascript + let net = getNet() + const client = new xrpl.Client(net) + results = 'Connecting to ' + getNet() + '....' + standbyResultField.value = results + + await client.connect() + results += '\nConnected.' + standbyResultField.value = results +``` + +Get the account wallets. + +```javascript + const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) + const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) +``` + +Prepare the EscrowCancel transaction. + +```javascript + const prepared = await client.autofill({ + "TransactionType": "EscrowCancel", + "Account": standby_wallet.address, + "Owner": standbyAccountField.value, + "OfferSequence": parseInt(standbyEscrowSequenceNumberField.value) + }) +``` + +Sign the transaction. +```javascript + const signed = standby_wallet.sign(prepared) +``` + +Submit the transaction and wait for the response. + +``` javascript + const tx = await client.submitAndWait(signed.tx_blob) +``` + +Report the results. + +```javascript + results += "\nBalance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + standbyResultField.value = results + standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) + operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) +``` + +Disconnect from the XRP Ledger instance. + +```javascript + client.disconnect() +} +``` + +## 8.escrow.html + +```html + + + Time-based Escrow Test Harness + + + + + + + + + + + + + +

Time-based Escrow Test Harness

+
+ Choose your ledger instance: +    + + +    + + +

+ +
+ +

+ + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Standby Account + + +
+
+ XRP Balance + + +
+
+ Amount + + +
+
+ Destination Account + + +
+
+ Escrow Finish (seconds) + + +
+
+ Escrow Cancel (seconds) + + +
+
+ Escrow Sequence Number + + +
+
+ + +
+ Public Key + + +
+
+ Private Key + + +
+
+ Seed + + +
+
+

+ +

+
+ + + + + + + +
+ +

+ +
+ +
+ +
+ +
+
+
+ + + + +
+ + + + + + + + + +
+ +

+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Operational Account + + +
+
+ XRP Balance + + +
+
+ Amount + + +
+
+ Destination + + +
+
+ Escrow Sequence Number + + +
+
+ Transaction to Look Up + + +
+
+ + + + +
+ Public Key + + +
+
+ Private Key + + +
+
+ Seed + + +
+
+

+ +

+
+
+
+
+ + +``` + diff --git a/content/tutorials/quickstart/create-trustline-send-currency.md b/content/tutorials/quickstart/create-trustline-send-currency-using-javascript.md similarity index 99% rename from content/tutorials/quickstart/create-trustline-send-currency.md rename to content/tutorials/quickstart/create-trustline-send-currency-using-javascript.md index 942266707f..8653a43a6e 100644 --- a/content/tutorials/quickstart/create-trustline-send-currency.md +++ b/content/tutorials/quickstart/create-trustline-send-currency-using-javascript.md @@ -1,7 +1,7 @@ --- -html: create-trustline-send-currency.html -parent: quickstart-javascript.html -blurb: Quickstart step 2, create trust lines and send currency. +html: create-trustline-send-currency-using-javascript.html +parent: send-payments-using-javascript.html +blurb: Create Trust Lines and send currency. labels: - Cross-Currency - Payments @@ -9,8 +9,7 @@ labels: - Tokens --- - -# 2. Create Trust Line and Send Currency +# Create Trust Line and Send Currency Using JavaScript This example shows how to: diff --git a/content/tutorials/quickstart/mint-and-burn-nfts.md b/content/tutorials/quickstart/mint-and-burn-nfts-using-javascript.md similarity index 98% rename from content/tutorials/quickstart/mint-and-burn-nfts.md rename to content/tutorials/quickstart/mint-and-burn-nfts-using-javascript.md index 86acf28dfd..5f6002e175 100644 --- a/content/tutorials/quickstart/mint-and-burn-nfts.md +++ b/content/tutorials/quickstart/mint-and-burn-nfts-using-javascript.md @@ -1,20 +1,19 @@ --- -html: mint-and-burn-nfts.html -parent: quickstart-javascript.html -blurb: Quickstart step 3, mint and burn NFTs. +html: mint-and-burn-nfts-using-javascript.html +parent: nfts-using-javascript.html +blurb: Mint and burn NFTs. labels: - Quickstart - Tokens - Non-fungible tokens, NFTs --- - -# 3. Mint and Burn NFTs +# Mint and Burn NFTs Using JavaScript This example shows how to: 1. Mint new Non-fungible Tokens (NFTs). 2. Get a list of existing NFTs. -3. Delete (Burn) an NFT. +3. Delete (Burn) a NFT. [![Test harness with mint NFT fields](img/quickstart8.png)](img/quickstart8.png) @@ -35,11 +34,11 @@ You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-port [![Get accounts](img/quickstart9.png)](img/quickstart9.png) -## Mint an NFT +## Mint a NFT To mint a non-fungible token object: -1. Set the **Flags** field. For testing purposes, we recommend setting the value to _8_. This sets the _tsTransferable_ flag, meaning that the NFT object can be transferred to another account. Otherwise, the NFT object can only be transferred back to the issuing account. See [NFToken Mint](https://xrpl.org/nftokenmint.html#:~:text=Example%20NFTokenMint%20JSON-,NFTokenMint%20Fields,-NFTokenMint%20Flags) for information about all of the available flags for minting NFTs. +1. Set the **Flags** field. For testing purposes, we recommend setting the value to _8_. This sets the _tsTransferable_ flag, meaning that the NFT object can be transferred to another account. Otherwise, the NFT object can only be transferred back to the issuing account. See [NFTokenMint](nftokenmint.html) for information about all of the available flags for minting NFTs. 2. Enter the **Token URL**. This is a URI that points to the data or metadata associated with the NFT object. You can use the sample URI provided if you do not have one of your own. 3. Enter the **Transfer Fee**, a percentage of the proceeds from future sales of the NFT that will be returned to the original creator. This is a value of 0-50000 inclusive, allowing transfer rates between 0.000% and 50.000% in increments of 0.001%. If you do not set the **Flags** field to allow the NFT to be transferrable, set this field to 0. 4. Click **Mint NFT**. @@ -55,9 +54,9 @@ Click **Get NFTs** to get a list of NFTs owned by the account. ## Burn a Token -The current owner of an NFT can always destroy (or _burn_) an NFT object. +The current owner of a NFT can always destroy (or _burn_) a NFT object. -To permanently destroy an NFT: +To permanently destroy a NFT: 1. Enter the **Token ID**. 2. Click **Burn NFT**. @@ -704,4 +703,4 @@ async function oPburnToken() { -``` \ No newline at end of file +``` diff --git a/content/tutorials/quickstart/py-authorize-minter.md b/content/tutorials/quickstart/py-authorize-minter.md index 373618ea9b..9a24c58649 100644 --- a/content/tutorials/quickstart/py-authorize-minter.md +++ b/content/tutorials/quickstart/py-authorize-minter.md @@ -1,6 +1,6 @@ --- html: py-authorize-minter.html -parent: quickstart-python.html +parent: send-payments-using-python.html blurb: Authorize another account to mint NFTs for you. labels: - Accounts @@ -9,7 +9,7 @@ labels: - NFTs, NFTokens --- -# Assign an Authorized Minter (Python) +# Assign an Authorized Minter Using Python You can assign another account permission to mint NFTs for you. @@ -22,7 +22,7 @@ This example shows how to: # Usage -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} archive to try the sample in your own browser. +You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/py/){.github-code-download} archive to try the sample in your own browser. ## Get Accounts diff --git a/content/tutorials/quickstart/py-broker-sale.md b/content/tutorials/quickstart/py-broker-sale.md index ed680c3dba..43fab544b3 100644 --- a/content/tutorials/quickstart/py-broker-sale.md +++ b/content/tutorials/quickstart/py-broker-sale.md @@ -1,6 +1,6 @@ --- html: py-broker-sale.html -parent: quickstart-python.html +parent: send-payments-using-python.html blurb: Broker a sale between a sell offer and a buy offer. labels: - Accounts @@ -9,7 +9,7 @@ labels: - XRP --- -# Broker an NFT Sale (Python) +# Broker an NFT Sale Using Python Earlier examples showed how to make buy and sell offers directly between two accounts. Another option is to use a third account as a broker for the sale. The broker acts on behalf of the NFT owner. The seller creates an offer with the broker account as its destination. The broker gathers and evaluates buy offers and chooses which one to accept, adding an agreed-upon fee for arranging the sale. When the broker account accepts a sell offer with a buy offer, the funds and ownership of the NFT are transferred simultaneously, completing the deal. This allows an account to act as a marketplace or personal agent for NFT creators and traders. diff --git a/content/tutorials/quickstart/py-create-accounts-send-xrp.md b/content/tutorials/quickstart/py-create-accounts-send-xrp.md index f2095995d3..5588cdb8a5 100644 --- a/content/tutorials/quickstart/py-create-accounts-send-xrp.md +++ b/content/tutorials/quickstart/py-create-accounts-send-xrp.md @@ -1,14 +1,14 @@ --- html: py-create-accounts-send-xrp.html -parent: quickstart-python.html -blurb: Quickstart 1, create two accounts and transfer XRP between them. +parent: send-payments-using-python.html +blurb: Create two accounts and transfer XRP between them using Python. labels: - Accounts - Quickstart - Transaction Sending - XRP --- -# 1. Create Accounts and Send XRP (Python) +# Create Accounts and Send XRP Using Python This example shows how to: @@ -28,7 +28,7 @@ To get started, create a new folder on your local disk and install the Python li pip3 install xrpl-py ``` -Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/python/){.github-code-download} archive. +Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/py/){.github-code-download} archive. **Note:** Without the Quickstart Samples, you will not be able to try the examples that follow. diff --git a/content/tutorials/quickstart/py-create-trustline-send-currency.md b/content/tutorials/quickstart/py-create-trustline-send-currency.md index 0d02829b4e..56a8fb70a3 100644 --- a/content/tutorials/quickstart/py-create-trustline-send-currency.md +++ b/content/tutorials/quickstart/py-create-trustline-send-currency.md @@ -1,14 +1,14 @@ --- html: py-create-trustline-send-currency.html -parent: quickstart-python.html -blurb: Quickstart step 2, create trust lines and send currency. +parent: send-payments-using-python.html +blurb: Create trust lines and send currency. labels: - Cross-Currency - Payments - Quickstart - Tokens --- -# 2. Create Trust Line and Send Currency (Python) +# Create Trust Line and Send Currency Using Python This example shows how to: diff --git a/content/tutorials/quickstart/py-mint-and-burn-nfts.md b/content/tutorials/quickstart/py-mint-and-burn-nfts.md index 4296b3a7b1..c021ded40f 100644 --- a/content/tutorials/quickstart/py-mint-and-burn-nfts.md +++ b/content/tutorials/quickstart/py-mint-and-burn-nfts.md @@ -1,14 +1,14 @@ --- html: py-mint-and-burn-nfts.html -parent: quickstart-python.html -blurb: Quickstart step 3, mint and burn NFTs. +parent: send-payments-using-python.html +blurb: Mint and burn NFTs. labels: - Quickstart - Tokens - Non-fungible tokens, NFTs --- -# 3. Mint and Burn NFTs (Python) +# Mint and Burn NFTs Using Python This example shows how to: diff --git a/content/tutorials/quickstart/py-transfer-nfts.md b/content/tutorials/quickstart/py-transfer-nfts.md index fa2e636e2a..4e695c3fdf 100644 --- a/content/tutorials/quickstart/py-transfer-nfts.md +++ b/content/tutorials/quickstart/py-transfer-nfts.md @@ -1,6 +1,6 @@ --- html: py-transfer-nfts.html -parent: quickstart-python.html +parent: send-payments-using-python.html blurb: Use a Python test harness to create and accept NFT buy and sell offers. labels: - Quickstart @@ -8,7 +8,7 @@ labels: - Non-fungible Tokens, NFTs --- -# 4. Transfer NFTs (Python) +# Transfer NFTs Using Python This example shows how to: diff --git a/content/tutorials/quickstart/quickstart-intro.md b/content/tutorials/quickstart/send-payments-using-javascript.md similarity index 66% rename from content/tutorials/quickstart/quickstart-intro.md rename to content/tutorials/quickstart/send-payments-using-javascript.md index 7d9ba7bc74..1d7bb09cb4 100644 --- a/content/tutorials/quickstart/quickstart-intro.md +++ b/content/tutorials/quickstart/send-payments-using-javascript.md @@ -1,6 +1,6 @@ --- -html: quickstart-intro.html -parent: quickstart-javascript.html +html: send-payments-using-javascript.html +parent: modular-tutorials-in-javascript.html blurb: Use a JavaScript test harness to send XRP, trade currencies, and mint and trade NFTs. labels: - Accounts @@ -11,7 +11,7 @@ labels: - Tokens - XRP --- -# Quickstart Introduction (JavaScript) +# Send Payments Using JavaScript The XRP Ledger (XRPL) is a robust, secure, customizable service. You can create your own interface to try out the capabilities and support your specific business needs. @@ -28,21 +28,11 @@ Typically, the example functions for interacting with the XRP Ledger involve fou 3. Get the state of accounts and tokens on the XRP Ledger using requests. 4. Disconnect from the XRP Ledger. -Each lesson shows you how to build the Token Test Harness one section at a time. Each module lets you try out meaningful interactions with the test ledger, with complete JavaScript and HTML code samples and a code walkthrough. There is also a link to the complete source code for each section that can be modified with a text editor and run in a browser. If you cannot wait, you can follow the prerequisites below, then jump to lesson 4, [Transfer NFTs](transfer-nfts.html), and try out the complete test harness right away. +Each lesson shows you how to build the Token Test Harness one section at a time. Each module lets you try out meaningful interactions with the test ledger, with complete JavaScript and HTML code samples and a code walkthrough. There is also a link to the complete source code for each section that can be modified with a text editor and run in a browser. If you cannot wait, you can follow the prerequisites below, then jump to lesson 4, [Transfer NFTs](transfer-nfts-using-javascript.html), and try out the complete test harness right away. This quickstart tutorial introduces you to the API used to implement features and explore the capabilities of XRP Ledger. It does not represent *all* of the capabilities of the API and this example is not intended for production or secure payment use. -Much of this is “brute force” code that sacrifices conciseness for readability. Each example builds on the previous step, adding a new JavaScript file and the supporting UI. We expect the applications you build to greatly improve upon these examples. Your feedback and contributions are most welcome. - -In this quickstart, you can: - -1. [Create Accounts and Send XRP](create-accounts-send-xrp.html) -2. [Create Trust Line and Send Currency](create-trustline-send-currency.html). -3. [Mint and Burn NFTs](mint-and-burn-nfts.html). -4. [Transfer NFTs](transfer-nfts.html). - -There are also expanded lessons demonstrating how to [Broker a NFT Sale](broker-sale.html), [Assign an Authorized Minter](authorize-minter.html), and [Batch Mint NFTs](batch-minting.html). - +Much of this is “brute force” code that sacrifices conciseness for readability. Each example builds on the previous examples, adding a new JavaScript file and the supporting UI. We anticipate that the applications you build greatly improve upon these examples. Your feedback and contributions are most welcome. ## Prerequisites @@ -52,6 +42,4 @@ To get started, create a new folder on your local disk and install the JavaScrip npm install xrpl ``` -Download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/){.github-code-download}. - -**Note:** Without the Quickstart Samples, you will not be able to try the examples that follow. \ No newline at end of file +Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/){.github-code-download}. diff --git a/content/tutorials/quickstart/py-quickstart-intro.md b/content/tutorials/quickstart/send-payments-using-python.md similarity index 94% rename from content/tutorials/quickstart/py-quickstart-intro.md rename to content/tutorials/quickstart/send-payments-using-python.md index 0b7c6a21b8..a13c6d0dfe 100644 --- a/content/tutorials/quickstart/py-quickstart-intro.md +++ b/content/tutorials/quickstart/send-payments-using-python.md @@ -1,6 +1,6 @@ --- -html: py-quickstart-intro.html -parent: quickstart-python.html +html: send-payments-using-python.html +parent: modular-tutorials-in-python.html blurb: Use a Python test harness to send XRP, trade currencies, and mint and trade NFTs. labels: - Accounts @@ -11,7 +11,7 @@ labels: - Tokens - XRP --- -# Quickstart Introduction (Python) +# Send Payments Using Python The XRP Ledger (XRPL) is a robust, secure, customizable service. You can create your own interface to try out the capabilities and support your specific business needs. @@ -52,6 +52,6 @@ To get started, create a new folder on your local disk and install the Python li pip3 install xrpl-py ``` -Download the python [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/python/){.github-code-download}. +Download the python [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/py/){.github-code-download}. **Note:** Without the Quickstart Samples, you will not be able to try the examples that follow. \ No newline at end of file diff --git a/content/tutorials/quickstart/transfer-nfts.md b/content/tutorials/quickstart/transfer-nfts-using-javascript.md similarity index 99% rename from content/tutorials/quickstart/transfer-nfts.md rename to content/tutorials/quickstart/transfer-nfts-using-javascript.md index 97fdc1e537..80e90af8f2 100644 --- a/content/tutorials/quickstart/transfer-nfts.md +++ b/content/tutorials/quickstart/transfer-nfts-using-javascript.md @@ -1,14 +1,13 @@ --- -html: transfer-nfts.html -parent: quickstart-javascript.html +html: transfer-nfts-using-javascript.html +parent: nfts-using-javascript.html blurb: Use a JavaScript test harness to send XRP, trade currencies, and mint and trade NFTs. labels: - Quickstart - Tokens - Non-fungible Tokens, NFTs --- - -# 4. Transfer NFTs +# Transfer NFTs Using JavaScript This example shows how to: @@ -21,7 +20,7 @@ This example shows how to: [![Quickstart form with NFT transfer fields](img/quickstart13.png)](img/quickstart13.png) -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} archive to try each of the samples in your own browser. +You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/){.github-code-download} archive to try each of the samples in your own browser. # Usage @@ -80,7 +79,7 @@ To create an offer to buy a NFT: ## Accept a Buy Offer -To accept an offer to buy an NFT: +To accept an offer to buy a NFT: 1. Enter the **NFT Offer Index** (the `nft_offer_index` of the NFT buy offer). 3. Click **Accept Buy Offer**. @@ -89,7 +88,7 @@ To accept an offer to buy an NFT: ## Get Offers -To list the buy and sell offers associated with an NFT: +To list the buy and sell offers associated with a NFT: 1. Enter the **NFT ID**. 2. Click **Get Offers**. @@ -165,7 +164,7 @@ If the Expiration Date is present, append it to the transaction. ``` -If the Destination field is not empty, append it to the transaction. When the destination is set, only the destination account can buy the NFT. +If the Destination field is not empty, append it to the transaction. When the destination is set, only the destination account can buy the NFToken. ```javascript if(standbyDestinationField.value !== '') { @@ -1377,4 +1376,4 @@ Update the form with fields and buttons to support the new functions. -``` \ No newline at end of file +``` diff --git a/content/tutorials/use-specialized-payment-types/open-a-payment-channel-to-enable-an-inter-exchange-network.md b/content/tutorials/use-specialized-payment-types/open-a-payment-channel-to-enable-an-inter-exchange-network.md index 0deadb4cf3..f74462ca7d 100644 --- a/content/tutorials/use-specialized-payment-types/open-a-payment-channel-to-enable-an-inter-exchange-network.md +++ b/content/tutorials/use-specialized-payment-types/open-a-payment-channel-to-enable-an-inter-exchange-network.md @@ -84,7 +84,7 @@ The payer exchange opens a payment channel from their XRP Ledger account to the For this exchange use case, there is no real need to ever close the channel, so the payer exchange may not want to define a `CancelAfter` (expiration) value. If they ever need to close the channel, they can still do so. -As the payer exchange, you can think of the payment channel as a special sub-wallet exclusively for a particular destination. Consider estimating how much XRP the payment channel requires similar to how you would estimate a hot wallet's needs. According to [typical best practices](issuing-and-operational-addresses.html), exchanges hold the vast majority of XRP across all of their user accounts in a cold wallet, with a small amount of XRP in a hot wallet. +As the payer exchange, you can think of the payment channel as a special sub-wallet exclusively for a particular destination. Consider estimating how much XRP the payment channel requires similar to how you would estimate a hot wallet's needs. According to [typical best practices](account-types.html), exchanges hold the vast majority of XRP across all of their user accounts in a cold wallet, with a small amount of XRP in a hot wallet. Along these lines, you should also decide approximately how often you want to add more XRP to the payment channel---for example, daily, every 4 hours, or every 15 minutes---and estimate the volume of XRP that you send to the payee exchange during that interval. You should fund the payment channel with enough to cover at least that much volume or the largest withdrawal that you want to process without delay, whichever is larger. For example, if you plan to refill the channel every 15 minutes, have an average volume of 50 XRP every 15 minutes, but occasionally send transfers of 10,000 XRP, you should supply the channel with at least 10,000 XRP. diff --git a/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.ja.md b/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.ja.md index 622308726b..ea3aa7d659 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.ja.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.ja.md @@ -22,7 +22,7 @@ _[Checks Amendment][]が必要です。_ - 現在レジャーに記録されているCheckオブジェクトのIDが必要です。 - たとえばこのチュートリアルの例では、IDが`49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0`のCheckを取り消しますが、この手順を自身で実行する場合は異なるIDを使用する必要があります。 - CheckCancelトランザクションを送信する資金供給のあるアカウントの**アドレス**と**シークレットキー**。Checkが有効期限切れでない限り、このアドレスは、Checkの送金元または受取人のいずれかでなければなりません。 -- トランザクションに[安全に署名できる手段](set-up-secure-signing.html)。 +- トランザクションに[安全に署名できる手段](secure-signing.html)。 - [クライアントライブラリ](client-libraries.html)またはHTTPライブラリ、WebSocketライブラリなど。 diff --git a/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.md b/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.md index 5671e79399..4b32c6cbc0 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/cancel-a-check.md @@ -7,8 +7,6 @@ labels: --- # Cancel a Check -_Added by the [Checks amendment][]._ - This tutorial shows how to cancel a [Check](checks.html), which removes the [Check object from the ledger](check.html) without sending money. You may want to cancel an incoming Check if you do not want it. You might cancel an outgoing Check if you made a mistake when sending it or if circumstances have changed. If a Check expires, it's also necessary to cancel it to remove it from the ledger so the sender gets their [owner reserve](reserves.html#owner-reserves) back. @@ -22,7 +20,7 @@ To cancel a Check with this tutorial, you need the following: - You need the ID of a Check object currently in the ledger. - For example, this tutorial includes examples that cancel a Check with the ID `49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0`, although you must use a different ID to go through these steps yourself. - The **address** and **secret key** of a funded account to send the CheckCancel transaction. This address must be either the sender or the recipient of the Check, unless the Check is expired. -- A [secure way to sign transactions](set-up-secure-signing.html). +- A [secure way to sign transactions](secure-signing.html). - A [client library](client-libraries.html) or any HTTP or WebSocket library. diff --git a/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-a-flexible-amount.md b/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-a-flexible-amount.md index ab804baa11..ee40ca421f 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-a-flexible-amount.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-a-flexible-amount.md @@ -7,8 +7,6 @@ labels: --- # Cash a Check for a Flexible Amount -_Added by the [Checks amendment][]._ - As long as the Check is in the ledger and not expired, the specified recipient can cash it to receive a flexible amount by sending a [CheckCash transaction][] with a `DeliverMin` field. When cashing a Check in this way, the receiver gets as much as is possible to deliver, debiting the Check's sender for the Check's full `SendMax` amount or as much as is available. Cashing fails if it doesn't deliver at least the `DeliverMin` amount to the Check's recipient. You might cash a Check for a flexible amount if you want to get as much as possible from the Check. diff --git a/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-an-exact-amount.md b/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-an-exact-amount.md index 5b8e95446b..83241c7d63 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-an-exact-amount.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/cash-a-check-for-an-exact-amount.md @@ -7,8 +7,6 @@ labels: --- # Cash a Check for an Exact Amount -_Added by the [Checks amendment][]._ - As long as the Check is in the ledger and not expired, the specified recipient can cash it to receive any exact amount up to the amount specified in the Check by sending a [CheckCash transaction][] with an `Amount` field. You would cash a Check this way if you want to receive a specific amount, for example to pay off an invoice or bill exactly. The specified recipient can also [cash the check for a flexible amount](cash-a-check-for-a-flexible-amount.html). diff --git a/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-recipient.md b/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-recipient.md index f5b7a84455..b13ef4db3b 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-recipient.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-recipient.md @@ -7,14 +7,13 @@ labels: --- # Look Up Checks by Recipient -_Added by the [Checks amendment][]._ - This tutorial shows how to look up [Checks](checks.html) by their recipient. You may also want to [look up Checks by sender](look-up-checks-by-sender.html). ## 1. Look up all Checks for the address To get a list of all incoming and outgoing Checks for an account, use the `account_objects` command with the recipient account's address and set the `type` field of the request to `checks`. + **Note:** The commandline interface to the `account_objects` command does not accept the `type` field. You can use the [json method][] to send the JSON-RPC format request on the commandline instead. ### Example Request diff --git a/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-sender.md b/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-sender.md index 2a065be411..5dbd71aff7 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-sender.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/look-up-checks-by-sender.md @@ -7,8 +7,6 @@ labels: --- # Look Up Checks by Sender -_Added by the [Checks amendment][]._ - This tutorial shows how to look up [Checks](checks.html) by their sender. You may also want to [look up Checks by recipient](look-up-checks-by-recipient.html). ## 1. Look up all Checks for the address @@ -17,6 +15,7 @@ This tutorial shows how to look up [Checks](checks.html) by their sender. You ma To get a list of all incoming and outgoing Checks for an account, use the `account_objects` command with the sending account's address and set the `type` field of the request to `checks`. + **Note:** The commandline interface to the `account_objects` command does not accept the `type` field. You can use the [json method][] to send the JSON-RPC format request on the commandline instead. ### Example Request diff --git a/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.ja.md b/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.ja.md index 2bbcd7b6ef..03b0e083a5 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.ja.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.ja.md @@ -26,7 +26,7 @@ XRP Ledgerの外部でGrand PaymentsはBoxSend SGに請求書(IDは`46060241FA - Checkの送信元である資金供給のあるアカウントの**アドレス**と**シークレットキー**。 - [XRP Ledger Test Net Faucet](xrp-test-net-faucet.html)を使用して、10,000 Test Net XRPを保有する資金供給のあるアドレスおよびシークレットを取得できます。 - Checkを受領する資金供給のあるアカウントの**アドレス**。 -- トランザクションに[安全に署名できる手段](set-up-secure-signing.html)。 +- トランザクションに[安全に署名できる手段](secure-signing.html)。 - [クライアントライブラリ](client-libraries.html)またはHTTPライブラリ、WebSocketライブラリなど。 ## {{send_n.next()}}.CheckCreateトランザクションの準備 diff --git a/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.md b/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.md index 867d5f84dc..adc35fadaa 100644 --- a/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.md +++ b/content/tutorials/use-specialized-payment-types/use-checks/send-a-check.md @@ -7,8 +7,6 @@ labels: --- # Send a Check -_Added by the [Checks amendment][]._ - Sending a Check is like writing permission for an intended recipient to pull a payment from you. The outcome of this process is a [Check object in the ledger](check.html) which the recipient can cash later. In many cases, you want to send a [Payment][] instead of a Check, since that delivers the money directly to the recipient in one step. However, if your intended recipient uses [DepositAuth](depositauth.html), you cannot send them Payments directly, so a Check is a good alternative. @@ -26,7 +24,7 @@ To send a Check with this tutorial, you need the following: - The **address** and **secret key** of a funded account to send the Check from. - You can use the [XRP Ledger Test Net Faucet](xrp-test-net-faucet.html) to get a funded address and secret with 10,000 Test Net XRP. - The **address** of a funded account to receive the Check. -- A [secure way to sign transactions](set-up-secure-signing.html). +- A [secure way to sign transactions](secure-signing.html). - A [client library](client-libraries.html) or any HTTP or WebSocket library. ## {{send_n.next()}}. Prepare the CheckCreate transaction diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.ja.md b/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.ja.md index 06e5ff6de4..916a1a31f2 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.ja.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.ja.md @@ -65,7 +65,7 @@ _Websocket_ ## 2.EscrowCancelトランザクションの送信 -XRP Ledgerでは、[EscrowCancelトランザクション][]に[署名して送信する](transaction-basics.html#トランザクションへの署名とトランザクションの送信)ことで、***誰でも***有効期限切れのEscrowを取り消すことができます。トランザクションの`Owner`フィールドを、そのEscrowを作成した`EscrowCreate`トランザクションの`Account`に設定します。`OfferSequence`フィールドを、`EscrowCreate`トランザクションの`Sequence`に設定します。 +XRP Ledgerでは、[EscrowCancelトランザクション][]に[署名して送信する](transactions.html#トランザクションへの署名とトランザクションの送信)ことで、***誰でも***有効期限切れのEscrowを取り消すことができます。トランザクションの`Owner`フィールドを、そのEscrowを作成した`EscrowCreate`トランザクションの`Account`に設定します。`OfferSequence`フィールドを、`EscrowCreate`トランザクションの`Sequence`に設定します。 {% include '_snippets/secret-key-warning.md' %} diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md b/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md index bcaa730bd7..a34d7dd892 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow.md @@ -8,9 +8,11 @@ labels: --- # Cancel an Expired Escrow -## 1. Confirm the expired escrow +An escrow in the XRP Ledger is expired when its `CancelAfter` time is lower than the `close_time` of the latest validated ledger. Escrows without a `CancelAfter` time never expire. -An escrow in the XRP Ledger is expired when its `CancelAfter` time is lower than the `close_time` of a validated ledger version. (If the escrow does not have a `CancelAfter` time, it never expires.) You can look up the close time of the latest validated ledger with the [ledger method][]: +## 1. Get the latest validated ledger + +Use the [ledger method][] to look up the latest validated ledger and get the `close_time` value. Request: @@ -36,8 +38,9 @@ _Websocket_ +## 2. Look up the escrow -You can look up the escrow and compare to the `CancelAfter` time using the [account_objects method][]: +Use the [account_objects method][] and compare `CancelAfter` to `close_time`: Request: @@ -63,9 +66,11 @@ _Websocket_ -## 2. Submit EscrowCancel transaction +## 3. Submit EscrowCancel transaction -***Anyone*** can cancel an expired escrow in the XRP Ledger by [signing and submitting](transaction-basics.html#signing-and-submitting-transactions) an [EscrowCancel transaction][]. Set the `Owner` field of the transaction to the `Account` of the `EscrowCreate` transaction that created this escrow. Set the `OfferSequence` field to the `Sequence` of the `EscrowCreate` transaction. +***Anyone*** can cancel an expired escrow in the XRP Ledger by sending an [EscrowCancel transaction][]. Set the `Owner` field of the transaction to the `Account` of the `EscrowCreate` transaction that created this escrow. Set the `OfferSequence` field to the `Sequence` of the `EscrowCreate` transaction. + +**Tip:** If you don't know what `OfferSequence` to use, you can look up the transaction that created the Escrow: call the [tx method][] with the value of the Escrow's `PreviousTxnID` field. In `tx` response, use the `Sequence` value of that transaction as the `OfferSequence` value of the EscrowCancel transaction. {% include '_snippets/secret-key-warning.md' %} @@ -95,13 +100,13 @@ _Websocket_ Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version. -## 3. Wait for validation +## 4. Wait for validation {% include '_snippets/wait-for-validation.md' %} -## 4. Confirm final result +## 5. Confirm final result -Use the [tx method][] with the EscrowCancel transaction's identifying hash to check its final status. Look in the transaction metadata for a `DeletedNode` with `LedgerEntryType` of `Escrow`. Also look for a `ModifiedNode` of type `AccountRoot` for the sender of the escrowed payment. The `FinalFields` of the object should show the increase in XRP in the `Balance` field for the returned XRP. +Use the [tx method][] with the `EscrowCancel` transaction's identifying hash to check its final status. Look in the transaction metadata for a `DeletedNode` with `LedgerEntryType` of `Escrow`. Also look for a `ModifiedNode` of type `AccountRoot` for the sender of the escrowed payment. The `FinalFields` of the object should show the increase in XRP in the `Balance` field for the returned XRP. Request: @@ -130,13 +135,11 @@ _Websocket_ In the above example, `r3wN3v2vTUkr5qd6daqDc2xE4LSysdVjkT` is the sender of the escrow, and the increase in `Balance` from 99999**8**9990 drops to 99999**9**9990 drops represents the return of the escrowed 10,000 drops of XRP (0.01 XRP). -**Tip:** If you don't know what `OfferSequence` to use in the [EscrowFinish transaction][] to execute an escrow, use the [tx method][] to look up the transaction that created the escrow, using the identifying hash of the transaction in the Escrow's `PreviousTxnID` field. Use the `Sequence` value of that transaction as the `OfferSequence` value when finishing the escrow. - ## See Also - **Concepts:** - - [XRP](xrp.html) + - [What is XRP?](what-is-xrp.html) - [Payment Types](payment-types.html) - [Escrow](escrow.html) - **Tutorials:** diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/look-up-escrows.md b/content/tutorials/use-specialized-payment-types/use-escrows/look-up-escrows.md index bc09fd46a1..0364d51c15 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/look-up-escrows.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/look-up-escrows.md @@ -6,54 +6,13 @@ labels: - Escrow - Smart Contracts --- -# Look up escrows +# Look up Escrows -All pending escrows are stored in the ledger as [Escrow objects](escrow.html). - -You can look up escrow objects by the [sender's address](#look-up-escrows-by-sender-address) or the [destination address](#look-up-escrows-by-destination-address) using the [account_objects method][]. - -## Look up escrows by sender address - -You can use the [account_objects method][] to look up escrow objects by sender address. - -Let's say that you want to look up all pending escrow objects with a sender address of `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`. You can do this using the following example request, where the sender address is the `account` value. - -Request: - - - -_Websocket_ - -```json -{% include '_code-samples/escrow/websocket/account_objects-request.json' %} -``` - - - - -The response resembles the following example. Note that the response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm` as the sender or destination address, where the sender address is the `Account` value and the destination address is the `Destination` value. - -In this example, the second and fourth escrow objects meet our lookup criteria because their `Account` (sender address) values are set to `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`. - -Response: - - - -_Websocket_ - -```json -{% include '_code-samples/escrow/websocket/account_objects-response.json' %} -``` - - - -## Look up escrows by destination address - -You can use the [account_objects method][] to look up escrow objects by destination address. +All pending escrows are stored in the ledger as [Escrow objects](escrow.html). You can look them up by the sender's address or the destination address. **Note:** You can only look up pending escrow objects by destination address if those escrows were created after the [fix1523 amendment][] was enabled on 2017-11-14. -Let's say that you want to look up all pending escrow objects with a destination address of `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`. You can do this using the following example request, where the destination address is the `account` value. +Use the [account_objects method][], where the sender or destination address is the `account` value. Request: @@ -67,10 +26,7 @@ _Websocket_ - -The response resembles the following example. Note that the response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm` as the destination or sender address, where the destination address is the `Destination` value and the sender address is the `Account` value. - -In this example, the first and third escrow objects meet our lookup criteria because their `Destination` (destination address) values are set to `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`. +The response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`, where the sender address is the `Account` value, or the destination address is the `Destination` value. Response: @@ -89,7 +45,7 @@ _Websocket_ ## See Also - **Concepts:** - - [XRP](xrp.html) + - [What is XRP?](what-is-xrp.html) - [Payment Types](payment-types.html) - [Escrow](escrow.html) - **Tutorials:** diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.ja.md b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.ja.md index b25df53921..00cda92fb0 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.ja.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.ja.md @@ -74,7 +74,7 @@ print(cancel_after) ## 3.EscrowCreateトランザクションの送信 -[EscrowCreateトランザクション][]に[署名して送信](transaction-basics.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`Condition`フィールドを、保留中の支払いがリリースされる時刻に設定します。`Destination`を受取人に設定します。受取人と送金元のアドレスは同じでもかまいません。前の手順で算出した`CancelAfter`または`FinishAfter`の時刻も指定します。`Amount`を、Escrowする[XRP、drop単位][]の合計額に設定します。 +[EscrowCreateトランザクション][]に[署名して送信](transactions.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`Condition`フィールドを、保留中の支払いがリリースされる時刻に設定します。`Destination`を受取人に設定します。受取人と送金元のアドレスは同じでもかまいません。前の手順で算出した`CancelAfter`または`FinishAfter`の時刻も指定します。`Amount`を、Escrowする[XRP、drop単位][]の合計額に設定します。 {% include '_snippets/secret-key-warning.md' %} @@ -136,7 +136,7 @@ print(cancel_after) ## 6.EscrowFinishトランザクションの送信 -`FinishAfter`の時刻が経過した後で資金のリリースを実行する[EscrowFinishトランザクション][]に[署名して送信](transaction-basics.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`Owner`フィールドにEscrowCreateトランザクションの`Account`アドレスを設定し、`OfferSequence` にEscrowCreateトランザクションの`Sequence`番号を設定します。`Condition`フィールドと`Fulfillment`フィールドに、ステップ1で生成した条件値とフルフィルメント値をそれぞれ16進数で設定します。フルフィルメントのサイズ(バイト数)に基づいて`Fee`([トランザクションコスト](transaction-cost.html))の値を設定します。条件付きEscrowFinishでは、少なくとも330 drop(XRP)と、フルフィルメントのサイズで16バイトごとに10 dropが必要です。 +`FinishAfter`の時刻が経過した後で資金のリリースを実行する[EscrowFinishトランザクション][]に[署名して送信](transactions.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`Owner`フィールドにEscrowCreateトランザクションの`Account`アドレスを設定し、`OfferSequence` にEscrowCreateトランザクションの`Sequence`番号を設定します。`Condition`フィールドと`Fulfillment`フィールドに、ステップ1で生成した条件値とフルフィルメント値をそれぞれ16進数で設定します。フルフィルメントのサイズ(バイト数)に基づいて`Fee`([トランザクションコスト](transaction-cost.html))の値を設定します。条件付きEscrowFinishでは、少なくとも330 drop(XRP)と、フルフィルメントのサイズで16バイトごとに10 dropが必要です。 **注記:** EscrowCreateトランザクションに`FinishAfter`フィールドが含まれている場合、Escrowの条件として正しいフルフィルメントを指定しても、この時刻よりも前の時点ではこのトランザクションを実行できません。前に閉鎖されたレジャーの閉鎖時刻が`FinishAfter`の時刻よりも前である場合、EscrowFinishトランザクションは[結果コード](transaction-results.html)`tecNO_PERMISSION`で失敗します。 diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md index 67ae220d71..84b6e73a01 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-conditionally-held-escrow.md @@ -94,7 +94,7 @@ print(cancel_after) ## 3. Submit EscrowCreate transaction -[Sign and submit](transaction-basics.html#signing-and-submitting-transactions) an [EscrowCreate transaction][]. Set the `Condition` field of the transaction to the time when the held payment should be released. Set the `Destination` to the recipient, which can be the same address as the sender. Include the `CancelAfter` or `FinishAfter` time you calculated in the previous step. Set the `Amount` to the total amount of [XRP, in drops][], to escrow. +[Sign and submit](transactions.html#signing-and-submitting-transactions) an [EscrowCreate transaction][]. Set the `Condition` field of the transaction to the time when the held payment should be released. Set the `Destination` to the recipient, which can be the same address as the sender. Include the `CancelAfter` or `FinishAfter` time you calculated in the previous step. Set the `Amount` to the total amount of [XRP, in drops][], to escrow. {% include '_snippets/secret-key-warning.md' %} @@ -156,7 +156,7 @@ Response: ## 6. Submit EscrowFinish transaction -[Sign and submit](transaction-basics.html#signing-and-submitting-transactions) an [EscrowFinish transaction][] to execute the release of the funds after the `FinishAfter` time has passed. Set the `Owner` field of the transaction to the `Account` address from the EscrowCreate transaction, and the `OfferSequence` to the `Sequence` number from the EscrowCreate transaction. Set the `Condition` and `Fulfillment` fields to the condition and fulfillment values, in hexadecimal, that you generated in step 1. Set the `Fee` ([transaction cost](transaction-cost.html)) value based on the size of the fulfillment in bytes: a conditional EscrowFinish requires at least 330 drops of XRP plus 10 drops per 16 bytes in the size of the fulfillment. +[Sign and submit](transactions.html#signing-and-submitting-transactions) an [EscrowFinish transaction][] to execute the release of the funds after the `FinishAfter` time has passed. Set the `Owner` field of the transaction to the `Account` address from the EscrowCreate transaction, and the `OfferSequence` to the `Sequence` number from the EscrowCreate transaction. Set the `Condition` and `Fulfillment` fields to the condition and fulfillment values, in hexadecimal, that you generated in step 1. Set the `Fee` ([transaction cost](transaction-cost.html)) value based on the size of the fulfillment in bytes: a conditional EscrowFinish requires at least 330 drops of XRP plus 10 drops per 16 bytes in the size of the fulfillment. **Note:** If you included a `FinishAfter` field in the EscrowCreate transaction, you cannot execute it before that time has passed, even if you provide the correct fulfillment for the Escrow's condition. The EscrowFinish transaction fails with the [result code](transaction-results.html) `tecNO_PERMISSION` if the previously-closed ledger's close time is before the `FinishAfter` time. @@ -214,7 +214,7 @@ Response: - [Crypto-Conditions Specification][] - **Concepts:** - - [XRP](xrp.html) + - [What is XRP?](what-is-xrp.html) - [Payment Types](payment-types.html) - [Escrow](escrow.html) - **Tutorials:** diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.ja.md b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.ja.md index d8f9aba985..48bc8e4a35 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.ja.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.ja.md @@ -45,7 +45,7 @@ print(release_date_ripple) ## 2.EscrowCreateトランザクションの送信 -[EscrowCreateトランザクション][]に[署名して送信](transaction-basics.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`FinishAfter`フィールドを、保留中の支払いがリリースされる時刻に設定します。`Condition`フィールドを省略して、時刻を保留中の支払いをリリースする唯一の条件とします。`Destination`を受取人に設定します。受取人と送金元のアドレスは同じでもかまいません。`Amount`を、Escrowする[XRP、drop単位][]の合計額に設定します。 +[EscrowCreateトランザクション][]に[署名して送信](transactions.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`FinishAfter`フィールドを、保留中の支払いがリリースされる時刻に設定します。`Condition`フィールドを省略して、時刻を保留中の支払いをリリースする唯一の条件とします。`Destination`を受取人に設定します。受取人と送金元のアドレスは同じでもかまいません。`Amount`を、Escrowする[XRP、drop単位][]の合計額に設定します。 {% include '_snippets/secret-key-warning.md' %} @@ -141,7 +141,7 @@ print(release_date_ripple) ## 6.EscrowFinishトランザクションの送信 -`FinishAfter`の時刻が経過した後で資金のリリースを実行する[EscrowFinishトランザクション][]に[署名して送信](transaction-basics.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`Owner`フィールドにEscrowCreateトランザクションの`Account`アドレスを設定し、`OfferSequence` にEscrowCreateトランザクションの`Sequence`番号を設定します。時刻のみに基づいて保留されているEscrowの場合は、`Condition`フィールドと`Fulfillment`フィールドを省略します。 +`FinishAfter`の時刻が経過した後で資金のリリースを実行する[EscrowFinishトランザクション][]に[署名して送信](transactions.html#トランザクションへの署名とトランザクションの送信)します。トランザクションの`Owner`フィールドにEscrowCreateトランザクションの`Account`アドレスを設定し、`OfferSequence` にEscrowCreateトランザクションの`Sequence`番号を設定します。時刻のみに基づいて保留されているEscrowの場合は、`Condition`フィールドと`Fulfillment`フィールドを省略します。 **ヒント:** XRP Ledgerの状態はトランザクションでしか変更できないため、EscrowFinishトランザクションが必要です。このトランザクションの送信者は、Escrowの受取人、Escrowの元としての送金人、またはその他のXRP Ledgerアドレスのいずれかです。 diff --git a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md index d97d558843..12ecaac103 100644 --- a/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md +++ b/content/tutorials/use-specialized-payment-types/use-escrows/send-a-time-held-escrow.md @@ -45,7 +45,7 @@ print(release_date_ripple) ## 2. Submit EscrowCreate transaction -[Sign and submit](transaction-basics.html#signing-and-submitting-transactions) an [EscrowCreate transaction][]. Set the `FinishAfter` field of the transaction to the time when the held payment should be released. Omit the `Condition` field to make time the only condition for releasing the held payment. Set the `Destination` to the recipient, which may be the same address as the sender. Set the `Amount` to the total amount of [XRP, in drops][], to escrow. +[Sign and submit](transactions.html#signing-and-submitting-transactions) an [EscrowCreate transaction][]. Set the `FinishAfter` field of the transaction to the time when the held payment should be released. Omit the `Condition` field to make time the only condition for releasing the held payment. Set the `Destination` to the recipient, which may be the same address as the sender. Set the `Amount` to the total amount of [XRP, in drops][], to escrow. {% include '_snippets/secret-key-warning.md' %} @@ -141,8 +141,9 @@ Response: ## 6. Submit EscrowFinish transaction -[Sign and submit](transaction-basics.html#signing-and-submitting-transactions) an [EscrowFinish transaction][] to execute the release of the funds after the `FinishAfter` time has passed. Set the `Owner` field of the transaction to the `Account` address from the EscrowCreate transaction, and the `OfferSequence` to the `Sequence` number from the EscrowCreate transaction. For an escrow held only by time, omit the `Condition` and `Fulfillment` fields. +[Sign and submit](transactions.html#signing-and-submitting-transactions) an [EscrowFinish transaction][] to execute the release of the funds after the `FinishAfter` time has passed. Set the `Owner` field of the transaction to the `Account` address from the EscrowCreate transaction, and the `OfferSequence` to the `Sequence` number from the EscrowCreate transaction. For an escrow held only by time, omit the `Condition` and `Fulfillment` fields. +***TODO: First half of this statement is covered by concept info already. It's also reiterated in escrow.md. The second portion about potential recipients should remain.*** **Tip:** The EscrowFinish transaction is necessary because the XRP Ledger's state can only be modified by transactions. The sender of this transaction may be the recipient of the escrow, the original sender of the escrow, or any other XRP Ledger address. If the escrow has expired, you can only [cancel the escrow](cancel-an-expired-escrow.html) instead. @@ -211,7 +212,7 @@ Response: ## See Also - **Concepts:** - - [XRP](xrp.html) + - [What is XRP?](what-is-xrp.html) - [Payment Types](payment-types.html) - [Escrow](escrow.html) - **Tutorials:** diff --git a/content/tutorials/use-specialized-payment-types/use-payment-channels.md b/content/tutorials/use-specialized-payment-types/use-payment-channels.md index 193de633a0..35b9068bd0 100644 --- a/content/tutorials/use-specialized-payment-types/use-payment-channels.md +++ b/content/tutorials/use-specialized-payment-types/use-payment-channels.md @@ -648,7 +648,7 @@ This concludes the tutorial of Payment Channel usage. Ripple encourages users to ## See Also - **Concepts:** - - [XRP](xrp.html) + - [What is XRP?](what-is-xrp.html) - [Payment Types](payment-types.html) - [Payment Channels](payment-channels.html) - **Tutorials:** diff --git a/content/tutorials/use-tokens/enable-no-freeze.md b/content/tutorials/use-tokens/enable-no-freeze.md index 5f26170b3f..13bf59610f 100644 --- a/content/tutorials/use-tokens/enable-no-freeze.md +++ b/content/tutorials/use-tokens/enable-no-freeze.md @@ -34,7 +34,7 @@ Complete sample code for all of the steps of this tutorial is available under th ### {{n.next()}}. Get Credentials -To transact on the XRP Ledger, you need an address and secret key, and some XRP. If you use the best practice of having separate ["cold" and "hot" addresses](issuing-and-operational-addresses.html), you need the **master keys** to the _cold address_, which is the **issuer** of the token. Only the issuer's No Freeze setting has any effect on a token. +To transact on the XRP Ledger, you need an address and secret key, and some XRP. If you use the best practice of having separate ["cold" and "hot" addresses](account-types.html), you need the **master keys** to the _cold address_, which is the **issuer** of the token. Only the issuer's No Freeze setting has any effect on a token. **Caution:** You cannot use a [regular key pair](cryptographic-keys.html) or [multi-signing](multi-signing.html) to enable the No Freeze setting. @@ -42,7 +42,7 @@ For this tutorial, you can get credentials from the following interface: {% include '_snippets/interactive-tutorials/generate-step.md' %} -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). ### {{n.next()}}. Connect to the Network diff --git a/content/tutorials/use-tokens/enact-global-freeze.md b/content/tutorials/use-tokens/enact-global-freeze.md index 5ec95160f1..24ef4f7ea5 100644 --- a/content/tutorials/use-tokens/enact-global-freeze.md +++ b/content/tutorials/use-tokens/enact-global-freeze.md @@ -37,7 +37,7 @@ Complete sample code for all of the steps of this tutorial is available under th ### {{n.next()}}. Get Credentials -To transact on the XRP Ledger, you need an address and secret key, and some XRP. If you use the best practice of having separate ["cold" and "hot" addresses](issuing-and-operational-addresses.html), you need the keys to the _cold address_, which is the **issuer** of the token. Only the issuer's Global Freeze setting has any effect on a token. +To transact on the XRP Ledger, you need an address and secret key, and some XRP. If you use the best practice of having separate ["cold" and "hot" addresses](account-types.html), you need the keys to the _cold address_, which is the **issuer** of the token. Only the issuer's Global Freeze setting has any effect on a token. **Tip:** Unlike the No Freeze setting, you _can_ enable and disable a Global Freeze using a [regular key pair](cryptographic-keys.html) or [multi-signing](multi-signing.html). @@ -45,7 +45,7 @@ For this tutorial, you can get credentials from the following interface: {% include '_snippets/interactive-tutorials/generate-step.md' %} -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). ### {{n.next()}}. Connect to the Network @@ -184,7 +184,7 @@ At this point all token issued by your address are frozen. During this time, you Keep in mind that while a token is frozen, it is still possible for the frozen token to be sent _directly to_ or _directly from_ the issuer, so you may still want to disable any systems you have that are configured to send such transactions, and you may want to track incoming transactions without processing them so that you can eventually process the legitimate ones. -If you use a [hot wallet or operational address](issuing-and-operational-addresses.html), it has no special status compared to other users, so it also cannot send and receive the frozen tokens except when dealing directly with the issuer. +If you use a [hot wallet or operational address](account-types.html), it has no special status compared to other users, so it also cannot send and receive the frozen tokens except when dealing directly with the issuer. If you use the [No Freeze setting](freezes.html#no-freeze) then the Global Freeze continues forever. If you want to resume issuing tokens, you must create a new account and start over from there. diff --git a/content/tutorials/use-tokens/freeze-a-trust-line.md b/content/tutorials/use-tokens/freeze-a-trust-line.md index 1fd9175e6b..a8670535d9 100644 --- a/content/tutorials/use-tokens/freeze-a-trust-line.md +++ b/content/tutorials/use-tokens/freeze-a-trust-line.md @@ -39,7 +39,7 @@ Complete sample code for all of the steps of this tutorial is available under th ### {{n.next()}}. Get Credentials -To transact on the XRP Ledger, you need an address and secret key, and some XRP. If you use the best practice of having separate ["cold" and "hot" addresses](issuing-and-operational-addresses.html), you need the keys to the _cold address_, which is the **issuer** of the token. +To transact on the XRP Ledger, you need an address and secret key, and some XRP. If you use the best practice of having separate ["cold" and "hot" addresses](account-types.html), you need the keys to the _cold address_, which is the **issuer** of the token. {% include '_snippets/interactive-tutorials/generate-step.md' %} diff --git a/content/tutorials/use-tokens/issue-a-fungible-token.md b/content/tutorials/use-tokens/issue-a-fungible-token.md index 9376523fec..6e983ae854 100644 --- a/content/tutorials/use-tokens/issue-a-fungible-token.md +++ b/content/tutorials/use-tokens/issue-a-fungible-token.md @@ -10,7 +10,7 @@ labels: --- # Issue a Fungible Token -Anyone can issue various types of tokens in the XRP Ledger, ranging from informal "IOUs" to fiat-backed stablecoins, purely digital fungible and semi-fungible tokens, and more. This tutorial shows the technical steps of creating a token in the ledger. For more information on how XRP Ledger tokens work, see [Issued Currencies](issued-currencies.html); for more on the business decisions involved in issuing a stablecoin, see [Become an XRP Ledger Gateway](become-an-xrp-ledger-gateway.html). +Anyone can issue various types of tokens in the XRP Ledger, ranging from informal "IOUs" to fiat-backed stablecoins, purely digital fungible and semi-fungible tokens, and more. This tutorial shows the technical steps of creating a token in the ledger. For more information on how XRP Ledger tokens work, see [Issued Currencies](issued-currencies.html); for more on the business decisions involved in issuing a stablecoin, see [Stablecoin Issuer](stablecoin-issuer.html). ## Prerequisites @@ -39,7 +39,7 @@ Complete sample code for all of the steps of these tutorials is available under To transact on the XRP Ledger, you need an address and secret key, and some XRP. You also need one or more recipients who are willing to hold the tokens you issue: unlike in some other blockchains, in the XRP Ledger you cannot force someone to hold a token they do not want. -The best practice is to use ["cold" and "hot" addresses](issuing-and-operational-addresses.html). The cold address is the **issuer** of the token. The hot address is like a regular user's address that you control. It receives tokens from the cold address, which you can then transfer to other users. A hot address is not strictly necessary, since you could send tokens directly to users from the cold address, but it is good practice for security reasons. In production, you should take extra care of the cold address's cryptographic keys (for example, keeping them offline) because it is much harder to replace a cold address than a hot address. +The best practice is to use ["cold" and "hot" addresses](account-types.html). The cold address is the **issuer** of the token. The hot address is like a regular user's address that you control. It receives tokens from the cold address, which you can then transfer to other users. A hot address is not strictly necessary, since you could send tokens directly to users from the cold address, but it is good practice for security reasons. In production, you should take extra care of the cold address's cryptographic keys (for example, keeping them offline) because it is much harder to replace a cold address than a hot address. In this tutorial, the hot address receives the tokens you issue from the cold address. You can get the keys for two addresses using the following interface. @@ -59,7 +59,7 @@ In this tutorial, the hot address receives the tokens you issue from the cold ad **Caution:** Ripple provides the [Testnet and Devnet](parallel-networks.html) for testing purposes only, and sometimes resets the state of these test networks along with all balances. As a precaution, **do not** use the same addresses on Testnet/Devnet and Mainnet. -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). ### {{n.next()}}. Connect to the Network diff --git a/content/tutorials/use-tokens/trade-in-the-decentralized-exchange.md b/content/tutorials/use-tokens/trade-in-the-decentralized-exchange.md index 5816f1b719..763d3c98d9 100644 --- a/content/tutorials/use-tokens/trade-in-the-decentralized-exchange.md +++ b/content/tutorials/use-tokens/trade-in-the-decentralized-exchange.md @@ -69,7 +69,7 @@ To transact on the XRP Ledger, you need an address, a secret key, and some XRP. {% include '_snippets/interactive-tutorials/generate-step.md' %} -When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](set-up-secure-signing.html). The following code shows how to create a `Wallet` instance to use your keys: +When you're [building production-ready software](production-readiness.html), you should use an existing account, and manage your keys using a [secure signing configuration](secure-signing.html). The following code shows how to create a `Wallet` instance to use your keys: diff --git a/content/tutorials/xrp-ledger-businesses/list-your-exchange-on-xrp-charts.md b/content/tutorials/xrp-ledger-businesses/list-your-exchange-on-xrp-charts.md deleted file mode 100644 index 65dc41a74a..0000000000 --- a/content/tutorials/xrp-ledger-businesses/list-your-exchange-on-xrp-charts.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -html: list-your-exchange-on-xrp-charts.html -parent: xrp-ledger-businesses.html -blurb: XRPCharts has been retired. -status: removed ---- -# List Your Exchange on XRP Charts - -XRPCharts (formerly Ripple Charts) was a site run by Ripple that listed metrics about the XRP Ledger and activity in it. It has been retired. - -For other tools and sites where you can look up information on the XRP Ledger, see [Dev Tools](dev-tools.html). \ No newline at end of file diff --git a/content/use-cases/defi/algorithmic-trading.md b/content/use-cases/defi/algorithmic-trading.md new file mode 100644 index 0000000000..1f0ab168cf --- /dev/null +++ b/content/use-cases/defi/algorithmic-trading.md @@ -0,0 +1,101 @@ +--- +html: algorithmic-trading.html +parent: defi-uc.html +blurb: The XRP Ledger's decentralized exchange consists of an unlimited number of currency pairs, tracked on-demand when users make trades. +labels: + - Transactions +--- +# Algorithmic Trading + +The XRP Ledger's decentralized exchange presents an opportunity to earn money through _algorithmic trading_, which means running a computer program to find and take profitable trading opportunities automatically. In algorithmic trading, you typically make many trades based on quantitative factors to earn steady, small profits; this is unlike traditional manual trading where you make a few long-term investments based on market fundamentals and wait to earn a large return over time. Blockchains are often more suitable for algorithmic trading than manual trading, because the high volatility of cryptocurrencies in general makes them less suitable for traditional "buy and hold" investing; the XRP Ledger is particularly suited for algorithmic trading, for several reasons: + +- Decentralized exchange data is public and freely available. +- Trades settle in seconds, enabling frequent trading without specialized equipment. +- Transaction fees on the XRP Ledger are low. + +## Trading Strategies + +Algorithmic trading can make profits through many different strategies; part of the challenge (or the fun) of algorithmic trading is designing and implementing your own unique approach. From a high level, algorithmic trading approaches often fall into the following categories: + +- **Arbitrage:** Buying and immediately selling an asset to take advantages of price differences. This could involve finding sets of 3 or more assets where the prices aren't aligned, or using the XRP Ledger to move assets between private exchanges where the prices are different. +- **Quantitative Trading:** Predicting and taking advantage of future price movements based on past price movements, outside data, or both. Examples include [candlestick patterns](https://blog.quantinsti.com/candlestick-patterns-meaning/), correlating an asset's price movements with other assets, and using sentiment analysis of social media. +- **Front-running:** Taking advantage of pending trades, especially large ones, by buying and immediately reselling the assets those trades are buying. Front-running is often frowned-upon because it takes profits from other traders without adding liquidity or enabling exchanges that otherwise wouldn't occur. The XRP Ledger's canonical ordering of transactions makes front-running difficult, but not impossible. + +### Arbitrage Examples + +There are many ways to perform arbitrage, both within and adjacent to the XRP Ledger. The following examples are meant to illustrate potential strategies, but others are possible as well. + +You can use **circular payments** to complete multi-asset trades for a profit. The XRP Ledger automatically connects overlapping trades between pairs of assets, as well as sets of 3 assets where XRP is the asset in the middle. However, the XRP Ledger protocol does not automatically find and compete trades across other, longer or more complex paths. (Finding the _best possible_ path is a category of problem that is known to be computationally intensive.) Therefore, if you do your own pathfinding, it is possible to find profitable arbitrage opportunities like this; if you do, you can specify those [paths](paths.html) explicitly in a [Payment transaction](payment.html). For example, imagine there are three tokens, FOO, BAR, and TST, each with different issuers. If you can buy 2 BAR by spending 1 FOO, then buy 3 TST by spending those 2 BAR, and finally buy 1.1 FOO by spending 3 TST, you can earn a profit of 0.1 FOO minus any costs of the transaction such as [transfer fees](transfer-fees.html) of the tokens involved. + +You can perform **cross-exchange arbitrage** if you have accounts at multiple private exchanges where the prices for an asset are different. For example, if you can buy XRP at ACME Exchange for $0.45 per 1 XRP, then move the XRP over to WayGate Exchange where you sell it for $0.50 per 1 XRP, you can make a profit of $0.05 per XRP minus the costs of trading and sending the relevant transactions, including exchanges' fees to withdraw and deposit your profits. As a more complex example, if the BTC:ETH price shifts at ACME Exchange to make ETH cheaper relative to BTC, you could potentially take advantage of this price shift by selling ETH→XRP at one exchange, then moving the XRP to ACME Exchange and trading XRP→BTC→ETH for a profit there. Since XRP Ledger transactions settle in seconds but Ethereum transactions can take minutes and Bitcoin transactions can take hours, using XRP as a bridge currency can potentially allow you to take advantage of this opportunity sooner than simply trading ETH→BTC and then BTC→ETH at ACME Exchange. (This only works, of course, if there is enough liquidity and tight enough spreads that exchanging to XRP and back doesn't cost more than your profits.) + + +## Background Reading + +You can familiarize yourself with algorithmic trading, in general, by reading the following resources: + +- [Investopedia: Basics of Algorithmic Trading: Concepts and Examples](https://www.investopedia.com/articles/active-trading/101014/basics-algorithmic-trading-concepts-and-examples.asp) +- [_Flash Boys: A Wall Street Revolt_ by Michael Lewis](https://wwnorton.com/books/Flash-Boys/) +- [Investopedia: How Arbitraging Works in Investing, With Examples](https://www.investopedia.com/terms/a/arbitrage.asp) + +The following pages describe key elements of how the XRP Ledger's decentralized exchange works: + +- [Tokens](tokens.html) +- [Decentralized Exchange](decentralized-exchange.html) +- [Offers](offers.html) + + +## Testing and Common Mistakes + +Like any type of trading, algorithmic trading is not a surefire way to make money; there are many ways you might take a loss. Compared with manual trading, algorithmic trading has much less room for error. If you make a small mistake, but multiply it by a large number of trades, your losses can add up quickly before you have a chance to fix the problem. Therefore, it's wise to do various tests to make sure that your trading strategy will actually make a profit. You might do any or all of the following to test your strategy or the actual implementation of it (often called a _bot_): + +- Manually calculate the potential returns based on the current ledger state or past trades. +- Record historical data and feed it to your bot, then record what actions the bot would have taken and compare the results against the actual historical price movements. +- Model or predict the results of your approach in various plausible future scenarios. + +Common mistakes you might make in these calculations or in building your bot include: + +- Rounding errors. If your math is not sound, or does not match the precision that the blockchain uses, you could inaccurately predict the results of a trade and take a loss, or have your trade not execute at all. The XRP Ledger uses different precision for token and XRP amounts, which can lead to rounding in unexpected places when trading one for the other. For more details on the precision used in the protocol, see [Currency Formats](currency-formats.html). + - Be aware that token issuers can further limit the precision of exchange rates involving their tokens. See [Tick Size](ticksize.html) for details. + - Typically, you need to adjust your amounts by some small percentage to account for potential differences in rounding or price movements between when you looked things up and when your trade executes. This amount is called _slippage_, and it's important to get the right amount. If it's too low, your transaction may not execute at all; but if it's too high, you're vulnerable to front-running, and the higher it is the more that price movements can cut into your profits in general. +- Forgetting extra costs and delays. For example, if two stablecoins are both fully backed by US dollars, but one issuer charges a 0.5% transfer fee and a different issuer charges a 0.25% [transfer fee](transfer-fees.html), you should expect about a 0.25% difference in the effective price those stablecoins trade at. Don't forget the costs of sending a transaction, even though they're usually small, nor the consequences of other potential delays. For example, even if an off-ledger private exchange shows a favorable price now, if that exchange takes hours or even days to process a deposit, the price is likely to shift so you can't take advantage of it unless you already have liquidity at that exchange. +- Not accounting for rare events. Even setting aside unprecented ("black swan") events, your calculations can be skewed by individual outliers. As one example (which is a true story), a trader reported that, when calculating the potential profits of a given strategy in a specific time range, over 80% of the profits came from a single "fat-fingered" transaction where another user had accidentally added an extra zero to their price. The same strategy was far less profitable when calculated against time ranges that didn't include the outlier transaction. +- Not reading transaction flags. The flags of an XRP Ledger transaction can have significant impacts on the way that transaction is processed and when the protocol marks it as "successful". For example, the flags of "Offer" transactions can make it a "fill or kill" order that only trades if the full amount can be obtained immediately; the flags of "Payment" transactions can make them [partial payments](partial-payments.html) that succeed even if they can't deliver the full amount to the intended destination. You need to do bitwise math to parse the `Flags` field of a transaction, but your expectations can be totally wrong if you skip doing so. + +## Taxes and Licensing + +The legal requirements for trading on a blockchain vary by jurisdiction. In many cases, there are no licensing or other legal barriers to getting started, but you may be required to report your profits for tax purposes, especially if your gains or losses are over some thresholds. In the United States, you typically report profits (or losses) from trading as capital gains, which means you need to calculate the cost basis for the assets you buy at the time you acquire them. There are various tools out there that may be able to help track your trading activity or even generate the appropriate tax forms, depending on your individual situation. Depending on which assets you are trading and your trading strategies, the details may vary. Be sure to do your research or consult with a tax professional before you get started with algorithmic trading. + + +## Technical Details + +### Placing Trades + +Buying and selling _fungible_ tokens and XRP within the XRP Ledger's decentralized exchange typically involves sending [OfferCreate transactions](offercreate.html). For a detailed walkthrough of the code and technical steps to place a trade this way, see [Trade in the Decentralized Exchange](trade-in-the-decentralized-exchange.html). It is also possible to exchange currencies using the [Payment transaction type](payment.html). You could send a [cross-currency payment](cross-currency-payments.html) to another user or even send it back to yourself, using a long [path](paths.html) to link arbitrage opportunities together into a single operation. + +Non-fungible tokens work differently; for the code and technical steps to trade NFTs, see [Transfer NFTokens Using JavaScript](transfer-nfts-using-javascript.html). + +### Reading Trade Data + +There are many sources of information about the trading activity in the XRP Ledger. Depending on your trading strategy and use case, you may be able to connect to the XRP Ledger through [Public Servers](public-servers.html), but you can often benefit from running your own server, and some use cases may not be practical without doing so. See [Install `rippled`](install-rippled.html) for instructions on how to set up a core server in P2P mode. + +If your approach involves following other transaction activity, you may need to read the transactions' detailed metadata to know exactly how much they traded. Offers can partially execute and may consume multiple matching offers. For a detailed explanation of how to interpret transaction metadata, see [Look Up Transaction Results](look-up-transaction-results.html). + +To give yourself as much time as possible to react to profit-taking opportunities, you may also want to look at pending data from the [Open Ledger](open-closed-validated-ledgers.html), or even monitor for proposed transactions. If you're connected to WebSocket, you can use the [subscribe method](subscribe.html) with the `transactions_proposed` stream to see transactions before they're validated by consensus; you can also limit this to a subset of transactions that affect a particular account (for example, the issuer of a token you're interested in trading) by subscribing using the `accounts_proposed` parameter. + +### Future Developments + +Ripple has proposed extending the XRP Ledger protocol with a native Automated Market Maker (AMM) design that would work alongside the existing central limit order based (CLOB) decentralized exchange. If this proposal is accepted and becomes enabled as an [amendment](amendments.html), AMMs will become an important factor in trading on the XRP Ledger. You can read more at the following links: + +- [XLS-30d: Automated Market Maker standards proposal](https://github.com/XRPLF/XRPL-Standards/discussions/78) +- [AMM documentation (Ripple Open Source site)](https://opensource.ripple.com/docs/xls-30d-amm/automated-market-makers/) + +## Further Reading + +The following articles provide some more specific examples and interesting information about how these strategies work on other blockchains. This information isn't necessary to get started, but may help to provide perspective. + +- [Ethereum is a Dark Forest](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest) +- [Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges (PDF)](https://arxiv.org/pdf/1904.05234.pdf) +- [Slippage in AMM Markets](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4133897) +- [Frontrunner Jones and the Raiders of the Dark Forest: An Empirical Study of Frontrunning on the Ethereum Blockchain](https://www.usenix.org/conference/usenixsecurity21/presentation/torres) +- [SoK: Transparent Dishonesty: front-running attacks on Blockchain (PDF)](https://arxiv.org/pdf/1902.05164) \ No newline at end of file diff --git a/content/tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.ja.md b/content/use-cases/defi/list-xrp-as-an-exchange.ja.md similarity index 89% rename from content/tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.ja.md rename to content/use-cases/defi/list-xrp-as-an-exchange.ja.md index 30313a495e..ab47fb5726 100644 --- a/content/tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.ja.md +++ b/content/use-cases/defi/list-xrp-as-an-exchange.ja.md @@ -1,6 +1,6 @@ --- html: list-xrp-as-an-exchange.html -parent: xrp-ledger-businesses.html +parent: defi-uc.html blurb: デジタルアセット取引所でXRPを上場するために必要な手順の概要を説明します。 labels: - XRP @@ -41,17 +41,17 @@ XRPをサポートするために、Alpha Exchangeでは以下を行う必要が 関連項目: -* [ゲートウェイコンプライアンス](become-an-xrp-ledger-gateway.html#compliance-guidelines) — ゲートウェイと取引所は異なりますが、取引所は地域の規制に準拠し、適切な当局の監督下になければなりません。 +* [ゲートウェイコンプライアンス](stablecoin-issuer.html#compliance-guidelines) — ゲートウェイと取引所は異なりますが、取引所は地域の規制に準拠し、適切な当局の監督下になければなりません。 -* [Requirements for Sending to XRP Ledger](become-an-xrp-ledger-gateway.html#requirements-for-sending-to-xrp-ledger) +* [Requirements for Sending to XRP Ledger](stablecoin-issuer.html#requirements-for-sending-to-xrp-ledger) -* [Requirements for Receiving from XRP Ledger](become-an-xrp-ledger-gateway.html#requirements-for-receiving-from-xrp-ledger) +* [Requirements for Receiving from XRP Ledger](stablecoin-issuer.html#requirements-for-receiving-from-xrp-ledger) -* [ゲートウェイの注意事項](become-an-xrp-ledger-gateway.html#precautions) +* [ゲートウェイの注意事項](stablecoin-issuer.html#precautions) ### Partial Payments -追加の前に、取引所は[Partial Payments](partial-payments.html)機能について知っておく必要があります。この機能を使用すると、XRP Ledgerのユーザーは、`SendMax`を増やさずに、受取金額を減額して、支払いを正常に送信できます。この機能は、送信者側に追加費用が発生せず、[支払いの返金](become-an-xrp-ledger-gateway.html#bouncing-payments)に便利です。 +追加の前に、取引所は[Partial Payments](partial-payments.html)機能について知っておく必要があります。この機能を使用すると、XRP Ledgerのユーザーは、`SendMax`を増やさずに、受取金額を減額して、支払いを正常に送信できます。この機能は、送信者側に追加費用が発生せず、[支払いの返金](stablecoin-issuer.html#bouncing-payments)に便利です。 #### Partial Paymentsに関する警告 @@ -67,7 +67,7 @@ XRPは、XRP Ledgerの _アカウント_ ( _ウォレット_ や _アドレス Rippleが推奨するベストプラクティスに従い、Alpha Exchangeは、XRP Ledgerに最低2つのアカウントを作成する必要があります。シークレットキーが悪用された場合の危険を最小限にとどめるため、Rippleでは、[ _コールドアカウント_ 、 _ホットアカウント_ 、 _ウォームアカウント_ ](https://ripple.com/build/issuing-operational-addresses/)(それぞれコールドウォレット、ホットウォレット、ウォームウォレットとも呼ばれる)の作成をお勧めしています。コールド/ホット/ウォームのモデルは、セキュリティと利便性のバランスをとるためのものです。XRPを上場する取引所は、以下のアカウントを作成する必要があります。 -* 大部分のXRPと顧客の資金を維持する[ _コールドウォレット_ ](issuing-and-operational-addresses.html#発行アドレス)。取引所にとって、これはユーザーが[預入れ](#取引所へのxrpの入金)をするアドレスです。 セキュリティを最適化するため、このアカウントのシークレットキーはオフラインにする必要があります。 +* 大部分のXRPと顧客の資金を維持する[ _コールドウォレット_ ](account-types.html#発行アドレス)。取引所にとって、これはユーザーが[預入れ](#取引所へのxrpの入金)をするアドレスです。 セキュリティを最適化するため、このアカウントのシークレットキーはオフラインにする必要があります。 取引所のコールドウォレットが悪用されると、以下のような結果が生じるおそれがあります。 @@ -83,20 +83,18 @@ Rippleが推奨するベストプラクティスに従い、Alpha Exchangeは、 * 不正使用者が、アカウントにasfRequireAuthフラグを設定した場合。この設定は解除できません。ただし、これは通貨の発行のみに関係し、ゲートウェイではない取引所には影響しません。不正使用者がマスターキーで設定または設定解除したその他の設定は、元に戻すことができます。 -* 顧客のXRP出金や入金を管理する、日常業務を遂行するための1つ以上の[ _ホットウォレット_ ](issuing-and-operational-addresses.html#運用アドレス)。例えば、ホットウォレットがあれば、取引所はこの種のXRPの自動送金を安全にサポートできます。出金要求にただちに応じるため、ホットウォレットはオンラインである必要があります。 +* 顧客のXRP出金や入金を管理する、日常業務を遂行するための1つ以上の[ _ホットウォレット_ ](account-types.html#運用アドレス)。例えば、ホットウォレットがあれば、取引所はこの種のXRPの自動送金を安全にサポートできます。出金要求にただちに応じるため、ホットウォレットはオンラインである必要があります。 - 不正使用されたホットウォレットによって発生するおそれのある結果についての詳細は、[Operational Account Compromise](issuing-and-operational-addresses.html#運用アドレスの漏えい)を参照してください。 + 不正使用されたホットウォレットによって発生するおそれのある結果についての詳細は、[Operational Account Compromise](account-types.html#運用アドレスの漏えい)を参照してください。 * オプションとして、コールドウォレットとホットウォレットの間で追加のセキュリティ層を提供する、1つ以上のウォームウォレット。ホットウォレットとは異なり、ウォームウォレットのシークレットキーはオンラインである必要はありません。さらに、ウォームウォレットのシークレットキーを複数の人に分散し、[マルチシグ](multi-signing.html)を導入してセキュリティを強化することもできます。 - 不正使用されたウォームウォレットによって発生するおそれのある結果についての詳細は、[スタンバイアドレスの漏えい](issuing-and-operational-addresses.html#スタンバイアドレスの漏えい)を参照してください。 + 不正使用されたウォームウォレットによって発生するおそれのある結果についての詳細は、[スタンバイアドレスの漏えい](account-types.html#スタンバイアドレスの漏えい)を参照してください。 関連項目: -* ["Suggested Business Practices" in the _Gateway Guide_](become-an-xrp-ledger-gateway.html#suggested-business-practices) - -* [発行アドレスと運用アドレス](issuing-and-operational-addresses.html) +* [発行アドレスと運用アドレス](account-types.html) * [アカウントの作成](accounts.html#アカウントの作成) @@ -200,7 +198,7 @@ XRPの額は、XRP Ledgerで、符号なし整数の _drop_ として示され _Alpha Exchange_ のような取引所では、XRPは「台帳上」または「台帳外」に存在します。 -* **台帳上のXRP**: XRP保有者のパブリック[アドレス](accounts.html#アドレス)を指定し、パブリックのXRP Ledgerを通じて照会できるXRP。これらの残高の取引相手はXRP Ledgerです。詳細については、[XRP](xrp.html)を参照してください。 +* **台帳上のXRP**: XRP保有者のパブリック[アドレス](accounts.html#アドレス)を指定し、パブリックのXRP Ledgerを通じて照会できるXRP。これらの残高の取引相手はXRP Ledgerです。詳細については、[XRP](what-is-xrp.html)を参照してください。 * **台帳外のXRP**: 取引所の会計システムに保持されている、取引所のインターフェイスで照会できるXRP。台帳外のXRP残高はクレジットペースです。取引相手は、XRPを保有している取引所です。 @@ -313,7 +311,7 @@ CharlieというユーザーがAlpha Exchangeに50,000XRPを入金したいと 1. Charlieは50,000XRPの支払いを、Alpha Exchangeの[コールドウォレット](#アカウント)に送信します。 - a. Charlieは識別子(このケースでは`789`)を支払いに追加し、Alpha Exchangeにある自身のアカウントに関連付けます。これは、[ _宛先タグ_ ](become-an-xrp-ledger-gateway.html#source-and-destination-tags)と呼ばれます。(これを使用するには、Alpha Exchangeは、すべての入金でCharlieのような宛先タグを必要とするように、すべてのアカウントでasfRequireDestフラグをオンに設定している必要があります。詳細については、[AccountSet Flags](accountset.html#accountsetのフラグ)を参照してください。) + a. Charlieは識別子(このケースでは`789`)を支払いに追加し、Alpha Exchangeにある自身のアカウントに関連付けます。これは、[ _宛先タグ_ ](source-and-destination-tags.html)と呼ばれます。(これを使用するには、Alpha Exchangeは、すべての入金でCharlieのような宛先タグを必要とするように、すべてのアカウントでasfRequireDestフラグをオンに設定している必要があります。詳細については、[AccountSet Flags](accountset.html#accountsetのフラグ)を参照してください。) 2. Alpha Exchangeのソフトウェアは、受信される支払を検出し、`789`をチャーリーのアカウントの宛先タグとして認識します。 diff --git a/content/tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.md b/content/use-cases/defi/list-xrp-as-an-exchange.md similarity index 85% rename from content/tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.md rename to content/use-cases/defi/list-xrp-as-an-exchange.md index 8423d24af6..732bf4682e 100644 --- a/content/tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.md +++ b/content/use-cases/defi/list-xrp-as-an-exchange.md @@ -1,6 +1,6 @@ --- html: list-xrp-as-an-exchange.html -parent: xrp-ledger-businesses.html +parent: defi-uc.html blurb: Run a digital asset exchange? Follow these steps to add XRP. labels: - XRP @@ -41,17 +41,17 @@ To support XRP, Alpha Exchange must: See also: -* [Compliance Guidelines](become-an-xrp-ledger-gateway.html#compliance-guidelines) — Token issuers and exchanges are different, but exchanges should also ensure that they are complying with local regulations and reporting to the appropriate agencies. +* [Compliance Guidelines](stablecoin-issuer.html#compliance-guidelines) — Token issuers and exchanges are different, but exchanges should also ensure that they are complying with local regulations and reporting to the appropriate agencies. -* [Requirements for Sending to XRP Ledger](become-an-xrp-ledger-gateway.html#requirements-for-sending-to-xrp-ledger) +* [Requirements for Sending to XRP Ledger](stablecoin-issuer.html#requirements-for-sending-to-xrp-ledger) -* [Requirements for Receiving from XRP Ledger](become-an-xrp-ledger-gateway.html#requirements-for-receiving-from-xrp-ledger) +* [Requirements for Receiving from XRP Ledger](stablecoin-issuer.html#requirements-for-receiving-from-xrp-ledger) -* [Precautions](become-an-xrp-ledger-gateway.html#precautions) +* [Precautions](stablecoin-issuer.html#precautions) ### Partial Payments -Before integrating, exchanges should be aware of the [partial payments](partial-payments.html) feature. This feature allows XRP Ledger users to send successful payments that reduce the amount received instead of increasing the `SendMax`. This feature can be useful for [returning payments](become-an-xrp-ledger-gateway.html#bouncing-payments) without incurring additional cost as the sender. +Before integrating, exchanges should be aware of the [partial payments](partial-payments.html) feature. This feature allows XRP Ledger users to send successful payments that reduce the amount received instead of increasing the `SendMax`. This feature can be useful for [returning payments](stablecoin-issuer.html#bouncing-payments) without incurring additional cost as the sender. #### Partial Payments Warning @@ -61,11 +61,11 @@ When the [`tfPartialPayment` flag](payment.html#payment-flags) is enabled, the ` ### Accounts -XRP is held in _accounts_ (also referred to as _wallets_ or _addresses_ ) on the XRP Ledger. Accounts on the XRP Ledger are different than accounts on other blockchain ledgers, such as Bitcoin, where accounts incur little to no overhead. In the XRP Ledger, account state is stored per ledger and accounts are [not easy to delete](accounts.html#deletion-of-accounts). To offset the costs associated with storing accounts, each account must hold a separate [reserve of XRP](reserves.html) that cannot be sent to others. For these reasons, Ripple recommends that institutions not create excessive or needless accounts. +XRP is held in _accounts_ (also referred to as _wallets_ or _addresses_ ) on the XRP Ledger. Accounts on the XRP Ledger are different than accounts on other blockchain ledgers, such as Bitcoin, where accounts incur little to no overhead. In the XRP Ledger, account state is stored per ledger and accounts are [not easy to delete](deleting-accounts.html). To offset the costs associated with storing accounts, each account must hold a separate [reserve of XRP](reserves.html) that cannot be sent to others. For these reasons, Ripple recommends that institutions not create excessive or needless accounts. -To follow Ripple's recommended best practices, Alpha Exchange should create at least two new accounts on the XRP Ledger. To minimize the risks associated with a compromised secret key, Ripple recommends creating [_cold_, _hot_, and _warm_ accounts](issuing-and-operational-addresses.html) (these are sometimes referred to, respectively, as cold, hot, and warm wallets). The hot/warm/cold model is intended to balance security and convenience. Exchanges listing XRP should create the following accounts: +To follow Ripple's recommended best practices, Alpha Exchange should create at least two new accounts on the XRP Ledger. To minimize the risks associated with a compromised secret key, Ripple recommends creating [_cold_, _hot_, and _warm_ accounts](account-types.html) (these are sometimes referred to, respectively, as cold, hot, and warm wallets). The hot/warm/cold model is intended to balance security and convenience. Exchanges listing XRP should create the following accounts: -* A [_cold wallet_](issuing-and-operational-addresses.html#issuing-address) to securely hold the majority of XRP and customers' funds. For exchanges, this is also the address to which its users send [deposits](#deposit-xrp-into-exchange). To provide optimal security, this account's secret key should be offline. +* A [_cold wallet_](account-types.html#issuing-address) to securely hold the majority of XRP and customers' funds. For exchanges, this is also the address to which its users send [deposits](#deposit-xrp-into-exchange). To provide optimal security, this account's secret key should be offline. If a malicious actor compromises an exchange's cold wallet, the possible consequences are: @@ -81,20 +81,18 @@ To follow Ripple's recommended best practices, Alpha Exchange should create at l * If a malicious actor enables the [Authorized Trust Lines](authorized-trust-lines.html) setting for the account, that cannot be unset, although this only relates to issuing tokens and should not affect an exchange that is not also an issuer. Any other settings a malicious actor changes with a master key can be reverted. -* One or more [_hot wallets_](issuing-and-operational-addresses.html#operational-addresses) to conduct the day-to-day business of managing customers' XRP withdrawals and deposits. For example, with a hot wallet, exchanges can securely support these types of automated XRP transfers. Hot wallets need to be online to service instant withdrawal requests. +* One or more [_hot wallets_](account-types.html#operational-addresses) to conduct the day-to-day business of managing customers' XRP withdrawals and deposits. For example, with a hot wallet, exchanges can securely support these types of automated XRP transfers. Hot wallets need to be online to service instant withdrawal requests. - For more information about the possible consequences of a compromised hot wallet, see [Operational Account Compromise](issuing-and-operational-addresses.html#operational-address-compromise). + For more information about the possible consequences of a compromised hot wallet, see [Operational Account Compromise](account-types.html#operational-address-compromise). * Optionally, one or more warm wallets to provide an additional layer of security between the cold and hot wallets. Unlike a hot wallet, the secret key of a warm wallet does not need to be online. Additionally, you can distribute the secret keys for the warm wallet to several different people and implement [multi-signing](multi-signing.html) to increase security. - For more information about the possible consequences of a compromised warm wallet, see [Standby Account Compromise](issuing-and-operational-addresses.html#standby-address-compromise). + For more information about the possible consequences of a compromised warm wallet, see [Standby Account Compromise](account-types.html#standby-address-compromise). See also: -* ["Suggested Business Practices" in the _Gateway Guide_](become-an-xrp-ledger-gateway.html#suggested-business-practices) - -* [Issuing and Operational Addresses](issuing-and-operational-addresses.html) +* [Issuing and Operational Addresses](account-types.html) * [Creating Accounts](accounts.html#creating-accounts) @@ -198,7 +196,7 @@ For more information, see [Specifying Currency Amounts][]. With exchanges like _Alpha Exchange_, XRP can be "on-ledger" or "off-ledger": -* **On-Ledger XRP**: XRP that can be queried through the public XRP Ledger by specifying the public [address](accounts.html#addresses) of the XRP holder. The counterparty to these balances is the XRP Ledger. For more information, see [XRP](xrp.html). +* **On-Ledger XRP**: XRP that can be queried through the public XRP Ledger by specifying the public [address](addresses.html) of the XRP holder. The counterparty to these balances is the XRP Ledger. For more information, see [XRP](what-is-xrp.html). * **Off-Ledger XRP**: XRP that is held by the accounting system of an exchange and can be queried through the exchange interface. Off-ledger XRP balances are credit-based. The counterparty is the exchange holding the XRP. @@ -311,7 +309,7 @@ A user named Charlie wants to deposit 50,000 XRP to Alpha Exchange. Doing this i 1. Charlie submits a payment of 50,000 XRP to Alpha Exchange's [cold wallet](#accounts). - a. Charlie adds an identifier (in this case, `789`) to the payment to associate it with his account at Alpha Exchange. This is called a [_destination tag_](become-an-xrp-ledger-gateway.html#source-and-destination-tags). (To use this, Alpha Exchange should have set the `asfRequireDest` flag on all of its accounts to require all incoming payments to have a destination tag like Charlie's. For more information, see [AccountSet Flags](accountset.html#accountset-flags)). + a. Charlie adds an identifier (in this case, `789`) to the payment to associate it with his account at Alpha Exchange. This is called a [_destination tag_](source-and-destination-tags.html). (To use this, Alpha Exchange should have set the `asfRequireDest` flag on all of its accounts to require all incoming payments to have a destination tag like Charlie's. For more information, see [AccountSet Flags](accountset.html#accountset-flags)). 2. The software at Alpha Exchange detects the incoming payment, and recognizes `789` as the destination tag for Charlie’s account. @@ -614,7 +612,7 @@ Off-Ledger Balances - **Tutorials:** - [Install `rippled`](install-rippled.html) - [Send XRP](send-xrp.html) - - [Set Up Secure Signing](set-up-secure-signing.html) + - [Set Up Secure Signing](secure-signing.html) - [Monitor Incoming Payments with WebSocket](monitor-incoming-payments-with-websocket.html) - **References:** - [Payment transaction][] diff --git a/content/use-cases/payments/peer-to-peer-payments-uc.md b/content/use-cases/payments/peer-to-peer-payments-uc.md new file mode 100644 index 0000000000..1e5b6a47cd --- /dev/null +++ b/content/use-cases/payments/peer-to-peer-payments-uc.md @@ -0,0 +1,53 @@ +--- +html: peer-to-peer-payments-uc.html +parent: payments-uc.html +blurb: Use the XRP Ledger to handle your day-to-day payments without a third party. +labels: + - Transactions +--- +# Peer-to-Peer Payments + +The XRP Ledger provides an efficient and borderless solution to handling payments. Unlike traditional payment methods, you don't need a financial institution to hold your assets and transfer value. If you have access to the internet, you can make direct payments on the XRP Ledger as easily as handing someone cash. Whether between friends, or a buyer and merchant, the XRP Ledger enables you to handle direct (peer-to-peer) payments quickly and with low network fees. + + +## Wallets + +Before jumping into using the XRP Ledger to handle direct payments, you should settle on a crypto wallet to use. Crypto wallets make it easier to interact with the ledger and manage your funds; there are many to choose from, depending on your needs, and you can even create your own. See: [Crypto Wallets](crypto-wallets.html). + + +## Account Creation + +Before creating an account, you must decide which XRP Ledger network to use. There are multiple networks for different use cases, but native XRP transactions only happen on `Mainnet`. See: [Parallel Networks](parallel-networks.html) + +Most publicly available wallets offer the ability to create an account for you and can generate a public and private key. If they don't, you can create an account yourself, so long as it's mathematically valid. See: [Creating Accounts](accounts.html#creating-accounts). + + +## Fund Your Account + +An account isn't active on the XRP Ledger until it's been funded and meets the minimum reserve requiremen. See: [Reserves](reserves.html). + +If the wallet you're using doesn't offer the option to purchase XRP, you'll need to find a third party exchange to do so and send it to your account. Alternatively, someone you know can also send XRP to your account. See: [Payment](payment.html). + +After funding your account, you should verify on the XRP Ledger itself that your account exists and is funded. You can do this with the: + + - [XRPL Explorer](https://livenet.xrpl.org/). + - [`account_info` command](account_info.html). + + +## Handling Payments + + +### Direct XRP Payments + +XRP payments are the simplest way to pay someone on the XRP Ledger. You can use checks or escrows, but these require multiple transactions to complete. A direct XRP payment require only one transaction, making this option great for day-to-day activity. If you're a merchant handling large volumes of transactions, this may be the right choice for you due to it being quick, simple, and having the lowest fees. See: [Direct XRP Payments](direct-xrp-payments.html). + +To make a direct XRP payment work, you only need to know the address of the receiver. + + +### Cross-Currency Payments + +The XRP Ledger enables you to make cross-currency payments of XRP and tokens. Cross-currency payments within the XRP Ledger are fully atomic, meaning the payment fully executes or no part of the payment executes at all. + +Cross-currency payments deliver a fixed amount to their destination, but the sender can have a variable fee cost, depending on the paths taken to make the transaction work on the network. See: [Cross-currency Payments](cross-currency-payments.html). + +This is a great payment option if you or the receiver prefer a specific token instead of the native XRP currency. diff --git a/content/use-cases/payments/restricting-deposits-uc.md b/content/use-cases/payments/restricting-deposits-uc.md new file mode 100644 index 0000000000..ada791650d --- /dev/null +++ b/content/use-cases/payments/restricting-deposits-uc.md @@ -0,0 +1,70 @@ +--- +html: restricting-deposits-uc.html +parent: payments-uc.html +blurb: Checks enable users to create deferred payments similar to personal paper checks. +labels: + - Transactions +--- +# Restricting Deposits + +To comply with banking regulations, financial institutions must provide documentation about the sources of funds they receive. These regulations seek to prevent illicit activity by requiring institutions to track the source and destination of all payments they process. On the XRP Ledger, payments can be sent and received without any interaction from the receiver. This default behavior can be problematic, but you can enable deposit authorization so you only receive funds you explicitly approve. + +Accounts with deposit authorization enabled can only receive funds through: + + - Preauthorized Accounts + - Checks + - Escrow + + + +## Set Up Deposit Authorization + +To enable deposit authorization, use the `AccountSet` transaction to set the `asfDepositAuth` flag. See: [Deposit Authorization](depositauth.html). + +## Preauthorized Accounts + +When you enable deposit authorization, your account blocks all incoming transactions unless you specifically _okay_ them. This may be what you're looking for, but it can be cumbersome if you're working with high volumes of transactions. If you have trusted vendors or accounts, you can preauthorize them so that you don't have to approve transactions from them. + +Preauthorized accounts are currency-agnostic, meaning you can't specify which currencies to authorize. It's all or nothing. + +See: [DepositPreauth](depositpreauth.html). + + +## Accepting Deposits from Unauthorized Accounts + +You can still work with unauthorized accounts, even after enabling deposit authorization. There are several payment methods that enable you to do so. + + +### Checks + +Checks are a straightforward, familiar, and flexible way to transfer funds when deposit authorization is enabled. Checks are a two-part payment method. The sender creates the check, and then the receiver has to cash the check. Cashing the check is your explicit approval of the deposit. + +While this method is the simplest, it doesn't guarantee the funds. Checks are deferred payments, meaning funds aren't moved until the moment you try to cash the check. It's possible for the sending account to not have the necessary funds at the time the check is cashed, which can cause delays or other headaches, depending on your business. + +See: [Use Checks](use-checks.html). + + +### Escrow + +If you require a guarantee of funds at the time of deposit, another option is to have deposits made with an escrow. Like regular escrows, a sender sets aside funds on the ledger, effectively locking them up until certain conditions are met. This guarantees the funds will be available when you close the escrow to release the funds. + +See: [Use Escrows](use-escrows.html). + + + \ No newline at end of file diff --git a/content/use-cases/payments/smart-contracts-uc.md b/content/use-cases/payments/smart-contracts-uc.md new file mode 100644 index 0000000000..3ef3a3175e --- /dev/null +++ b/content/use-cases/payments/smart-contracts-uc.md @@ -0,0 +1,48 @@ +--- +html: escrow-uc.html +parent: payments-uc.html +blurb: Transactions allow accounts to modify the XRP Ledger. +labels: + - Ledgers +--- +# Smart Contracts + +A smart contract is a blockchain-based program that handles the conditions and executes the fulfillment of an agreement between two parties. Broken into its simplest components, a smart contract _does_ something if _something else_ happens. + +The benefit of encoding a smart contract into a blockchain is that it enables contracts to be securely carried out without traditional third-parties, like financial or legal institutions. Instead, the contract is supervised by the distributed, decentralized network of computers that run the blockchain. + +This enables you to transact with anybody without having to trust they'll uphold their end of a deal; the conditions of the smart contract will force them to. + + +## Conditionally Held Escrow + +Smart contracts on the XRP Ledger work through conditionally held escrows. + + +### Create the Escrow + +A conditionally held escrow is similar to a normal escrow: you set aside funds with an escrow to guarantee funds are available to a recipient. The difference is that a conditionally held escrow on the ledger has a `Condition` attached to it, which serves as a lock on the funds. The ledger won't release those funds until an `EscrowFinish` transaction is submitted with the corresponding `Fulfillment` field. The `Condition` and `Fulfillment` fields can be viewed as a lock and key on an escrow. + +See: [`EscrowCreate`](escrowcreate.html). + + +### Establish the Oracle + +An oracle is a neutral third-party agent that can verify real-world events to either fulfill or invalidate a smart contract. Oracles are vital to making conditional escrows work by generating the condition and fulfillment, and keeping the fulfillment secret until the terms of the contract are met. + +In the context of smart contracts, an oracle will most likely be software that can read real-world data. The oracle would be programmed with the terms of the contract between parties and generate the condition and fulfillment hex values. + +The oracle gives the condition hex value to the escrow creator, enabling them to set up the escrow initially. + +After the oracle's programming detects the conditions are met, it gives the fulfillment hex value to the escrow recipient. It does nothing else after this point, such as finishing the escrow. The recipient of the escrow would most likely finish the escrow. + +See: [Generate a condition and fulfillment](send-a-conditionally-held-escrow.html#1-generate-condition-and-fulfillment). + +## Examples + +Smart contracts have a wide range of uses, but some uses include: + +1. Handling payments on large-value items you would otherwise need lawyers for, such as mortgages. +2. Supply-chain management to ensure funds are delivered upon receipt of goods. +3. Automating certain kinds of insurance claims that can be verified by software. +4. Ensuring payments are given for services rendered. diff --git a/content/use-cases/tokenization/authorized-minter.md b/content/use-cases/tokenization/authorized-minter.md new file mode 100644 index 0000000000..b6855bbd29 --- /dev/null +++ b/content/use-cases/tokenization/authorized-minter.md @@ -0,0 +1,103 @@ +--- +html: authorized-minter.html +parent: nft-mkt-overview.html +blurb: Minting and selling NFTs for another account. +labels: + - Tokenization +--- +# Authorized Minter + +_As an authorized minter, I want to mint tokens for a token issuer at an agreed upon rate and sell the tokens at a profit, with royalties returning to the issuer._ + +You can act as an authorized minter for token issuers. When you do this, you own the NFToken, but royalties flow to the NFToken issuer. When you make a sale of that NFToken, the proceeds of the initial sale go to you. You can have an agreement with your issuer to pay them some or all of your portion of the initial sale amount. + +You can learn more in the tutorial [Assign an Authorized Minter](assign-an-authorized-minter-using-javascript.html). + +[![Authorized Minter Flow](img/nft-mkt-auth-minter.png "Authorized Minter Flow")](img/nft-mkt-auth-minter.png) + +## Set up a rippled instance + +If you want to set up a larger site with high volume, it might be worth investing in your own XRP Ledger server instance. See [Install rippled](install-rippled.html). + +## Set up your marketplace + +Rather than designing NFTs yourself, you coordinate with an NFT creator to become an authorized minter and generate NFTs on their behalf. This allows the creator to focus on making new NFTs while you handle production and sales of the NFTs. See [Authorized Minter](nftoken-authorized-minting.html). + +Once you finish creating NFTs, the creator can revoke your privileges and reassert control over the NFTs. You might also transfer the tokens to a marketplace that will handle sales of the NFTs. You can act as a broker to match sell offers to buy offers. See [Running an NFT auction](nftoken-auctions.html). + +To mint your first NFTs on behalf of another account, see [Authorizing Another Account to Mint Your NFTs](assign-an-authorized-minter-using-javascript.html). + +If you, as the owner or issuer, want to be able to burn the token in the future, set the `Flags` field to _1._ To make the NFT transferable, set the `Flags` field to _8_. Set the `Flags` field to _9_ to make the NFT both burnable and transferable. See[ Burnable flag](nftoken.html#nftoken-flags) and [Transferable flag](nftoken.html#nftoken-flags). + +You can arrange for the creator to receive royalties from future sales by setting a transfer fee. This is a value from 0-50000 representing 0-50% of the sale price. See [Transfer Fee](nftoken.html#transferfee). + +The NFToken URL is a link to the location where the content of the NFT is stored. One option is create an IPFS account and store the NFToken content at a persistent URL. See [Best Practices for Storing NFT Data](https://docs.ipfs.io/how-to/best-practices-for-nft-data). + +Considerations that might be most interesting to you: + +* [Minting NFTs into Collections](nft-collections.html) +Use the TokenTaxon field to gather a set of NFTs centered around a specific theme or purpose. +* [Guaranteeing a Fixed Supply of NFTs](nft-fixed-supply.html) +You can assure scarcity of NFTs you create by creating them with what might be characterized as a “burner” account that you use to mint a set number of NFTs for another account, then delete the account you used to mint the NFTs. See [Guaranteeing a Fixed Supply of NFTs](nft-fixed-supply.html). + +## Transferring NFTs + +You transfer NFTs by creating a sell offer or accepting a buy offer. See [Transfer NFTokens](transfer-nfts-using-javascript.html). + +You can sell your NFTs in an auction format. See [Running an NFT Auction](nftoken-auctions.html). + +You can act as a broker, connecting sellers with bidders, completing the transfer and keeping a percentage of the purchase price. See [Broker a NFToken sale](broker-an-nft-sale-using-javascript.html). + +### Reserve requirements + +There are several XRP reserve requirements when you mint NFTs for sale. Each NFToken page requires a reserve of 2 XRP. A NFToken page can store 16-32 NFTs. + +Each `NFTokenOffer` object requires a reserve of 2 XRP. + +When you post the `NFTokenOffer` or sell the NFT, there are trivial transfer fees (roughly 6000 drops, or .006 XRP). When you are selling at a high volume, the trivial amounts can add up quickly, and need to be considered as part of your cost of doing business. + +See: + +1. [NFTokenOffer](nft-reserve-requirements.html#nftokenoffer-reserve) +2. NFToken page ([Owner reserve](nft-reserve-requirements.html#owner-reserve)) +3. Trivial [transfer fees](transfer-fees.html) + +### Checkout + +The most straightforward payment for XRPL NFTs is XRP. For examples of selling and buying NFTs using XRP, see [Transfer NFTokens](transfer-nfts-using-javascript.html). + +For trade in other currencies, you can leverage the DEX to accept and convert issued currencies of all kinds. See [Trade in the Decentralized Exchange](trade-in-the-decentralized-exchange.html#trade-in-the-decentralized-exchange). + +## Indexing NFTs + +When listing NFTs for sale, it can be useful to use object metadata to organize them. You can use queries in the XRPL libraries, the Clio server, and extensions in the XRPL API and Bithomp libraries to sort and filter NFTs by creator, price, collection, rarity, and more. + +See: + +- [Clio setup](install-clio-on-ubuntu.html) +- [XRPL Data API](https://api.xrpldata.com/docs/static/index.html#/) +- [Bithomp](https://docs.bithomp.com/#nft-xls-20) + + diff --git a/content/use-cases/tokenization/digital-artist.md b/content/use-cases/tokenization/digital-artist.md new file mode 100644 index 0000000000..cc6ccf6369 --- /dev/null +++ b/content/use-cases/tokenization/digital-artist.md @@ -0,0 +1,83 @@ +--- +html: digital-artist.html +parent: nft-mkt-overview.html +blurb: Creating an NFT Marketplace for buying and selling NFTs. +labels: + - Tokenization +--- +# Digital Artist + +_As a Digital Artist, I want to use the XRPL to create a NFToken of my work and sell it on the XRPL, because the XRPL is both cost efficient and carbon neutral._ + +--- + +When you create a NFToken, you create a unique token on the XRPL that is effectively a placeholder for an actual physical or digital asset. When you create the NFToken, you provide a URL to a digital file that is the item itself, such as a digital artwork, or a URL to a placeholder that represents an item in the physical world. + +As a digital artist, you’re focused on creating NFTs, presumably to sell on the XRP Ledger (it’s also possible you might create NFTs as a way of establishing provenance for your creations). + +You can create NFTokens using an app such as the [Xumm app](https://xumm.app). + +For a more hands-on experience, you can follow the steps in the [Quickstart Tutorial 3 - Mint and Burn NFTokens](mint-and-burn-nfts-using-javascript.html). + +[![Digital Artist Flow](img/nft-mkt-digital-artist.png "Digital Artist Flow")](img/nft-mkt-digital-artist.png) + +## Use a public server + +As you get started, you will likely have comparatively few transactions. You can work with one of the free XRP Ledger public servers. As your business grows, you might consider your own NFT Ledger instance to handle increased sales traffic. See [Public servers](public-servers.html). + +## Create NFTs + +Build your marketplace by minting NFTs to sell. + +To create your first NFTs, follow the instructions in the tutorial _Mint and Burn NFTokens_. Keep the following in mind as you create your NFTs: + +* You can collect royalties from future sales by setting a transfer fee. This is a value from 0-50000 representing 0-50% of the sale price. See [Transfer Fee](nftoken.html#transferfee). +* The NFToken URL is a link to the location where the content of the NFT is stored. One option is create an IPFS account and store the NFToken content at a persistent URL. See [Best Practices for Storing NFT Data](https://docs.ipfs.io/how-to/best-practices-for-nft-data). [Add link to blog post about alternative NFT cache options.] +* You can mint NFTs in logical collections using the TokenTaxon field. See [Minting NFTs into Collections](nft-collections.html). +* If you, as the issuer, want to be able to burn the token in the future, set the Flags field to 1. To make the NFT transferable, set the Flags field to 8. Set the Flags field to 9 to make the NFT both burnable and transferable. See[ Burnable flag](nftoken.html#nftoken-flags) and [Transferable flag](nftoken.html#nftoken-flags). + +See [Mint and Burn NFTokens](mint-and-burn-nfts-using-javascript.html). + +## Sell NFTs + +You transfer NFTs by creating a sell offer. See [Transfer NFTokens](transfer-nfts-using-javascript.html). + +You can sell your NFTs in an auction format. See [Running an NFT Auction](nftoken-auctions.html). + +### Reserve requirements + +There are several XRP reserve requirements when you mint NFTs for sale. Each NFToken page requires a reserve of 2 XRP. A NFToken page can store 16-32 NFTs. + +Each `NFTokenOffer` object requires a reserve of 2 XRP. + +When you post the `NFTokenOffer` or sell the NFT, there are trivial transfer fees (roughly 6000 drops, or .006 XRP). When you are selling at a high volume, the trivial amounts can add up quickly, and need to be considered as part of your cost of doing business. + +See: + +1. [NFTokenOffer](nft-reserve-requirements.html#nftokenoffer-reserve) +2. NFToken page ([Owner reserve](nft-reserve-requirements.html#owner-reserve)) +3. Trivial [transfer fees](transfer-fees.html) + +### Checkout + +The most straightforward payment for XRPL NFTs is XRP. For examples of selling and buying NFTs using XRP, see [Transfer NFTokens](transfer-nfts-using-javascript.html). + +For trade in other currencies, you can leverage the DEX to accept and convert issued currencies of all kinds. See [Trade in the Decentralized Exchange](trade-in-the-decentralized-exchange.html#trade-in-the-decentralized-exchange). + + +## Indexing NFTs + +When listing NFTs for sale, it can be useful to use object metadata to organize them. You can use queries in the XRPL libraries, the Clio server, and extensions in the XRPL API and Bithomp libraries to sort and filter NFTs by creator, price, collection, rarity, and more. + +See: + +- [Clio setup](install-clio-on-ubuntu.html) +- [XRPL Data API](https://api.xrpldata.com/docs/static/index.html#/) +- [Bithomp](https://docs.bithomp.com/#nft-xls-20) + + +## Burning NFTs + +There are some workflows where it makes sense for the issuer to retain the right to burn the token at some point in the future, regardless of the current owner. For example, NFTs used for carbon credits can be minted and traded, but once the carbon is captured, the NFT can be burned so that it is no longer transferable. For these scenarios, set the `lsfBurnable` flag when you mint the NFT. + +Another example might be burning an in-game asset that is lost by a player after losing a life in the game. You might also burn an NFT ticket after successful redemption to prevent it from being used again. \ No newline at end of file diff --git a/content/use-cases/tokenization/nft-mkt-overview.md b/content/use-cases/tokenization/nft-mkt-overview.md new file mode 100644 index 0000000000..73c0229f50 --- /dev/null +++ b/content/use-cases/tokenization/nft-mkt-overview.md @@ -0,0 +1,168 @@ +--- +html: nft-mkt-overview.html +parent: tokenization.html +blurb: Overview of NFT Marketplace use cases. +labels: + - Tokenization +--- +# NFT Marketplace Overview + + +## Key Features + +XRPL native support for NFTs provides tools that let you do the following. + +- Mint, sell, and burn NFTs +- Kick start an NFT project in little time at low expense +- Assign a broker to arrange transfers between sellers and bidders +- Authorize another account to mint NFTs for you +- Receive creator-friendly, on-ledger royalties that are honored by marketplaces + +All this on top of the XRP Ledger’s greater than 10 years of performance and reliability. + +## Understand Your Goals + +Start by deciding what sort of marketplace you want to create. + +- Marketplace, selling NFTs minted by others +- Authorized minter, minting NFTs for artists +- Digital artist, creating and selling your own NFTs + +There are 4 essential areas of preparation for starting your NFT business. + +1. Deciding how you will connect to the network +2. Setting up your blockchain behavior +3. Indexing required NFT information +4. Determining your permanent storage strategy to cache your NFTs + +[![NFT Marketplace Flow](img/nft-mkt-overview.png "NFT Marketplace Flow")](img/nft-mkt-overview.png) + +## Connect to XRPL + +If you want to set up a smaller site with fewer transactions, you can work with one of the free XRP Ledger public servers. See [Public servers](public-servers.html). + +If you want to set up a larger site with high volume, it might be worth investing in your own XRP Ledger server instance. See [Install rippled](install-rippled.html). + +See also: + +* [Pros and cons of running your own server](networks-and-servers.html#reasons-to-run-your-own-server). + +## Set Up Basic Blockchain Functions + +You can begin to build your marketplace by minting some NFTs to sell. + +To create your first NFTs, follow the instructions in the tutorial _Mint and Burn NFTokens_. See [Mint and Burn NFTokens](mint-and-burn-nfts-using-javascript.html). + +The NFToken URL is a link to the location where the content of the NFT is stored. One option is create an IPFS account and store the NFToken content at a persistent URL. See [Best Practices for Storing NFT Data](https://docs.ipfs.io/how-to/best-practices-for-nft-data). + +If you, as the issuer, want to be able to burn the token in the future, set the `Flags` field to _1._ To make the NFT transferable, set the `Flags` field to _8_. Set the `Flags` field to _9_ to make the NFT both burnable and transferable. See [Burnable flag](nftoken.html#nftoken-flags) and [Transferable flag](nftoken.html#nftoken-flags). + +You can collect royalties from future sales by setting a transfer fee. This is a value from 0-50000 representing 0-50% of the sale price. See [Transfer Fee](nftoken.html#transferfee). + +You can mint NFTs in logical collections using the `TokenTaxon` field. See [Minting NFTs into Collections](nft-collections.html). + +You can mint your own NFTs with content you create yourself, but you can also become an authorized minter to generate NFTs on behalf of another creator. This allows the creator to focus on making new NFTs while you handle production and sales of the NFTs. + +Once the authorized minter has finished creating NFTs for you, you can revoke their privileges so that they no longer have any control over your NFTs. + +See [Authorized Minter](nftoken-authorized-minting.html). + +Minted NFTs are listed on a `NFTokenPage`. There is a reserve requirement of 2 XRP for every `NFTokenPage` on your account. See [NFT Reserve Requirements](nft-reserve-requirements.html). + +Each `NFTokenPage` holds 16-32 NFTs. Minting a large number of NFTs can tie up a great deal of your XRP. You can keep your XRP liquid by minting on demand (or _lazy minting_). See [Lazy minting](nftoken-batch-minting.html#mint-on-demand-lazy-minting) vs [Scripted minting](nftoken-batch-minting.html#scripted-minting). + + +### Setting up a wallet + +Set up a new wallet. See [Xumm](https://xumm.app/). + +When you set up your account, keep in mind that there is a base reserve requirement of 10 XRP. See [Reserves](reserves.html#base-reserve-and-owner-reserve). + +### Transferring NFTs + +You transfer NFTs by creating a sell offer or accepting a buy offer. See [Transfer NFTokens](transfer-nfts-using-javascript.html). + +You can sell your NFTs in an auction format. See [Running an NFT Auction](nftoken-auctions.html). + +You can act as a broker, connecting sellers with bidders, completing the transfer and keeping a percentage of the purchase price. See [Broker a NFToken sale](broker-an-nft-sale-using-javascript.html). + +#### Reserve requirements + +There are several XRP reserve requirements when you mint NFTs for sale. Each NFToken page requires a reserve of 2 XRP. A NFToken page can store 16-32 NFTs. + +Each `NFTokenOffer` object requires a reserve of 2 XRP. + +When you post the `NFTokenOffer` or sell the NFT, there are trivial transfer fees (roughly 6000 drops, or .006 XRP). When you are selling at a high volume, the trivial amounts can add up quickly, and need to be considered as part of your cost of doing business. + +See: + +1. [NFTokenOffer](nft-reserve-requirements.html#nftokenoffer-reserve) +2. NFToken page ([Owner reserve](nft-reserve-requirements.html#owner-reserve)) +3. Trivial [transfer fees](transfer-fees.html) + +#### Checkout + +The most straightforward payment for XRPL NFTs is XRP. For examples of selling and buying NFTs using XRP, see [Transfer NFTokens](transfer-nfts-using-javascript.html). + +For trade in other currencies, you can leverage the DEX to accept and convert issued currencies of all kinds. See [Trade in the Decentralized Exchange](trade-in-the-decentralized-exchange.html#trade-in-the-decentralized-exchange). + + + +## Indexing NFTs + +When listing NFTs for sale, it can be useful to use object metadata to organize them. You can use queries in the XRPL libraries, the Clio server, and extensions in the XRPL API and Bithomp libraries to sort and filter NFTs by creator, price, collection, rarity, and more. + +See: + +- [Clio setup](install-clio-on-ubuntu.html) +- [XRPL Data API](https://api.xrpldata.com/docs/static/index.html#/) +- [Bithomp](https://docs.bithomp.com/#nft-xls-20) + + + + +## NFT Caching + +NFTs that are created in the crypto space are expected to store metadata, including media, attributes, and so on. Currently most are stored on IPFS or Arweave to avoid centralization. + + + +Although IPFS / Arweave are great solutions to promote decentralization, fetching the metadata efficiently is a problem. Reaching IPFS / Arweave directly to fetch metadata is not fast enough for modern websites that require immediate responses from users that are scrolling through multiple pages of NFTs with high-quality media. Many NFT marketplaces on XRPL today are storing cached versions of the IPFS originals to have fast and reliable responsive websites, but this process is expensive and inefficient. + +Cloudflare, Infura, and many other providers are increasingly focusing on storing these decentralized files and retrieving them fast for users. + +See [NFT Caching](nftoken.html#retrieving-nftoken-data-and-metadata). + + + + diff --git a/content/use-cases/tokenization/nftoken-marketplace.md b/content/use-cases/tokenization/nftoken-marketplace.md new file mode 100644 index 0000000000..0b8e8a7e62 --- /dev/null +++ b/content/use-cases/tokenization/nftoken-marketplace.md @@ -0,0 +1,101 @@ +--- +html: nftoken-marketplace.html +parent: nft-mkt-overview.html +blurb: Creating an NFT Marketplace for buying and selling NFTs. +labels: + - Tokenization +--- +# NFT Marketplace + +_In my NFToken Marketplace, I want to use the XRPL to create a web presence where I can arrange transfer of a curated selection of NFTokens to consumers, with the benefit that I can build a brand and earn broker fees based on sales._ + +--- + +NFToken Marketplaces act as intermediaries between NFToken creators and collectors. As a marketplace curator, you seek out NFToken creators and assemble a collection of items to sell. Buyers come to your site to review your selections and post offers. You match the minimum prices set by the creators with the optimal offers from the buyers, complete the transaction, and collect a broker fee. + +## Creating an NFT Marketplace + +[![NFT Marketplace Flow](img/nft-mkt-marketplace.png "NFT Marketplace Flow")](img/nft-mkt-marketplace.png) + + +## Set up a rippled instance + +When you set up a serious marketplace site with high volume, it justifies the decision to set up your own XRP Ledger server instance. See [Install rippled](install-rippled.html). + + +### Setting up a wallet + +Set up a new wallet. See [Xumm](https://xumm.app/). + +Base reserve requirements See [Reserves](reserves.html#base-reserve-and-owner-reserve). + +Current wallet options on XRPL: This is a good opportunity for XRPL to highlight wallet providers in the ecosystem + + +### Transferring NFTs + +You transfer NFTs by creating a sell offer or accepting a buy offer. See [Transfer NFTokens](transfer-nfts-using-javascript.html). + +You can sell your NFTs in an auction format. See [Running an NFT Auction](nftoken-auctions.html). + +You can act as a broker, connecting sellers with bidders, completing the transfer and keeping a percentage of the purchase price. See [Broker a NFToken sale](broker-an-nft-sale-using-javascript.html). + + +### Reserve requirements + +There are several XRP reserve requirements when you mint NFTs for sale. Each NFToken page requires a reserve of 2 XRP. A NFToken page can store 16-32 NFTs. + +Each `NFTokenOffer` object requires a reserve of 2 XRP. + +When you post the `NFTokenOffer` or sell the NFT, there are trivial transfer fees (roughly 6000 drops, or .006 XRP). When you are selling at a high volume, the trivial amounts can add up quickly, and need to be considered as part of your cost of doing business. + +See: + +1. [NFTokenOffer](nft-reserve-requirements.html#nftokenoffer-reserve) +2. NFToken page ([Owner reserve](nft-reserve-requirements.html#owner-reserve)) +3. Trivial [transfer fees](transfer-fees.html) + + +You can learn more about brokered sales in the topic [Trading Tokens on the XRP Ledger](non-fungible-token-transfers.html). + +Learn more about token transfer fees in the topic [Transfer Fees](transfer-fees.html). + +You can get started building a brokered sales marketplace by following the steps in the [Broker a NFToken Sale](broker-an-nft-sale-using-javascript.html). + +### Checkout + +The most straightforward payment for XRPL NFTs is XRP. For examples of selling and buying NFTs using XRP, see [Transfer NFTokens](transfer-nfts-using-javascript.html). + +For trade in other currencies, you can leverage the DEX to accept and convert issued currencies of all kinds. See [Trade in the Decentralized Exchange](trade-in-the-decentralized-exchange.html#trade-in-the-decentralized-exchange). + +## Indexing NFTs + +When listing NFTs for sale, it can be useful to use object metadata to organize them. You can use queries in the XRPL libraries, the Clio server, and extensions in the XRPL API and Bithomp libraries to sort and filter NFTs by creator, price, collection, rarity, and more. + +See: + +- [Clio setup](install-clio-on-ubuntu.html) +- [XRPL Data API](https://api.xrpldata.com/docs/static/index.html#/) +- [Bithomp](https://docs.bithomp.com/#nft-xls-20) + + + diff --git a/content/tutorials/xrp-ledger-businesses/become-an-xrp-ledger-gateway.md b/content/use-cases/tokenization/stablecoin-issuer.md similarity index 61% rename from content/tutorials/xrp-ledger-businesses/become-an-xrp-ledger-gateway.md rename to content/use-cases/tokenization/stablecoin-issuer.md index 4bccebd7f6..d6a80e6903 100644 --- a/content/tutorials/xrp-ledger-businesses/become-an-xrp-ledger-gateway.md +++ b/content/use-cases/tokenization/stablecoin-issuer.md @@ -1,89 +1,77 @@ --- -html: become-an-xrp-ledger-gateway.html -parent: xrp-ledger-businesses.html -blurb: Stablecoin issuers link tokens in the XRP Ledger to assets in the outside world. +html: stablecoin-issuer.html +parent: tokenization.html +blurb: Issue your own stablecoin, based on assets of equal value outside of the XRP Ledger. labels: - Tokens - - Security --- -# Become a Stablecoin Issuer +# Stablecoin Issuer -**Stablecoin issuers** are businesses that link [tokens](tokens.html) in the XRP Ledger to assets in the outside world. An existing online financial institution can expand to issue a stablecoin in the the XRP Ledger. By doing so, the business can gain several advantages: +**Stablecoin** are [tokens](tokens.html) that are backed by assets in the outside world. Stablecoins allow users to transact in familiar currencies, and provide a convenient way to get funds into and out of the blockchain. In exchange for providing these services, stablecoin issuers can earn revenue in various ways, such as fees on withdrawals or transfers of the stablecoin. -* By enabling its customers to send and receive value in the XRP Ledger, the business increases its value proposition to customers. -* By accepting payments from the XRP Ledger, the business increases the number of ways that customers can fund accounts at its business, even internationally. -* The business can use XRP Ledger-related services as a new source of revenue. - -This guide explains the concepts and steps necessary to issue a stablecoin in the XRP Ledger, using a fictional online currency exchange named "ACME" and its customers as examples. +While anyone can issue a token with any currency code in the XRP Ledger, stablecoins' value comes from the promise that they can be redeemed for the corresponding assets. Issuing a stablecoin may also involve regulatory obligations, which vary by jurisdiction. For these reasons, issuing a stablecoin generally requires a reputable business. **Note:** Stablecoin issuers on the XRP Ledger were formerly called "gateways". +This article provides information you should know before issuing a stablecoin, summarizes the choices involved in setting up a stablecoin issuer, and provides resources for implementing the technical integration with the XRP Ledger. -## Token Issuers Explained -There are several related business models that provide a way for money and other forms of value to move in and out of the XRP Ledger. Most of these business models fall into one of the following categories: - -* A **Token Issuer** receives money (or other assets of value) outside of the XRP Ledger, and issues tokens in the XRP Ledger representing those assets. This provides a direct way for customers to get money in and out of the XRP Ledger. All currencies in the XRP Ledger, except for XRP, are tokens tied to a specific issuer. -* A **Private Exchange** holds XRP and lets its customers buy and sell that XRP in its own system. Most cryptocurrencies rely on private exchanges to provide a market for the cryptocurrency, but the XRP Ledger has [a currency exchange built into the protocol itself](decentralized-exchange.html). -* **Merchants** accept payment within the XRP Ledger in exchange for goods and services in the outside world. - -This guide focuses on running a **token issuer**. +## Background Information ### Trust Lines and Tokens All assets in the XRP Ledger, except for the native cryptocurrency XRP, are represented as _tokens_, which are tied to a specific issuer who defines their meaning. The XRP Ledger has a system of directional accounting relationships, called _trust lines_, to make sure that users can only hold and receive the tokens they want. -Tokens issued that are backed by balances in some outside system are sometimes called _stablecoins_. This includes tokens backed by fiat currency in a bank account, by cryptocurrencies on another blockchain, or other types of assets and forms of value. The term "stablecoin" comes from the idea that the exchange rate between the token and the asset it represents should be "stable" at 1:1 (minus fees). +Tokens that are backed by funds in some outside system are sometimes called _stablecoins_. This includes tokens backed by fiat currency in a bank account, by cryptocurrencies on another blockchain, or other types of assets and forms of value. The term "stablecoin" comes from the idea that the exchange rate between the token and the asset it represents should be "stable" at 1:1 (minus fees). -Main article: [Trust Lines and Issuing](trust-lines-and-issuing.html). +For more information, see [Trust Lines and Issuing](trust-lines-and-issuing.html). ### XRP -[**XRP**](xrp.html) is the native cryptocurrency of the XRP Ledger. XRP can be sent directly from any XRP Ledger address to any other. This helps make XRP a convenient bridge currency. For more information on XRP, see the [XRP Overview](xrp-overview.html). +**XRP** is the native cryptocurrency of the XRP Ledger. XRP can be sent directly from any XRP Ledger address to any other. This helps make XRP a convenient bridge currency. -Token issuers do not need to accumulate or exchange XRP. They must only hold a small balance of XRP to meet the [reserve requirements](reserves.html) and pay the [cost of sending transactions](transaction-cost.html) through the network. The XRP equivalent of $10 USD should be enough for at least one year of transaction costs for a busy issuer. +Token issuers do not need to accumulate or exchange XRP. They must only hold a small balance of XRP to meet the reserve requirement and pay the cost of sending transactions through the network. The XRP equivalent of $10 USD should be enough for at least one year of transaction costs for a busy issuer. -Main article: [XRP](xrp.html). +For more information, see [What is XRP?](what-is-xrp.html), [Reserves](reserves.html), and [Transaction Cost](transaction-cost.html) -### Liquidity and Currency Exchange +### Liquidity and Trading -The XRP Ledger contains a [decentralized asset exchange](decentralized-exchange.html), where any user can place and fulfill bids to exchange XRP and tokens in any combination. [Cross-currency payments](cross-currency-payments.html) use the decentralized exchange to exchange currencies atomically when the transaction is executed. In this way, users who trade in the decentralized exchange provide the liquidity that makes cross-currency payments possible. +The XRP Ledger contains a decentralized exchange, where any user can place and fulfill bids to exchange XRP and tokens in any combination. The decentralized exchange also provides the liquidity that makes atomic [cross-currency payments](cross-currency-payments.html) possible. -Traders who hold an issuer's tokens can provide liquidity to other popular currencies, without the issuer needing to float a large reserve in various destination currencies. The issuer also does not need to take on the risk of holding a variety of different tokens and assets. However, an issuer _may_ still want to provide liquidity to XRP or other popular tokens at a baseline rate, especially when their token is new to the exchange. If you do provide liquidity, **use a different address for trading than your issuing address.** - -Liquidity providers can use the [HTTP / WebSocket APIs](http-websocket-apis.html), [client libraries](client-libraries.html), or another application to access the distributed exchange. It may also help client applications to display information about your business if you provide an [`xrp-ledger.toml` file](xrp-ledger-toml.html). +Stablecoin issuers aren't required to use the decentralized exchange directly, but all tokens are automatically available for trading. If a token is widely used, users should naturally trade it among themselves, creating liquidity to other popular assets. An issuer _may_ want to provide liquidity to XRP or other popular tokens at a baseline rate, especially when their token is new. If a stablecoin issuer does provide liquidity, a best practice is to **use different addresses for trading and for issuing.** +For more information on the decentralized exchange, see [Decentralized Exchange](decentralized-exchange.html). ## Suggested Business Practices The value of a stablecoin issuer's tokens in the XRP Ledger comes directly from the trust that customers can redeem the tokens when needed. To reduce the risk of business interruptions, you should follow these best practices: -* Use separate [Issuing and Operational Addresses](issuing-and-operational-addresses.html) to limit your risk profile on the network. +* Use separate [Issuing and Operational Addresses](account-types.html) to limit your risk profile on the network. * Follow anti-money-laundering regulations for your jurisdiction, such as the [Bank Secrecy Act](http://en.wikipedia.org/wiki/Bank_Secrecy_Act). This usually includes requirements to collect ["Know-Your-Customer" (KYC) information](http://en.wikipedia.org/wiki/Know_your_customer). * Complete the XRP Ledger Foundation's [token issuer self-assessment](https://foundation.xrpl.org/token-assessment-framework/). * Publicize all your policies and fees. +* Provide an [`xrp-ledger.toml` file](xrp-ledger-toml.html) with domain verification so client applications can display relevant details about you. ### Hot and Cold Wallets {% include '_snippets/issuing-and-operational-addresses-intro.md' %} - -Main article: [Issuing and Operational Addresses](issuing-and-operational-addresses.html) +Main article: [Issuing and Operational Addresses](account-types.html) ## Fees and Revenue Sources -There are several ways in which an issuer can seek to profit from XRP Ledger integration. These can include: +A stablecoin issuer can earn revenue in a variety of ways, including: -* Withdrawal and Deposit fees. Issuers typically charge a small fee (such as 1%) for the service of adding or removing money from the XRP Ledger. You have the power to determine the rate you credit people when they move money onto and off of the XRP Ledger through your tokens. -* Transfer fees. You can set a percentage fee to charge automatically when customers send each other tokens that you issued. This amount is debited from the XRP Ledger, decreasing your obligation each time your tokens change hands. See [Transfer Fees](#transfer-fees) for details. -* Indirect revenue from value added. XRP Ledger integration can provide valuable functionality for your customers that distinguishes your business from your competitors. -* Interest on XRP Ledger-backed funds. You can keep the collateral for the funds you issue in XRP Ledger in a bank account that earns interest. Make sure you can always access enough funds to service customer withdrawals. -* [Financial Exchange](#liquidity-and-currency-exchange). You also make offers to buy and sell your tokens in the XRP Ledger's decentralized exchange, providing liquidity to cross-currency payments and possibly making a profit. (As with all financial exchange, profits are not guaranteed.) +- Withdrawal or Deposit fees. The issuer can charge a small fee (such as 1%) for the service of moving money into or out of the XRP Ledger. This fee isn't assessed on the XRP Ledger, but in the issuer's own systems when deciding how much to issue or credit users. +- Transfer fees. The issuer can set a percentage fee to charge when users transfer the stablecoin within the XRP Ledger. This amount is debited from the XRP Ledger whenever users transact, decreasing the total obligation the stablecoin issuer owes to its users in the ledger without decreasing the amount of assets the issuer holds outside of the ledger. +- Indirect revenue from value added. Stablecoins provide convenient functionality that can ease the adoption of other, adjacent services. +- Interest on collateral. The issuer can hold the assets backing the stablecoin in an interest-earning account. Of course, they must make sure that they can always access enough funds to serve customer withdrawals. +- Financial exchange. The business can buy and sell its own stablecoins in the decentralized exchange, providing liquidity to cross-currency payments and possibly making a profit. (As with all financial exchange, profits are not guaranteed.) ### Choosing Fee Rates @@ -135,7 +123,9 @@ See also: To prevent illicit funds from passing through their systems, financial institutions must be able to determine within reason if the source of a customer’s funds is linked to criminal activity. -Determining the exact source of funds for every customer may not be administratively feasible. As a result, some regulatory authorities may not provide specific regulation or guidance for all accounts. In specific cases, however, authorities may require financial institutions to identify and report the source of funds. Guidance by the FATF recommends that where the risks of money laundering or terrorist financing are higher (commonly referred to as a “risk-based approach”), financial institutions conduct enhanced due diligence, including but not limited to determining the customer’s source of funds. +Determining the exact source of funds for every customer may not be administratively feasible. As a result, some regulatory authorities may not provide specific regulation or guidance for all accounts. In specific cases, however, authorities may require financial institutions to identify and report the source of funds. Guidance by the FATF recommends that where the risks of money laundering or terrorist financing are higher (commonly referred to as a “risk-based approach”), financial institutions conduct enhanced due diligence, including but not limited to determining the customer’s source of funds. + + ### Suspicious Activity Reporting @@ -212,9 +202,11 @@ See also: # XRP Ledger Integration +This document uses the example of a fictional cryptocurrency exchange called ACME Exchange which decides to issue an EUR stablecoin on the XRP Ledger, to illustrate the overall process and flow of funds for a stablecoin. + ## Before Integration -Our example exchange, ACME, already accepts withdrawals and deposits from customers using some existing system, and uses its own system of record to track how much balance each user has with the exchange. Such a system can be modeled with a balance sheet and tracking how much currency each user has with ACME. +ACME, as a cryptocurrency exchange, already accepts withdrawals and deposits from customers using some system (such as an app or website). ACME has a _system of record_ to track how much each user holds with the exchange in each of several types of assets. Such a system can be modeled with a simple balance sheet, although in practice it probably involves databases, application servers, and various other infrastructure to ensure its reliability, information security, and so on. In the following diagram, ACME Exchange starts with €5 on hand, including €1 that belongs to Bob, €2 that belongs to Charlie, and an additional €2 of equity that belongs to ACME itself. Alice deposits €5, so ACME adds her to its balance sheet and ends up with €10. @@ -229,9 +221,7 @@ In the following diagram, ACME Exchange starts with €5 on hand, including €1 ## Sending into the XRP Ledger -XRP Ledger payments can automatically bridge between currencies, but an issuer normally only sends single-currency payments that go directly to customers. This means debiting a customer's current balance in your system, and then sending the equivalent amount of tokens in the XRP Ledger to the customer's XRP Ledger address. - -An example flow for a payment into the XRP Ledger: +Sending money _into_ the XRP Ledger involves issuing new stablecoins for an amount that ACME holds on behalf of one of its users. An example flow might look like this: 1. Alice asks to send €3 of her ACME balance into the XRP Ledger. 2. In its system of record, ACME debits Alice's balance €3. @@ -239,7 +229,7 @@ An example flow for a payment into the XRP Ledger: **Assumptions:** -* Alice already has an address in the XRP Ledger separate from her ACME account. Alice manages her XRP Ledger address using a third-party client application. +* Alice already has an address in the XRP Ledger separate from her ACME account. Alice manages her XRP Ledger address using a third-party client application (wallet). ![Diagram: ACME issues 3 EUR.ACME to Alice on the XRP Ledger](img/e2g-02.png) @@ -247,25 +237,24 @@ An example flow for a payment into the XRP Ledger: {{ include_svg("img/gateway-to-xrpl.svg", "Diagram: ACME issues 3 EUR.ACME to Alice on the XRP Ledger") }} #}--> - +After this, Alice can send or trade her EUR.ACME to other users in the XRP Ledger at her discretion. At any time, ACME can query the XRP Ledger to see who currently holds its tokens. ### Requirements for Sending to XRP Ledger There are several prerequisites that ACME must meet for this to happen: -- ACME sets aside money that is issued in the XRP Ledger. ACME can query the XRP Ledger to see who holds its tokens at any time. There are several ways ACME may do this: +- ACME sets aside the funds that back its stablecoin. There are several ways ACME may do this: - ACME may create a XRP Ledger collateral account in ACME's system of record. - ACME can store the funds allocated to the XRP Ledger in a separate bank account. - - If ACME is a cryptocurrency exchange, ACME can create a separate wallet to hold the funds allocated to the XRP Ledger, as publicly-verifiable proof to customers that the issuer is solvent. -- ACME should control two separate XRP Ledger addresses. See [Issuing and Operational Addresses](issuing-and-operational-addresses.html) for details. - - ACME must enable the [Default Ripple Flag](#default-ripple) on its issuing address for customers to send and receive its tokens. + - If the stablecoin is backed by cryptocurrency, ACME can create a separate wallet to hold the funds allocated to the XRP Ledger, as publicly-verifiable proof of its reserves. +- ACME should control two separate XRP Ledger addresses. See [Issuing and Operational Addresses](account-types.html) for details. + - ACME must enable the Default Ripple flag on its issuing address for customers to send and receive its tokens. - Alice must create an accounting relationship (trust line) from her XRP Ledger address to ACME's issuing address. She can do this from any XRP Ledger client application as long as she knows ACME's issuing address. - ACME should publicize its issuing address on its website where customers can find it. It can also use an [`xrp-ledger.toml` file](xrp-ledger-toml.html) to publish the issuing address to automated systems. -- ACME must create a user interface for Alice to send funds from ACME into the XRP Ledger. + - Alternatively, instead of sending a Payment, ACME can write Alice as a Check in the XRP Ledger. This does not move any money right away, but creates both the trust line and the tokens together when Alice cashes the Check. +- ACME must create a user interface for Alice to request for her funds from ACME to be sent into the XRP Ledger. - ACME needs to know Alice's XRP Ledger address. ACME can have Alice input her XRP Ledger address as part of the interface, or ACME can require Alice to input and verify her XRP Ledger address in advance. -See [Sending Payments to Customers](#sending-payments-to-customers) for an example of how to send payments into the XRP Ledger. - ## Sending from XRP Ledger @@ -275,34 +264,36 @@ An example flow of a payment out of the XRP Ledger: 1. Bob sends an XRP Ledger transaction of €1 to ACME's issuing address. 2. In ACME's system of record, ACME credits Bob's balance €1. +3. Later, Bob can use ACME's own interface to withdraw the money to a separate account, such as requesting a bank deposit over the SEPA system (Europe) or ACH (United States), receiving a payment on another blockchain, or something else. + +XRP Ledger Payments going to an issuer can be single-currency or cross-currency payments, but the amount the issuer receives is typically denominated in the stablecoin it issued. -Payments going from the XRP Ledger to an issuer can be single-currency or cross-currency payments. An issuing address can only receive payments in XRP or in tokens that it previously issued. ### Requirements for Receiving from XRP Ledger -In addition to the [requirements for sending into the XRP Ledger](#requirements-for-sending-to-xrp-ledger), there are several prerequisites that ACME must meet to process payments coming from the XRP Ledger: +In addition to the requirements for sending into the XRP Ledger, there are several prerequisites that ACME must meet to process payments coming from the XRP Ledger: - ACME must monitor its XRP Ledger addresses for incoming payments. - ACME must know which user to credit in its system of record for the incoming payments. - - We recommend that ACME should [bounce any unrecognized incoming payments](#bouncing-payments) back to their sender. - - Typically, the preferred method of recognizing incoming payments is through [destination tags](#source-and-destination-tags). + - ACME should bounce unrecognized incoming payments back to their sender. + - Typically, the preferred method of recognizing incoming payments is through [destination tags](source-and-destination-tags.html). ## Precautions -Processing payments to and from the XRP Ledger naturally comes with some risks, so an issuer should be sure to take care in implementing these processes. We recommend the following precautions: +Processing payments to and from the XRP Ledger naturally comes with some risks, so an issuer should be sure to take care in implementing these processes. As a stablecoin issuer, you should take the following precautions: -- Protect yourself against reversible deposits. XRP Ledger payments are irreversible, but many electronic money systems like credit cards or PayPal are not. Scammers can abuse this to take their fiat money back by canceling a deposit after receiving tokens in the XRP Ledger. -- When sending into the XRP Ledger, specify the issuing address as the issuer of the currency. Otherwise, you might accidentally use paths that deliver the same currency issued by other addresses. -- Before sending a payment into the XRP Ledger, double check the cost of the payment. A payment from your operational address to a customer should not cost more than the destination amount plus any [transfer fee](#transfer-fees) you have set. +- Protect yourself against reversible deposits. XRP Ledger payments are irreversible, but many digital payments are not. Scammers can abuse this to take their fiat money back by canceling a deposit after receiving tokens in the XRP Ledger. +- When sending into the XRP Ledger, always specify your issuing address as the issuer of the token. Otherwise, you might accidentally use paths that deliver the same currency issued by other addresses. +- Before sending a payment into the XRP Ledger, double check the cost of the payment. A payment from your operational address to a customer should not cost more than the destination amount plus any transfer fee you have set. - Before processing a payment out of the XRP Ledger, make sure you know the customer's identity. This makes it harder for anonymous attackers to scam you. Most anti-money-laundering regulations require this anyway. This is especially important because the users sending money from the XRP Ledger could be different than the ones that initially received the money in the XRP Ledger. - Follow the guidelines for [reliable transaction submission](#reliable-transaction-submission) when sending XRP Ledger transactions. - [Robustly monitor for incoming payments](#robustly-monitoring-for-payments), and read the correct amount. Don't mistakenly credit someone the full amount if they only sent a [partial payment](partial-payments.html). - Track your obligations and balances within the XRP Ledger, and compare with the assets in your collateral account. If they do not match up, stop processing withdrawals and deposits until you resolve the discrepancy. - Avoid ambiguous situations. We recommend the following: - - Enable the [Disallow XRP flag](#disallow-xrp) for the issuing address and all operational addresses, so customers do not accidentally send you XRP. (Private exchanges should *not* set this flag, since they trade XRP normally.) + - Enable the `Disallow XRP` flag for the issuing address and all operational addresses, so customers do not accidentally send you XRP. (Private exchanges should *not* set this flag, since they trade XRP normally.) - Enable the [`RequireDest` flag](require-destination-tags.html) for the issuing address and all operational addresses, so customers do not accidentally send a payment without the destination tag to indicate who should be credited. - - Enable the [`RequireAuth` flag](#require-auth) on all operational addresses so they cannot issue currency by accident. + - Enable the `RequireAuth` flag on all operational addresses so they cannot issue tokens by accident. - Monitor for suspicious or abusive behavior. For example, a user could repeatedly send funds into and out of the XRP Ledger, as a denial of service attack that effectively empties an operational address's balance. Suspend customers whose addresses are involved in suspicious behavior by not processing their XRP Ledger payments. ## Trading on the XRP Ledger @@ -364,47 +355,101 @@ For your own security as well as the stability of the network, each XRP Ledger b There are several interfaces you can use to connect to the XRP Ledger, depending on your needs and your existing software: -* [HTTP / WebSocket APIs](http-websocket-apis.html) can be used as a low-level interface to all core XRP Ledger functionality. -* [Client Libraries](client-libraries.html) are available in several programming languages to provide convenient utilities for accessing the XRP Ledger. -* Other tools such as [xApps](https://xumm.readme.io/docs/xapps) are also available. +- [HTTP / WebSocket APIs](http-websocket-apis.html) can be used as a low-level interface to all core XRP Ledger functionality. +- [Client Libraries](client-libraries.html) are available in several programming languages to provide convenient utilities for accessing the XRP Ledger. +- Other tools such as [xApps](https://xumm.readme.io/docs/xapps) are also available. +- Third party wallet applications may also be useful, especially for humans in charge of standby addresses. ## Tool Security -Any time you submit an XRP Ledger transaction, it must be signed using your secret key. The secret key gives full control over your XRP Ledger address. **Never** send your secret key to a server run by someone else. Either use your own `rippled` server, or sign the transactions locally before sending them to a `rippled` server. +Any time you submit an XRP Ledger transaction, it must be signed using your secret key. The secret key gives full control over your XRP Ledger address. **Never** send your secret key to a server run by someone else. Either use your own server, or sign the transactions locally using a client library. -The examples in this document show API methods that include a secret key. This is only safe if you control `rippled` server yourself, *and* you connect to it over a connection that is secure from outside listeners. For instructions and examples of other secure configurations, see [Set Up Secure Signing](set-up-secure-signing.html). +For instructions and examples of secure configurations, see [Set Up Secure Signing](secure-signing.html). + +## Issuer Setup + +There are some settings you must configure on your XRP Ledger account before you start issuing tokens. For examples of how to configure these settings, see the [Issue a Fungible Token tutorial](issue-a-fungible-token.html). + +Settings you may want to configure include: + +| Setting | Notes | +|---------|-------| +| Default Ripple | Issuers **must** enable this field. | +| Deposit Authorization | Block all incoming payments from users you haven't explicitly approved. | +| Require Auth | Restrict your tokens to being held by users you've explicitly approved. | +| Tick Size | Round off exchange rates in the decentralized exchange to facilitate faster price discovery. | +| Transfer Fee | Charge a percentage fee when users send your token to each other. | -## Default Ripple +### Default Ripple The Default Ripple flag controls whether the balances on a trust line are [allowed to ripple](rippling.html) by default. Rippling is what allows customers to send and trade tokens among themselves, so an issuer MUST allow rippling on all the trust lines to its issuing address. Before asking customers to create trust lines to its issuing address, an issuer should enable the Default Ripple flag on that address. Otherwise, the issuer must individually disable the No Ripple flag for each trust line that other addresses have created. -For examples of how to configure this setting, see the [Issue a Fungible Token tutorial](issue-a-fungible-token.html). + +### Deposit Authorization + +The Deposit Authorization setting blocks all incoming payments to your account, unless either: + +- You have previously preauthorized the sender. +- You send a transaction to receive the funds. For example, you could finish an Escrow that was initiated by a stranger. + +Deposit Authorization is most useful for blocking unwanted XRP payments, because you already can't receive tokens unless you've created a trust line to their issuer. However, as a stablecoin issuer, you need to be able to receive payments from users in order for them to redeem the stablecoin for its off-ledger value; you can preauthorize your customers but doing so requires storing an object in the ledger for each custom address, increasing your reserve requirement substantially. + +Therefore, Deposit Authorization is not recommended for stablecoin issuers unless you need it to meet regulatory requirements about receiving money from unknown or sanctioned entities. + +For more information, see [Deposit Authorization](depositauth.html). -## Disallow XRP +### Disallow XRP -The Disallow XRP setting is designed to discourage XRP Ledger users from sending XRP to an address by accident. This reduces the costs and effort of bouncing undesired payments from addresses that aren't intended to receive and hold XRP. The Disallow XRP flag is not strictly enforced, because doing so could allow addresses to become permanently unusable if they run out of XRP. Client applications should honor the Disallow XRP flag by default. +The Disallow XRP setting is designed to discourage XRP Ledger users from sending XRP to an address by accident. This reduces the costs and effort of bouncing undesired payments from addresses that aren't intended to receive and hold XRP. The Disallow XRP flag is not enforced at the protocol level, because doing so could allow addresses to become permanently unusable if they run out of XRP. Client applications should honor the Disallow XRP flag by default, but may allow users to ignore it. -You should enable the Disallow XRP flag on your issuing and operational addresses unless you also use those addresses for XRP transactions. If you use the same addresses for withdrawals or deposits of XRP, you should leave this flag disabled. - -For examples of how to configure this setting, see the [Issue a Fungible Token tutorial](issue-a-fungible-token.html). +The Disallow XRP flag is optional, but if you don't intend to receive XRP from customers you may want to enable it on your issuing address and all your operational addresses. -## Require Auth +### Require Auth -The Require Auth setting prevents all counterparties from holding balances issued by an address unless the address has specifically approved an accounting relationship with that counterparty. For more information, see [Authorized Trust Lines](authorized-trust-lines.html). +The Require Auth setting blocks users from holding the tokens you issue unless you explicitly approve their trust lines first. You can use this setting to meet regulatory requirements if it matters who holds your tokens within the XRP Ledger. However, this can reduce the utility of your tokens since your approval becomes a bottleneck for users to use them. + +Also, you must use your issuing address each time you authorize a trust line; if you must authorize a lot of trust lines, this can undermine the security of your issuing address because you have to use it so often. (If you only need to use the issuing address sparingly, you can put greater protections on its secret keys. The more often you use it, the more of a burden those protections become.) + +For more information, see [Authorized Trust Lines](authorized-trust-lines.html). -### Authorizing Trust Lines +### Tick Size -If you are using the [Authorized Trust Lines](authorized-trust-lines.html) feature, customers cannot hold balances you issue unless you first authorize their accounting relationships to you in the XRP Ledger. +The Tick Size setting controls how many decimal places are used when calculating exchange rates in the [Decentralized Exchange](decentralized-exchange.html). A higher Tick Size means more precision and less rounding in the amounts of various trades. Too much precision can be inconvenient because trades are ranked primarily based on exchange rate, so a trader can offer a minuscule amount more to the top of the list. A smaller Tick Size works similar to the minimum bid increment at an auction, saving everyone the time and effort of gradually bidding up a price by irrelevantly small amounts. However, a smaller Tick Size results in more rounding, which can increase the costs of trading, and sometimes has surprising results because two Offers that seemed like an exact match before rounding no longer match after rounding. -To authorize an accounting relationship, 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` flag](trustset.html#trustset-flags) for the transaction. +The Tick Size is an account-level setting and applies to all tokens issued by the same address. +Tick Size only controls the precision of _exchange rates_, not the precision of the token itself. Users can send and hold very large or very small amounts regardless of the Tick Size set by the token's issuer. + +For more information, see [Tick Size](ticksize.html). + + +### Transfer Fees + +A transfer fee setting charges users a percentage fee when sending your tokens to each other. The transfer fee does not apply when issuing tokens or redeeming them directly with the issuing address. (It _does_ apply when users send payments to your hot wallet.) If you issue multiple tokens from the same address, the same transfer fee applies to all of them. + +When users send a token with a transfer fee, the amount of the transfer fee is debited from the sending side in addition to the destination amount, but only the destination amount is credited to the recipient. The amount of the fee "vanishes" from the XRP Ledger. As a stablecoin issuer, this means that you gain that much equity in your reserves outside of the XRP Ledger—or, in other words, the amount you need to keep as collateral decreases each time users pay a transfer fee. + +At a protocol level, the transfer fee is defined by the `TransferRate` account setting, which is an integer from 1 billion to 2 billion. + +For more information, see [Transfer Fees](transfer-fees.html). + + +### Transfer Fees with Operational and Standby Addresses + +All XRP Ledger addresses, including operational and standby addresses, are subject to the issuer's transfer fees when sending tokens. If you set a nonzero transfer fee, then you must send extra (to pay the transfer fee) when making payments from your operational address or standby address. In other words, your addresses must pay back a little of the balance your issuing address created, each time you make a payment. + +Set the [`SendMax` transaction parameter][Payment] higher than the destination `Amount` parameter by a percentage based on the `TransferRate` setting. + +**Note:** Transfer fees do not apply when sending tokens directly from or to the issuing address. The issuing address must always accept its tokens at face value in the XRP Ledger. This means that customers don't have to pay the transfer fee if they send payments to the issuing address directly, but they do when sending to an operational address. If you accept payments at both addresses, you may want to adjust the amount you credit customers in your system of record when customers send payments to the operational address, to compensate for the transfer fee the customer pays. + +For example: If ACME sets a transfer fee of 1%, an XRP Ledger payment to deliver 5 EUR.ACME from a customer address to ACME's issuing address would cost exactly 5 EUR.ACME. However, the customer would need to send 5.05 EUR.ACME to deliver 5 EUR.ACME to ACME's operational address. When ACME credits customers for payments to ACME's operational address, ACME credits the customer for the amount delivered to the operational address _and_ the transfer fee, giving the customer €5,05 in ACME's systems. ## Robustly Monitoring for Payments @@ -416,113 +461,31 @@ To robustly check for incoming payments, issuers should do the following: * Look out for [Partial Payments](partial-payments.html). Payments with the partial payment flag enabled can be considered "successful" if any non-zero amount is delivered, even minuscule amounts. * Check the transaction for a [`delivered_amount` field](partial-payments.html#the-delivered_amount-field). If present, that field indicates how much money *actually* got delivered to the `Destination` address. * In xrpl.js, you can use the [`xrpl.getBalanceChanges()` method](https://js.xrpl.org/modules.html#getBalanceChanges) to see how much each address received. In some cases, this can be divided into multiple parts on different trust lines. -* Some transactions change your balances without being payments directly to or from one of your addresses. For example, if ACME sets a nonzero [transfer fee](#transfer-fees), then ACME's issuing address's outstanding obligations decrease each time Bob and Charlie exchange ACME's tokens. See [Transfer Fees](#transfer-fees) for more information. +* Some transactions change your balances without being payments directly to or from one of your addresses. For example, if ACME sets a nonzero transfer fee, then ACME's issuing address's outstanding obligations decrease each time Bob and Charlie exchange ACME's tokens. To make things simpler for your customers, we recommend accepting payments to both your operational address and your issuing addresses. As an added precaution, we recommend comparing the balances of your issuing address with the collateral funds in your internal accounting system as of each new XRP Ledger ledger version. The issuing address's negative balances should match the assets you have allocated to XRP Ledger outside the network. If the two do not match up, then you should suspend processing payments into and out of the XRP Ledger until you have resolved the discrepancy. -* Use the [gateway_balances method][] to check your balances. -* If you have a [Transfer Fee](#transfer-fees) set, then your obligations within the XRP Ledger decrease slightly whenever other XRP Ledger addresses transfer your tokens among themselves. +* Use the `gateway_balances` method to check your balances. +* If you have a Transfer Fee set, then your obligations within the XRP Ledger decrease slightly whenever other XRP Ledger addresses transfer your tokens among themselves. For more details on how to read the details of incoming transactions, see [Look Up Transaction Results](look-up-transaction-results.html). -## Transfer Fees - -The `TransferRate` setting defines a fee to charge for transferring tokens from one XRP Ledger address to another. See [Transfer Fees](transfer-fees.html) for more information. - -For examples of how to configure this setting, see the [Issue a Fungible Token tutorial](issue-a-fungible-token.html). - - -### Transfer Fees with Operational and Standby Addresses - -All XRP Ledger addresses, including operational and standby addresses, are subject to the issuer's transfer fees when sending tokens. If you set a nonzero transfer fee, then you must send extra (to pay the transfer fee) when making payments from your operational address or standby address. In other words, your addresses must pay back a little of the balance your issuing address created, each time you make a payment. - -Set the [`SendMax` transaction parameter][Payment] higher than the destination `Amount` parameter by a percentage based on the `TransferRate` setting. - -**Note:** Transfer fees do not apply when sending tokens directly to the issuing address. The issuing address must always accept its tokens at face value in the XRP Ledger. This means that customers don't have to pay the transfer fee if they send payments to the issuing address directly, but they do when sending to an operational address. If you accept payments at both addresses, you may want to adjust the amount you credit customers in your system of record when customers send payments to the operational address, to compensate for the transfer fee the customer pays. - -For example: If ACME sets a transfer fee of 1%, an XRP Ledger payment to deliver 5 EUR.ACME from a customer address to ACME's issuing address would cost exactly 5 EUR.ACME. However, the customer would need to send 5.05 EUR.ACME to deliver 5 EUR.ACME to ACME's operational address. (The issuing address's total obligations in the XRP Ledger decrease by 0.05 EUR.ACME.) When ACME credits customers for payments to ACME's operational address, ACME credits the customer for the amount delivered to the operational address _and_ the transfer fee, giving the customer €5,05 in ACME's systems. - ## Sending Payments to Customers When you build an automated system to send payments into the XRP Ledger for your customers, you must make sure that it constructs payments carefully. Malicious actors are constantly trying to find ways to trick a system into paying them more money than it should. -One common pitfall is performing pathfinding before sending a payment to customers in the XRP Ledger. If you specify the issuers correctly, the [default paths](paths.html#default-paths) can deliver the currency as intended. +Generally, when sending stablecoins, you use a [Payment transaction][]. Some of the details are different depending on whether you are issuing tokens for the first time or transferring them from a hot wallet to a customer. Things to note include: -The following is an example of using a locally-hosted `rippled`'s [submit method][] to send a payment from the operational address `rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn` to the customer address `raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n`, sending and delivering funds issued by the issuing address `rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW`. +- When issuing new tokens from your issuing address, you should omit the `SendMax` field. Otherwise, malicious users can arrange their settings so that you issue the full `SendMax` amount instead of just the intended destination `Amount`. +- When sending tokens _from a hot wallet_, you must specify `SendMax` if you have a nonzero transfer fee. In this case, set the `SendMax` field to the amount specified in the `Amount` field plus the transfer fee. (You may want to round up slightly, in case the precision of your calculations doesn't exactly match the XRP Ledger's.) For example, if you send a transaction whose `Amount` field specifies 99.47 USD, and your transfer fee is 0.25%, you should set the `SendMax` field to 124.3375, or 124.34 USD if you round up. +- Omit the `Paths` field. This field is unnecessary when sending directly from the issuer, or from a hot wallet as long as the tokens being sent and the tokens being received have the same currency code and issuer—that is, they're the same stablecoin. The `Paths` field is intended for [Cross-Currency Payments](cross-currency-payments.html) and longer multi-hop (rippling) payments. If you naively perform pathfinding and attach the paths to your transaction, your payment may take a more expensive indirect route rather than failing if the direct path is not available; malicious users can even set this up to +- If you get a `tecPATH_DRY` result code, this usually indicates that either the customer doesn't have the necessary trust line set up already, or your issuer's rippling settings aren't configured correctly. -Request: - -``` -{ - "method": "submit", - "params": [{ - "secret": "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9", - "tx_json": { - "TransactionType": "Payment", - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "Destination": "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n", - "Amount": { - "currency": "USD", - "value": "0.13", - "issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW" - }, - "SendMax": { - "currency": "USD", - "value": "0.13065", - "issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW" - }, - "Fee": "10000" - } - }] -} -``` - -*Reminder: Don't send your secret to a server you do not control.* - -Response: - -``` -{ - "result": { - "engine_result": "tesSUCCESS", - "engine_result_code": 0, - "engine_result_message": "The transaction was applied. Only final in a validated ledger.", - "status": "success", - "tx_blob": "1200002280000000240000016561D4449E57D63540000000000000000000000000005553440000000000204288D2E47F8EF6C99BCC457966320D1240971168400000000000271069D444A4413C6628000000000000000000000000005553440000000000204288D2E47F8EF6C99BCC457966320D12409711732103AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB7446304402207B75D91DC0EEE613A94E05FD5D031568D8A763E99697FF6328745BD226DA7D4E022005C75D7215FD62CB8E46C55B29FCA8E3FC62FDC55DF300597089DD29863BD3CD81144B4E9C06F24296074F7BC48F92A97916C6DC5EA983143A4C02EA95AD6AC3BED92FA036E0BBFB712C030C", - "tx_json": { - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "Amount": { - "currency": "USD", - "issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", - "value": "0.13" - }, - "Destination": "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n", - "Fee": "10000", - "Flags": 2147483648, - "SendMax": { - "currency": "USD", - "issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", - "value": "0.13065" - }, - "Sequence": 357, - "SigningPubKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB", - "TransactionType": "Payment", - "TxnSignature": "304402207B75D91DC0EEE613A94E05FD5D031568D8A763E99697FF6328745BD226DA7D4E022005C75D7215FD62CB8E46C55B29FCA8E3FC62FDC55DF300597089DD29863BD3CD", - "hash": "37B4AA5C77A8EB889164CA012E6F064A46B6B7B51677003FC3617F614608C60B" - } - } -} -``` - -In particular, note the following features of the [Payment transaction][]: - -- No `Paths` field. The payment only succeeds if it can use a [default path](paths.html#default-paths), which is preferable. Using less direct paths can become much more expensive. -- The `issuer` of both the `SendMax` and the `Amount` is the issuing address. This ensures that the transaction sends and delivers tokens from the intended issuer, and not from another issuer using the same currency code. -- The `value` of the `SendMax` amount is slightly higher than the destination `Amount`, to compensate for the [transfer fee](#transfer-fees). In this case, the transfer fee is 0.5%, so the `SendMax` amount is exactly 1.005 times the destination `Amount`. +For a detailed tutorial on issuing a token on the XRP Ledger, whether a stablecoin or otherwise, see [Issue a Fungible Token](issue-a-fungible-token.html). ## Bouncing Payments @@ -569,7 +532,7 @@ You can publish information about what currencies you issue, and which XRP Ledge - [Source and Destination Tags](source-and-destination-tags.html) - **Tutorials:** - [Install `rippled`](install-rippled.html) - - [Set Up Secure Signing](set-up-secure-signing.html) + - [Set Up Secure Signing](secure-signing.html) - [Issue a Fungible Token](issue-a-fungible-token.html) - [Enable No Freeze](enable-no-freeze.html) - [Freeze a Trust Line](freeze-a-trust-line.html) diff --git a/dactyl-config.yml b/dactyl-config.yml index 25e1e155e4..54a705b753 100644 --- a/dactyl-config.yml +++ b/dactyl-config.yml @@ -30,6 +30,7 @@ default_filters: - css_tables - slug - copy_code_to_clipboard + - enforce_filenames callout_class: "devportal-callout" callout_types: @@ -141,13 +142,13 @@ targets: # Fix link from untranslated manifest.html: "rippled-server-modes.html#reporting-mode": "rippled-server-modes.html#レポートモード" # Fix links for untranslated get-started-using-python.html: - "xrpl-servers.html#reasons-to-run-your-own-server": "xrpl-servers.html#独自サーバーを運用する理由" + "networks-and-servers.html#reasons-to-run-your-own-server": "networks-and-servers.html#独自サーバーを運用する理由" "cryptographic-keys.html#key-components": "cryptographic-keys.html#キーの生成" "accounts.html#addresses": "accounts.html#アドレス" "cryptographic-keys.html#private-key": "cryptographic-keys.html#キーの生成" "basic-data-types.html#specifying-currency-amounts": "basic-data-types.html#通貨額の指定" "transaction-cost.html#current-transaction-cost": "transaction-cost.html#現在のトランザクションコスト" - "ledgers.html#open-closed-and-validated-ledgers": "ledgers.html#ツリーの形式" + #"ledgers.html#open-closed-and-validated-ledgers": "ledgers.html#ツリーの形式" "account_info.html#response-format": "account_info.html#応答フォーマット" # Fix link from untranslated rate-limiting.html: "get-started-using-http-websocket-apis.html#admin-access": "get-started-using-http-websocket-apis.html#管理者アクセス権限" @@ -183,7 +184,6 @@ targets: "transaction-cost.html#fee-levels": "transaction-cost.html#手数料レベル" "offers.html#lifecycle-of-an-offer": "offers.html#オファーのライフサイクル" "subscribe.html#order-book-streams": "subscribe.html#オーダーブックストリーム" - "transaction-basics.html#authorizing-transactions": "transaction-basics.html#トランザクションの識別" "ledger-header.html#close-flags": "ledger-header.html#closeフラグ" # Fix links from untranslated NFT API methods: "transaction-common-fields.html#flags-field": "transaction-common-fields.html#flagsフィールド" @@ -197,11 +197,26 @@ targets: # Fix link from untranslated health-check.html: "amendments.html#amendment-blocked-servers": "amendments.html#amendment-blocked" # Fix link from nft-reserve-requirements.html: - "reserves.html#base-reserve-and-owner-reserve": "reserves.html#基本準備金と所有者準備金" + #"reserves.html#base-reserve-and-owner-reserve": "reserves.html#基本準備金と所有者準備金" # Fix link from nft-reserve-requirements.html: - "reserves.html#going-below-the-reserve-requirement": "reserves.html#必要準備金を下回る" - link_re_subs: - # Fix link from untranslated account_nfts.html. + #"reserves.html#going-below-the-reserve-requirement": "reserves.html#必要準備金を下回る" + # Fix links from untranslated NFT use cases: + "nft-reserve-requirements.html#nftokenoffer-reserve": "nft-reserve-requirements.html#nftokenofferの準備金" + "nft-reserve-requirements.html#owner-reserve": "nft-reserve-requirements.html#所有者準備金" + "reserves.html#base-reserve-and-owner-reserve": "reserves.html#基本準備金と所有者準備金" + "nftoken.html#transferfee": "nftoken.html#送金手数料" + "nftoken-batch-minting.html#mint-on-demand-lazy-minting": "nftoken-batch-minting.html#オンデマンドmint-遅延minting" + "nftoken-batch-minting.html#scripted-minting": "nftoken-batch-minting.html#スクリプトminting" + "nftoken.html#retrieving-nftoken-data-and-metadata": "nftoken.html#nftoken-データとメタデータの取得" + # Fix link from untranslated Clio ledger method page: + "transactions.html#authorizing-transactions": "transactions.html#トランザクションの承認" + # Fix link from untranslated addresses.html: + "cryptographic-keys.html#key-derivation": "cryptographic-keys.html#鍵導出" + # Fix links from untranslated open-closed-validated-ledgers.html: + "consensus-principles-and-rules.html#simplifying-the-problem": "consensus-principles-and-rules.html#問題の単純化" + "consensus-structure.html#validation": "consensus-structure.html#検証" +link_re_subs: + # Fix link from untranslated account_nfts.html. # Because the replacement contains the original as a substring, # simple link replacement doesn't work nicely here "nftoken[.]html#nftokentaxon$": "nftoken.html#nftokentaxon分類群" @@ -293,20 +308,6 @@ pages: targets: - ja - - name: Ledger Explorer - html: https://livenet.xrpl.org/ - parent: xrp-ledger-overview.html - top_nav_grouping: XRP Ledger - targets: - - en - - - name: XRP Ledger エクスプローラ - html: https://livenet.xrpl.org/ - parent: xrp-ledger-overview.html - top_nav_grouping: XRP Ledger - targets: - - ja - - name: XRP template: page-xrp-overview.html.jinja html: xrp-overview.html @@ -348,7 +349,7 @@ pages: sidebar: disabled targets: - ja - + # Redirect old Carbon Calculator page to Impact - name: Carbon Calculator @@ -405,7 +406,7 @@ pages: template: page-docs.html.jinja sidebar: left_only top_nav_name: Docs - top_nav_shortcuts: + top_nav_shortcuts: #TODO: update shortcuts (en+ja) # Programming Languages - get-started-using-python.html - get-started-using-javascript.html @@ -417,7 +418,6 @@ pages: - xrp-testnet-faucet.html - run-rippled-as-a-validator.html - build-run-rippled-in-reporting-mode.html - - intro-to-consensus.html - public-api-methods.html top_nav_hero_image: top-nav-hero-docs popular_pages: # TODO: find a way so this isn't a partial duplicate of top_nav_shortcuts? @@ -426,7 +426,6 @@ pages: - xrp-testnet-faucet.html - run-rippled-as-a-validator.html - build-run-rippled-in-reporting-mode.html - - intro-to-consensus.html - public-api-methods.html blurb: Explore XRP Ledger documentation and everything you need to know to start building and integrating with the ledger. top_nav_blurb: Dive into XRP Ledger technology and start integrating. @@ -454,7 +453,6 @@ pages: - xrp-testnet-faucet.html - run-rippled-as-a-validator.html - build-run-rippled-in-reporting-mode.html - - intro-to-consensus.html - public-api-methods.html top_nav_hero_image: top-nav-hero-docs popular_pages: # TODO: find a way so this isn't a partial duplicate of top_nav_shortcuts? @@ -463,7 +461,6 @@ pages: - xrp-testnet-faucet.html - run-rippled-as-a-validator.html - build-run-rippled-in-reporting-mode.html - - intro-to-consensus.html - public-api-methods.html blurb: XRP Ledgerのドキュメントと、元帳を構築して統合するために必要なすべての情報を紹介します。 top_nav_blurb: XRP Ledgerの技術に飛び込んで、統合を始めましょう。 @@ -471,17 +468,192 @@ pages: - labels targets: - ja - + - name: Documentation Index longer_name: Full Documentation Index template: page-docs-index.html.jinja html: docs-index.html parent: docs.html sidebar: disabled + nav_omit: true + top_nav_omit: true targets: - en - ja +# Introduction ----------------------------------------------------------------- + + # TODO: these are placed under "Docs" in nav but the files are under "Docs/Concepts" + - name: Introduction + html: introduction.html + parent: docs.html + template: pagetype-category.html.jinja + blurb: This is a quick introduction to the principal features of the XRP Ledger (XRPL). Read this to get a high level understanding of the XRPL, then you can read more about areas of particular interest. The XRP Ledger is a blockchain that permanently records digital transactions of tokens between accounts. The sections below expand on the concepts introduced in that sentence. + top_nav_grouping: Article Types + targets: + - en + + - name: 基本 + html: introduction.html + parent: docs.html + template: pagetype-category.html.jinja + blurb: XRP Ledgerとは「何なのか」、「なぜなのか」を学びましょう。 + top_nav_grouping: Article Types + targets: + - ja + + - md: concepts/introduction/what-is-the-xrp-ledger.md + targets: + - en + - ja + + - md: concepts/introduction/what-is-xrp.md + targets: + - en + - ja + + # Redirect from old XRP page + - name: XRP + html: xrp.html + redirect_url: what-is-xrp.html + nav_omit: true + template: pagetype-redirect.html.jinja + targets: + - en + - ja + + - md: concepts/introduction/crypto-wallets.md + parent: introduction.html + targets: + - en + - ja + + - md: concepts/introduction/txn-and-requests.md + parent: introduction.html + targets: + - en + - ja + + - md: concepts/introduction/software-ecosystem.md + parent: introduction.html + targets: + - en + + # TODO: update based on EN changes + - md: concepts/introduction/software-ecosystem.ja.md + parent: introduction.html + targets: + - ja + +# Use Cases -------------------------------------------------------------------- + + - name: Use Cases + html: use-cases.html + parent: docs.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Browse the documentation based on practical use cases. + targets: + - en + - ja + + + - name: Payments + html: payments-uc.html + parent: use-cases.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Practical examples for using different types of payment on the XRP Ledger. + targets: + - en + - ja + + - md: use-cases/payments/peer-to-peer-payments-uc.md + parent: payments-uc.html + targets: + - en + - ja + + - md: use-cases/payments/restricting-deposits-uc.md + parent: payments-uc.html + targets: + - en + - ja + + - md: use-cases/payments/smart-contracts-uc.md + parent: payments-uc.html + targets: + - en + - ja + + - name: Tokenization + html: tokenization.html + parent: use-cases.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Work with a variety of tokens supported by the XRP Ledger. + targets: + - en + - ja + + - md: use-cases/tokenization/stablecoin-issuer.md + parent: tokenization.html + targets: + - en + - ja + + - md: use-cases/tokenization/nft-mkt-overview.md + parent: tokenization.html + targets: + - en + - ja + + # TODO: these files aren't nested under "NFT mkt overview" but they are in the nav + - md: use-cases/tokenization/nftoken-marketplace.md + parent: nft-mkt-overview.html + targets: + - en + - ja + + - md: use-cases/tokenization/authorized-minter.md + parent: nft-mkt-overview.html + targets: + - en + - ja + + - md: use-cases/tokenization/digital-artist.md + parent: nft-mkt-overview.html + targets: + - en + - ja + + - name: Decentralized Finance + html: defi-uc.html + parent: use-cases.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Enabling fast, secure financial transactions without a central authority. + targets: + - en + - ja + + - md: use-cases/defi/algorithmic-trading.md + parent: defi-uc.html + targets: + - en + - ja + + - md: use-cases/defi/list-xrp-as-an-exchange.md + parent: defi-uc.html + targets: + - en + + - md: use-cases/defi/list-xrp-as-an-exchange.ja.md + parent: defi-uc.html + targets: + - ja + + # Concepts --------------------------------------------------------------------- - name: Concepts @@ -502,174 +674,302 @@ pages: targets: - ja - - name: Introduction - html: introduction.html - parent: concepts.html - template: pagetype-category.html.jinja - blurb: Learn the "what" and "why" of the XRP Ledger. + # Networks and Servers ----------------------------------------------------------------- + + - md: concepts/networks-and-servers/networks-and-servers.md targets: - en - - name: 基本 - html: introduction.html - parent: concepts.html - template: pagetype-category.html.jinja - blurb: 「XRP Ledgerとは何なのか」、「なぜXRP Ledgerなのか」を学びましょう。 + - md: concepts/networks-and-servers/networks-and-servers.ja.md targets: - ja - # Supplanted by the new xrp-ledger-overview.html landing page. - # TODO: fully replace. https://github.com/XRPLF/xrpl-dev-portal/issues/1202 - # - md: concepts/introduction/xrp-ledger-overview.md - # targets: - # - en - # - # - md: concepts/introduction/xrp-ledger-overview.ja.md - # targets: - # - ja + # Redirect from the old xrpl-servers.html + - name: XRP Ledger Servers + html: xrpl-servers.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: networks-and-servers.html + targets: + - en + - ja - - md: concepts/introduction/intro-to-consensus.md + - md: concepts/networks-and-servers/rippled-server-modes.md targets: - en - - md: concepts/introduction/intro-to-consensus.ja.md + - md: concepts/networks-and-servers/rippled-server-modes.ja.md targets: - ja - - md: concepts/introduction/xrp.md + - md: concepts/networks-and-servers/clustering.md targets: - en - - md: concepts/introduction/xrp.ja.md + - md: concepts/networks-and-servers/clustering.ja.md targets: - ja - - md: concepts/introduction/software-ecosystem.md + - md: concepts/networks-and-servers/ledger-history/ledger-history.md targets: - en - - md: concepts/introduction/software-ecosystem.ja.md + - md: concepts/networks-and-servers/ledger-history/ledger-history.ja.md targets: - ja - - name: Payment System Basics - html: payment-system-basics.html - parent: concepts.html - template: pagetype-category.html.jinja - blurb: One of the primary purposes of the XRP Ledger is payment processing. Learn more about key concepts that will help you understand the XRP Ledger payment system. + - md: concepts/networks-and-servers/peer-protocol.md targets: - en - - name: 支払いシステムの基本 - html: payment-system-basics.html - parent: concepts.html - template: pagetype-category.html.jinja - blurb: XRP Ledgerの主な用途は決済処理です。主要なコンセプトを詳しく学んで、XRP Ledgerの決済システムの理解を深めましょう。 + - md: concepts/networks-and-servers/peer-protocol.ja.md targets: - ja - - md: concepts/payment-system-basics/accounts/accounts.md + - md: concepts/networks-and-servers/transaction-censorship-detection.md targets: - en - - md: concepts/payment-system-basics/accounts/accounts.ja.md + - md: concepts/networks-and-servers/transaction-censorship-detection.ja.md targets: - ja - - md: concepts/payment-system-basics/accounts/cryptographic-keys.md + - md: concepts/networks-and-servers/parallel-networks.md targets: - en - # TODO: update translation based on latest English version - - md: concepts/payment-system-basics/accounts/cryptographic-keys.ja.md + - md: concepts/networks-and-servers/parallel-networks.ja.md targets: - ja - - md: concepts/payment-system-basics/accounts/multi-signing.md + - md: concepts/networks-and-servers/amendments.md targets: - en - - md: concepts/payment-system-basics/accounts/multi-signing.ja.md + - md: concepts/networks-and-servers/amendments.ja.md targets: - ja - - md: concepts/payment-system-basics/accounts/reserves.md + - md: concepts/networks-and-servers/the-clio-server.md targets: - en - - md: concepts/payment-system-basics/accounts/reserves.ja.md + - md: concepts/networks-and-servers/the-clio-server.ja.md targets: - ja - - md: concepts/payment-system-basics/accounts/tickets.md + # Consensus Protocol ------------------------------------------------------ + + # TODO: "consensus" subpages are nested in nav but not filesystem; also, might be a mismatch with other contents here + - md: concepts/consensus-protocol/consensus.md targets: - en - - md: concepts/payment-system-basics/accounts/tickets.ja.md + - md: concepts/consensus-protocol/consensus.ja.md targets: - ja - - md: concepts/payment-system-basics/accounts/depositauth.md + - md: concepts/consensus-protocol/consensus-structure.md targets: - en - - md: concepts/payment-system-basics/accounts/depositauth.ja.md + # TODO: update title to match English + - md: concepts/consensus-protocol/consensus-structure.ja.md targets: - ja - - md: concepts/payment-system-basics/fees.md + - md: concepts/consensus-protocol/consensus-principles-and-rules.md targets: - en - - md: concepts/payment-system-basics/fees.ja.md + - md: concepts/consensus-protocol/consensus-principles-and-rules.ja.md targets: - ja - - md: concepts/payment-system-basics/ledgers.md + - md: concepts/consensus-protocol/consensus-protections.md targets: - en - # TODO: translation needs to be updated based on ledgers.md - - md: concepts/payment-system-basics/ledgers.ja.md + - md: concepts/consensus-protocol/consensus-protections.ja.md targets: - ja - - md: concepts/payment-system-basics/transaction-basics/transaction-basics.md + # TODO: maybe nest invariant checking under consensus protections? + - md: concepts/consensus-protocol/invariant-checking.md targets: - en - - md: concepts/payment-system-basics/transaction-basics/transaction-basics.ja.md + - md: concepts/consensus-protocol/invariant-checking.ja.md targets: - ja - - md: concepts/payment-system-basics/transaction-basics/transaction-cost.md + - md: concepts/consensus-protocol/fee-voting.md targets: - en - - md: concepts/payment-system-basics/transaction-basics/transaction-cost.ja.md + - md: concepts/consensus-protocol/fee-voting.ja.md targets: - ja - - md: concepts/payment-system-basics/transaction-basics/finality-of-results.md + - md: concepts/consensus-protocol/negative-unl.md targets: - en - - md: concepts/payment-system-basics/transaction-basics/finality-of-results.ja.md + - md: concepts/consensus-protocol/negative-unl.ja.md targets: - ja - - md: concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md + - md: concepts/consensus-protocol/consensus-research.md targets: - en - # TODO: Somehow this page's blurb got translated into Japanese but the page itself wasn't? - # For now we overwrite the blurb but use the page otherwise as-is. - - md: concepts/payment-system-basics/transaction-basics/source-and-destination-tags.md + - md: concepts/consensus-protocol/consensus-research.ja.md + targets: + - ja + + # Ledgers ----------------------------------------------------------------- + + - md: concepts/ledgers/ledgers.md + targets: + - en + + # TODO: update translation. Some parts split into "ledger structure" + - md: concepts/ledgers/ledgers.ja.md + targets: + - ja + + # TODO: translate. Some parts taken from "ledgers.md" + - md: concepts/ledgers/ledger-structure.md + targets: + - en + - ja + + # TODO: translate. Content mostly split off from "ledgers.md" + - md: concepts/ledgers/open-closed-validated-ledgers.md + targets: + - en + - ja + + # TODO: translate. Content mostly split off from "ledgers.md" + - md: concepts/ledgers/ledger-close-times.md + targets: + - en + - ja + + # TODO: add a "ledger history" page that doesn't go too deep into + # server management topics. + + # Transactions ------------------------------------------------------------ + - md: concepts/transactions/transactions.md + targets: + - en + + - md: concepts/transactions/transactions.ja.md + targets: + - ja + + - md: concepts/transactions/fees.md + targets: + - en + + - md: concepts/transactions/fees.ja.md + targets: + - ja + + - md: concepts/transactions/reliable-transaction-submission.md + targets: + - en + + - md: concepts/transactions/reliable-transaction-submission.ja.md + targets: + - ja + + # TODO: rename these to "secure-signing.md" + - md: concepts/transactions/set-up-secure-signing.md + targets: + - en + + - md: concepts/transactions/set-up-secure-signing.ja.md + targets: + - ja + + - md: concepts/transactions/multi-signing.md + targets: + - en + + - md: concepts/transactions/multi-signing.ja.md + targets: + - ja + + - md: concepts/transactions/source-and-destination-tags.md + targets: + - en + + # TODO: Translate to Japanese. Somehow this page's blurb got translated already. + - md: concepts/transactions/source-and-destination-tags.md blurb: 多目的アドレスとの間で支払いのやり取りをする具体的な目的を示すためにソースタグと宛先タグを使用します。 untranslated_warning: true targets: - ja + - md: concepts/transactions/transaction-cost.md + targets: + - en + + - md: concepts/transactions/transaction-cost.ja.md + targets: + - ja + + - md: concepts/transactions/transaction-queue.md + targets: + - en + + - md: concepts/transactions/transaction-queue.ja.md + targets: + - ja + + - md: concepts/transactions/finality-of-results.md + targets: + - en + + - md: concepts/transactions/finality-of-results.ja.md + targets: + - ja + + - md: concepts/transactions/look-up-transaction-results.md + targets: + - en + + - md: concepts/transactions/look-up-transaction-results.ja.md + targets: + - ja + + - md: concepts/transactions/transaction-malleability.md + targets: + - en + + - md: concepts/transactions/transaction-malleability.ja.md + targets: + - ja + + # TODO: match filename to page title + - md: concepts/transactions/about-canceling-a-transaction.md + targets: + - en + + - md: concepts/transactions/about-canceling-a-transaction.ja.md + targets: + - ja + + - md: concepts/transactions/tickets.md + targets: + - en + + - md: concepts/transactions/tickets.ja.md + targets: + - ja + + # Payment Types ----------------------------------------------------------- - name: Payment Types html: payment-types.html parent: concepts.html @@ -686,16 +986,6 @@ pages: targets: - ja - # Redirect from the old landing name/URL - - name: Complex Payment Types - html: complex-payment-types.html - template: pagetype-redirect.html.jinja - nav_omit: true - redirect_url: payment-types.html - targets: - - en - - ja - - md: concepts/payment-types/direct-xrp-payments.md targets: - en @@ -744,6 +1034,7 @@ pages: targets: - ja + # Tokens ------------------------------------------------------------------ - md: concepts/tokens/tokens.md targets: - en @@ -752,55 +1043,6 @@ pages: targets: - ja - # Redirects from old (emptyish) landing pages. - - name: Tokens - html: issued-currencies.html - template: pagetype-redirect.html.jinja - redirect_url: tokens.html - blurb: Anyone can make tokens representing digital value on the XRP Ledger. - targets: - - en - - - name: トークン - html: issued-currencies.html - template: pagetype-redirect.html.jinja - redirect_url: tokens.html - blurb: 誰もがXRP Ledger上でデジタル価値を表すトークンを作ることができます。 - targets: - - ja - - - name: Tokens - html: issued-currencies-overview.html - template: pagetype-redirect.html.jinja - redirect_url: tokens.html - blurb: Anyone can make tokens representing digital value on the XRP Ledger. - targets: - - en - - - name: トークン - html: issued-currencies-overview.html - template: pagetype-redirect.html.jinja - redirect_url: tokens.html - blurb: 誰もがXRP Ledger上でデジタル価値を表すトークンを作ることができます。 - targets: - - ja - - - md: concepts/tokens/trust-lines-and-issuing.md - targets: - - en - - - md: concepts/tokens/trust-lines-and-issuing.ja.md - targets: - - ja - - - md: concepts/tokens/authorized-trust-lines.md - targets: - - en - - - md: concepts/tokens/authorized-trust-lines.ja.md - targets: - - ja - - md: concepts/tokens/non-fungible-tokens.md targets: - en @@ -865,11 +1107,29 @@ pages: targets: - ja + # TODO: translate - md: concepts/tokens/nft-apis.md targets: - en - ja + # TODO: maybe fungible tokens should be in their own folder? + - md: concepts/tokens/trust-lines-and-issuing.md + targets: + - en + + - md: concepts/tokens/trust-lines-and-issuing.ja.md + targets: + - ja + + - md: concepts/tokens/authorized-trust-lines.md + targets: + - en + + - md: concepts/tokens/authorized-trust-lines.ja.md + targets: + - ja + - md: concepts/tokens/freezes.md targets: - en @@ -878,6 +1138,7 @@ pages: targets: - ja + # TODO: nest this file appropriately - md: concepts/tokens/common-misconceptions-about-freezes.md targets: - en @@ -902,14 +1163,6 @@ pages: targets: - ja - - md: concepts/tokens/issuing-and-operational-addresses.md - targets: - - en - - - md: concepts/tokens/issuing-and-operational-addresses.ja.md - targets: - - ja - - md: concepts/tokens/paths.md targets: - en @@ -926,11 +1179,196 @@ pages: targets: - ja - - md: concepts/decentralized-exchange/decentralized-exchange.md + - md: concepts/tokens/decentralized-exchange.md targets: - en - - md: concepts/decentralized-exchange/decentralized-exchange.ja.md + - md: concepts/tokens/decentralized-exchange.ja.md + targets: + - ja + + - md: concepts/tokens/offers.md + targets: + - en + + - md: concepts/tokens/offers.ja.md + targets: + - ja + + - md: concepts/tokens/autobridging.md + targets: + - en + + - md: concepts/tokens/autobridging.ja.md + targets: + - ja + + - md: concepts/tokens/ticksize.md + targets: + - en + + - md: concepts/tokens/ticksize.ja.md + targets: + - ja + + # Accounts ---------------------------------------------------------------- + - md: concepts/accounts/accounts.md + targets: + - en + + - md: concepts/accounts/accounts.ja.md + targets: + - ja + + - md: concepts/accounts/account-types.md + targets: + - en + + #TODO: update translation. Mostly just the title has changed + - md: concepts/accounts/account-types.ja.md + targets: + - ja + + #TODO: translate. Draws heavily on content that used to be in accounts.md + - md: concepts/accounts/deleting-accounts.md + targets: + - en + - ja + + - md: concepts/accounts/reserves.md + targets: + - en + + - md: concepts/accounts/reserves.ja.md + targets: + - ja + + #TODO: translate. Draws heavily on content that used to be in accounts.md + - md: concepts/accounts/addresses.md + targets: + - en + - ja + + - md: concepts/accounts/cryptographic-keys.md + targets: + - en + + # TODO: update translation based on latest English version + - md: concepts/accounts/cryptographic-keys.ja.md + targets: + - ja + + - md: concepts/accounts/depositauth.md + targets: + - en + + - md: concepts/accounts/depositauth.ja.md + targets: + - ja + + + ## REDIRECTS FROM OLD CONCEPT PAGES/LANDINGS ------------------------------- + - name: Intro to Consensus + html: intro-to-consensus.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: consensus.html + targets: + - en + - ja + + - name: Secure Signing + html: set-up-secure-signing.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: secure-signing.html + targets: + - en + - ja + + - name: Transactions + html: transaction-basics.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: transactions.html + targets: + - en + - ja + + - name: Stablecoin Issuer + html: become-an-xrp-ledger-gateway.html.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: stablecoin-issuer.html + targets: + - en + - ja + + - name: Consensus + html: consensus-network.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: consensus.html + targets: + - en + - ja + + - name: Complex Payment Types + html: complex-payment-types.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: payment-types.html + targets: + - en + - ja + + - name: Canceling a Transaction + html: about-canceling-a-transaction.html + template: pagetype-redirect.html.jinja + redirect_url: canceling-a-transaction.html + nav_omit: true + targets: + - en + - ja + + - name: Account Types + html: issuing-and-operational-addresses.html + template: pagetype-redirect.html.jinja + redirect_url: account-types.html + nav_omit: true + targets: + - en + - ja + + - name: Tokens + html: issued-currencies.html + template: pagetype-redirect.html.jinja + redirect_url: tokens.html + blurb: Anyone can make tokens representing digital value on the XRP Ledger. + targets: + - en + + - name: トークン + html: issued-currencies.html + template: pagetype-redirect.html.jinja + redirect_url: tokens.html + blurb: 誰もがXRP Ledger上でデジタル価値を表すトークンを作ることができます。 + targets: + - ja + + - name: Tokens + html: issued-currencies-overview.html + template: pagetype-redirect.html.jinja + redirect_url: tokens.html + blurb: Anyone can make tokens representing digital value on the XRP Ledger. + targets: + - en + + - name: トークン + html: issued-currencies-overview.html + template: pagetype-redirect.html.jinja + redirect_url: tokens.html + blurb: 誰もがXRP Ledger上でデジタル価値を表すトークンを作ることができます。 targets: - ja @@ -943,158 +1381,6 @@ pages: - en - ja - - md: concepts/decentralized-exchange/offers.md - targets: - - en - - - md: concepts/decentralized-exchange/offers.ja.md - targets: - - ja - - - md: concepts/decentralized-exchange/autobridging.md - targets: - - en - - - md: concepts/decentralized-exchange/autobridging.ja.md - targets: - - ja - - - md: concepts/decentralized-exchange/ticksize.md - targets: - - en - - - md: concepts/decentralized-exchange/ticksize.ja.md - targets: - - ja - - - name: Consensus Network - html: consensus-network.html - parent: concepts.html - template: pagetype-category.html.jinja - blurb: The XRP Ledger uses a consensus algorithm to resolve the double spend problem and choose which transactions to execute in which order. Consensus also governs rules of transaction processing. - targets: - - en - - - name: コンセンサスネットワーク - html: consensus-network.html - parent: concepts.html - template: pagetype-category.html.jinja - blurb: XRP Ledgerは、コンセンサス・アルゴリズムを用いて二重支払い問題を解決し、トランザクションの実行順序を決定します。コンセンサスでは、トランザクション処理のルールも定められています。 - targets: - - ja - - - md: concepts/consensus-network/consensus.md - targets: - - en - - - md: concepts/consensus-network/consensus.ja.md - targets: - - ja - - - md: concepts/consensus-network/consensus-principles-and-rules.md - targets: - - en - - - md: concepts/consensus-network/consensus-principles-and-rules.ja.md - targets: - - ja - - - md: concepts/consensus-network/consensus-protections.md - targets: - - en - - - md: concepts/consensus-network/consensus-protections.ja.md - targets: - - ja - - - md: concepts/consensus-network/invariant-checking.md - targets: - - en - - - md: concepts/consensus-network/invariant-checking.ja.md - targets: - - ja - - - md: concepts/consensus-network/negative-unl.md - targets: - - en - - - md: concepts/consensus-network/negative-unl.ja.md - targets: - - ja - - - md: concepts/consensus-network/transaction-queue.md - targets: - - en - - - md: concepts/consensus-network/transaction-queue.ja.md - targets: - - ja - - - md: concepts/consensus-network/about-canceling-a-transaction.md - targets: - - en - - - md: concepts/consensus-network/about-canceling-a-transaction.ja.md - targets: - - ja - - - md: concepts/consensus-network/transaction-malleability.md - targets: - - en - - # TODO: translate - - md: concepts/consensus-network/transaction-malleability.ja.md - targets: - - ja - - - md: concepts/consensus-network/amendments/amendments.md - targets: - - en - - - md: concepts/consensus-network/amendments/amendments.ja.md - targets: - - ja - - - md: concepts/consensus-network/amendments/contribute-code-flow.md - targets: - - en - - ja - - - md: concepts/consensus-network/amendments/known-amendments.md - targets: - - en - - - md: concepts/consensus-network/amendments/known-amendments.ja.md - targets: - - ja - - - md: concepts/consensus-network/fee-voting.md - targets: - - en - - - md: concepts/consensus-network/fee-voting.ja.md - targets: - - ja - - - md: concepts/consensus-network/consensus-research.md - targets: - - en - - - md: concepts/consensus-network/consensus-research.ja.md - targets: - - ja - - # TODO: add pseudo-transactions concept page - - - md: concepts/consensus-network/parallel-networks.md - targets: - - en - - - md: concepts/consensus-network/parallel-networks.ja.md - targets: - - ja - # Redirect for now obsolete "Federated Sidechains" page - name: Federated Sidechains html: federated-sidechains.html @@ -1105,78 +1391,6 @@ pages: - en - ja - - md: concepts/xrpl-servers/xrpl-servers.md - targets: - - en - - - md: concepts/xrpl-servers/xrpl-servers.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/rippled-server-modes.md - targets: - - en - - - md: concepts/xrpl-servers/rippled-server-modes.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/clustering.md - targets: - - en - - - md: concepts/xrpl-servers/clustering.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/ledger-history/ledger-history.md - targets: - - en - - - md: concepts/xrpl-servers/ledger-history/ledger-history.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/ledger-history/online-deletion.md - targets: - - en - - - md: concepts/xrpl-servers/ledger-history/online-deletion.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/ledger-history/history-sharding.md - targets: - - en - - - md: concepts/xrpl-servers/ledger-history/history-sharding.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/peer-protocol.md - targets: - - en - - - md: concepts/xrpl-servers/peer-protocol.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/transaction-censorship-detection.md - targets: - - en - - - md: concepts/xrpl-servers/transaction-censorship-detection.ja.md - targets: - - ja - - - md: concepts/xrpl-servers/the-clio-server.md - targets: - - en - - - md: concepts/xrpl-servers/the-clio-server.ja.md - targets: - - ja - # Redirect for "Interoperability" landing page - name: Interoperability html: xrpl-interoperability.html @@ -1201,7 +1415,7 @@ pages: - name: The rippled Server html: the-rippled-server.html template: pagetype-redirect.html.jinja - redirect_url: xrpl-servers.html + redirect_url: networks-and-servers.html blurb: Learn about the core servers that power the XRP Ledger. nav_omit: true targets: @@ -1230,6 +1444,7 @@ pages: - ja + # Tutorials -------------------------------------------------------------------- - name: Tutorials @@ -1250,149 +1465,6 @@ pages: targets: - ja - # TODO: translate - - name: Quickstart - html: xrpl-quickstart.html - parent: tutorials.html - blurb: Quickly experiment with the basics of XRPL development. - cta_text: Quickstart tutorials - template: pagetype-category.html.jinja - targets: - - en - - ja - - # TODO: translate - - name: Quickstart (JavaScript) - html: quickstart-javascript.html - parent: xrpl-quickstart.html - template: pagetype-category.html.jinja - blurb: Use a JavaScript test harness to send XRP, trade currencies, and mint and trade NFTs. - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/quickstart-intro.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/create-accounts-send-xrp.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/create-trustline-send-currency.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/mint-and-burn-nfts.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/transfer-nfts.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/broker-sale.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/authorize-minter.md - parent: quickstart-javascript.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/batch-minting.md - parent: quickstart-javascript.html - targets: - - en - - ja - - - name: Quickstart (Python) - html: quickstart-python.html - parent: xrpl-quickstart.html - template: pagetype-category.html.jinja - blurb: Use a Python test harness to send XRP, trade currencies, and mint and trade NFTs. - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-quickstart-intro.md - parent: quickstart-python.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-create-accounts-send-xrp.md - parent: quickstart-python.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-create-trustline-send-currency.md - parent: quickstart-python.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-mint-and-burn-nfts.md - parent: quickstart-python.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-transfer-nfts.md - parent: quickstart-python.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-broker-sale.md - parent: quickstart-python.html - targets: - - en - - ja - - # TODO: translate - - md: tutorials/quickstart/py-authorize-minter.md - parent: quickstart-python.html - targets: - - en - - ja - - - md: tutorials/get-started/get-started.md - targets: - - en - - - md: tutorials/get-started/get-started.ja.md - targets: - - ja - - md: tutorials/get-started/public-servers.md targets: - en @@ -1401,14 +1473,89 @@ pages: targets: - ja + # Python ------------------------------------------------------------------- + + - name: Python + html: python.html + parent: tutorials.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: XRPL tutorials in Python. + targets: + - en + - ja + # TODO: translate - md: tutorials/get-started/get-started-using-python.md targets: - en - ja + - name: Modular Tutorials in Python + html: modular-tutorials-in-python.html + parent: python.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Modular XRPL tutorials in Python. + targets: + - en + - ja + # TODO: translate - - md: tutorials/get-started/get-started-using-java.md + - md: tutorials/quickstart/send-payments-using-python.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/py-create-accounts-send-xrp.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/py-create-trustline-send-currency.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/py-mint-and-burn-nfts.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/py-transfer-nfts.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/py-broker-sale.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/py-authorize-minter.md + targets: + - en + - ja + + - md: tutorials/build-apps/build-a-desktop-wallet-in-python.md + targets: + - en + - ja # TODO: translate this page + + # JavaScript --------------------------------------------------------------- + + - name: JavaScript + html: javascript.html + parent: tutorials.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: XRPL tutorials in JavaScript. targets: - en - ja @@ -1446,12 +1593,120 @@ pages: - en - ja - - md: tutorials/get-started/get-started-using-http-websocket-apis.md + - name: Modular Tutorials in JavaScript + html: modular-tutorials-in-javascript.html + parent: javascript.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Modular XRPL tutorials in JavaScript. targets: - en + - ja - - md: tutorials/get-started/get-started-using-http-websocket-apis.ja.md + # TODO: translate + - md: tutorials/quickstart/send-payments-using-javascript.md targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/create-accounts-send-xrp-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/create-trustline-send-currency-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/create-time-based-escrows-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/create-conditional-escrows-using-javascript.md + targets: + - en + - ja + + - name: NFTs Using JavaScript + html: nfts-using-javascript.html + parent: modular-tutorials-in-javascript.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: Mint and sell NFTs on the XRP Ledger. + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/mint-and-burn-nfts-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/transfer-nfts-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/broker-an-nft-sale-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/assign-an-authorized-minter-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/quickstart/batch-mint-nfts-using-javascript.md + targets: + - en + - ja + + # TODO: translate + - md: tutorials/build-apps/build-a-browser-wallet-using-javascript.md + targets: + - en + - ja + + # Java --------------------------------------------------------------------- + + - name: Java + html: java.html + parent: tutorials.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: XRPL tutorials in Java. + targets: + - en + - ja + + # TODO: translate + - md: tutorials/get-started/get-started-using-java.md + targets: + - en + - ja + + # HTTP / Websocket Tutorials --------------------------------------------------- + + - name: HTTP / Websocket APIs + html: http-websocket-apis-tutorials.html + parent: tutorials.html + top_nav_grouping: Article Types + template: pagetype-category.html.jinja + blurb: XRPL tutorials for HTTP / Websocket APIs. + targets: + - en - ja # Redirect for old HTTP/WebSocket APIs URL @@ -1464,11 +1719,11 @@ pages: - en - ja - - md: tutorials/get-started/send-xrp.md + - md: tutorials/get-started/get-started-using-http-websocket-apis.md targets: - en - - md: tutorials/get-started/send-xrp.ja.md + - md: tutorials/get-started/get-started-using-http-websocket-apis.ja.md targets: - ja @@ -1480,95 +1735,23 @@ pages: targets: - ja - # Send old "Use Direct XRP Payments" landing to "Get Started" instead - - name: Use Direct XRP Payments - html: use-simple-xrp-payments.html - template: pagetype-redirect.html.jinja - nav_omit: true - redirect_url: get-started.html - targets: - - en - - ja + # Tasks -------------------------------------------------------------------- - - name: Build Apps - html: build-apps.html + - name: Tasks + html: tasks.html parent: tutorials.html + top_nav_grouping: Article Types template: pagetype-category.html.jinja - blurb: Develop applications and services that use the XRP Ledger. - targets: - - en - - - name: アプリケーションの構築 - html: build-apps.html - parent: tutorials.html - template: pagetype-category.html.jinja - blurb: XRP Ledgerを利用したアプリケーションやサービスを開発しましょう。 - targets: - - ja - - - md: tutorials/build-apps/build-a-desktop-wallet-in-python.md - targets: - - en - - ja # TODO: translate this page - - - md: tutorials/build-apps/build-a-browser-wallet-in-js.md - targets: - - en - - ja # TODO: translate this page - - - name: Production Readiness - html: production-readiness.html - parent: tutorials.html - template: pagetype-category.html.jinja - blurb: Follow these best practices to build a robust, safe production system for using the XRP Ledger. - targets: - - en - - - name: 本番環境への準備 - html: production-readiness.html - parent: tutorials.html - template: pagetype-category.html.jinja - blurb: 以下のベストプラクティスに従って、XRPレジャーを使用するための堅牢で安全な本番システムを構築しましょう。 - targets: - - ja - - - md: tutorials/production-readiness/set-up-secure-signing.md - targets: - - en - - - md: tutorials/production-readiness/set-up-secure-signing.ja.md - targets: - - ja - - - md: tutorials/production-readiness/look-up-transaction-results.md - targets: - - en - - - md: tutorials/production-readiness/look-up-transaction-results.ja.md - targets: - - ja - - - md: tutorials/production-readiness/reliable-transaction-submission.md - targets: - - en - - - md: tutorials/production-readiness/reliable-transaction-submission.ja.md - targets: - - ja - - # Redirect for this page's new home outside of tutorials - - name: Cancel or Skip a Transaction - html: cancel-or-skip-a-transaction.html - template: pagetype-redirect.html.jinja - nav_omit: true - redirect_url: about-canceling-a-transaction.html + blurb: Common tasks on the XRP Ledger. targets: - en - ja + # Manage Account Settings ---------------------------------------------- + - name: Manage Account Settings html: manage-account-settings.html - parent: tutorials.html + parent: tasks.html template: pagetype-category.html.jinja blurb: Set up your XRP Ledger account to send and receive payments the way you want it to. targets: @@ -1576,7 +1759,7 @@ pages: - name: アカウントの設定の利用 html: manage-account-settings.html - parent: tutorials.html + parent: tasks.html template: pagetype-category.html.jinja blurb: XRP Ledgerアカウントを設定して、思い通りの支払いをしましょう。 targets: @@ -1649,11 +1832,19 @@ pages: targets: - ja - # TODO: "Use Deposit Authorization to Block Unwanted Payments" (DOC-1555) + - md: tutorials/get-started/send-xrp.md + targets: + - en + + - md: tutorials/get-started/send-xrp.ja.md + targets: + - ja + + # Use Specialized Payment Types -------------------------------------------------------- - name: Use Specialized Payment Types html: use-specialized-payment-types.html - parent: tutorials.html + parent: tasks.html template: pagetype-category.html.jinja blurb: Use advanced features like Escrow and Payment Channels to build smart applications on the XRP Ledger. targets: @@ -1661,7 +1852,7 @@ pages: - name: 専門化した支払いタイプの使用 html: use-specialized-payment-types.html - parent: tutorials.html + parent: tasks.html template: pagetype-category.html.jinja blurb: EscrowやPayment Channelなどの高度な機能を使用して、XRP Ledgerでスマートアプリケーションを構築しましょう。 targets: @@ -1751,6 +1942,7 @@ pages: targets: - en + # TODO: update translation to match English updates - md: tutorials/use-specialized-payment-types/use-checks/use-checks.ja.md targets: - ja @@ -1803,9 +1995,11 @@ pages: targets: - ja + # Use Tokens ------------------------------------------------------------------ + - name: Use Tokens html: use-tokens.html - parent: tutorials.html + parent: tasks.html blurb: Create and trade tokens (fungible or otherwise) in the XRP Ledger. template: pagetype-category.html.jinja targets: @@ -1813,7 +2007,7 @@ pages: - name: トークンの利用 html: use-tokens.html - parent: tutorials.html + parent: tasks.html blurb: XRP Ledgerでトークン(代替型やそれ以外)を発行し、取引しましょう template: pagetype-category.html.jinja targets: @@ -1849,500 +2043,48 @@ pages: - en - ja - # TODO: "Send a Cross-Currency Payment" - - # TODO: Set up issuing/operational addresses, monitor changes to balances, - # enable/disable rippling, use auth'd trust lines - - - name: XRP Ledger Businesses - html: xrp-ledger-businesses.html - parent: tutorials.html - blurb: This section demonstrates how to follow various best practices for running businesses that interface with the XRP Ledger, such as exchanges listing XRP and gateways issuing currency in the XRP Ledger. - template: pagetype-category.html.jinja - targets: - - en - - - name: ビジネスとしてのXRP Ledger - html: xrp-ledger-businesses.html - parent: tutorials.html - blurb: このセクションでは、XRPを上場している取引所やXRP Ledgerで通貨を発行しているゲートウェイなど、XRP Ledgerとインターフェースを持つビジネスを運営するための様々なベストプラクティスをご紹介しています。 - template: pagetype-category.html.jinja - targets: - - ja - - - md: tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.md - targets: - - en - - - md: tutorials/xrp-ledger-businesses/list-xrp-as-an-exchange.ja.md - targets: - - ja - - # legacy feature that has been removed. - - md: tutorials/xrp-ledger-businesses/list-your-exchange-on-xrp-charts.md - targets: - - en - - ja - - # TODO: translate - - md: tutorials/xrp-ledger-businesses/become-an-xrp-ledger-gateway.md - targets: - - en - - ja - - - name: Manage the rippled Server - html: manage-the-rippled-server.html - parent: tutorials.html - blurb: Install, configure, and manage the core server that powers the XRP Ledger. - cta_text: Run rippled - template: pagetype-category.html.jinja - targets: - - en - - - name: rippledサーバの管理 - html: manage-the-rippled-server.html - parent: tutorials.html - blurb: XRP Ledgerを動かすコアサーバーをインストール、設定、管理しましょう。 - cta_text: インストールしよう - template: pagetype-category.html.jinja - targets: - - ja - - - name: Install rippled - html: install-rippled.html - parent: manage-the-rippled-server.html - top_nav_name: Install & Configure - blurb: Install and update the rippled server. - template: pagetype-category.html.jinja - targets: - - en - - - name: rippledのインストール - html: install-rippled.html - parent: manage-the-rippled-server.html - blurb: rippledサーバーをインストールして更新します。 - template: pagetype-category.html.jinja - targets: - - ja - - - md: tutorials/manage-the-rippled-server/installation/system-requirements.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/system-requirements.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/install-rippled-on-centos-rhel-with-yum.ja.md - targets: - - ja - - # Redirect old Alien-based install - - name: Install rippled on Ubuntu with Alien - html: install-rippled-on-ubuntu-with-alien.html - parent: install-rippled.html + # Redirect to tutorial parent nav. + - name: Get Started + html: get-started.html template: pagetype-redirect.html.jinja nav_omit: true - redirect_url: install-rippled-on-ubuntu.html + redirect_url: tutorials.html targets: - en - ja - - md: tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/install-rippled-on-ubuntu.ja.md - targets: - - ja - - # Redirect old CentOS/RHEL install - - name: Update rippled Automatically on CentOS/RHEL - html: update-rippled-automatically-on-centos-rhel.html + # Send old "Use Direct XRP Payments" landing to "Get Started" instead + - name: Use Direct XRP Payments + html: use-simple-xrp-payments.html template: pagetype-redirect.html.jinja nav_omit: true - redirect_url: update-rippled-automatically-on-linux.html + redirect_url: send-xrp.html targets: - en - ja - - md: tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/update-rippled-automatically-on-linux.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-centos-rhel.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/update-rippled-manually-on-ubuntu.ja.md - targets: - - ja - - # Redirect to build instructions on rippled repo. - - name: Build and Run rippled on Ubuntu - html: build-run-rippled-ubuntu.html + # Redirect old Production Readiness category. + # There's no equivalent category now, so go to Tutorials top + - name: Production Readiness + html: production-readiness.html + redirect_url: tutorials.html template: pagetype-redirect.html.jinja - redirect_url: https://github.com/XRPLF/rippled/blob/release/BUILD.md + nav_omit: true targets: - en - ja - # Redirect to b uild instructions on rippled repo. - - name: Build and Run rippled on macOS - html: build-run-rippled-macos.html + # Redirect for this page's new home outside of tutorials + - name: Cancel or Skip a Transaction + html: cancel-or-skip-a-transaction.html template: pagetype-redirect.html.jinja - redirect_url: https://github.com/XRPLF/rippled/blob/release/BUILD.md - targets: - - en - - ja - - - md: tutorials/manage-the-rippled-server/installation/build-run-rippled-in-reporting-mode.md + nav_omit: true + redirect_url: about-canceling-a-transaction.html targets: - en - ja - - md: tutorials/manage-the-rippled-server/installation/capacity-planning.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/capacity-planning.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/installation/rippled-1-3-migration-instructions.ja.md - targets: - - ja - - - name: Configure rippled - html: configure-rippled.html - parent: manage-the-rippled-server.html - blurb: Customize your rippled server configuration. - template: pagetype-category.html.jinja - targets: - - en - - - name: rippledの設定 - html: configure-rippled.html - parent: manage-the-rippled-server.html - blurb: rippledサーバーの構成をカスタマイズします。 - template: pagetype-category.html.jinja - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-validator.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-stock-server.md - targets: - - en - - # TODO: update this translation and rename the file like in the English version - - md: tutorials/manage-the-rippled-server/configuration/run-rippled-as-a-wallet-server.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/configure-amendment-voting.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/configure-amendment-voting.ja.md - targets: - - ja - - # TODO: translate - - md: tutorials/manage-the-rippled-server/configuration/test-amendments.md - targets: - - en - - ja - - # TODO: translate - - md: tutorials/manage-the-rippled-server/configuration/configure-statsd.md - targets: - - en - - ja - - - md: tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/configure-online-deletion.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/configure-online-deletion.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/configure-advisory-deletion.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/configure-history-sharding.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/configure-history-sharding.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configuration/configure-full-history.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/configure-full-history.ja.md - targets: - - ja - - # TODO: translate page - - md: tutorials/manage-the-rippled-server/configuration/configure-grpc.md - targets: - - en - - ja - - - md: tutorials/manage-the-rippled-server/configuration/enable-public-signing.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configuration/enable-public-signing.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/configure-peering.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/configure-peering.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/cluster-rippled-servers.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/configure-a-private-server.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/configure-the-peer-crawler.md - targets: - - en - - # TODO: translate this page. # For now we just have a translated blurb. - - md: tutorials/manage-the-rippled-server/configure-peering/configure-the-peer-crawler.md - blurb: rippledサーバーがステータスとピアについてどの程度の情報を公表するか設定します。 - untranslated_warning: true - targets: - - ja - - # TODO: translate this page - - md: tutorials/manage-the-rippled-server/configure-peering/enable-link-compression.md - targets: - - en - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/forward-ports-for-peering.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/forward-ports-for-peering.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/manually-connect-to-a-specific-peer.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/manually-connect-to-a-specific-peer.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/set-max-number-of-peers.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/set-max-number-of-peers.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/configure-peering/use-a-peer-reservation.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/configure-peering/use-a-peer-reservation.ja.md - targets: - - ja - - - name: Test rippled Functionality in Stand-Alone Mode - html: use-stand-alone-mode.html - parent: manage-the-rippled-server.html - blurb: For new features and experiments, you can use Stand-Alone Mode to test features with a full network. - template: pagetype-category.html.jinja - targets: - - en - - - name: スタンドアロンモードでrippledをテスト - html: use-stand-alone-mode.html - parent: manage-the-rippled-server.html - blurb: 新機能や実験用に、スタンドアロンモードを使用してフルネットワークで機能をテストできます。 - template: pagetype-category.html.jinja - targets: - - ja - - - md: tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.ja.md - targets: - - ja - - - name: Troubleshooting - html: troubleshoot-the-rippled-server.html - parent: manage-the-rippled-server.html - blurb: Troubleshoot all kinds of problems with the rippled server. - template: pagetype-category.html.jinja - targets: - - en - - - name: rippledのトラブルシューティング - html: troubleshoot-the-rippled-server.html - parent: manage-the-rippled-server.html - blurb: rippledサーバーのあらゆる種類の問題をトラブルシューティングします。 - template: pagetype-category.html.jinja - targets: - - ja - - - md: tutorials/manage-the-rippled-server/troubleshooting/diagnosing-problems.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/troubleshooting/diagnosing-problems.ja.md - targets: - - ja - - # TODO: translate - - md: tutorials/manage-the-rippled-server/troubleshooting/health-check-interventions.md - targets: - - en - - ja - - - md: tutorials/manage-the-rippled-server/troubleshooting/understanding-log-messages.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/troubleshooting/understanding-log-messages.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.md - targets: - - en - - # TODO: translate the blurb in this page's frontmatter - - md: tutorials/manage-the-rippled-server/troubleshooting/server-doesnt-sync.ja.md - targets: - - ja - - # TODO: translate - - md: tutorials/manage-the-rippled-server/troubleshooting/server-is-amendment-blocked.md - targets: - - en - - ja - - - md: tutorials/manage-the-rippled-server/troubleshooting/server-wont-start.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/troubleshooting/server-wont-start.ja.md - targets: - - ja - - - md: tutorials/manage-the-rippled-server/troubleshooting/fix-sqlite-tx-db-page-size-issue.md - targets: - - en - - - md: tutorials/manage-the-rippled-server/troubleshooting/fix-sqlite-tx-db-page-size-issue.ja.md - targets: - - ja - - - name: Manage the Clio Server - html: manage-the-clio-server.html - parent: tutorials.html - blurb: Install, configure, and manage the Clio server. - template: pagetype-category.html.jinja - targets: - - en - - - name: Clioサーバの管理 - html: manage-the-clio-server.html - parent: tutorials.html - blurb: Clioサーバーのインストール、設定、管理しましょう。 - template: pagetype-category.html.jinja - targets: - - ja - - # TODO: translate - - md: tutorials/manage-the-clio-server/install-clio-on-ubuntu.md - targets: - - en - - ja + # TODO: "Use Deposit Authorization to Block Unwanted Payments" (DOC-1555) # Redirect for "Interoperability - EVM Sidechain" tutorial landing page - name: Interoperability - EVM Sidechain @@ -2699,7 +2441,7 @@ pages: html: ammbid.html template: pagetype-redirect.html.jinja redirect_url: https://opensource.ripple.com/docs/xls-30d-amm/transaction-types/ammbid/ - nav_omit: true + nav_omit: true targets: - en - ja @@ -3124,7 +2866,7 @@ pages: - ja - # HTTP / Websocket APIs ---------------------------------------------------- + # HTTP / Websocket APIs References ---------------------------------------------------- - name: HTTP / WebSocket APIs html: http-websocket-apis.html @@ -3624,7 +3366,7 @@ pages: targets: - ja - - name: Clio Server + - name: Clio Server html: clio-methods.html parent: public-api-methods.html blurb: Use these methods to retrieve information using Clio server APIs. @@ -4042,15 +3784,6 @@ pages: targets: - ja - - md: references/http-websocket-apis/commandline-usage.md - targets: - - en - - # TODO: update translation - - md: references/http-websocket-apis/commandline-usage.ja.md - targets: - - ja - # TODO: translate title & blurb - name: Peer Port Methods html: peer-port-methods.html @@ -4117,446 +3850,921 @@ pages: targets: - ja - # Landing pages for labels ------------------------------------------------- - - name: Accounts - html: label-accounts.html - parent: by-label.html - landing_for: Accounts - template: pagetype-label.html.jinja - blurb: Pages relating to accounts in the XRP Ledger. - filters: - - labels +# Infrastructure --------------------------------------------------------------- + + # TODO: translate blurb + - name: Infrastructure + html: infrastructure.html + parent: docs.html + blurb: Install, configure, and manage the software that powers the XRP Ledger. + template: pagetype-category.html.jinja + top_nav_grouping: Article Types + targets: + - en + - ja + + # Redirect old landing + - name: Manage the rippled server + html: manage-the-rippled-server.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: install-rippled-on-ubuntu.html + targets: + - en + - ja + + - md: infrastructure/rippled/commandline-usage.md targets: - en - - name: アカウント - html: label-accounts.html - parent: by-label.html - landing_for: アカウント - template: pagetype-label.html.jinja - blurb: XRP Ledgerのアカウントに関するページ。 - filters: - - labels + # TODO: update translation + - md: infrastructure/rippled/commandline-usage.ja.md targets: - ja - - - name: Blockchain - html: label-blockchain.html - parent: by-label.html - landing_for: Blockchain - template: pagetype-label.html.jinja - blurb: Pages about how the XRP Ledger functions as a blockchain. - filters: - - labels + - name: Install rippled + html: install-rippled.html + parent: infrastructure.html + top_nav_name: Install & Configure + blurb: Install and update the rippled server. + template: pagetype-category.html.jinja targets: - en - - name: ブロックチェーン - html: label-blockchain.html - parent: by-label.html - landing_for: ブロックチェーン - template: pagetype-label.html.jinja - blurb: ブロックチェーンとしてのXRP Ledgerの機能に関するページ。 - filters: - - labels + - name: rippledのインストール + html: install-rippled.html + parent: infrastructure.html + blurb: rippledサーバーをインストールして更新します。 + template: pagetype-category.html.jinja targets: - ja - - name: Checks - html: label-checks.html - parent: by-label.html - landing_for: Checks - template: pagetype-label.html.jinja - blurb: Pages about the Checks feature. - filters: - - labels + - md: infrastructure/rippled/installation/system-requirements.md targets: - en - - name: Checks - html: label-checks.html - parent: by-label.html - landing_for: Checks - template: pagetype-label.html.jinja - blurb: Checks機能に関するページ。 - filters: - - labels + - md: infrastructure/rippled/installation/system-requirements.ja.md targets: - ja - - name: Core Server - html: label-rippled.html - parent: by-label.html - landing_for: Core Server - template: pagetype-label.html.jinja - blurb: Pages about the XRP Ledger's core server implementation, rippled. - filters: - - labels + - md: infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.md targets: - en - - name: コアサーバー - html: label-rippled.html - parent: by-label.html - landing_for: コアサーバー - template: pagetype-label.html.jinja - blurb: XRP Ledgerのコアサーバー「rippled」に関するページ。 - filters: - - labels + - md: infrastructure/rippled/installation/install-rippled-on-centos-rhel-with-yum.ja.md targets: - ja - - name: Cross-Currency - html: label-cross-currency.html - parent: by-label.html - landing_for: Cross-Currency - template: pagetype-label.html.jinja - blurb: Pages about exchanging currencies, tokens, and XRP in payments or the decentralized exchange. - filters: - - labels + # Redirect old Alien-based install + - name: Install rippled on Ubuntu with Alien + html: install-rippled-on-ubuntu-with-alien.html + parent: install-rippled.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: install-rippled-on-ubuntu.html + targets: + - en + - ja + + - md: infrastructure/rippled/installation/install-rippled-on-ubuntu.md targets: - en - - name: 複数通貨間 - html: label-cross-currency.html - parent: by-label.html - landing_for: 複数通貨間 - template: pagetype-label.html.jinja - blurb: 決済や分散型取引所での通貨、トークン、XRPの交換に関するページ。 - filters: - - labels + - md: infrastructure/rippled/installation/install-rippled-on-ubuntu.ja.md + targets: + - ja + + # Redirect old CentOS/RHEL install + - name: Update rippled Automatically on CentOS/RHEL + html: update-rippled-automatically-on-centos-rhel.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: update-rippled-automatically-on-linux.html + targets: + - en + - ja + + - md: infrastructure/rippled/installation/update-rippled-automatically-on-linux.md + targets: + - en + + - md: infrastructure/rippled/installation/update-rippled-automatically-on-linux.ja.md + targets: + - ja + + - md: infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.md + targets: + - en + + - md: infrastructure/rippled/installation/update-rippled-manually-on-centos-rhel.ja.md + targets: + - ja + + - md: infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.md + targets: + - en + + - md: infrastructure/rippled/installation/update-rippled-manually-on-ubuntu.ja.md + targets: + - ja + + # Redirect to build instructions on rippled repo. + - name: Build and Run rippled on Ubuntu + html: build-run-rippled-ubuntu.html + template: pagetype-redirect.html.jinja + redirect_url: https://github.com/XRPLF/rippled/blob/release/BUILD.md + targets: + - en + - ja + + # Redirect to build instructions on rippled repo. + - name: Build and Run rippled on macOS + html: build-run-rippled-macos.html + template: pagetype-redirect.html.jinja + redirect_url: https://github.com/XRPLF/rippled/blob/release/BUILD.md + targets: + - en + - ja + + - md: infrastructure/rippled/installation/build-run-rippled-in-reporting-mode.md + targets: + - en + - ja + + - md: infrastructure/rippled/installation/capacity-planning.md + targets: + - en + + - md: infrastructure/rippled/installation/capacity-planning.ja.md + targets: + - ja + + - md: infrastructure/rippled/installation/rippled-1-3-migration-instructions.md + targets: + - en + + - md: infrastructure/rippled/installation/rippled-1-3-migration-instructions.ja.md + targets: + - ja + + - name: Configure rippled + html: configure-rippled.html + parent: infrastructure.html + blurb: Customize your rippled server configuration. + template: pagetype-category.html.jinja + targets: + - en + + - name: rippledの設定 + html: configure-rippled.html + parent: infrastructure.html + blurb: rippledサーバーの構成をカスタマイズします。 + template: pagetype-category.html.jinja + targets: + - ja + + - name: Server Modes + html: server-modes.html + parent: configure-rippled.html + template: pagetype-category.html.jinja + targets: + - en + - ja + + - md: infrastructure/rippled/configuration/run-rippled-as-a-validator.md + targets: + - en + + - md: infrastructure/rippled/configuration/run-rippled-as-a-validator.ja.md + targets: + - ja + + - md: infrastructure/rippled/configuration/run-rippled-as-a-stock-server.md + targets: + - en + + # TODO: update this translation and rename the file like in the English version + - md: infrastructure/rippled/configuration/run-rippled-as-a-wallet-server.ja.md targets: - ja - name: Data Retention - html: label-data-retention.html - parent: by-label.html - landing_for: Data Retention - template: pagetype-label.html.jinja - blurb: Pages about how and for how long XRP Ledger software stores data. - filters: - - labels + html: data-retention.html + parent: configure-rippled.html + template: pagetype-category.html.jinja + targets: + - en + - ja + + - md: infrastructure/rippled/configuration/configure-full-history.md targets: - en - - name: データ保持 - html: label-data-retention.html - parent: by-label.html - landing_for: データ保持 - template: pagetype-label.html.jinja - blurb: XRP Ledgerのソフトウェアがデータを保存する方法と期間に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/configure-full-history.ja.md targets: - ja - - name: Decentralized Exchange - html: label-decentralized-exchange.html - parent: by-label.html - landing_for: Decentralized Exchange - template: pagetype-label.html.jinja - blurb: Pages about the Decentralized Exchange built into the XRP Ledger. - filters: - - labels + - md: concepts/networks-and-servers/ledger-history/online-deletion.md targets: - en - - name: 分散型取引所 - html: label-decentralized-exchange.html - parent: by-label.html - landing_for: 分散型取引所 - template: pagetype-label.html.jinja - blurb: XRP Ledgerの分散型取引所に関するページ。 - filters: - - labels + - md: concepts/networks-and-servers/ledger-history/online-deletion.ja.md targets: - ja - - name: Development - html: label-development.html - parent: by-label.html - landing_for: Development - template: pagetype-label.html.jinja - blurb: Pages about developing apps that use the XRP Ledger. - filters: - - labels + - md: infrastructure/rippled/configuration/configure-online-deletion.md targets: - en - - name: 開発 - html: label-development.html - parent: by-label.html - landing_for: 開発 - template: pagetype-label.html.jinja - blurb: XRP Ledgerを使うアプリケーションの開発に関するページ。 - filters: - - labels - targets: - - ja - - - name: Escrow - html: label-escrow.html - parent: by-label.html - landing_for: Escrow - template: pagetype-label.html.jinja - blurb: Pages about the Escrow feature. - filters: - - labels - targets: - - en - - - name: Escrow - html: label-escrow.html - parent: by-label.html - landing_for: Escrow - template: pagetype-label.html.jinja - blurb: Escrow機能に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/configure-online-deletion.ja.md targets: - ja - - name: Fees - html: label-fees.html - parent: by-label.html - landing_for: Fees - template: pagetype-label.html.jinja - blurb: Pages about fees and related costs of transacting in the XRP Ledger. - filters: - - labels + - md: infrastructure/rippled/configuration/configure-advisory-deletion.md targets: - en - - name: 手数料 - html: label-fees.html - parent: by-label.html - landing_for: 手数料 - template: pagetype-label.html.jinja - blurb: XRP Ledgerのトランザクション処理時の手数料とコストに関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/configure-advisory-deletion.ja.md targets: - ja - - name: "Non-fungible Tokens, NFTs" - html: label-nfts.html - landing_for: "Non-fungible Tokens, NFTs" - template: pagetype-label.html.jinja - blurb: Pages about non-fungible tokens. - filters: - - labels + - md: concepts/networks-and-servers/ledger-history/history-sharding.md targets: - en - - name: "非代替性トークン, NFT" - html: label-nfts.html - landing_for: "非代替性トークン, NFT" - template: pagetype-label.html.jinja - blurb: NFTに関するページ。 - filters: - - labels + - md: concepts/networks-and-servers/ledger-history/history-sharding.ja.md targets: - ja - - name: Payment Channels - html: label-payment-channels.html - parent: by-label.html - landing_for: Payment Channels - template: pagetype-label.html.jinja - blurb: Pages about the Payment Channels feature. - filters: - - labels + - md: infrastructure/rippled/configuration/configure-history-sharding.md targets: - en - - name: Payment Channel - html: label-payment-channels.html - parent: by-label.html - landing_for: Payment Channel - template: pagetype-label.html.jinja - blurb: Payment Channel機能に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/configure-history-sharding.ja.md targets: - ja - - name: Payments - html: label-payments.html - parent: by-label.html - landing_for: Payments - template: pagetype-label.html.jinja - blurb: About sending payments (of XRP or tokens) in the XRP Ledger. - filters: - - labels + - md: infrastructure/rippled/configuration/configure-amendment-voting.md targets: - en - - name: 支払い - html: label-payments.html - parent: by-label.html - landing_for: 支払い - template: pagetype-label.html.jinja - blurb: XRP Ledgerでの支払い機能に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/configure-amendment-voting.ja.md targets: - ja - - name: Smart Contracts - html: label-smart-contracts.html - parent: by-label.html - landing_for: Smart Contracts - template: pagetype-label.html.jinja - blurb: Pages about XRP Ledger features that can be used to build smart contracts. - filters: - - labels + # TODO: translate + - md: infrastructure/rippled/configuration/test-amendments.md + targets: + - en + - ja + + # TODO: translate + - md: infrastructure/rippled/configuration/configure-statsd.md + targets: + - en + - ja + + - md: infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.md targets: - en - - name: スマートコントラクト - html: label-smart-contracts.html - parent: by-label.html - landing_for: スマートコントラクト - template: pagetype-label.html.jinja - blurb: スマートコントラクトを構築する際に利用できるXRP Ledgerの特徴に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/connect-your-rippled-to-the-xrp-test-net.ja.md targets: - ja - - name: Security - html: label-security.html - parent: by-label.html - landing_for: Security - template: pagetype-label.html.jinja - blurb: Pages about security issues and precautions. - filters: - - labels + # TODO: translate page + - md: infrastructure/rippled/configuration/configure-grpc.md + targets: + - en + - ja + + - md: infrastructure/rippled/configuration/enable-public-signing.md targets: - en - - name: セキュリティ - html: label-security.html - parent: by-label.html - landing_for: セキュリティ - template: pagetype-label.html.jinja - blurb: セキュリティ問題と予防措置に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configuration/enable-public-signing.ja.md targets: - ja - - name: Tokens - html: label-tokens.html - parent: by-label.html - landing_for: Tokens - template: pagetype-label.html.jinja - blurb: Pages about issuing tokens in the XRP Ledger. - filters: - - labels + - md: infrastructure/rippled/configure-peering/configure-peering.md targets: - en - - name: トークン - html: label-tokens.html - parent: by-label.html - landing_for: トークン - template: pagetype-label.html.jinja - blurb: XRP Ledgerでの発行トークンに関するページ。 - filters: - - labels + - md: infrastructure/rippled/configure-peering/configure-peering.ja.md targets: - ja - - name: Transaction Sending - html: label-transaction-sending.html - parent: by-label.html - landing_for: Transaction Sending - template: pagetype-label.html.jinja - blurb: Pages about sending transactions in the XRP Ledger. - filters: - - labels + - md: infrastructure/rippled/configure-peering/cluster-rippled-servers.md targets: - en - - name: トランザクション送信 - html: label-transaction-sending.html - parent: by-label.html - landing_for: トランザクション送信 - template: pagetype-label.html.jinja - blurb: XRP Ledgerでのトランザクション送信に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configure-peering/cluster-rippled-servers.ja.md targets: - ja - - name: XRP - html: label-xrp.html - parent: by-label.html - landing_for: XRP - template: pagetype-label.html.jinja - blurb: Pages about XRP, the native digital asset built into the XRP Ledger. - filters: - - labels + - md: infrastructure/rippled/configure-peering/configure-a-private-server.md targets: - en - - name: XRP - html: label-xrp.html - parent: by-label.html - landing_for: XRP - template: pagetype-label.html.jinja - blurb: XRP Ledgerのネイティブ暗号資産「XRP」に関するページ。 - filters: - - labels + - md: infrastructure/rippled/configure-peering/configure-a-private-server.ja.md targets: - ja - - name: Browse By Label - html: by-label.html - parent: docs.html - template: page-by-label.html.jinja - sidebar: left_only - blurb: See all pages labeled with a specific topic or idea. - top_nav_omit: true - filters: - - labels + - md: infrastructure/rippled/configure-peering/configure-the-peer-crawler.md targets: - en - - name: ラベル別に閲覧 - html: by-label.html - parent: docs.html - template: page-by-label.html.jinja - sidebar: left_only - blurb: 特定のトピックでラベル付けされたページを表示します。 - top_nav_omit: true - filters: - - labels + # TODO: translate this page. # For now we just have a translated blurb. + - md: infrastructure/rippled/configure-peering/configure-the-peer-crawler.md + blurb: rippledサーバーがステータスとピアについてどの程度の情報を公表するか設定します。 + untranslated_warning: true targets: - ja + # TODO: translate this page + - md: infrastructure/rippled/configure-peering/enable-link-compression.md + targets: + - en + - ja + + - md: infrastructure/rippled/configure-peering/forward-ports-for-peering.md + targets: + - en + + - md: infrastructure/rippled/configure-peering/forward-ports-for-peering.ja.md + targets: + - ja + + - md: infrastructure/rippled/configure-peering/manually-connect-to-a-specific-peer.md + targets: + - en + + - md: infrastructure/rippled/configure-peering/manually-connect-to-a-specific-peer.ja.md + targets: + - ja + + - md: infrastructure/rippled/configure-peering/set-max-number-of-peers.md + targets: + - en + + - md: infrastructure/rippled/configure-peering/set-max-number-of-peers.ja.md + targets: + - ja + + - md: infrastructure/rippled/configure-peering/use-a-peer-reservation.md + targets: + - en + + - md: infrastructure/rippled/configure-peering/use-a-peer-reservation.ja.md + targets: + - ja + + - name: Testing and Auditing + html: use-stand-alone-mode.html + parent: infrastructure.html + blurb: For new features and experiments, you can use Stand-Alone Mode to test features with a full network. + template: pagetype-category.html.jinja + targets: + - en + + # TODO: Translate page name. + - name: スタンドアロンモードでrippledをテスト + html: use-stand-alone-mode.html + parent: infrastructure.html + blurb: 新機能や実験用に、スタンドアロンモードを使用してフルネットワークで機能をテストできます。 + template: pagetype-category.html.jinja + targets: + - ja + + - md: infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.md + targets: + - en + + - md: infrastructure/rippled/stand-alone-mode/start-a-new-genesis-ledger-in-stand-alone-mode.ja.md + targets: + - ja + + - md: infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.md + targets: + - en + + - md: infrastructure/rippled/stand-alone-mode/load-a-saved-ledger-in-stand-alone-mode.ja.md + targets: + - ja + + - md: infrastructure/rippled/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.md + targets: + - en + + - md: infrastructure/rippled/stand-alone-mode/advance-the-ledger-in-stand-alone-mode.ja.md + targets: + - ja + + - name: Troubleshooting + html: troubleshoot-the-rippled-server.html + parent: infrastructure.html + blurb: Troubleshoot all kinds of problems with the rippled server. + template: pagetype-category.html.jinja + targets: + - en + + - name: rippledのトラブルシューティング + html: troubleshoot-the-rippled-server.html + parent: infrastructure.html + blurb: rippledサーバーのあらゆる種類の問題をトラブルシューティングします。 + template: pagetype-category.html.jinja + targets: + - ja + + - md: infrastructure/rippled/troubleshooting/diagnosing-problems.md + targets: + - en + + - md: infrastructure/rippled/troubleshooting/diagnosing-problems.ja.md + targets: + - ja + + # TODO: translate + - md: infrastructure/rippled/troubleshooting/health-check-interventions.md + targets: + - en + - ja + + - md: infrastructure/rippled/troubleshooting/understanding-log-messages.md + targets: + - en + + - md: infrastructure/rippled/troubleshooting/understanding-log-messages.ja.md + targets: + - ja + + - md: infrastructure/rippled/troubleshooting/server-doesnt-sync.md + targets: + - en + + # TODO: translate the blurb in this page's frontmatter + - md: infrastructure/rippled/troubleshooting/server-doesnt-sync.ja.md + targets: + - ja + + # TODO: translate + - md: infrastructure/rippled/troubleshooting/server-is-amendment-blocked.md + targets: + - en + - ja + + - md: infrastructure/rippled/troubleshooting/server-wont-start.md + targets: + - en + + - md: infrastructure/rippled/troubleshooting/server-wont-start.ja.md + targets: + - ja + + - md: infrastructure/rippled/troubleshooting/fix-sqlite-tx-db-page-size-issue.md + targets: + - en + + - md: infrastructure/rippled/troubleshooting/fix-sqlite-tx-db-page-size-issue.ja.md + targets: + - ja + + # TODO: translate + - md: infrastructure/clio/install-clio-on-ubuntu.md + targets: + - en + - ja + + # TODO: translate + - md: infrastructure/rippled/run-private-network-with-docker.md + targets: + - en + - ja + + + # # Landing pages for labels ------------------------------------------------- + # - name: Accounts + # html: label-accounts.html + # parent: by-label.html + # landing_for: Accounts + # template: pagetype-label.html.jinja + # blurb: Pages relating to accounts in the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: アカウント + # html: label-accounts.html + # parent: by-label.html + # landing_for: アカウント + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerのアカウントに関するページ。 + # filters: + # - labels + # targets: + # - ja + + + # - name: Blockchain + # html: label-blockchain.html + # parent: by-label.html + # landing_for: Blockchain + # template: pagetype-label.html.jinja + # blurb: Pages about how the XRP Ledger functions as a blockchain. + # filters: + # - labels + # targets: + # - en + + # - name: ブロックチェーン + # html: label-blockchain.html + # parent: by-label.html + # landing_for: ブロックチェーン + # template: pagetype-label.html.jinja + # blurb: ブロックチェーンとしてのXRP Ledgerの機能に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Checks + # html: label-checks.html + # parent: by-label.html + # landing_for: Checks + # template: pagetype-label.html.jinja + # blurb: Pages about the Checks feature. + # filters: + # - labels + # targets: + # - en + + # - name: Checks + # html: label-checks.html + # parent: by-label.html + # landing_for: Checks + # template: pagetype-label.html.jinja + # blurb: Checks機能に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Core Server + # html: label-rippled.html + # parent: by-label.html + # landing_for: Core Server + # template: pagetype-label.html.jinja + # blurb: Pages about the XRP Ledger's core server implementation, rippled. + # filters: + # - labels + # targets: + # - en + + # - name: コアサーバー + # html: label-rippled.html + # parent: by-label.html + # landing_for: コアサーバー + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerのコアサーバー「rippled」に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Cross-Currency + # html: label-cross-currency.html + # parent: by-label.html + # landing_for: Cross-Currency + # template: pagetype-label.html.jinja + # blurb: Pages about exchanging currencies, tokens, and XRP in payments or the decentralized exchange. + # filters: + # - labels + # targets: + # - en + + # - name: 複数通貨間 + # html: label-cross-currency.html + # parent: by-label.html + # landing_for: 複数通貨間 + # template: pagetype-label.html.jinja + # blurb: 決済や分散型取引所での通貨、トークン、XRPの交換に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Data Retention + # html: label-data-retention.html + # parent: by-label.html + # landing_for: Data Retention + # template: pagetype-label.html.jinja + # blurb: Pages about how and for how long XRP Ledger software stores data. + # filters: + # - labels + # targets: + # - en + + # - name: データ保持 + # html: label-data-retention.html + # parent: by-label.html + # landing_for: データ保持 + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerのソフトウェアがデータを保存する方法と期間に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Decentralized Exchange + # html: label-decentralized-exchange.html + # parent: by-label.html + # landing_for: Decentralized Exchange + # template: pagetype-label.html.jinja + # blurb: Pages about the Decentralized Exchange built into the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: 分散型取引所 + # html: label-decentralized-exchange.html + # parent: by-label.html + # landing_for: 分散型取引所 + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerの分散型取引所に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Development + # html: label-development.html + # parent: by-label.html + # landing_for: Development + # template: pagetype-label.html.jinja + # blurb: Pages about developing apps that use the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: 開発 + # html: label-development.html + # parent: by-label.html + # landing_for: 開発 + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerを使うアプリケーションの開発に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Escrow + # html: label-escrow.html + # parent: by-label.html + # landing_for: Escrow + # template: pagetype-label.html.jinja + # blurb: Pages about the Escrow feature. + # filters: + # - labels + # targets: + # - en + + # - name: Escrow + # html: label-escrow.html + # parent: by-label.html + # landing_for: Escrow + # template: pagetype-label.html.jinja + # blurb: Escrow機能に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Fees + # html: label-fees.html + # parent: by-label.html + # landing_for: Fees + # template: pagetype-label.html.jinja + # blurb: Pages about fees and related costs of transacting in the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: 手数料 + # html: label-fees.html + # parent: by-label.html + # landing_for: 手数料 + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerのトランザクション処理時の手数料とコストに関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: "Non-fungible Tokens, NFTs" + # html: label-nfts.html + # landing_for: "Non-fungible Tokens, NFTs" + # template: pagetype-label.html.jinja + # blurb: Pages about non-fungible tokens. + # filters: + # - labels + # targets: + # - en + + # - name: "非代替性トークン, NFT" + # html: label-nfts.html + # landing_for: "非代替性トークン, NFT" + # template: pagetype-label.html.jinja + # blurb: NFTに関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Payment Channels + # html: label-payment-channels.html + # parent: by-label.html + # landing_for: Payment Channels + # template: pagetype-label.html.jinja + # blurb: Pages about the Payment Channels feature. + # filters: + # - labels + # targets: + # - en + + # - name: Payment Channel + # html: label-payment-channels.html + # parent: by-label.html + # landing_for: Payment Channel + # template: pagetype-label.html.jinja + # blurb: Payment Channel機能に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Payments + # html: label-payments.html + # parent: by-label.html + # landing_for: Payments + # template: pagetype-label.html.jinja + # blurb: About sending payments (of XRP or tokens) in the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: 支払い + # html: label-payments.html + # parent: by-label.html + # landing_for: 支払い + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerでの支払い機能に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Smart Contracts + # html: label-smart-contracts.html + # parent: by-label.html + # landing_for: Smart Contracts + # template: pagetype-label.html.jinja + # blurb: Pages about XRP Ledger features that can be used to build smart contracts. + # filters: + # - labels + # targets: + # - en + + # - name: スマートコントラクト + # html: label-smart-contracts.html + # parent: by-label.html + # landing_for: スマートコントラクト + # template: pagetype-label.html.jinja + # blurb: スマートコントラクトを構築する際に利用できるXRP Ledgerの特徴に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Security + # html: label-security.html + # parent: by-label.html + # landing_for: Security + # template: pagetype-label.html.jinja + # blurb: Pages about security issues and precautions. + # filters: + # - labels + # targets: + # - en + + # - name: セキュリティ + # html: label-security.html + # parent: by-label.html + # landing_for: セキュリティ + # template: pagetype-label.html.jinja + # blurb: セキュリティ問題と予防措置に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Tokens + # html: label-tokens.html + # parent: by-label.html + # landing_for: Tokens + # template: pagetype-label.html.jinja + # blurb: Pages about issuing tokens in the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: トークン + # html: label-tokens.html + # parent: by-label.html + # landing_for: トークン + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerでの発行トークンに関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Transaction Sending + # html: label-transaction-sending.html + # parent: by-label.html + # landing_for: Transaction Sending + # template: pagetype-label.html.jinja + # blurb: Pages about sending transactions in the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: トランザクション送信 + # html: label-transaction-sending.html + # parent: by-label.html + # landing_for: トランザクション送信 + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerでのトランザクション送信に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: XRP + # html: label-xrp.html + # parent: by-label.html + # landing_for: XRP + # template: pagetype-label.html.jinja + # blurb: Pages about XRP, the native digital asset built into the XRP Ledger. + # filters: + # - labels + # targets: + # - en + + # - name: XRP + # html: label-xrp.html + # parent: by-label.html + # landing_for: XRP + # template: pagetype-label.html.jinja + # blurb: XRP Ledgerのネイティブ暗号資産「XRP」に関するページ。 + # filters: + # - labels + # targets: + # - ja + + # - name: Browse By Label + # html: by-label.html + # parent: docs.html + # template: page-by-label.html.jinja + # sidebar: left_only + # blurb: See all pages labeled with a specific topic or idea. + # top_nav_omit: true + # filters: + # - labels + # targets: + # - en + + # - name: ラベル別に閲覧 + # html: by-label.html + # parent: docs.html + # template: page-by-label.html.jinja + # sidebar: left_only + # blurb: 特定のトピックでラベル付けされたページを表示します。 + # top_nav_omit: true + # filters: + # - labels + # targets: + # - ja # --------------- end "Docs" section ------------------------------------------- -# Use Cases: these have been removed. Only redirects remain. - - - name: Use Cases - html: use-cases.html - template: pagetype-redirect.html.jinja - nav_omit: true - redirect_url: uses.html - targets: - - en - - - name: ユースケース - html: use-cases.html - template: pagetype-redirect.html.jinja - nav_omit: true - redirect_url: uses.html - targets: - - ja +# Old use Cases: these have been removed. Only redirects remain. - name: Run a rippled Validator html: run-a-rippled-validator.html @@ -4594,7 +4802,7 @@ pages: html: contribute-code-to-rippled.html template: pagetype-redirect.html.jinja nav_omit: true - redirect_url: contribute-code-flow.html + redirect_url: contribute-code.html targets: - en @@ -4602,7 +4810,7 @@ pages: html: contribute-code-to-rippled.html template: pagetype-redirect.html.jinja nav_omit: true - redirect_url: contribute-code-flow.html + redirect_url: contribute-code.html targets: - ja @@ -4610,7 +4818,7 @@ pages: html: contribute-code-to-ripple-lib.html template: pagetype-redirect.html.jinja nav_omit: true - redirect_url: contribute-code-flow.html + redirect_url: contribute-code.html targets: - en @@ -4618,53 +4826,79 @@ pages: html: contribute-code-to-ripple-lib.html template: pagetype-redirect.html.jinja nav_omit: true - redirect_url: contribute-code-flow.html + redirect_url: contribute-code.html + targets: + - ja + + - name: Contribute Code + html: contribute-code-flow.html + template: pagetype-redirect.html.jinja + nav_omit: true + redirect_url: contribute-code.html + targets: + - en + - ja + +# Resources tab --------------------------------------------------------------- + - name: Resources + html: resources.html + parent: index.html + # Temporary: redirect to Dev Tools Eventually this should become a real landing page. + template: pagetype-category.html.jinja + blurb: Other resources to help understand the XRP Ledger and develop on it. + targets: + - en + + - name: リソース + html: resources.html + parent: index.html + template: pagetype-category.html.jinja + blurb: XRP Ledgerの理解や開発ためのリソース。Other resources to help understand the XRPL and develop on it. targets: - ja -# Code Samples page (final location TBD) - name: Code Samples html: code-samples.html - parent: docs.html + parent: resources.html template: page-code-samples.html.jinja sidebar: left_only codesamples: true + top_nav_grouping: Development filters: - code_samples - top_nav_grouping: Online Tools blurb: Browse sample code for building common use cases on the XRP Ledger. targets: - en - name: サンプルコード html: code-samples.html - parent: docs.html + parent: resources.html template: page-code-samples.html.jinja sidebar: left_only codesamples: true + top_nav_grouping: 開発 filters: - code_samples - top_nav_grouping: Online Tools blurb: XRP Ledgerで一般的なユースケースを構築するためのサンプルコードを確認することができます。 targets: - ja -# Dev Tools -------------------------------------------------------------------- + # Dev Tools --------------------------------------------------------------- - name: Dev Tools html: dev-tools.html template: page-dev-tools.html.jinja - parent: docs.html - top_nav_grouping: Online Tools + parent: resources.html sidebar: left_only + top_nav_grouping: Development targets: - en - name: 開発者ツール html: dev-tools.html template: page-dev-tools.html.jinja - parent: docs.html - top_nav_grouping: Online Tools + parent: resources.html sidebar: left_only + top_nav_grouping: 開発 targets: - ja @@ -4676,20 +4910,6 @@ pages: targets: - en - ja - - - name: XRPL Learning Portal - html: https://learn.xrpl.org/ - parent: docs.html - top_nav_grouping: Online Tools - targets: - - en - - - name: XRPL学習ポータル - html: https://learn.xrpl.org/ - parent: docs.html - top_nav_grouping: Online Tools - targets: - - ja - name: RPC Tool html: xrp-ledger-rpc-tool.html @@ -4803,6 +5023,121 @@ pages: targets: - ja + - name: XRPL Learning Portal + html: https://learn.xrpl.org/ + parent: resources.html + top_nav_grouping: Development + targets: + - en + + - name: XRPL学習ポータル + html: https://learn.xrpl.org/ + parent: resources.html + top_nav_grouping: 開発 + targets: + - ja + + - name: Ledger Explorer + html: https://livenet.xrpl.org/ + parent: resources.html + top_nav_grouping: Current Status + targets: + - en + + - name: XRP Ledger エクスプローラ + html: https://livenet.xrpl.org/ + parent: resources.html + top_nav_grouping: 現在のステータス + targets: + - ja + + - md: resources/known-amendments.md + top_nav_grouping: Current Status + targets: + - en + + - md: resources/known-amendments.ja.md + top_nav_grouping: 現在のステータス + targets: + - ja + + + # Contribute Code --------------------------------------------------------- + + - md: resources/contribute-code/contribute-code.md + top_nav_grouping: Join In + targets: + - en + + - md: resources/contribute-code/contribute-code.ja.md + top_nav_grouping: 参加する + targets: + - ja + + - md: resources/contribute-code/create-custom-transactors.md + targets: + - en + + - md: resources/contribute-code/create-custom-transactors.ja.md + targets: + - ja + + # Contribute Documentation ------------------------------------------------ + + - md: resources/contribute-documentation/contribute-documentation.md + top_nav_grouping: Join In + targets: + - en + + - md: resources/contribute-documentation/contribute-documentation.ja.md + top_nav_grouping: 参加する + targets: + - ja + + - name: Contributor Code of Conduct + html: https://github.com/XRPLF/xrpl-dev-portal/blob/master/CODE_OF_CONDUCT.md + parent: contribute-documentation.html + targets: + - en + + - name: コントリビューター行動規範 + html: https://github.com/XRPLF/xrpl-dev-portal/blob/master/CODE_OF_CONDUCT.ja.md + parent: contribute-documentation.html + targets: + - ja + + - md: resources/contribute-documentation/documentation-translations.md + targets: + - en + + - md: resources/contribute-documentation/documentation-translations.ja.md + targets: + - ja + + - md: resources/contribute-documentation/creating-diagrams.md + targets: + - en + + - md: resources/contribute-documentation/creating-diagrams.ja.md + targets: + - ja + + - md: resources/contribute-documentation/tutorial-guidelines.md + targets: + - en + + - md: resources/contribute-documentation/tutorial-guidelines.ja.md + targets: + - ja + + - md: resources/contribute-documentation/tutorial-structure.md + targets: + - en + + - md: resources/contribute-documentation/tutorial-structure.ja.md + targets: + - ja + # "Community" tab -------------------------------------------------------------- - name: Contribute to the XRPL Community @@ -4817,44 +5152,19 @@ pages: targets: - en - # TODO: translate blurb & contents - - name: 貢献する + # TODO: translate contents + - name: XRPLコミュニティへの貢献 html: contribute.html parent: index.html template: page-community.html.jinja sidebar: disabled - blurb: 話題に加わろう + top_nav_blurb: Join the conversation + blurb: XRP Ledger (XRPL) はコミュニティ主導のパブリックブロックチェーンです。ここでは、その参加方法について説明します。 top_nav_name: コミュニティ top_nav_hero_image: top-nav-hero-contribute targets: - ja - # TODO: translate - - md: contributing/contribute-code.md - html: contribute-code.html - parent: contribute.html - top_nav_omit: true - targets: - - en - - ja - - # TODO: translate - - md: contributing/tutorial-guidelines.md - html: tutorial-guidelines.html - parent: contribute-code.html - top_nav_omit: true - targets: - - en - - ja - - # TODO: translate - - md: contributing/tutorial-structure.md - html: tutorial-structure.html - parent: tutorial-guidelines.html - top_nav_omit: true - targets: - - en - - ja - name: Events html: events.html @@ -4865,7 +5175,7 @@ pages: blurb: The XRP Ledger (XRPL) is a community-driven public blockchain. Here’s how you can get involved. top_nav_name: Events top_nav_hero_image: top-nav-hero-contribute - filters: + filters: - categorize_dates targets: - en @@ -4879,7 +5189,7 @@ pages: blurb: XRP Ledger (XRPL) はコミュニティ主導のパブリックブロックチェーンです。ここでは、その参加方法について説明します。 top_nav_name: イベント top_nav_hero_image: top-nav-hero-contribute - filters: + filters: - categorize_dates targets: - ja @@ -4962,16 +5272,16 @@ pages: - ja - name: GitHub - html: https://github.com/XRPLF/xrpl-dev-portal/ + html: https://github.com/XRPLF parent: contribute.html - blurb: View and propose changes to this site's source code on GitHub. + blurb: View XRP Ledger projects and source code on GitHub. targets: - en - name: GitHub html: https://github.com/XRPLF/xrpl-dev-portal/ parent: contribute.html - blurb: このサイトのソースコードをGitHubで閲覧し、変更を提案することができます。 + blurb: XRP LedgerのソースコードをGitHubで閲覧し、変更を提案することができます。 targets: - ja @@ -4989,10 +5299,12 @@ pages: targets: - ja - # TODO: Translate - md: contributing/report-a-scam.md targets: - en + + - md: contributing/report-a-scam.ja.md + targets: - ja # Redirects from deprecated "Explore" pages ------------------------------------ @@ -5011,7 +5323,7 @@ pages: nav_omit: true targets: - ja - + - name: Wallet html: wallet.html template: pagetype-redirect.html.jinja diff --git a/img/conditional-escrow1.png b/img/conditional-escrow1.png new file mode 100644 index 0000000000..dc737feefb Binary files /dev/null and b/img/conditional-escrow1.png differ diff --git a/img/conditional-escrow2.png b/img/conditional-escrow2.png new file mode 100644 index 0000000000..694b50f040 Binary files /dev/null and b/img/conditional-escrow2.png differ diff --git a/img/conditional-escrow3.png b/img/conditional-escrow3.png new file mode 100644 index 0000000000..ed5d4f8896 Binary files /dev/null and b/img/conditional-escrow3.png differ diff --git a/img/conditional-escrow4.png b/img/conditional-escrow4.png new file mode 100644 index 0000000000..78b9c6a4c6 Binary files /dev/null and b/img/conditional-escrow4.png differ diff --git a/img/conditional-escrow5.png b/img/conditional-escrow5.png new file mode 100644 index 0000000000..76c57cf6ba Binary files /dev/null and b/img/conditional-escrow5.png differ diff --git a/img/consensus1-proposed-ledgers.png b/img/consensus1-proposed-ledgers.png new file mode 100644 index 0000000000..8b3edc0ee2 Binary files /dev/null and b/img/consensus1-proposed-ledgers.png differ diff --git a/img/consensus2-agreed-transactions.png b/img/consensus2-agreed-transactions.png new file mode 100644 index 0000000000..c90041d396 Binary files /dev/null and b/img/consensus2-agreed-transactions.png differ diff --git a/img/consensus3-updates.png b/img/consensus3-updates.png new file mode 100644 index 0000000000..89d3e8539c Binary files /dev/null and b/img/consensus3-updates.png differ diff --git a/img/ecosystem-apps-and-services.svg b/img/ecosystem-apps-and-services.svg new file mode 100644 index 0000000000..11f97decdc --- /dev/null +++ b/img/ecosystem-apps-and-services.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ecosystem-client-libraries.svg b/img/ecosystem-client-libraries.svg new file mode 100644 index 0000000000..126bcc1adf --- /dev/null +++ b/img/ecosystem-client-libraries.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ecosystem-middleware.svg b/img/ecosystem-middleware.svg new file mode 100644 index 0000000000..31a3a07f88 --- /dev/null +++ b/img/ecosystem-middleware.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ecosystem-peer-to-peer.svg b/img/ecosystem-peer-to-peer.svg new file mode 100644 index 0000000000..316daf7209 --- /dev/null +++ b/img/ecosystem-peer-to-peer.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/introduction1-howdy.png b/img/introduction1-howdy.png new file mode 100644 index 0000000000..685656d497 Binary files /dev/null and b/img/introduction1-howdy.png differ diff --git a/img/introduction10-xrp-on-chain.png b/img/introduction10-xrp-on-chain.png new file mode 100644 index 0000000000..51a1e9f3fd Binary files /dev/null and b/img/introduction10-xrp-on-chain.png differ diff --git a/img/introduction11-all-the-things.png b/img/introduction11-all-the-things.png new file mode 100644 index 0000000000..fd2db7ca97 Binary files /dev/null and b/img/introduction11-all-the-things.png differ diff --git a/img/introduction12-diamond.png b/img/introduction12-diamond.png new file mode 100644 index 0000000000..352a6547b6 Binary files /dev/null and b/img/introduction12-diamond.png differ diff --git a/img/introduction13-x-prefix.png b/img/introduction13-x-prefix.png new file mode 100644 index 0000000000..59f76d9821 Binary files /dev/null and b/img/introduction13-x-prefix.png differ diff --git a/img/introduction14-hundred-billion.png b/img/introduction14-hundred-billion.png new file mode 100644 index 0000000000..97cb2654df Binary files /dev/null and b/img/introduction14-hundred-billion.png differ diff --git a/img/introduction15-custodial-non-custodial.png b/img/introduction15-custodial-non-custodial.png new file mode 100644 index 0000000000..64b0ea8cc2 Binary files /dev/null and b/img/introduction15-custodial-non-custodial.png differ diff --git a/img/introduction16-hardware-software.png b/img/introduction16-hardware-software.png new file mode 100644 index 0000000000..09896197fb Binary files /dev/null and b/img/introduction16-hardware-software.png differ diff --git a/img/introduction17-gather-txns.png b/img/introduction17-gather-txns.png new file mode 100644 index 0000000000..d3f1de1939 Binary files /dev/null and b/img/introduction17-gather-txns.png differ diff --git a/img/introduction18-80-percent-consensus.png b/img/introduction18-80-percent-consensus.png new file mode 100644 index 0000000000..2aa6efcc1b Binary files /dev/null and b/img/introduction18-80-percent-consensus.png differ diff --git a/img/introduction19-clio.png b/img/introduction19-clio.png new file mode 100644 index 0000000000..67510ae500 Binary files /dev/null and b/img/introduction19-clio.png differ diff --git a/img/introduction2-data-block.png b/img/introduction2-data-block.png new file mode 100644 index 0000000000..f6e66c1604 Binary files /dev/null and b/img/introduction2-data-block.png differ diff --git a/img/introduction3-validators.png b/img/introduction3-validators.png new file mode 100644 index 0000000000..0d8fa7b2b9 Binary files /dev/null and b/img/introduction3-validators.png differ diff --git a/img/introduction4-hash.png b/img/introduction4-hash.png new file mode 100644 index 0000000000..4452b78f81 Binary files /dev/null and b/img/introduction4-hash.png differ diff --git a/img/introduction5-time-stamp.png b/img/introduction5-time-stamp.png new file mode 100644 index 0000000000..b516ee9f58 Binary files /dev/null and b/img/introduction5-time-stamp.png differ diff --git a/img/introduction6-valid-copies.png b/img/introduction6-valid-copies.png new file mode 100644 index 0000000000..6aa7cf786f Binary files /dev/null and b/img/introduction6-valid-copies.png differ diff --git a/img/introduction7-two-blocks.png b/img/introduction7-two-blocks.png new file mode 100644 index 0000000000..a5640307f7 Binary files /dev/null and b/img/introduction7-two-blocks.png differ diff --git a/img/introduction8-3-blocks.png b/img/introduction8-3-blocks.png new file mode 100644 index 0000000000..e728d78fac Binary files /dev/null and b/img/introduction8-3-blocks.png differ diff --git a/img/introduction9-2-sets-of-3.png b/img/introduction9-2-sets-of-3.png new file mode 100644 index 0000000000..ff0dbe0e63 Binary files /dev/null and b/img/introduction9-2-sets-of-3.png differ diff --git a/img/ledger-hash-icon.svg b/img/ledger-hash-icon.svg new file mode 100644 index 0000000000..677e6eb9ca --- /dev/null +++ b/img/ledger-hash-icon.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ledger-index-icon.svg b/img/ledger-index-icon.svg new file mode 100644 index 0000000000..ca0c727fe9 --- /dev/null +++ b/img/ledger-index-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/img/ledger-notes-icon.svg b/img/ledger-notes-icon.svg new file mode 100644 index 0000000000..0e852e61b8 --- /dev/null +++ b/img/ledger-notes-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/img/ledger-parent-icon.svg b/img/ledger-parent-icon.svg new file mode 100644 index 0000000000..e61dc26398 --- /dev/null +++ b/img/ledger-parent-icon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ledger-state-data-hash-icon.svg b/img/ledger-state-data-hash-icon.svg new file mode 100644 index 0000000000..3a6b0eadd3 --- /dev/null +++ b/img/ledger-state-data-hash-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/img/ledger-state-data.svg b/img/ledger-state-data.svg new file mode 100644 index 0000000000..988e13548c --- /dev/null +++ b/img/ledger-state-data.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/img/ledger-timestamp-icon.svg b/img/ledger-timestamp-icon.svg new file mode 100644 index 0000000000..2fc8b461c5 --- /dev/null +++ b/img/ledger-timestamp-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/img/ledger-transaction-set.svg b/img/ledger-transaction-set.svg new file mode 100644 index 0000000000..ea752a7282 --- /dev/null +++ b/img/ledger-transaction-set.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ledger-tx-set-hash-icon.svg b/img/ledger-tx-set-hash-icon.svg new file mode 100644 index 0000000000..7eb325e9e9 --- /dev/null +++ b/img/ledger-tx-set-hash-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/img/ledger-validated-mark.svg b/img/ledger-validated-mark.svg new file mode 100644 index 0000000000..228b013dac --- /dev/null +++ b/img/ledger-validated-mark.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/ledger.svg b/img/ledger.svg new file mode 100644 index 0000000000..4a68a8adcf --- /dev/null +++ b/img/ledger.svg @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/nft-mkt-auth-minter.png b/img/nft-mkt-auth-minter.png new file mode 100644 index 0000000000..5ec7b599d8 Binary files /dev/null and b/img/nft-mkt-auth-minter.png differ diff --git a/img/nft-mkt-digital-artist.png b/img/nft-mkt-digital-artist.png new file mode 100644 index 0000000000..0bd7762d64 Binary files /dev/null and b/img/nft-mkt-digital-artist.png differ diff --git a/img/nft-mkt-marketplace.png b/img/nft-mkt-marketplace.png new file mode 100644 index 0000000000..241de0ca35 Binary files /dev/null and b/img/nft-mkt-marketplace.png differ diff --git a/img/nft-mkt-overview.png b/img/nft-mkt-overview.png new file mode 100644 index 0000000000..58b4ca7e85 Binary files /dev/null and b/img/nft-mkt-overview.png differ diff --git a/img/quickstart-escrow1.png b/img/quickstart-escrow1.png new file mode 100644 index 0000000000..4c88077a6e Binary files /dev/null and b/img/quickstart-escrow1.png differ diff --git a/img/quickstart-escrow2.png b/img/quickstart-escrow2.png new file mode 100644 index 0000000000..906c5c84fc Binary files /dev/null and b/img/quickstart-escrow2.png differ diff --git a/img/quickstart-escrow3.png b/img/quickstart-escrow3.png new file mode 100644 index 0000000000..d6081d4043 Binary files /dev/null and b/img/quickstart-escrow3.png differ diff --git a/img/quickstart-escrow4.png b/img/quickstart-escrow4.png new file mode 100644 index 0000000000..daf0dacb35 Binary files /dev/null and b/img/quickstart-escrow4.png differ diff --git a/img/quickstart-escrow5.png b/img/quickstart-escrow5.png new file mode 100644 index 0000000000..d79e118513 Binary files /dev/null and b/img/quickstart-escrow5.png differ diff --git a/img/quickstart-escrow6.png b/img/quickstart-escrow6.png new file mode 100644 index 0000000000..a7d4566c05 Binary files /dev/null and b/img/quickstart-escrow6.png differ diff --git a/img/quickstart-escrow7.png b/img/quickstart-escrow7.png new file mode 100644 index 0000000000..70d88d2785 Binary files /dev/null and b/img/quickstart-escrow7.png differ diff --git a/img/quickstart-escrow8.png b/img/quickstart-escrow8.png new file mode 100644 index 0000000000..605cc91717 Binary files /dev/null and b/img/quickstart-escrow8.png differ diff --git a/img/quickstart-escrow9.png b/img/quickstart-escrow9.png new file mode 100644 index 0000000000..224390e02c Binary files /dev/null and b/img/quickstart-escrow9.png differ diff --git a/theme-aware-recolor.png b/img/theme-aware-recolor.png similarity index 100% rename from theme-aware-recolor.png rename to img/theme-aware-recolor.png diff --git a/img/xrp-ledger-private-network-docker.svg b/img/xrp-ledger-private-network-docker.svg new file mode 100644 index 0000000000..ad4524ba79 --- /dev/null +++ b/img/xrp-ledger-private-network-docker.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/_code-tabs.scss b/styles/_code-tabs.scss index 3f1f25d399..de983d57aa 100644 --- a/styles/_code-tabs.scss +++ b/styles/_code-tabs.scss @@ -55,6 +55,7 @@ pre { margin-right: 0px; margin-left: 0px; border: 0; + clear: none; } } @@ -91,9 +92,6 @@ pre { z-index: 10; margin-right: 10px; } -.js_interactive .codehilite > .btn-group { - display: none; -} // Syntax highlighting via Codehilite ------------------------------------------ @@ -197,7 +195,7 @@ pre { .si, // string, interpol .sr, // string, regex .ss, // string, symbol - .sx, // string, other + .sx // string, other { color: $green-700; } diff --git a/styles/_colors.scss b/styles/_colors.scss index b059514e76..266c5dbdf5 100644 --- a/styles/_colors.scss +++ b/styles/_colors.scss @@ -158,3 +158,13 @@ $progress-bg: $gray-900; $modal-content-bg: $black; $modal-content-border-color: $gray-200; $close-color: $magenta-500; + +// Light mode colors +$light-bg: $gray-100; +$light-fg: $black; +$light-fg-muted: $gray-800; +$light-fg-disabled: $gray-400; +$light-form-bg: $gray-200; +$light-box-shadow: 0px 5px 20px 0px $gray-300; +$light-link-hover-color: $blue-purple-500; +$light-standout-bg: $gray-050; diff --git a/styles/_diagrams.scss b/styles/_diagrams.scss index 439c9a8fd6..3a410d791d 100644 --- a/styles/_diagrams.scss +++ b/styles/_diagrams.scss @@ -18,6 +18,15 @@ svg { max-width: 100%; } + + .floating-diagram { + margin: 0.5rem; + float: left; + } + + li { + clear: left; // avoid spilling to the side with floating diagrams + } } @@ -293,4 +302,42 @@ html.light { stroke: $magenta-500; } } + + // Recolor Figma diagrams for light mode ------------------------------------ + svg[fill="none"] { + rect[fill="#111112"] { + fill: $light-bg; + } + path[fill="white"] { + fill: $black; + } + path[fill="#343437"] { + fill: $gray-300; + } + path[fill="#A2A2A4"], + rect[fill="#A2A2A4"], + ellipse[fill="#A2A2A4"] { + fill: $gray-600; + } + path[fill="#232325"] { + fill: $gray-200; + } + path[fill="#F5F5F7"] { + fill: $gray-900; + } + path[stroke="#F5F5F7"] { + stroke: $gray-900; + } + path[stroke="#FF198B"] { + // slightly darken up this magenta for more contrast in light mode + stroke: $magenta-700; + } + + linearGradient stop[stop-color="#F5F5F7"] { + stop-color: $gray-900; + } + linearGradient stop[stop-color="#C1C1C2"] { + stop-color: $gray-700; + } + } } diff --git a/styles/_top-nav.scss b/styles/_top-nav.scss index bf9396a1d9..3b0de56936 100644 --- a/styles/_top-nav.scss +++ b/styles/_top-nav.scss @@ -211,6 +211,11 @@ grid-template-columns: 200px; } + &#topnav_dd_resourceshtml { + grid-template-columns: 195px 180px 180px; + left: -200px; + } + .dropdown-hero { grid-row: 1; grid-column: 1 / 4; @@ -260,6 +265,19 @@ margin: -40px -40px -40px 0; padding: 40px; } + + // "Resources" dropdown placement + .col-for-development, + .col-for-開発 { + grid-column: 1; + } + .col-for-current-status, + .col-for-現在のステータス { + grid-column: 2; + } + .col-for-join-in { + grid-column: 3; + } } &.smaller-dropdown { @@ -270,10 +288,10 @@ #topnav-pages { flex-grow: 0; - @media (min-width: 992px) and (max-width: 1030px) { - // Fix for top nav overflow in this range + @media (min-width: 992px) and (max-width: 1133px) { + // Part of the fix for top nav overflow in this range .nav-link { - padding: $nav-link-padding-y 1.6rem; //TODO:checkme + padding: $nav-link-padding-y 1rem; } } } @@ -287,12 +305,16 @@ #language_selector_header_btn { padding-right: 0; + @media (min-width: 992px) and (max-width: 1133px) { + // Part of the fix for top nav overflow in this range + padding-left: 1rem; + } } } @include media-breakpoint-up(xl) { #topnav-search { - margin-left: 4rem; + margin-left: 3.5rem; margin-right: 0.5rem; } } diff --git a/styles/light/_light-theme.scss b/styles/light/_light-theme.scss index 39c32951ef..108ed31aea 100644 --- a/styles/light/_light-theme.scss +++ b/styles/light/_light-theme.scss @@ -1,12 +1,3 @@ -$light-bg: $gray-100; -$light-fg: $black; -$light-fg-muted: $gray-800; -$light-fg-disabled: $gray-400; -$light-form-bg: $gray-200; -$light-box-shadow: 0px 5px 20px 0px $gray-300; -$light-link-hover-color: $blue-purple-500; -$light-standout-bg: $gray-050; - // General color elements ------------------------------------------------------ .content { p code, diff --git a/template/component-footer.html.jinja b/template/component-footer.html.jinja index 3bad5ea128..60051cfa32 100644 --- a/template/component-footer.html.jinja +++ b/template/component-footer.html.jinja @@ -7,7 +7,9 @@ diff --git a/template/component-top-nav.html.jinja b/template/component-top-nav.html.jinja index bb4370cebb..e7e90cfa92 100644 --- a/template/component-top-nav.html.jinja +++ b/template/component-top-nav.html.jinja @@ -132,7 +132,7 @@

{{top_page.top_nav_blurb|default(top_page.blurb)}}

- {% else %} + {% elif top_page.top_nav_grouping is defined %}