mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2026-04-29 15:37:48 +00:00
Compare commits
9 Commits
java-crede
...
revise-tra
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d37f82ab34 | ||
|
|
3f9a2afe04 | ||
|
|
fb83c3cea5 | ||
|
|
9561262a25 | ||
|
|
b67fb1f6a0 | ||
|
|
61e7216488 | ||
|
|
9a42a41688 | ||
|
|
eb8b9b543c | ||
|
|
d28b5dbffb |
@@ -1,19 +0,0 @@
|
||||
# XRPL Dev Portal — Claude Code Instructions
|
||||
|
||||
## Quick Reference
|
||||
|
||||
- **Framework:** Redocly Realm
|
||||
- **Production branch:** `master`
|
||||
- **Local preview:** `npm start`
|
||||
|
||||
## Localization
|
||||
|
||||
- Default: `en-US`
|
||||
- Japanese: `ja`
|
||||
- Translations mirror `docs/` structure under `@l10n/<language-code>/`
|
||||
|
||||
## Navigation
|
||||
|
||||
- Update `sidebars.yaml` when adding new doc pages
|
||||
- Blog posts have a separate `blog/sidebars.yaml`
|
||||
- Redirects go in `redirects.yaml`
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"deny": [
|
||||
"Bash(git push *)"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
---
|
||||
name: generate-release-notes
|
||||
description: Generate and sort rippled release notes from GitHub commit history
|
||||
argument-hint: --from <ref> --to <ref> [--date YYYY-MM-DD] [--output <path>]
|
||||
allowed-tools: Bash, Read, Edit, Write, Grep, Glob
|
||||
effort: max
|
||||
---
|
||||
|
||||
# Generate rippled Release Notes
|
||||
|
||||
This skill generates a draft release notes blog post for a new rippled version, then sorts the entries into the correct subsections.
|
||||
|
||||
## Execution constraints
|
||||
|
||||
- **Do NOT write scripts** to sort or process the file. Prefer the Edit tool for targeted changes. Use Write only when replacing large sections that are impractical to edit incrementally.
|
||||
- **Output progress**: Before each major step (generating raw release notes, reviewing file, processing amendments, sorting entries, reformatting, cleanup), output a brief status message so the user can see progress.
|
||||
|
||||
## Step 1: Generate the raw release notes
|
||||
|
||||
Run the Python script from the repo root. Pass through all arguments from `$ARGUMENTS`:
|
||||
|
||||
```bash
|
||||
python3 tools/generate-release-notes.py $ARGUMENTS
|
||||
```
|
||||
|
||||
If the user didn't provide `--from` or `--to`, ask them for the base and target refs (tags or branches).
|
||||
|
||||
The script will:
|
||||
- Fetch the version string from `BuildInfo.cpp`
|
||||
- Fetch all commits between the two refs
|
||||
- Fetch PR details (title, link, labels, files, description) via GraphQL
|
||||
- Compare `features.macro` between refs to identify amendment changes
|
||||
- Auto-sort amendment entries into the Amendments section
|
||||
- Output all other entries as unsorted with full context
|
||||
|
||||
## Step 2: Review the generated file
|
||||
|
||||
Read the output file (path shown in script output). Note the **Full Changelog** structure:
|
||||
- **Amendments section**: Contains auto-sorted entries and an HTML comment listing which amendments to include or remove
|
||||
- **Empty subsections**: Features, Breaking Changes, Bug Fixes, Refactors, Documentation, Testing, CI/Build
|
||||
- **Unsorted entries**: After the **Bug Bounties and Responsible Disclosures** section is an unsorted list of entries with title, link, labels, files, and description for context
|
||||
|
||||
## Step 3: Process amendments
|
||||
|
||||
Handle Amendments first, before sorting other entries.
|
||||
|
||||
**3a. Process the auto-sorted Amendments subsection:**
|
||||
The HTML comment contains three lists — follow them exactly:
|
||||
- **Include**: Keep these entries.
|
||||
- **Exclude**: Remove these entries.
|
||||
- Entries on **neither** list: Remove these entries.
|
||||
|
||||
**3b. Scan unsorted entries for unreleased amendment work:**
|
||||
Search through ALL unsorted entries for titles, labels, descriptions, or files that reference amendments on the "Exclude" or "Other amendments not part of this release" lists. Remove entries that directly implement, enable, fix, or refactor these amendments. Keep entries that are general changes that merely reference the amendment as motivation — if the code change is useful on its own regardless of whether the amendment ships, keep it.
|
||||
|
||||
**3c. If you disagree with any amendment decisions, make a note to the user but do NOT deviate from the rules.**
|
||||
|
||||
## Step 4: Sort remaining unsorted entries into subsections
|
||||
|
||||
Move each remaining unsorted entry into the appropriate subsection.
|
||||
|
||||
Use these signals to categorize:
|
||||
|
||||
**Files changed** (strongest signal):
|
||||
- Only `.github/`, `CMakeLists.txt`, `conan*`, CI config files → **CI/Build**
|
||||
- Only `src/test/`, `*_test.cpp` files → **Testing**
|
||||
- Only `*.md`, `docs/` files → **Documentation**
|
||||
|
||||
**Labels** (strong signal):
|
||||
- `Bug` label → **Bug Fixes**
|
||||
|
||||
**Title prefixes** (medium signal):
|
||||
- `fix:` → **Bug Fixes**
|
||||
- `feat:` → **Features**
|
||||
- `refactor:` → **Refactors**
|
||||
- `docs:` → **Documentation**
|
||||
- `test:` → **Testing**
|
||||
- `ci:`, `build:`, `chore:` → **CI/Build**
|
||||
|
||||
**Description content** (when other signals are ambiguous):
|
||||
- Read the PR description to understand the change's purpose
|
||||
- PRs that change API behavior, remove features, or have "Breaking change" checked in their description → **Breaking Changes**
|
||||
|
||||
Additional sorting guidance:
|
||||
- Watch for revert pairs: If a PR was committed and then reverted (or vice versa), check that the net effect is accounted for — don't include both.
|
||||
|
||||
## Step 5: Reformat sorted entries
|
||||
|
||||
After sorting, reformat each entry to match the release notes style.
|
||||
|
||||
**Amendment entries** should follow this format:
|
||||
```markdown
|
||||
- **amendmentName**: Description of what the amendment does. ([#1234](https://github.com/XRPLF/rippled/pull/1234))
|
||||
```
|
||||
- Use more detail for amendment descriptions since they are the most important. Use present tense.
|
||||
- If there are multiple entries for the same amendment, merge into one, prioritizing the entry that describes the actual amendment.
|
||||
|
||||
**Feature and Breaking Change entries** should follow this format:
|
||||
```markdown
|
||||
- Description of the change. ([#1234](https://github.com/XRPLF/rippled/pull/1234))
|
||||
```
|
||||
- Keep the description concise. Use past tense.
|
||||
|
||||
**All other entries** should follow this format:
|
||||
```markdown
|
||||
- The PR title of the entry. ([#1234](https://github.com/XRPLF/rippled/pull/1234))
|
||||
```
|
||||
- Copy the PR title as-is. Only fix capitalization, remove conventional commit prefixes (fix:, feat:, ci:, refactor:, docs:, test:, chore:, build:), and adjust to past tense if needed. Do NOT rewrite, paraphrase, or summarize.
|
||||
|
||||
## Step 6: Clean up
|
||||
|
||||
- Add a short and generic description of changes to the existing `seo.description` frontmatter, e.g., "This version introduces new amendments and bug fixes." Do not create long lists of detailed changes.
|
||||
- Add a more detailed summary of the release to the existing "Introducing XRP Ledger Version X.Y.Z" section. Include amendment names (organized in a list if more than 2), featuress, and breaking changes. Limit this to 1 paragraph.
|
||||
- Do NOT delete the **Credits** or **Bug Bounties and Responsible Disclosures** sections
|
||||
- Remove empty subsections that have no entries
|
||||
- Remove all HTML comments (sorting instructions)
|
||||
- Do a final review of the release notes. If you see anything strange, or were forced to take unintuitive actions by these instructions, notify the user, but don't make changes.
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -9,7 +9,6 @@ yarn-error.log
|
||||
.venv/
|
||||
_code-samples/*/js/package-lock.json
|
||||
_code-samples/*/go/go.sum
|
||||
_code-samples/*/java/target/
|
||||
_code-samples/*/*/*[Ss]etup.json
|
||||
|
||||
# PHP
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
seo:
|
||||
description: アカウントの削除
|
||||
labels:
|
||||
- アカウント
|
||||
- Accounts
|
||||
requiredAmendment: DeletableAccounts
|
||||
txIcon: cancel
|
||||
---
|
||||
# AccountDelete
|
||||
|
||||
@@ -10,7 +12,7 @@ labels:
|
||||
|
||||
AccountDeleteトランザクションは、XRP Ledgerで[アカウント](../../ledger-data/ledger-entry-types/accountroot.md)と、アカウントが所有するオブジェクトを削除し、可能であれば、アカウントの残りのXRPを指定された送金先アカウントに送信します。アカウントを削除する要件については、[アカウントの削除](../../../../concepts/accounts/deleting-accounts.md)をご覧ください。
|
||||
|
||||
_[DeletableAccounts Amendment][]が必要です。_
|
||||
{% amendment-disclaimer name="DeletableAccounts" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
seo:
|
||||
description: XRP Ledgerのアカウントのプロパティーを修正します。
|
||||
labels:
|
||||
- アカウント
|
||||
- Accounts
|
||||
txIcon: modify
|
||||
---
|
||||
# AccountSet
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
---
|
||||
html: ammbid.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: 自動マーケットメーカーのオークションスロットに入札することで、手数料の割引を受けることができます。
|
||||
labels:
|
||||
- AMM
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: modify
|
||||
---
|
||||
# AMMBid
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMBid.cpp "Source")
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
seo:
|
||||
description: 自動マーケットメーカープールに発行済みトークンを預け入れた保有者から、トークンを回収する。
|
||||
labels:
|
||||
- AMM
|
||||
- Tokens
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMMClawback
|
||||
txIcon: cancel
|
||||
---
|
||||
# AMMClawback
|
||||
|
||||
|
||||
@@ -4,7 +4,10 @@ parent: transaction-types.html
|
||||
seo:
|
||||
description: 指定された資産ペアを取引するための新しい自動マーケットメーカーを作成します。
|
||||
labels:
|
||||
- AMM
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: create
|
||||
---
|
||||
# AMMCreate
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMCreate.cpp "Source")
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
---
|
||||
html: ammdelete.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: 空のプールを持つ自動マーケットメーカーのインスタンスを削除します。
|
||||
labels:
|
||||
- AMM
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: cancel
|
||||
---
|
||||
# AMMDelete
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMDelete.cpp "Source")
|
||||
|
||||
@@ -4,7 +4,10 @@ parent: transaction-types.html
|
||||
seo:
|
||||
description: 自動マーケットメーカーに資金を預け、LPTokenを受け取ります。
|
||||
labels:
|
||||
- AMM
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: send
|
||||
---
|
||||
# AMMDeposit
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMDeposit.cpp "Source")
|
||||
|
||||
@@ -4,7 +4,10 @@ parent: transaction-types.html
|
||||
seo:
|
||||
description: 自動マーケットメーカーインスタンスの取引手数料へ投票する。
|
||||
labels:
|
||||
- AMM
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: modify
|
||||
---
|
||||
# AMMVote
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMVote.cpp "Source")
|
||||
|
||||
@@ -4,7 +4,10 @@ parent: transaction-types.html
|
||||
seo:
|
||||
description: LPトークを自動マーケットメーカーに返却し、プールが保有する資産の一部と引き換えマス。
|
||||
labels:
|
||||
- AMM
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: send
|
||||
---
|
||||
# AMMWithdraw
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMWithdraw.cpp "Source")
|
||||
|
||||
@@ -2,15 +2,19 @@
|
||||
seo:
|
||||
description: 最大8件のトランザクションをまとめて作成・送信し、それらがすべて成功するか、すべて失敗するようにアトミックに処理されるようにします。
|
||||
labels:
|
||||
- Batch
|
||||
- Transaction Sending
|
||||
- Transaction Sending
|
||||
- Other Transactions
|
||||
requiredAmendment: Batch
|
||||
status: not_enabled
|
||||
txIcon: other
|
||||
---
|
||||
# Batch
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/Batch.cpp "Source")
|
||||
|
||||
`Batch`トランザクションは、最大8つのトランザクションを単一のバッチで送信します。各トランザクションは、4つのモード(全て成功または全て失敗(All or Nothing)、一つのみ成功(Only One)、失敗まで継続(Until Failure)、および独立実行(Independent))のいずれかでアトミックに実行されます。
|
||||
|
||||
{% amendment-disclaimer name="Batch" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
### 単一アカウントの場合
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
---
|
||||
html: checkcancel.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: 未清算のCheckを取り消し、送金を行わずにレジャーから削除します。
|
||||
labels:
|
||||
- Checks
|
||||
- Checks
|
||||
- Payments
|
||||
requiredAmendment: Checks
|
||||
txIcon: cancel
|
||||
---
|
||||
# CheckCancel
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CancelCheck.cpp "Source")
|
||||
|
||||
未清算のCheckを取り消し、送金を行わずにレジャーから削除します。Checkの送金元または送金先は、いつでもこのトランザクションタイプを使用してCheckを取り消すことができます。有効期限切れのCheckはすべてのアドレスが取り消すことができます。
|
||||
|
||||
_([Checks Amendment][]が必要です)_
|
||||
{% amendment-disclaimer name="Checks" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
---
|
||||
html: checkcash.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: レジャーでCheckオブジェクトの清算を試みます。
|
||||
labels:
|
||||
- Checks
|
||||
- Checks
|
||||
- Payments
|
||||
requiredAmendment: Checks
|
||||
txIcon: finish
|
||||
---
|
||||
# CheckCash
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CashCheck.cpp "Source")
|
||||
@@ -13,7 +14,7 @@ labels:
|
||||
|
||||
Checkに相当する資金があるとは保証されないため、送金元に十分な残高がないか、または資金を送金できるだけの十分な流動性がないことが原因で、Checkの清算が失敗することがあります。このような状況が発生した場合、Checkはレジャーに残り、送金先は後でこのCheckの換金を再試行するか、または異なる額で換金を試みることができます。
|
||||
|
||||
_([Checks Amendment][]が必要です)_
|
||||
{% amendment-disclaimer name="Checks" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
---
|
||||
html: checkcreate.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: レジャーにCheckオブジェクトを作成します
|
||||
labels:
|
||||
- Checks
|
||||
- Checks
|
||||
- Payments
|
||||
requiredAmendment: Checks
|
||||
txIcon: create
|
||||
---
|
||||
# CheckCreate
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CreateCheck.cpp "Source")
|
||||
|
||||
レジャーにCheckオブジェクトを作成します。これにより指定の送金先は後日換金することができます。このトランザクションの送信者はCheckの送金元です。
|
||||
|
||||
_([Checks Amendment][]が必要です)_
|
||||
{% amendment-disclaimer name="Checks" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
seo:
|
||||
description: 発行したトークンを取り戻します。
|
||||
labels:
|
||||
- トークン
|
||||
- Tokens
|
||||
requiredAmendment: Clawback
|
||||
txIcon: cancel
|
||||
---
|
||||
# Clawback
|
||||
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
---
|
||||
seo:
|
||||
description: アカウントに仮発行された資格情報を承認します。
|
||||
status: not_enabled
|
||||
labels:
|
||||
- Decentralized Storage
|
||||
- Credentials
|
||||
requiredAmendment: Credentials
|
||||
txIcon: finish
|
||||
---
|
||||
# CredentialAccept
|
||||
|
||||
CredentialAcceptトランザクションは資格情報を承認し、その資格情報を有効にします。資格情報の対象者のみがこの操作を実行できます。
|
||||
|
||||
{% amendment-disclaimer name="Credentials" /%}
|
||||
|
||||
## CredentialAccept JSONの例
|
||||
|
||||
```json
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
---
|
||||
seo:
|
||||
description: アカウントに対して暫定的に資格情報を発行します。
|
||||
status: not_enabled
|
||||
labels:
|
||||
- Decentralized Storage
|
||||
- Credentials
|
||||
requiredAmendment: Credentials
|
||||
txIcon: create
|
||||
---
|
||||
|
||||
# CredentialCreate
|
||||
|
||||
CredentialCreateトランザクションは、レジャーにCredentialを作成します。Credential(資格情報)の発行者はこのトランザクションを使用して、暫定的に資格情報を発行します。Credentialは、その対象アカウントが[CredentialAcceptトランザクション][]で承認するまで有効になりません。
|
||||
|
||||
{% amendment-disclaimer name="Credentials" /%}
|
||||
|
||||
## CredentialCreate JSONの例
|
||||
|
||||
```json
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
---
|
||||
seo:
|
||||
description: レジャーから認証情報を削除し、事実上失効させます。
|
||||
status: not_enabled
|
||||
labels:
|
||||
- Decentralized Storage
|
||||
- Credentials
|
||||
requiredAmendment: Credentials
|
||||
txIcon: cancel
|
||||
---
|
||||
# CredentialDelete
|
||||
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: DepositPreauthトランザクションは別のアカウントに対し、このトランザクションの送信者に支払いを送金することを事前承認します。
|
||||
labels:
|
||||
- セキュリティ
|
||||
- Accounts
|
||||
- Security
|
||||
requiredAmendment: DepositPreauth
|
||||
txIcon: modify
|
||||
---
|
||||
# DepositPreauth
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/DepositPreauth.cpp "Source")
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
---
|
||||
html: diddelete.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: DIDを削除する。
|
||||
labels:
|
||||
- DID
|
||||
- DID
|
||||
- Decentralized Storage
|
||||
requiredAmendment: DID
|
||||
txIcon: cancel
|
||||
---
|
||||
# DIDDelete
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/DID.cpp "ソース")
|
||||
|
||||
_([DID Amendment][])_
|
||||
|
||||
指定した`Account`フィールドに関連付けられている[DIDレジャーエントリ](../../ledger-data/ledger-entry-types/did.md)を削除します。
|
||||
|
||||
{% admonition type="info" name="注記" %}このトランザクションは[共通フィールド][]のみ利用します。{% /admonition %}
|
||||
|
||||
{% amendment-disclaimer name="DID" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
---
|
||||
html: didset.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: DIDを作成または更新します。
|
||||
labels:
|
||||
- DID
|
||||
- DID
|
||||
- Decentralized Storage
|
||||
requiredAmendment: DID
|
||||
txIcon: create
|
||||
---
|
||||
# DIDSet
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/DID.cpp "ソース")
|
||||
|
||||
_([DID Amendment][])_
|
||||
|
||||
新しい[DIDレジャーエントリ](../../ledger-data/ledger-entry-types/did.md)を作成したり、既存の項目を更新したりします。
|
||||
|
||||
{% amendment-disclaimer name="DID" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Escrowに留保されているXRPを送金元に返金します。
|
||||
labels:
|
||||
- Escrow
|
||||
- Payments
|
||||
requiredAmendment: Escrow
|
||||
txIcon: cancel
|
||||
---
|
||||
# EscrowCancel
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/Escrow.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Escrowプロセスが終了または取り消されるまでXRPを隔離します。
|
||||
labels:
|
||||
- Escrow
|
||||
- Payments
|
||||
requiredAmendment: Escrow
|
||||
txIcon: create
|
||||
---
|
||||
# EscrowCreate
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/Escrow.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: エスクローされたXRPを受取人へ送金します。
|
||||
labels:
|
||||
- Escrow
|
||||
- Payments
|
||||
requiredAmendment: Escrow
|
||||
txIcon: finish
|
||||
---
|
||||
# EscrowFinish
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/Escrow.cpp "Source")
|
||||
|
||||
@@ -1,22 +1,40 @@
|
||||
---
|
||||
html: transaction-types.html
|
||||
parent: transaction-formats.html
|
||||
seo:
|
||||
description: トランザクションのタイプは、どういったタイプの操作を実行することが想定されているのかを示します。
|
||||
metadata:
|
||||
indexPage: true
|
||||
indexPage: true
|
||||
labels:
|
||||
- ブロックチェーン
|
||||
- ブロックチェーン
|
||||
---
|
||||
# トランザクションのタイプ
|
||||
|
||||
トランザクションのタイプ(`TransactionType`フィールド)は、トランザクションに関する最も基本的な情報です。トランザクションで、どういったタイプの操作を実行することが想定されているのかを示します。
|
||||
トランザクションのタイプ(`TransactionType`フィールド)は、どういったタイプの操作を実行することが想定されているのかを示します。すべてのトランザクションに、[共通フィールド](../common-fields.md)が含まれています。
|
||||
|
||||
すべてのトランザクションに、特定の共通フィールドが含まれています。
|
||||
## アカウント
|
||||
|
||||
* [共通フィールド](../common-fields.md)
|
||||
{% tx-category name="Accounts" /%}
|
||||
|
||||
トランザクションのタイプごとに、実行される操作のタイプに関連した追加のフィールドが含まれています。
|
||||
## 支払い
|
||||
|
||||
{% tx-category name="Payments" /%}
|
||||
|
||||
## トークン
|
||||
|
||||
{% tx-category name="Tokens" /%}
|
||||
|
||||
## 分散型取引所(DEX)
|
||||
|
||||
{% tx-category name="DEX" /%}
|
||||
|
||||
## 分散型ストレージ
|
||||
|
||||
{% tx-category name="Decentralized Storage" /%}
|
||||
|
||||
## XRPLサイドチェーン
|
||||
|
||||
{% tx-category name="Interoperability" /%}
|
||||
|
||||
## その他
|
||||
|
||||
{% tx-category name="Other Transactions" /%}
|
||||
|
||||
{% child-pages /%}
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
seo:
|
||||
description: アカウントが特定のMPTの残高を保持することを許可します。
|
||||
labels:
|
||||
- Multi-Purpose Token, MPT
|
||||
- Multi-purpose Tokens, MPTs
|
||||
- Tokens
|
||||
requiredAmendment: MPTokensV1
|
||||
txIcon: modify
|
||||
---
|
||||
|
||||
# MPTokenAuthorize
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp "ソース")
|
||||
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: 新しいMulti-Purpose Tokenを発行します。
|
||||
labels:
|
||||
- Multi-Purpose Token, MPT
|
||||
- Multi-purpose Tokens, MPTs
|
||||
- Tokens
|
||||
requiredAmendment: MPTokensV1
|
||||
txIcon: create
|
||||
---
|
||||
|
||||
# MPTokenIssuanceCreate
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: Multi-Purpose Tokenを削除します。
|
||||
labels:
|
||||
- Multi-Purpose Token, MPT
|
||||
- Multi-purpose Tokens, MPTs
|
||||
- Tokens
|
||||
requiredAmendment: MPTokensV1
|
||||
txIcon: cancel
|
||||
---
|
||||
# MPTokenIssuanceDestroy
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp "ソース")
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: MPTの変更可能なプロパティを設定します。
|
||||
labels:
|
||||
- Multi-Purpose Token, MPT
|
||||
- Multi-purpose Tokens, MPTs
|
||||
- Tokens
|
||||
requiredAmendment: MPTokensV1
|
||||
txIcon: modify
|
||||
---
|
||||
# MPTokenIssuanceSet
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp "ソース")
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
seo:
|
||||
description: NFTokenの購入または売却のオファーを受け入れる。
|
||||
labels:
|
||||
- NFT, 非代替性トークン
|
||||
- Non-fungible Tokens, NFTs
|
||||
- Tokens
|
||||
- DEX
|
||||
requiredAmendment: NonFungibleTokensV1_1
|
||||
txIcon: finish
|
||||
---
|
||||
# NFTokenAcceptOffer
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp "ソース")
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
---
|
||||
html: nftokenburn.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: TokenBurnを使用して、NFTを永久に破棄します。
|
||||
labels:
|
||||
- 非代替性トークン, NFT
|
||||
- Non-fungible Tokens, NFTs
|
||||
- Tokens
|
||||
requiredAmendment: NonFungibleTokensV1_1
|
||||
txIcon: cancel
|
||||
---
|
||||
# NFTokenBurn
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
---
|
||||
html: nftokencanceloffer.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: NFTokenの売買のための既存のトークンへのオファーをキャンセルする。
|
||||
labels:
|
||||
- NFT, 非代替性トークン
|
||||
- Non-fungible Tokens, NFTs
|
||||
- Tokens
|
||||
- DEX
|
||||
requiredAmendment: NonFungibleTokensV1_1
|
||||
txIcon: cancel
|
||||
---
|
||||
# NFTokenCancelOffer
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp "ソース")
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
---
|
||||
html: nftokencreateoffer.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: NFTの売買のオファーを作成する。
|
||||
labels:
|
||||
- 非代替性トークン, NFT
|
||||
- Non-fungible Tokens, NFTs
|
||||
- Tokens
|
||||
- DEX
|
||||
requiredAmendment: NonFungibleTokensV1_1
|
||||
txIcon: create
|
||||
---
|
||||
# NFTokenCreateOffer
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp "ソース")
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: NFTokenMintを使用して新規NFTを発行する。
|
||||
labels:
|
||||
- 非代替性トークン, NFT
|
||||
- Non-fungible Tokens, NFTs
|
||||
- Tokens
|
||||
requiredAmendment: NonFungibleTokensV1_1
|
||||
txIcon: create
|
||||
---
|
||||
# NFTokenMint
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/NFTokenMint.cpp "Source")
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
seo:
|
||||
description: ダイナミックNFTを変更します。
|
||||
labels:
|
||||
- 非代替性トークン, トークン, NFT
|
||||
title:
|
||||
- NFTokenModify
|
||||
- Non-fungible Tokens, NFTs
|
||||
- Tokens
|
||||
requiredAmendment: DynamicNFT
|
||||
txIcon: modify
|
||||
---
|
||||
# NFTokenModify
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/NFTokenModify.cpp "ソース")
|
||||
|
||||
`NFTokenModify`は、NFTの`URI`フィールドを別のURIに変更し、NFTのサポートデータを更新するために使用されます。NFTは、`tfMutable`フラグが設定された状態でミントされている必要があります。[ダイナミックNFT](../../../../concepts/tokens/nfts/dynamic-nfts.md)をご覧ください。
|
||||
|
||||
{% amendment-disclaimer name="DynamicNFT" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %} JSONの例
|
||||
|
||||
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
html: offercancel.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: XRP LedgerからOfferオブジェクトを削除します。
|
||||
description: 分散型取引所からオファーを削除します。
|
||||
labels:
|
||||
- 分散型取引所
|
||||
- DEX
|
||||
txIcon: cancel
|
||||
---
|
||||
# OfferCancel
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CancelOffer.cpp "Source")
|
||||
|
||||
OfferCancelトランザクションは、XRP LedgerからOfferオブジェクトを削除します。
|
||||
[分散型取引所](../../../../concepts/tokens/decentralized-exchange/index.md)からオファーを削除します。
|
||||
|
||||
## {% $frontmatter.seo.title %}のJSONの例
|
||||
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
seo:
|
||||
description: 通貨交換の注文を作成します。
|
||||
labels:
|
||||
- 分散型取引所
|
||||
- DEX
|
||||
txIcon: create
|
||||
---
|
||||
# OfferCreate
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CreateOffer.cpp "ソース")
|
||||
|
||||
OfferCreateトランザクションは[分散型取引所](../../../../concepts/tokens/decentralized-exchange/index.md)で[注文](../../../../concepts/tokens/decentralized-exchange/offers.md)を作成します。
|
||||
|
||||
@@ -2,15 +2,17 @@
|
||||
seo:
|
||||
description: 既存の価格オラクルを削除します。
|
||||
labels:
|
||||
- オラクル
|
||||
- Oracle
|
||||
- Decentralized Storage
|
||||
requiredAmendment: PriceOracle
|
||||
txIcon: cancel
|
||||
---
|
||||
# OracleDelete
|
||||
_([PriceOracle Amendment][])_
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/DeleteOracle.cpp "ソース")
|
||||
|
||||
既存の`Oracle`レジャーエントリを削除します。
|
||||
|
||||
{% amendment-disclaimer name="PriceOracle" /%}
|
||||
|
||||
## OracleDeleteのJSONの例
|
||||
|
||||
|
||||
@@ -2,15 +2,17 @@
|
||||
seo:
|
||||
description: 価格オラクルを作成または更新します。
|
||||
labels:
|
||||
- オラクル
|
||||
- Oracle
|
||||
- Decentralized Storage
|
||||
requiredAmendment: PriceOracle
|
||||
txIcon: create
|
||||
---
|
||||
# OracleSet
|
||||
_([PriceOracle Amendment][])_
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/SetOracle.cpp "ソース")
|
||||
|
||||
Oracle Document ID を使用して、新しい`Oracle`レジャーエントリを作成するか、既存のフィールドを更新します。
|
||||
|
||||
{% amendment-disclaimer name="PriceOracle" /%}
|
||||
|
||||
## OracleSetのJSONの例
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
---
|
||||
seo:
|
||||
description: アカウント間での価値の移動します。
|
||||
description: アカウント間での価値の移動します、またはアカウントを作成する。
|
||||
labels:
|
||||
- 支払い
|
||||
- XRP
|
||||
- クロスカレンシー
|
||||
- トークン
|
||||
- Accounts
|
||||
- Payments
|
||||
- XRP
|
||||
- Cross-Currency
|
||||
txIcon: send
|
||||
---
|
||||
# Payment
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/Payment.cpp "ソース")
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: Payment Channelに対しXRPを請求します。
|
||||
labels:
|
||||
- Payment Channel
|
||||
- Payment Channels
|
||||
- Payments
|
||||
requiredAmendment: PayChan
|
||||
txIcon: finish
|
||||
---
|
||||
# PaymentChannelClaim
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/PayChan.cpp "Source")
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: 新しいペイメントチャネルを作成します。
|
||||
labels:
|
||||
- Payment Channel
|
||||
- Payment Channels
|
||||
- Payments
|
||||
requiredAmendment: PayChan
|
||||
txIcon: create
|
||||
---
|
||||
# PaymentChannelCreate
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/PayChan.cpp "ソース")
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
seo:
|
||||
description: Payment ChannelにXRPを追加します。
|
||||
labels:
|
||||
- Payment Channel
|
||||
- Payment Channels
|
||||
- Payments
|
||||
requiredAmendment: PayChan
|
||||
txIcon: modify
|
||||
---
|
||||
# PaymentChannelFund
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/PayChan.cpp "Source")
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
seo:
|
||||
description: 許可型ドメインのレジャーエントリを削除する
|
||||
labels:
|
||||
- コンプライアンス
|
||||
- 許可型ドメイン
|
||||
- Compliance
|
||||
- Permissioned Domains
|
||||
- Decentralized Storage
|
||||
requiredAmendment: PermissionedDomains
|
||||
txIcon: cancel
|
||||
---
|
||||
# PermissionedDomainDelete
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp "ソース")
|
||||
|
||||
所有する[許可型ドメイン][]を削除します。
|
||||
|
||||
_([PermissionedDomains amendment][]が必要です {% not-enabled /%})_
|
||||
{% amendment-disclaimer name="PermissionedDomains" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %}のJSONの例
|
||||
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
seo:
|
||||
description: 許可型ドメインを作成または更新する
|
||||
labels:
|
||||
- コンプライアンス
|
||||
- 許可型ドメイン
|
||||
- Compliance
|
||||
- Permissioned Domains
|
||||
- Decentralized Storage
|
||||
requiredAmendment: PermissionedDomains
|
||||
txIcon: create
|
||||
---
|
||||
# PermissionedDomainSet
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp "ソース")
|
||||
|
||||
[許可型ドメイン][]を作成するか、所有するドメインを変更します。
|
||||
|
||||
_([PermissionedDomains amendment][]が必要です {% not-enabled /%})_
|
||||
{% amendment-disclaimer name="PermissionedDomains" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %}のJSONの例
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
html: setregularkey.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: アカウントに関連付けられているレギュラーキーペアの割り当て、変更、削除を行います。
|
||||
labels:
|
||||
- セキュリティ
|
||||
- Security
|
||||
- Accounts
|
||||
txIcon: modify
|
||||
---
|
||||
# SetRegularKey
|
||||
|
||||
@@ -29,7 +29,6 @@ labels:
|
||||
{% tx-example txid="6AA6F6EAAAB56E65F7F738A9A2A8A7525439D65BA990E9BA08F6F4B1C2D349B4" /%}
|
||||
|
||||
{% raw-partial file="/@l10n/ja/docs/_snippets/tx-fields-intro.md" /%}
|
||||
<!--{# fix md highlighting_ #}-->
|
||||
|
||||
| フィールド | JSONの型 | [内部の型][] | 説明 |
|
||||
|:-------------|:----------|:------------------|:------------------------------|
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
---
|
||||
html: signerlistset.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: トランザクションのマルチシグに使用できる署名者のリストを作成、置換、削除します。
|
||||
labels:
|
||||
- セキュリティ
|
||||
- Security
|
||||
- Accounts
|
||||
requiredAmendment: MultiSign
|
||||
txIcon: modify
|
||||
---
|
||||
# SignerListSet
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/SetSignerList.cpp "ソース")
|
||||
|
||||
SignerListSetトランザクションは、トランザクションの[マルチシグ](../../../../concepts/accounts/multi-signing.md)に使用できる署名者のリストを作成、置換、削除します。このトランザクションタイプは[MultiSign Amendment][]により導入されました。
|
||||
|
||||
{% amendment-disclaimer name="MultiSign" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %}のJSONの例
|
||||
|
||||
```json
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
---
|
||||
html: ticketcreate.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: チケットとして1つ以上のシーケンス番号を確保する。
|
||||
labels:
|
||||
- Transaction Sending
|
||||
- Transaction Sending
|
||||
- Accounts
|
||||
requiredAmendment: TicketBatch
|
||||
txIcon: create
|
||||
---
|
||||
# TicketCreate
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CreateTicket.cpp "Source")
|
||||
|
||||
_([TicketBatch amendment][]が必要です)_
|
||||
|
||||
TicketCreateトランザクションは、1つまたは複数の[シーケンス番号](../../data-types/basic-data-types.md#アカウントシーケンス)を[Tickets](../../ledger-data/ledger-entry-types/ticket.md)として確保します。
|
||||
|
||||
{% amendment-disclaimer name="TicketBatch" /%}
|
||||
|
||||
## {% $frontmatter.seo.title %}JSONの例
|
||||
|
||||
```json
|
||||
@@ -28,9 +28,6 @@ TicketCreateトランザクションは、1つまたは複数の[シーケンス
|
||||
|
||||
{% tx-example txid="738AEF36B48CA4A2D85C2B74910DC34DDBBCA4C83643F2DB84A58785ED5AD3E3" /%}
|
||||
|
||||
{% raw-partial file="/@l10n/ja/docs/_snippets/tx-fields-intro.md" /%}
|
||||
<!--{# fix md highlighting_ #}-->
|
||||
|
||||
| フィールド | JSONの型 | [内部の型][] | 説明 |
|
||||
|:-----------------|:-----------------|:------------------|:-------------------|
|
||||
| `TicketCount` | 数値 | UInt32 | 作成するチケットの枚数。これは正の数でなければならず、このトランザクションの実行の結果、アカウントが250枚以上のチケットを所有することはできません。 |
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
---
|
||||
html: trustset.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: トラストラインを作成または変更します。
|
||||
labels:
|
||||
- トークン
|
||||
- Tokens
|
||||
txIcon: modify
|
||||
---
|
||||
# TrustSet
|
||||
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/SetTrust.cpp "Source")
|
||||
|
||||
2つのアカウントをリンクする[トラストライン](../../../../concepts/tokens/fungible-tokens/index.md)を作成または変更します。
|
||||
|
||||
@@ -1,23 +1,20 @@
|
||||
---
|
||||
html: xchainaccountcreatecommit.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: ブリッジが接続するチェーンの一つでアカウントを作成します。このアカウントがそのチェーンのブリッジの入り口となります。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: create
|
||||
---
|
||||
# XChainAccountCreateCommit
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L466-L474 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
このトランザクションはXRP-XRPブリッジにのみ使用できます。
|
||||
|
||||
`XChainAccountCreateCommit`トランザクションは、発行チェーンにトランザクションを送信するために、Witnessサーバ用の新しいアカウントを作成します。
|
||||
発行チェーンにトランザクションを送信するために、Witnessサーバ用の新しいアカウントを作成します。このトランザクションはXRP-XRPブリッジにのみ使用できます。
|
||||
|
||||
{% admonition type="warning" name="注意" %}このトランザクションは、Witnessの証明書が送信先チェーンに確実に送信される場合にのみ実行されるべきです。署名が送信されない場合、証明書が受信されるまでアカウント作成はブロックされます。XRP-XRPブリッジでこのトランザクションを無効にするには、ブリッジの`MinAccountCreateAmount`フィールドを省略します。{% /admonition %}
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainAccountCreateCommit JSONの例
|
||||
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
---
|
||||
html: xchainaddaccountcreateattestation.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: XChainAddAccountCreateAttestationトランザクションは他のチェーンでXChainAccountCreateCommitトランザクションが発生した証明をWitnessサーバから提示します。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: create
|
||||
---
|
||||
# XChainAddAccountCreateAttestation
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L447-L464 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainAddAccountCreateAttestation`トランザクションは、`XChainAccountCreateCommit`トランザクションがもう一方のチェーンで発生したというWitnessサーバからの証明を提示します。
|
||||
`XChainAccountCreateCommit`トランザクションがもう一方のチェーンで発生したというWitnessサーバからの証明を提示します。
|
||||
|
||||
この署名は署名が提供された時点のドアの署名者リストにある鍵の一つでなければなりません。署名が提出されてから定足数に達するまでの間に署名者リストが変更された場合、新しい署名セットが使用され、現在収集されている署名の一部が削除される可能性があります。
|
||||
|
||||
@@ -20,6 +18,7 @@ _([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
{% admonition type="info" name="注記" %}報酬は現在のリストにある鍵を持っているアカウントにのみ送られます。署名者の定足数は`SignatureReward`に一致する必要があります。より大きな報酬を得ようとして、一つのWitnessサーバがこの値に不正な値を指定することはできません。{% /admonition %}
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainAddAccountCreateAttestation JSONの例
|
||||
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
---
|
||||
html: xchainaddclaimattestation.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: 送信元チェーンで発生したイベントを、送信先チェーンに証明(アテスト)します。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: modify
|
||||
---
|
||||
# XChainAddClaimAttestation
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L429-L445 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainAddClaimAttestation`トランザクションは`XChainCommit`トランザクションを証明するWitnessサーバの署名を提供します。
|
||||
`XChainCommit`トランザクションを証明するWitnessサーバの署名を提供します。
|
||||
|
||||
この署名は、署名が提出された時点のドアの署名者リストにある鍵の一つでなければなりません。ただし、署名が提出されてから定足数に達するまでの間に署名者リストが変更された場合は、新しい署名セットが使用され、現在収集されている署名の一部が削除されることがあります。
|
||||
|
||||
@@ -20,6 +18,7 @@ _([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
{% admonition type="info" name="注記" %}報酬は現在のリストにある鍵を持っているアカウントにのみ送られます。署名者の定足数は`SignatureReward`に一致する必要があります。より大きな報酬を得ようとして、一つのWitnessサーバがこの値に不正な値を指定することはできません。{% /admonition %}
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainAddClaimAttestation JSONの例
|
||||
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
---
|
||||
html: xchainclaim.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: 送信先チェーンで金額を請求することで、クロスチェーンでの価値移転を完了させます。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: finish
|
||||
---
|
||||
# XChainClaim
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L418-L427 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainClaim`トランザクションはクロスチェーンでの価値の移転を完了させます。`XChainClaim`トランザクションにより、ユーザは送信元チェーンでロックされた価値と同等の価値を送信先チェーンで請求することができます。ユーザは、送金元チェーンでロックされた価値に関連付けられたクロスチェーン請求ID(`Account`フィールド)を所有している場合にのみ、その価値を請求することができます。ユーザは誰にでも資金を送ることができます(`Destination`フィールド)。このトランザクションが必要になるのは`XChainCommit`トランザクションで`OtherChainDestination`が指定されていない場合、または自動送金で何か問題が発生した場合のみです。
|
||||
|
||||
トランザクションによって送金に成功すると、対象の`XChainOwnedClaimID`レジャーオブジェクトは削除されます。これはトランザクションのリプレイを防ぎます。トランザクションが失敗した場合、`XChainOwnedClaimID`は削除されず、異なるパラメータでトランザクションを再実行できます。
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainClaim JSONの例
|
||||
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
---
|
||||
html: xchaincommit.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: クロスチェーンでの価値移転を開始します。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: send
|
||||
---
|
||||
# XChainCommit
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L408-L416 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainCommit`はクロスチェーン送金の2番目のステップです。`XChainCommit`は発行チェーンでラップできるようにロックチェーンで資産を保管したり、ロックチェーンで返却できるように発行チェーンでラップされた資産をバーンしたりします。
|
||||
クロスチェーン送金の2番目のステップです。`XChainCommit`は発行チェーンでラップできるようにロックチェーンで資産を保管したり、ロックチェーンで返却できるように発行チェーンでラップされた資産をバーンしたりします。
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainCommit JSONの例
|
||||
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
---
|
||||
html: xchaincreatebridge.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: 2つのチェーン間にブリッジを作成します。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: create
|
||||
---
|
||||
# XChainCreateBridge
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L381-L388 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainCreateBridge`トランザクションは新しい`Bridge`レジャーオブジェクトを作成し、トランザクショ ンが送信されたチェーン上に新しいクロスチェーンブリッジの入り口を定義します。これにはブリッジのドアアカウントと資産に関する情報が含まれます。
|
||||
新しい`Bridge`レジャーオブジェクトを作成し、トランザクショ ンが送信されたチェーン上に新しいクロスチェーンブリッジの入り口を定義します。これにはブリッジのドアアカウントと資産に関する情報が含まれます。
|
||||
|
||||
このトランザクションは、ロックチェーンのドアアカウントが最初に送信する必要があります。有効なブリッジをセットアップするには、Witnessサーバのセットアップに加えて、両チェーンのドアアカウントがこのトランザクションを送信しなければなりません。
|
||||
|
||||
@@ -20,6 +18,7 @@ _([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
{% admonition type="info" name="注記" %}各ドアアカウントは1つのブリッジしか持つことができません。これにより、同じ資産に対して複数のブリッジが作成され、いずれかのチェーンで資産が不一致となるのを防ぐことができます。{% /admonition %}
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainCreateBridge JSONの例
|
||||
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
---
|
||||
html: xchaincreateclaimid.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: クロスチェーン送金に使用するクロスチェーン請求IDを作成します。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: create
|
||||
---
|
||||
# XChainCreateClaimID
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L399-L406 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainCreateClaimID`トランザクションはクロスチェーン送金に使われる新しいクロスチェーン請求IDを作成します。クロスチェーン請求IDは*1つの*クロスチェーン送金を表します。
|
||||
|
||||
このトランザクションはクロスチェーン送金の最初のステップであり、送金元チェーンではなく、送金先チェーンで送信されます。
|
||||
|
||||
また、送金元チェーン上の資金をロックまたはバーンする送金元チェーン上のアカウントも含まれます。
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainCreateClaimID JSONの例
|
||||
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
---
|
||||
html: xchainmodifybridge.html
|
||||
parent: transaction-types.html
|
||||
seo:
|
||||
description: ブリッジの設定を変更します。
|
||||
labels:
|
||||
- 相互運用性
|
||||
- Interoperability
|
||||
requiredAmendment: XChainBridge
|
||||
status: not_enabled
|
||||
txIcon: modify
|
||||
---
|
||||
# XChainModifyBridge
|
||||
[[ソース]](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/impl/TxFormats.cpp#L390-L397 "ソース")
|
||||
|
||||
_([XChainBridge Amendment][] {% not-enabled /%} が必要です)_
|
||||
|
||||
`XChainModifyBridge`トランザクションでは、ブリッジ管理者がブリッジの設定を変更することができます。変更できるのは`SignatureReward`と`MinAccountCreateAmount`だけです。
|
||||
|
||||
このトランザクションはドアアカウントから送信される必要があり、Witnessサーバを管理するエンティティがこのトランザクションのために協調し、署名を提供する必要があります。この調整はレジャーの外部で行われます。
|
||||
|
||||
{% admonition type="info" name="注記" %}このトランザクションでブリッジの署名者リストを変更することはできません。署名者リストはドアアカウント自体にあり、署名者リストがアカウント上で変更されるのと同じ方法で変更されます(`SignerListSet`トランザクションを利用)。{% /admonition %}
|
||||
|
||||
{% amendment-disclaimer name="XChainBridge" /%}
|
||||
|
||||
## XChainModifyBridge JSONの例
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// Components related to XRPL Amendment previews and statuses
|
||||
|
||||
import * as React from 'react'
|
||||
import { Link } from '@redocly/theme/components/Link/Link'
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks'
|
||||
|
||||
26
@theme/components/ChildPages.tsx
Normal file
26
@theme/components/ChildPages.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
// Component for {% child-pages /%} markdoc tag.
|
||||
// Return a list of children of the current page.
|
||||
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks'
|
||||
import { Link } from '@redocly/theme/components/Link/Link'
|
||||
import NotEnabled from './NotEnabled'
|
||||
|
||||
export default function ChildPages() {
|
||||
const { usePageSharedData } = useThemeHooks()
|
||||
const data = usePageSharedData('index-page-items') as any[]
|
||||
return (
|
||||
<div className="children-display">
|
||||
<ul>
|
||||
{data?.map((item: any) => (
|
||||
<li className="level-1" key={item.slug}>
|
||||
<Link to={item.slug}>{item.title}</Link>
|
||||
{
|
||||
item.status === "not_enabled" ? (<NotEnabled />) : ""
|
||||
}
|
||||
<p className="blurb child-blurb">{item.seo?.description}</p>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
11
@theme/components/CodePageName.tsx
Normal file
11
@theme/components/CodePageName.tsx
Normal file
@@ -0,0 +1,11 @@
|
||||
// Component for {% code-page-name /%} Markdoc tag.
|
||||
// Returns the current page title in monospace (code) font.
|
||||
// Useful in includes / templates that may be reused across pages.
|
||||
|
||||
export default function CodePageName(props: {
|
||||
name: string
|
||||
}) {
|
||||
return (
|
||||
<code>{props.name}</code>
|
||||
)
|
||||
}
|
||||
45
@theme/components/InteractiveBlock.tsx
Normal file
45
@theme/components/InteractiveBlock.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
// Component for {% interactive-block %} markdoc tag. Used in legacy interactive
|
||||
// tutorials; not recommended for new tutorials.
|
||||
|
||||
import * as React from 'react'
|
||||
import { useLocation } from 'react-router-dom'
|
||||
import dynamicReact from '@markdoc/markdoc/dist/react'
|
||||
import { idify } from '../helpers'
|
||||
|
||||
export default function InteractiveBlock(props: {
|
||||
children: React.ReactNode
|
||||
label: string
|
||||
steps: string[]
|
||||
}) {
|
||||
const stepId = idify(props.label)
|
||||
const { pathname } = useLocation()
|
||||
|
||||
return (
|
||||
// add key={pathname} to ensure old step state gets rerendered on page navigation
|
||||
<div className="interactive-block" id={'interactive-' + stepId} key={pathname}>
|
||||
<div className="interactive-block-inner">
|
||||
<div className="breadcrumbs-wrap">
|
||||
<ul
|
||||
className="breadcrumb tutorial-step-crumbs"
|
||||
id={'bc-ul-' + stepId}
|
||||
data-steplabel={props.label}
|
||||
data-stepid={stepId}
|
||||
>
|
||||
{props.steps?.map((step, idx) => {
|
||||
const iterStepId = idify(step).toLowerCase()
|
||||
let className = `breadcrumb-item bc-${iterStepId}`
|
||||
if (idx > 0) className += ' disabled'
|
||||
if (iterStepId === stepId) className += ' current'
|
||||
return (
|
||||
<li className={className} key={iterStepId}>
|
||||
<a href={`#interactive-${iterStepId}`}>{step}</a>
|
||||
</li>
|
||||
)
|
||||
})}
|
||||
</ul>
|
||||
</div>
|
||||
<div className="interactive-block-ui">{dynamicReact(props.children, React, {})}</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import React from 'react';
|
||||
// Replaces Redocly's built-in language picker with our custom language picker component.
|
||||
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { DropdownMenu } from '@redocly/theme/components/Dropdown/DropdownMenu';
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import * as React from "react";
|
||||
// Replaces the top navbar with our custom XRPL.org top navbar
|
||||
|
||||
import React from 'react'
|
||||
import { useThemeConfig, useThemeHooks } from "@redocly/theme/core/hooks";
|
||||
import { LanguagePicker } from "@redocly/theme/components/LanguagePicker/LanguagePicker";
|
||||
import { slugify } from "../../helpers";
|
||||
|
||||
14
@theme/components/NotEnabled.tsx
Normal file
14
@theme/components/NotEnabled.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
// Component for {% not-enabled /%} markdoc tag. Shows a flask icon with a
|
||||
// tooltip so you can indicate that a feature is not enabled on the
|
||||
// XRP Ledger Mainnet. Legacy usage, mostly; prefer {% amendment-disclaimer %}
|
||||
// for most cases.
|
||||
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks'
|
||||
|
||||
export default function NotEnabled() {
|
||||
const { useTranslate } = useThemeHooks()
|
||||
const { translate } = useTranslate()
|
||||
return (
|
||||
<span className="status not_enabled" title={translate("This feature is not currently enabled on the production XRP Ledger.")}><i className="fa fa-flask"></i></span>
|
||||
)
|
||||
}
|
||||
22
@theme/components/RepoLink.tsx
Normal file
22
@theme/components/RepoLink.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
// Create a link into the source code repository for this project.
|
||||
// This is supposed to adjust so that PR builds use the branch+fork of the PR,
|
||||
// but that part wasn't implemented for Redocly builds.
|
||||
|
||||
import * as React from 'react'
|
||||
import dynamicReact from '@markdoc/markdoc/dist/react'
|
||||
import { Link } from '@redocly/theme/components/Link/Link'
|
||||
|
||||
export default function RepoLink(props: {
|
||||
children: React.ReactNode
|
||||
path: string
|
||||
github_fork: string
|
||||
github_branch: string
|
||||
}) {
|
||||
const treeblob = props.path.indexOf(".") >= 0 ? "blob/" : "tree/"
|
||||
const sep = props.github_fork[-1] == "/" ? "" : "/"
|
||||
const href = props.github_fork+sep+treeblob+props.github_branch+"/"+props.path
|
||||
|
||||
return (
|
||||
<Link to={href}>{dynamicReact(props.children, React, {})}</Link>
|
||||
)
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
// This component replaces the default Redocly Tabs functionality.
|
||||
// Original Tabs styling is preserved, but this adds full-page tab
|
||||
// Replaces Redocly's built-in {% tabs %} component.
|
||||
// Uses the existing Tabs styling, but adds full-page tab
|
||||
// switching and preserves tab preferences between pages.
|
||||
|
||||
import React, { useRef, useState, useEffect, useCallback, useMemo } from 'react'
|
||||
|
||||
64
@theme/components/TxRefs.tsx
Normal file
64
@theme/components/TxRefs.tsx
Normal file
@@ -0,0 +1,64 @@
|
||||
// Component for {% tx-category %} Markdoc tag. Shows a list (table?) of child pages
|
||||
// with the matching labels in the frontmatter.
|
||||
// Requires the index-pages Redocly plugin to get child page data.
|
||||
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks'
|
||||
import { Link } from '@redocly/theme/components/Link/Link'
|
||||
import { AmendmentDisclaimer } from './Amendments'
|
||||
|
||||
interface TxCategoryProps {
|
||||
name: string,
|
||||
}
|
||||
|
||||
export function TxCategory(props: TxCategoryProps) {
|
||||
const { usePageSharedData } = useThemeHooks()
|
||||
const data = usePageSharedData('index-page-items') as any[]
|
||||
const matchingItems = data?.filter( (page) => {
|
||||
if (page.labels && page.labels.includes(props.name)) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
return (
|
||||
<div className="tx-type-list">
|
||||
{
|
||||
matchingItems?.map((item: any) => (
|
||||
<TxTypeLink key={item.slug} page={item} />
|
||||
))
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
const txIcons = {
|
||||
"create": require('../../static/img/tx-icons/TransactionCreateIcon.svg'),
|
||||
"modify": require('../../static/img/tx-icons/TransactionModifyIcon.svg'),
|
||||
"finish": require('../../static/img/tx-icons/TransactionFinishIcon.svg'),
|
||||
"cancel": require('../../static/img/tx-icons/TransactionCancelIcon.svg'),
|
||||
"send": require('../../static/img/tx-icons/TransactionSendIcon.svg'),
|
||||
"other": require('../../static/img/tx-icons/TransactionUnknownIcon.svg'),
|
||||
}
|
||||
|
||||
function TxTypeLink(props: {page: any}) {
|
||||
const page = props.page
|
||||
let txIcon = txIcons["other"]
|
||||
if (page.txIcon && txIcons[page.txIcon.toLowerCase()]) {
|
||||
txIcon = txIcons[page.txIcon]
|
||||
}
|
||||
return (
|
||||
<div className="tx-type">
|
||||
<Link to={page.slug} className="tx-title"><img className="tx-type-icon" src={txIcon} alt="" /> {page.title}</Link>
|
||||
{
|
||||
page.requiredAmendment &&
|
||||
<div className="required-amendment">
|
||||
Requires: <AmendmentDisclaimer name={page.requiredAmendment} compact={true} mode="" />
|
||||
</div>
|
||||
}
|
||||
{
|
||||
page.seo?.description &&
|
||||
<div className="tx-desc">{page.seo.description}</div>
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
58
@theme/components/WSToolButtons.tsx
Normal file
58
@theme/components/WSToolButtons.tsx
Normal file
@@ -0,0 +1,58 @@
|
||||
import { Link } from '@redocly/theme/components/Link/Link'
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks'
|
||||
|
||||
type TryItServer = 's1' | 's2' | 'xrplcluster' | 'testnet' | 'devnet' | 'testnet-clio' | 'devnet-clio'
|
||||
|
||||
export function TryIt(props: {
|
||||
method: string,
|
||||
server?: TryItServer
|
||||
}) {
|
||||
const { useTranslate } = useThemeHooks()
|
||||
const { translate } = useTranslate()
|
||||
let use_server = ""
|
||||
if (props.server == "s1") {
|
||||
use_server = "?server=wss%3A%2F%2Fs1.ripple.com%2F"
|
||||
} else if (props.server == "s2") {
|
||||
use_server = "?server=wss%3A%2F%2Fs2.ripple.com%2F"
|
||||
} else if (props.server == "xrplcluster") {
|
||||
use_server = "?server=wss%3A%2F%2Fxrplcluster.com%2F"
|
||||
} else if (props.server == 'devnet') {
|
||||
use_server = "?server=wss%3A%2F%2Fs.devnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'testnet') {
|
||||
use_server = "?server=wss%3A%2F%2Fs.altnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'testnet-clio') {
|
||||
use_server = "?server=wss%3A%2F%2Fclio.altnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'devnet-clio') {
|
||||
use_server = "?server=wss%3A%2F%2Fclio.devnet.rippletest.net%3A51233%2F"
|
||||
}
|
||||
const to_path = `/resources/dev-tools/websocket-api-tool${use_server}#${props.method}`
|
||||
return (
|
||||
<Link style={{marginBottom: "1rem", textDecoration: "none"}} className="btn btn-primary btn-arrow" to={to_path} target="_blank" role="button">{translate("component.tryit", "Try it!")}</Link>
|
||||
)
|
||||
}
|
||||
|
||||
export function TxExample(props: {
|
||||
txid: string,
|
||||
server?: TryItServer
|
||||
}) {
|
||||
const { useTranslate } = useThemeHooks()
|
||||
const { translate } = useTranslate()
|
||||
let use_server = ""
|
||||
if (props.server == "s1") {
|
||||
use_server = "&server=wss%3A%2F%2Fs1.ripple.com%2F"
|
||||
} else if (props.server == "s2") {
|
||||
use_server = "&server=wss%3A%2F%2Fs2.ripple.com%2F"
|
||||
} else if (props.server == "xrplcluster") {
|
||||
use_server = "&server=wss%3A%2F%2Fxrplcluster.com%2F"
|
||||
} else if (props.server == 'devnet') {
|
||||
use_server = "&server=wss%3A%2F%2Fs.devnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'testnet') {
|
||||
use_server = "&server=wss%3A%2F%2Fs.altnet.rippletest.net%3A51233%2F"
|
||||
}
|
||||
|
||||
const ws_req = `req=%7B%22id%22%3A%22example_tx_lookup%22%2C%22command%22%3A%22tx%22%2C%22transaction%22%3A%22${props.txid}%22%2C%22binary%22%3Afalse%2C%22api_version%22%3A2%7D`
|
||||
const to_path = `/resources/dev-tools/websocket-api-tool?${ws_req}${use_server}`
|
||||
return (
|
||||
<Link style={{marginBottom: "1rem", textDecoration: "none"}} className="btn btn-primary btn-arrow" to={to_path} target="_blank" role="button">{translate("component.queryexampletx", "Query example transaction")}</Link>
|
||||
)
|
||||
}
|
||||
@@ -1,3 +1,7 @@
|
||||
// Components for creating grids of cards in the current site style.
|
||||
// Used in both custom .page.tsx files as well as markdoc tags {% card-grid %}
|
||||
// and {% xrpl-card %}.
|
||||
|
||||
import * as React from 'react';
|
||||
import dynamicReact from '@markdoc/markdoc/dist/react';
|
||||
import { Link } from '@redocly/theme/components/Link/Link';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import * as React from 'react';
|
||||
// Loading animation component used in various custom pages.
|
||||
|
||||
export interface XRPLoaderProps {
|
||||
message?: string
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*/
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
export const useThemeFromClassList = (classNames) => {
|
||||
export const useThemeFromClassList = (classNames: Array<string>) => {
|
||||
const [currentTheme, setCurrentTheme] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -40,7 +40,7 @@ export const useThemeFromClassList = (classNames) => {
|
||||
return currentTheme;
|
||||
};
|
||||
|
||||
export function slugify(s) {
|
||||
export function slugify(s: string) {
|
||||
const unacceptable_chars = /[^A-Za-z0-9._ ]+/g;
|
||||
const whitespace_regex = /\s+/g;
|
||||
s = s.replace(unacceptable_chars, "");
|
||||
|
||||
@@ -1,158 +1,11 @@
|
||||
import * as React from 'react'
|
||||
import { useLocation } from 'react-router-dom'
|
||||
// @ts-ignore
|
||||
import dynamicReact from '@markdoc/markdoc/dist/react'
|
||||
import { Link } from '@redocly/theme/components/Link/Link'
|
||||
import { useThemeHooks } from '@redocly/theme/core/hooks'
|
||||
import { idify } from '../helpers'
|
||||
import { Button } from '@redocly/theme/components/Button/Button'
|
||||
|
||||
export { default as XRPLoader } from '../components/XRPLoader'
|
||||
export { XRPLCard, CardGrid } from '../components/XRPLCard'
|
||||
export { AmendmentsTable, AmendmentDisclaimer, Badge } from '../components/Amendments'
|
||||
export { Tabs } from '../components/SyncedTabs'
|
||||
|
||||
export function IndexPageItems() {
|
||||
const { usePageSharedData } = useThemeHooks()
|
||||
const data = usePageSharedData('index-page-items') as any[]
|
||||
return (
|
||||
<div className="children-display">
|
||||
<ul>
|
||||
{data?.map((item: any) => (
|
||||
<li className="level-1" key={item.slug}>
|
||||
<Link to={item.slug}>{item.title}</Link>
|
||||
{
|
||||
item.status === "not_enabled" ? (<NotEnabled />) : ""
|
||||
}
|
||||
<p className="blurb child-blurb">{item.seo?.description}</p>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function InteractiveBlock(props: {
|
||||
children: React.ReactNode
|
||||
label: string
|
||||
steps: string[]
|
||||
}) {
|
||||
const stepId = idify(props.label)
|
||||
const { pathname } = useLocation()
|
||||
|
||||
return (
|
||||
// add key={pathname} to ensure old step state gets rerendered on page navigation
|
||||
<div className="interactive-block" id={'interactive-' + stepId} key={pathname}>
|
||||
<div className="interactive-block-inner">
|
||||
<div className="breadcrumbs-wrap">
|
||||
<ul
|
||||
className="breadcrumb tutorial-step-crumbs"
|
||||
id={'bc-ul-' + stepId}
|
||||
data-steplabel={props.label}
|
||||
data-stepid={stepId}
|
||||
>
|
||||
{props.steps?.map((step, idx) => {
|
||||
const iterStepId = idify(step).toLowerCase()
|
||||
let className = `breadcrumb-item bc-${iterStepId}`
|
||||
if (idx > 0) className += ' disabled'
|
||||
if (iterStepId === stepId) className += ' current'
|
||||
return (
|
||||
<li className={className} key={iterStepId}>
|
||||
<a href={`#interactive-${iterStepId}`}>{step}</a>
|
||||
</li>
|
||||
)
|
||||
})}
|
||||
</ul>
|
||||
</div>
|
||||
<div className="interactive-block-ui">{dynamicReact(props.children, React, {})}</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function RepoLink(props: {
|
||||
children: React.ReactNode
|
||||
path: string
|
||||
github_fork: string
|
||||
github_branch: string
|
||||
}) {
|
||||
const treeblob = props.path.indexOf(".") >= 0 ? "blob/" : "tree/"
|
||||
const sep = props.github_fork[-1] == "/" ? "" : "/"
|
||||
const href = props.github_fork+sep+treeblob+props.github_branch+"/"+props.path
|
||||
|
||||
return (
|
||||
<Link to={href}>{dynamicReact(props.children, React, {})}</Link>
|
||||
)
|
||||
}
|
||||
|
||||
export function CodePageName(props: {
|
||||
name: string
|
||||
}) {
|
||||
return (
|
||||
<code>{props.name}</code>
|
||||
)
|
||||
}
|
||||
|
||||
type TryItServer = 's1' | 's2' | 'xrplcluster' | 'testnet' | 'devnet' | 'testnet-clio' | 'devnet-clio'
|
||||
|
||||
export function TryIt(props: {
|
||||
method: string,
|
||||
server?: TryItServer
|
||||
}) {
|
||||
const { useTranslate } = useThemeHooks()
|
||||
const { translate } = useTranslate()
|
||||
let use_server = ""
|
||||
if (props.server == "s1") {
|
||||
use_server = "?server=wss%3A%2F%2Fs1.ripple.com%2F"
|
||||
} else if (props.server == "s2") {
|
||||
use_server = "?server=wss%3A%2F%2Fs2.ripple.com%2F"
|
||||
} else if (props.server == "xrplcluster") {
|
||||
use_server = "?server=wss%3A%2F%2Fxrplcluster.com%2F"
|
||||
} else if (props.server == 'devnet') {
|
||||
use_server = "?server=wss%3A%2F%2Fs.devnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'testnet') {
|
||||
use_server = "?server=wss%3A%2F%2Fs.altnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'testnet-clio') {
|
||||
use_server = "?server=wss%3A%2F%2Fclio.altnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'devnet-clio') {
|
||||
use_server = "?server=wss%3A%2F%2Fclio.devnet.rippletest.net%3A51233%2F"
|
||||
}
|
||||
const to_path = `/resources/dev-tools/websocket-api-tool${use_server}#${props.method}`
|
||||
return (
|
||||
<Link style={{marginBottom: "1rem", textDecoration: "none"}} className="btn btn-primary btn-arrow" to={to_path} target="_blank" role="button">{translate("component.tryit", "Try it!")}</Link>
|
||||
)
|
||||
}
|
||||
|
||||
export function TxExample(props: {
|
||||
txid: string,
|
||||
server?: TryItServer
|
||||
}) {
|
||||
const { useTranslate } = useThemeHooks()
|
||||
const { translate } = useTranslate()
|
||||
let use_server = ""
|
||||
if (props.server == "s1") {
|
||||
use_server = "&server=wss%3A%2F%2Fs1.ripple.com%2F"
|
||||
} else if (props.server == "s2") {
|
||||
use_server = "&server=wss%3A%2F%2Fs2.ripple.com%2F"
|
||||
} else if (props.server == "xrplcluster") {
|
||||
use_server = "&server=wss%3A%2F%2Fxrplcluster.com%2F"
|
||||
} else if (props.server == 'devnet') {
|
||||
use_server = "&server=wss%3A%2F%2Fs.devnet.rippletest.net%3A51233%2F"
|
||||
} else if (props.server == 'testnet') {
|
||||
use_server = "&server=wss%3A%2F%2Fs.altnet.rippletest.net%3A51233%2F"
|
||||
}
|
||||
|
||||
const ws_req = `req=%7B%22id%22%3A%22example_tx_lookup%22%2C%22command%22%3A%22tx%22%2C%22transaction%22%3A%22${props.txid}%22%2C%22binary%22%3Afalse%2C%22api_version%22%3A2%7D`
|
||||
const to_path = `/resources/dev-tools/websocket-api-tool?${ws_req}${use_server}`
|
||||
return (
|
||||
<Link style={{marginBottom: "1rem", textDecoration: "none"}} className="btn btn-primary btn-arrow" to={to_path} target="_blank" role="button">{translate("component.queryexampletx", "Query example transaction")}</Link>
|
||||
)
|
||||
}
|
||||
|
||||
export function NotEnabled() {
|
||||
const { useTranslate } = useThemeHooks()
|
||||
const { translate } = useTranslate()
|
||||
return (
|
||||
<span className="status not_enabled" title={translate("This feature is not currently enabled on the production XRP Ledger.")}><i className="fa fa-flask"></i></span>
|
||||
)
|
||||
}
|
||||
export { default as ChildPages } from '../components/ChildPages'
|
||||
export { default as NotEnabled } from '../components/NotEnabled'
|
||||
export { default as InteractiveBlock } from '../components/InteractiveBlock'
|
||||
export { default as RepoLink } from '../components/RepoLink'
|
||||
export { default as CodePageName } from '../components/CodePageName'
|
||||
export { TryIt, TxExample } from '../components/WSToolButtons'
|
||||
export { TxCategory } from '../components/TxRefs'
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Schema, Tag } from '@markdoc/markdoc';
|
||||
|
||||
export const indexPageList: Schema & { tagName: string } = {
|
||||
export const childPages: Schema & { tagName: string } = {
|
||||
tagName: 'child-pages',
|
||||
render: 'IndexPageItems',
|
||||
render: 'ChildPages',
|
||||
selfClosing: true,
|
||||
};
|
||||
|
||||
@@ -243,3 +243,15 @@ export const amendmentDisclaimer: Schema & { tagName: string } = {
|
||||
render: 'AmendmentDisclaimer',
|
||||
selfClosing: true
|
||||
}
|
||||
|
||||
export const txCategory: Schema & { tagName: string } = {
|
||||
tagName: 'tx-category',
|
||||
attributes: {
|
||||
name: {
|
||||
type: 'String',
|
||||
required: true
|
||||
}
|
||||
},
|
||||
render: 'TxCategory',
|
||||
selfClosing: true,
|
||||
};
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
// The purpose of this plugin is to get a list of pages that are "children" of
|
||||
// the current page and pass along their frontmatter as well as the path that
|
||||
// can be used to link to those pages from other components.
|
||||
// It uses experimental Redocly plugin interface stuff that is expected
|
||||
// to be exposed in a "nicer" way in some theoretical future release.
|
||||
// The ts-ignore and TODOs are more for Redocly's notes than for XRPLF.
|
||||
|
||||
// @ts-check
|
||||
import { readSharedData } from '@redocly/realm/dist/server/utils/shared-data.js'; // TODO: export function from root package
|
||||
const INDEX_PAGE_INFO_DATA_KEY = 'index-page-items';
|
||||
@@ -26,14 +33,21 @@ export function indexPages() {
|
||||
|
||||
const item = findItemDeep(sidebar.items, route.fsPath);
|
||||
const childrenPaths = (item.items || [])
|
||||
.map((item) => item.fsPath)
|
||||
.map(
|
||||
// @ts-ignore
|
||||
(item) => item.fsPath
|
||||
)
|
||||
.filter(Boolean);
|
||||
|
||||
const childRoutes = childrenPaths.map((fsPath) =>
|
||||
const childRoutes = childrenPaths.map(
|
||||
// @ts-ignore
|
||||
(fsPath) =>
|
||||
actions.getRouteByFsPath(fsPath),
|
||||
);
|
||||
const childRoutesData = await Promise.all(
|
||||
childRoutes.map(async (route) => {
|
||||
childRoutes.map(
|
||||
// @ts-ignore
|
||||
async (route) => {
|
||||
const { data } = await cache.load(
|
||||
route.fsPath,
|
||||
'markdown-frontmatter',
|
||||
@@ -63,6 +77,7 @@ export function indexPages() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
// @ts-ignore
|
||||
function findItemDeep(items, fsPath) {
|
||||
for (const item of items) {
|
||||
if (item.fsPath === fsPath) {
|
||||
@@ -70,6 +85,7 @@ function findItemDeep(items, fsPath) {
|
||||
}
|
||||
|
||||
if (item.items) {
|
||||
// @ts-ignore
|
||||
const found = findItemDeep(item.items, fsPath);
|
||||
if (found) {
|
||||
return found;
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
* This creates shared data that maps tutorial paths to their supported languages.
|
||||
*/
|
||||
export function tutorialLanguages() {
|
||||
/** @type {import("@redocly/realm/dist/server/plugins/types").PluginInstance } */
|
||||
/** @type {import("@redocly/realm/dist/server/types").ExternalPlugin } */
|
||||
const instance = {
|
||||
id: 'tutorial-languages',
|
||||
processContent: async (actions, { fs, cache }) => {
|
||||
try {
|
||||
/** @type {Record<string, string[]>} */
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
# Assign a Regular Key (Go)
|
||||
|
||||
Demonstrates how to assign a regular key pair to an XRP Ledger account. Both WebSocket (`ws/`) and JSON-RPC (`rpc/`) examples are included.
|
||||
|
||||
Quick setup and usage:
|
||||
|
||||
```sh
|
||||
go mod tidy
|
||||
go run ./ws/main.go
|
||||
```
|
||||
@@ -1,6 +1,8 @@
|
||||
module github.com/XRPLF
|
||||
|
||||
go 1.24.0
|
||||
go 1.23.0
|
||||
|
||||
toolchain go1.23.10
|
||||
|
||||
require github.com/Peersyst/xrpl-go v0.1.11
|
||||
|
||||
@@ -18,5 +20,5 @@ require (
|
||||
github.com/tyler-smith/go-bip32 v1.0.0 // indirect
|
||||
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
|
||||
github.com/ugorji/go/codec v1.2.11 // indirect
|
||||
golang.org/x/crypto v0.45.0 // indirect
|
||||
golang.org/x/crypto v0.35.0 // indirect
|
||||
)
|
||||
|
||||
@@ -46,8 +46,8 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
|
||||
golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
|
||||
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
xrpl-py>=3.0.0
|
||||
wxPython==4.2.1
|
||||
toml==0.10.2
|
||||
requests==2.33.0
|
||||
requests==2.32.4
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
# Credential Example (Java)
|
||||
|
||||
This directory contains a Java example demonstrating how to issue a credential, accept a credential, and delete a credential.
|
||||
|
||||
## Setup
|
||||
|
||||
Install dependencies before running any examples:
|
||||
|
||||
```sh
|
||||
mvn install
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Manage Credentials
|
||||
|
||||
```sh
|
||||
mvn exec:java -Dexec.mainClass=com.example.xrpl.ManageCredentials
|
||||
```
|
||||
|
||||
The script should output two newly funded accounts, the CredentialCreate transaction, CredentialAccept transaction, and CredentialDelete transaction. Each successful transaction submission includes a link to the transaction metadata on the XRPL Explorer.
|
||||
|
||||
```sh
|
||||
=== Funding issuer and subject accounts on Testnet ===
|
||||
|
||||
Issuer: r446kRqJA1XGo1zGMiC2RAebtWbQa4duHL
|
||||
Subject: rs8vtTf3aLZW7XRCh398SUkuuAWBn7q49y
|
||||
|
||||
=== Preparing CredentialCreate transaction ===
|
||||
|
||||
{
|
||||
"Account" : "r446kRqJA1XGo1zGMiC2RAebtWbQa4duHL",
|
||||
"TransactionType" : "CredentialCreate",
|
||||
"Fee" : "15",
|
||||
"Sequence" : 16795444,
|
||||
"LastLedgerSequence" : 16795464,
|
||||
"SigningPubKey" : "EDC2C03C393852514C40CCCCF34CB61A8DDB4AECC6C95271468DDF13DE0979DCC7",
|
||||
"Subject" : "rs8vtTf3aLZW7XRCh398SUkuuAWBn7q49y",
|
||||
"CredentialType" : "6B79632D747261646572"
|
||||
}
|
||||
|
||||
=== Submitting CredentialCreate transaction ===
|
||||
|
||||
CredentialCreate succeeded!
|
||||
Explorer: https://testnet.xrpl.org/transactions/D7A00CFC8DFFE384F7A5D2DF14B3AC5629E8F8DBFD8BD06BC389363782F296B3
|
||||
|
||||
=== Preparing CredentialAccept transaction ===
|
||||
|
||||
{
|
||||
"Account" : "rs8vtTf3aLZW7XRCh398SUkuuAWBn7q49y",
|
||||
"TransactionType" : "CredentialAccept",
|
||||
"Fee" : "15",
|
||||
"Sequence" : 16795444,
|
||||
"LastLedgerSequence" : 16795466,
|
||||
"SigningPubKey" : "EDBED812587E0D7D9F965EFE63F4F2B2BB2EB559AD7D1FA9250C239C235CE62726",
|
||||
"Issuer" : "r446kRqJA1XGo1zGMiC2RAebtWbQa4duHL",
|
||||
"CredentialType" : "6B79632D747261646572"
|
||||
}
|
||||
|
||||
=== Submitting CredentialAccept transaction ===
|
||||
|
||||
CredentialAccept succeeded!
|
||||
Explorer: https://testnet.xrpl.org/transactions/C9E55B0A5270FEB37C18E710BDB01C46480530673FE8E4FC39FE3D6B036DF8F5
|
||||
|
||||
=== Preparing CredentialDelete transaction ===
|
||||
|
||||
{
|
||||
"Account" : "rs8vtTf3aLZW7XRCh398SUkuuAWBn7q49y",
|
||||
"TransactionType" : "CredentialDelete",
|
||||
"Fee" : "15",
|
||||
"Sequence" : 16795445,
|
||||
"LastLedgerSequence" : 16795468,
|
||||
"SigningPubKey" : "EDBED812587E0D7D9F965EFE63F4F2B2BB2EB559AD7D1FA9250C239C235CE62726",
|
||||
"Issuer" : "r446kRqJA1XGo1zGMiC2RAebtWbQa4duHL",
|
||||
"CredentialType" : "6B79632D747261646572"
|
||||
}
|
||||
|
||||
=== Submitting CredentialDelete transaction ===
|
||||
|
||||
CredentialDelete succeeded!
|
||||
Explorer: https://testnet.xrpl.org/transactions/0755B4FED0A646D5FB3698891D25DC0374C521DEF00D85D8FCFF58EB09CAB4FE
|
||||
```
|
||||
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
||||
https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>credential-samples</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.release>11</maven.compiler.release>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.xrpl</groupId>
|
||||
<artifactId>xrpl4j-client</artifactId>
|
||||
<version>6.0.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -1,292 +0,0 @@
|
||||
package com.example.xrpl;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.google.common.primitives.UnsignedInteger;
|
||||
import okhttp3.HttpUrl;
|
||||
import org.xrpl.xrpl4j.client.JsonRpcClientErrorException;
|
||||
import org.xrpl.xrpl4j.client.XrplClient;
|
||||
import org.xrpl.xrpl4j.client.faucet.FaucetClient;
|
||||
import org.xrpl.xrpl4j.client.faucet.FundAccountRequest;
|
||||
import org.xrpl.xrpl4j.crypto.keys.KeyPair;
|
||||
import org.xrpl.xrpl4j.crypto.keys.PrivateKey;
|
||||
import org.xrpl.xrpl4j.crypto.keys.Seed;
|
||||
import org.xrpl.xrpl4j.crypto.signing.SignatureService;
|
||||
import org.xrpl.xrpl4j.crypto.signing.SingleSignedTransaction;
|
||||
import org.xrpl.xrpl4j.crypto.signing.bc.BcSignatureService;
|
||||
import org.xrpl.xrpl4j.model.client.accounts.AccountInfoRequestParams;
|
||||
import org.xrpl.xrpl4j.model.client.accounts.AccountInfoResult;
|
||||
import org.xrpl.xrpl4j.model.client.common.LedgerSpecifier;
|
||||
import org.xrpl.xrpl4j.model.client.fees.FeeUtils;
|
||||
import org.xrpl.xrpl4j.model.client.ledger.LedgerRequestParams;
|
||||
import org.xrpl.xrpl4j.model.client.transactions.SubmitResult;
|
||||
import org.xrpl.xrpl4j.model.client.transactions.TransactionRequestParams;
|
||||
import org.xrpl.xrpl4j.model.client.transactions.TransactionResult;
|
||||
import org.xrpl.xrpl4j.model.jackson.ObjectMapperFactory;
|
||||
import org.xrpl.xrpl4j.model.transactions.Address;
|
||||
import org.xrpl.xrpl4j.model.transactions.CredentialAccept;
|
||||
import org.xrpl.xrpl4j.model.transactions.CredentialCreate;
|
||||
import org.xrpl.xrpl4j.model.transactions.CredentialDelete;
|
||||
import org.xrpl.xrpl4j.model.transactions.CredentialType;
|
||||
import org.xrpl.xrpl4j.model.transactions.Transaction;
|
||||
import org.xrpl.xrpl4j.model.transactions.TransactionResultCodes;
|
||||
import org.xrpl.xrpl4j.model.transactions.XrpCurrencyAmount;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.CompletionException;
|
||||
|
||||
/**
|
||||
* This code sample demonstrates the Credential lifecycle on the XRPL.
|
||||
* It issues a credential to a subject, accepts the credential, and then deletes it.
|
||||
*/
|
||||
public class ManageCredentials {
|
||||
|
||||
private static final HttpUrl NETWORK_URL = HttpUrl.get("https://s.altnet.rippletest.net:51234/");
|
||||
private static final HttpUrl FAUCET_URL = HttpUrl.get("https://faucet.altnet.rippletest.net");
|
||||
private static final String EXPLORER_BASE = "https://testnet.xrpl.org/transactions/";
|
||||
|
||||
private static final CredentialType CREDENTIAL_TYPE = CredentialType.ofPlainText("kyc-trader");
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
run();
|
||||
} catch (Exception e) {
|
||||
// Unwrap CompletionException so async failures print the same clean message
|
||||
// as sync failures. CompletableFuture.join() wraps exceptions in CompletionException
|
||||
Throwable cause = (e instanceof CompletionException && e.getCause() != null)
|
||||
? e.getCause() : e;
|
||||
System.err.println("Error: " + cause.getMessage());
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void run() {
|
||||
|
||||
// ----- Connect to Testnet and fund accounts -----
|
||||
XrplClient xrplClient = new XrplClient(NETWORK_URL);
|
||||
System.out.println("\n=== Funding issuer and subject accounts on Testnet ===\n");
|
||||
|
||||
CompletableFuture<KeyPair> issuerFuture = CompletableFuture.supplyAsync(
|
||||
() -> createAndFundWallet(xrplClient));
|
||||
CompletableFuture<KeyPair> subjectFuture = CompletableFuture.supplyAsync(
|
||||
() -> createAndFundWallet(xrplClient));
|
||||
CompletableFuture.allOf(issuerFuture, subjectFuture).join();
|
||||
|
||||
KeyPair issuer = issuerFuture.join();
|
||||
KeyPair subject = subjectFuture.join();
|
||||
Address issuerAddress = issuer.publicKey().deriveAddress();
|
||||
Address subjectAddress = subject.publicKey().deriveAddress();
|
||||
System.out.println("Issuer: " + issuerAddress);
|
||||
System.out.println("Subject: " + subjectAddress);
|
||||
|
||||
// ----- Prepare CredentialCreate transaction -----
|
||||
System.out.println("\n=== Preparing CredentialCreate transaction ===\n");
|
||||
|
||||
CredentialCreate createTx = CredentialCreate.builder()
|
||||
.account(issuerAddress)
|
||||
.subject(subjectAddress)
|
||||
.credentialType(CREDENTIAL_TYPE)
|
||||
.sequence(accountSequence(xrplClient, issuerAddress))
|
||||
.fee(recommendedFee(xrplClient))
|
||||
.lastLedgerSequence(lastLedgerSequence(xrplClient))
|
||||
.signingPublicKey(issuer.publicKey())
|
||||
.build();
|
||||
printTransactionJson(createTx);
|
||||
|
||||
// ----- Sign, submit, and wait for CredentialCreate validation -----
|
||||
System.out.println("\n=== Submitting CredentialCreate transaction ===\n");
|
||||
|
||||
TransactionResult<CredentialCreate> createResult = signSubmitAndWait(
|
||||
xrplClient, issuer, createTx, CredentialCreate.class);
|
||||
|
||||
requireSuccess(createResult);
|
||||
|
||||
// ----- Prepare CredentialAccept transaction -----
|
||||
System.out.println("\n=== Preparing CredentialAccept transaction ===\n");
|
||||
|
||||
CredentialAccept acceptTx = CredentialAccept.builder()
|
||||
.account(subjectAddress)
|
||||
.issuer(issuerAddress)
|
||||
.credentialType(CREDENTIAL_TYPE)
|
||||
.sequence(accountSequence(xrplClient, subjectAddress))
|
||||
.fee(recommendedFee(xrplClient))
|
||||
.lastLedgerSequence(lastLedgerSequence(xrplClient))
|
||||
.signingPublicKey(subject.publicKey())
|
||||
.build();
|
||||
printTransactionJson(acceptTx);
|
||||
|
||||
// ----- Sign, Submit, and wait for CredentialAccept validation -----
|
||||
System.out.println("\n=== Submitting CredentialAccept transaction ===\n");
|
||||
|
||||
TransactionResult<CredentialAccept> acceptResult = signSubmitAndWait(
|
||||
xrplClient, subject, acceptTx, CredentialAccept.class);
|
||||
|
||||
requireSuccess(acceptResult);
|
||||
|
||||
// ----- Prepare CredentialDelete transaction -----
|
||||
System.out.println("\n=== Preparing CredentialDelete transaction ===\n");
|
||||
|
||||
CredentialDelete deleteTx = CredentialDelete.builder()
|
||||
.account(subjectAddress)
|
||||
.issuer(issuerAddress)
|
||||
.credentialType(CREDENTIAL_TYPE)
|
||||
.sequence(accountSequence(xrplClient, subjectAddress))
|
||||
.fee(recommendedFee(xrplClient))
|
||||
.lastLedgerSequence(lastLedgerSequence(xrplClient))
|
||||
.signingPublicKey(subject.publicKey())
|
||||
.build();
|
||||
printTransactionJson(deleteTx);
|
||||
|
||||
// ----- Sign, Submit, and wait for CredentialDelete validation -----
|
||||
System.out.println("\n=== Submitting CredentialDelete transaction ===\n");
|
||||
|
||||
TransactionResult<CredentialDelete> deleteResult = signSubmitAndWait(
|
||||
xrplClient, subject, deleteTx, CredentialDelete.class);
|
||||
|
||||
requireSuccess(deleteResult);
|
||||
}
|
||||
|
||||
// ===== Helper functions =====
|
||||
|
||||
// Generates a new Ed25519 keypair, funds it from the Testnet faucet, and
|
||||
// returns the keypair once the account is visible on a validated ledger.
|
||||
private static KeyPair createAndFundWallet(XrplClient xrplClient) {
|
||||
KeyPair keyPair = Seed.ed25519Seed().deriveKeyPair();
|
||||
Address address = keyPair.publicKey().deriveAddress();
|
||||
FaucetClient faucetClient = FaucetClient.construct(FAUCET_URL);
|
||||
faucetClient.fundAccount(FundAccountRequest.of(address));
|
||||
|
||||
for (int attempt = 0; attempt < 20; attempt++) {
|
||||
try {
|
||||
xrplClient.accountInfo(AccountInfoRequestParams.builder()
|
||||
.account(address)
|
||||
.ledgerSpecifier(LedgerSpecifier.VALIDATED)
|
||||
.build());
|
||||
return keyPair;
|
||||
} catch (JsonRpcClientErrorException notYetVisible) {
|
||||
try {
|
||||
Thread.sleep(1_000L);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new RuntimeException("Account polling interrupted for " + address + ". " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException("Faucet funding for " + address + " did not confirm in time.");
|
||||
}
|
||||
|
||||
// Fetches the next transaction sequence number of an address from
|
||||
// the latest validated ledger.
|
||||
private static UnsignedInteger accountSequence(XrplClient xrplClient, Address address) {
|
||||
try {
|
||||
AccountInfoResult info = xrplClient.accountInfo(AccountInfoRequestParams.builder()
|
||||
.account(address)
|
||||
.ledgerSpecifier(LedgerSpecifier.VALIDATED)
|
||||
.build());
|
||||
return info.accountData().sequence();
|
||||
} catch (JsonRpcClientErrorException e) {
|
||||
throw new RuntimeException("Failed to fetch account sequence for " + address + ". " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
// Fetches the current network fee and returns the recommended fee for
|
||||
// a standard (non-multisig, non-batch) transaction.
|
||||
private static XrpCurrencyAmount recommendedFee(XrplClient xrplClient) {
|
||||
try {
|
||||
return FeeUtils.computeNetworkFees(xrplClient.fee()).recommendedFee();
|
||||
} catch (JsonRpcClientErrorException e) {
|
||||
throw new RuntimeException("Failed to fetch network fee. " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
// Computes a safe LastLedgerSequence for a new transaction. The
|
||||
// latest validated ledger index plus a small buffer (20 ledgers).
|
||||
private static UnsignedInteger lastLedgerSequence(XrplClient xrplClient) {
|
||||
try {
|
||||
UnsignedInteger validatedLedger = xrplClient.ledger(LedgerRequestParams.builder()
|
||||
.ledgerSpecifier(LedgerSpecifier.VALIDATED)
|
||||
.build())
|
||||
.ledgerIndexSafe()
|
||||
.unsignedIntegerValue();
|
||||
return validatedLedger.plus(UnsignedInteger.valueOf(20));
|
||||
} catch (JsonRpcClientErrorException e) {
|
||||
throw new RuntimeException("Failed to compute LastLedgerSequence. " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
// Prints a transaction as a formatted JSON.
|
||||
private static void printTransactionJson(Transaction tx) {
|
||||
try {
|
||||
System.out.println(ObjectMapperFactory.create().writerWithDefaultPrettyPrinter().writeValueAsString(tx));
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException("Failed to serialize transaction JSON. " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
// Signs and submits a transaction, then polls the network until
|
||||
// the transaction reaches a validated state.
|
||||
private static <T extends Transaction> TransactionResult<T> signSubmitAndWait(
|
||||
XrplClient xrplClient,
|
||||
KeyPair signer,
|
||||
T transaction,
|
||||
Class<T> transactionType
|
||||
) {
|
||||
SignatureService<PrivateKey> signatureService = new BcSignatureService();
|
||||
|
||||
UnsignedInteger lastLedgerSequence = transaction.lastLedgerSequence()
|
||||
.orElseThrow(() -> new IllegalArgumentException(
|
||||
"Must set LastLedgerSequence for polling expiration"));
|
||||
|
||||
try {
|
||||
SingleSignedTransaction<T> signed = signatureService.sign(signer.privateKey(), transaction);
|
||||
SubmitResult<T> submit = xrplClient.submit(signed);
|
||||
|
||||
if (!TransactionResultCodes.TES_SUCCESS.equals(submit.engineResult())) {
|
||||
throw new IllegalStateException(
|
||||
"Submission rejected. " + submit.engineResult() + " — " + submit.engineResultMessage());
|
||||
}
|
||||
|
||||
while (true) {
|
||||
Thread.sleep(1_000L);
|
||||
|
||||
// Poll network for validated status using tx hash
|
||||
try {
|
||||
TransactionResult<T> result = xrplClient.transaction(
|
||||
TransactionRequestParams.of(signed.hash()), transactionType);
|
||||
if (result.validated()) {
|
||||
return result;
|
||||
}
|
||||
} catch (JsonRpcClientErrorException e) {
|
||||
// Transaction not found; keep polling.
|
||||
}
|
||||
|
||||
// Check if transaction expired before polling again
|
||||
UnsignedInteger currentLedger = xrplClient.ledger(LedgerRequestParams.builder()
|
||||
.ledgerSpecifier(LedgerSpecifier.VALIDATED)
|
||||
.build())
|
||||
.ledgerIndexSafe()
|
||||
.unsignedIntegerValue();
|
||||
if (currentLedger.compareTo(lastLedgerSequence) > 0) {
|
||||
throw new IllegalStateException("Transaction expired. Current ledger " + currentLedger
|
||||
+ " passed LastLedgerSequence " + lastLedgerSequence);
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new RuntimeException("Transaction polling interrupted. " + e.getMessage(), e);
|
||||
} catch (JsonRpcClientErrorException | JsonProcessingException e) {
|
||||
throw new RuntimeException("Transaction processing failed. " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
// Checks for a tesSUCCESS result code. If true, prints an explorer
|
||||
// link. Otherwise, throws an error.
|
||||
private static void requireSuccess(TransactionResult<?> result) {
|
||||
String code = result.metadata().get().transactionResult();
|
||||
String txType = result.transaction().transactionType().value();
|
||||
if (!TransactionResultCodes.TES_SUCCESS.equals(code)) {
|
||||
throw new IllegalStateException(txType + " failed with error code " + code);
|
||||
}
|
||||
System.out.println(txType + " succeeded!");
|
||||
System.out.println("Explorer: " + EXPLORER_BASE + result.hash());
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Quiets xrpl4j's DEBUG chatter so tutorial output stays readable.
|
||||
Raise xrpl4j to DEBUG to see wire-level transaction details. -->
|
||||
<configuration>
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<logger name="org.xrpl.xrpl4j" level="WARN"/>
|
||||
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</root>
|
||||
</configuration>
|
||||
@@ -373,7 +373,6 @@
|
||||
[get_counts command]: /docs/references/http-websocket-apis/admin-api-methods/status-and-debugging-methods/get_counts.md
|
||||
[get_counts method]: /docs/references/http-websocket-apis/admin-api-methods/status-and-debugging-methods/get_counts.md
|
||||
[Get Started Using Go]: /docs/tutorials/get-started/get-started-go.md
|
||||
[Get Started Using Java]: /docs/tutorials/get-started/get-started-java.md
|
||||
[Get Started Using JavaScript]: /docs/tutorials/get-started/get-started-javascript.md
|
||||
[Get Started Using Python]: /docs/tutorials/get-started/get-started-python.md
|
||||
[hexadecimal]: https://en.wikipedia.org/wiki/Hexadecimal
|
||||
@@ -491,7 +490,6 @@
|
||||
[vault_info method]: /docs/references/http-websocket-apis/public-api-methods/vault-methods/vault_info.md
|
||||
[wallet_propose command]: /docs/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.md
|
||||
[wallet_propose method]: /docs/references/http-websocket-apis/admin-api-methods/key-generation-methods/wallet_propose.md
|
||||
[xrpl4j library]: https://github.com/XRPLF/xrpl4j
|
||||
[xrpl-go library]: https://github.com/XRPLF/xrpl-go
|
||||
[xrpl.js library]: https://github.com/XRPLF/xrpl.js
|
||||
[xrpl-py library]: https://github.com/XRPLF/xrpl-py
|
||||
|
||||
@@ -66,7 +66,7 @@ In addition to the [common ledger entry fields][], {% code-page-name /%} entries
|
||||
| `ManagementFeeRate` | Number | UInt16 | No | The fee charged by the lending protocol, in units of 1/10th basis points. Valid values are 0 to 100000 (inclusive), representing 0% to 100%. |
|
||||
| `OwnerCount` | Number | UInt32 | Yes | The number of active loans issued by the LoanBroker. |
|
||||
| `DebtTotal` | String | Number | Yes | The total asset amount the protocol owes the vault, including interest. |
|
||||
| `DebtMaximum` | String | Number | No | The maximum amount the protocol can owe the vault. The default value of `0` means there is no limit to the debt. |
|
||||
| `DebtMaximum` | String | Number | Yes | The maximum amount the protocol can owe the vault. The default value of `0` means there is no limit to the debt. |
|
||||
| `CoverAvailable` | String | Number | Yes | The total amount of first-loss capital deposited into the lending protocol. |
|
||||
| `CoverRateMinimum` | Number | UInt32 | Yes | The 1/10th basis point of the `DebtTotal` that the first-loss capital must cover. Valid values are 0 to 100000 (inclusive), representing 0% to 100%. |
|
||||
| `CoverRateLiquidation`| Number | UInt12 | Yes | The 1/10th basis point of minimum required first-loss capital that is moved to an asset vault to cover a loan default. Valid values are 0 to 100000 (inclusive), representing 0% to 100%. |
|
||||
|
||||
@@ -3,6 +3,8 @@ seo:
|
||||
description: Delete an account.
|
||||
labels:
|
||||
- Accounts
|
||||
requiredAmendment: DeletableAccounts
|
||||
txIcon: cancel
|
||||
---
|
||||
# AccountDelete
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/DeleteAccount.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,7 @@ seo:
|
||||
description: Set options on an account.
|
||||
labels:
|
||||
- Accounts
|
||||
txIcon: modify
|
||||
---
|
||||
# AccountSet
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/SetAccount.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Bid on an Automated Market Maker's auction slot, which grants a discounted fee.
|
||||
labels:
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: modify
|
||||
---
|
||||
# AMMBid
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMBid.cpp "Source")
|
||||
|
||||
@@ -3,7 +3,9 @@ seo:
|
||||
description: Claw back tokens from a holder who has deposited your issued tokens into an Automated Market Maker pool.
|
||||
labels:
|
||||
- AMM
|
||||
- Tokens
|
||||
- DEX
|
||||
requiredAmendment: AMMClawback
|
||||
txIcon: cancel
|
||||
---
|
||||
# AMMClawback
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Create a new Automated Market Maker for trading a given pair of assets.
|
||||
labels:
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: create
|
||||
---
|
||||
# AMMCreate
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMCreate.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Delete an Automated Market Maker with an empty asset pool.
|
||||
labels:
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: cancel
|
||||
---
|
||||
# AMMDelete
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMDelete.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Deposit funds into an Automated Market Maker in exchange for LPTokens.
|
||||
labels:
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: send
|
||||
---
|
||||
# AMMDeposit
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMDeposit.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Vote on the trading fee for an Automated Market Maker.
|
||||
labels:
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: modify
|
||||
---
|
||||
# AMMVote
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMVote.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Return LPTokens to an Automated Market Maker in exchange for a share of the assets the pool holds.
|
||||
labels:
|
||||
- AMM
|
||||
- DEX
|
||||
requiredAmendment: AMM
|
||||
txIcon: send
|
||||
---
|
||||
# AMMWithdraw
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/AMMWithdraw.cpp "Source")
|
||||
|
||||
@@ -3,7 +3,10 @@ seo:
|
||||
description: Create and submit a batch of up to 8 transactions that succeed or fail atomically.
|
||||
labels:
|
||||
- Transaction Sending
|
||||
- Other Transactions
|
||||
requiredAmendment: Batch
|
||||
status: not_enabled
|
||||
txIcon: other
|
||||
---
|
||||
# Batch
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/Batch.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Cancel a check.
|
||||
labels:
|
||||
- Checks
|
||||
- Payments
|
||||
txIcon: cancel
|
||||
requiredAmendment: Checks
|
||||
---
|
||||
# CheckCancel
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CancelCheck.cpp "Source")
|
||||
|
||||
@@ -3,6 +3,9 @@ seo:
|
||||
description: Redeem a check.
|
||||
labels:
|
||||
- Checks
|
||||
- Payments
|
||||
txIcon: finish
|
||||
requiredAmendment: Checks
|
||||
---
|
||||
# CheckCash
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/CashCheck.cpp "Source")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user