Compare commits

..

26 Commits

Author SHA1 Message Date
dependabot[bot]
397c8588c2 Bump vite in /_code-samples/build-a-browser-wallet/js
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.14 to 5.4.21.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.21
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-20 22:15:48 +00:00
Maria Shodunke
c83fc47941 Merge pull request #3328 from XRPLF/mptoken-authorize-transaction-sample
Add example JSON for MPTokenAuthorize transaction
2025-10-17 08:23:27 +01:00
Maria Shodunke
f511a23ea2 Additional changes for other MPToken transactions 2025-10-16 12:08:25 +01:00
Maria Shodunke
20225b5f62 Update JSON + add Mainnet transaction 2025-10-16 11:36:10 +01:00
oeggert
befd012ffa Merge pull request #3350 from XRPLF/update-nft_history
Update nft_history command
2025-10-15 09:58:13 -07:00
Maria Shodunke
4481320636 Add example JSON for MPTokenAuthorize transaction 2025-10-14 17:03:15 +01:00
Maria Shodunke
62c1d31660 Merge pull request #3336 from XRPLF/token-escrow-amendment
Token escrow amendment updates/fixes
2025-10-14 09:38:10 +01:00
Rome Reginelli
522bf43aef Merge pull request #3352 from XRPLF/xrpl-events-updates-10-13-2025
feat: add new events and update existing event details
2025-10-13 12:59:18 -07:00
akcodez
b237a6a2f1 feat: add new events and update existing event details
- Introduced new events: XRPL Town Hall Meeting #5 and XRPL Aquarium Residency Demo Day #7 with relevant details.
- Updated the date format for the existing hackathon event.
- Replaced images for the hackathon event with the new Italy Hackathon image.
- Added new images for the Town Hall Meeting and Aquarium Residency events.
2025-10-13 12:13:56 -07:00
Maria Shodunke
3136af79a3 Remove Escrow amendment + fix admonition 2025-10-13 11:28:36 +01:00
Oliver Eggert
f248b92d0d update nft_history command with actual responses and notes about api_version 2 2025-10-10 15:51:51 -07:00
Maria Shodunke
9b9d186af1 Remove wrong fields 2025-10-10 22:39:22 +01:00
Rome Reginelli
e1b97f7dba Merge pull request #3349 from XRPLF/hackathon-descr-update
update vegas house hackathon description
2025-10-10 13:44:09 -07:00
akcodez
d46d04f7d8 update vegas house hackathon description 2025-10-10 12:16:11 -07:00
Maria Shodunke
e646e10537 Further updates for review 2025-10-10 17:47:25 +01:00
Maria Shodunke
f9df5652e4 Update docs/concepts/payment-types/escrow.md
Co-authored-by: Rome Reginelli <rome@ripple.com>
2025-10-10 12:21:10 +01:00
Maria Shodunke
ecec4b4833 Update docs/references/http-websocket-apis/public-api-methods/account-methods/account_channels.md
Co-authored-by: Rome Reginelli <rome@ripple.com>
2025-10-10 12:19:34 +01:00
Maria Shodunke
b93691a4c4 Update docs/references/http-websocket-apis/public-api-methods/account-methods/account_channels.md
Co-authored-by: Rome Reginelli <rome@ripple.com>
2025-10-10 12:19:19 +01:00
Maria Shodunke
26713099cf Update docs/references/protocol/ledger-data/ledger-entry-types/escrow.md
Co-authored-by: Rome Reginelli <rome@ripple.com>
2025-10-10 12:18:50 +01:00
Maria Shodunke
6154d7a9bd Update docs/references/protocol/transactions/types/accountset.md
Co-authored-by: Rome Reginelli <rome@ripple.com>
2025-10-10 12:18:20 +01:00
Maria Shodunke
7cdf35f032 Update escrow documentation 2025-10-09 18:57:53 +01:00
Rome Reginelli
9b1878c512 Merge pull request #3344 from XRPLF/events-updates-2025-10-08
feat: add 2 new hackathons
2025-10-08 12:15:02 -07:00
Rome Reginelli
b08d7f085f Merge pull request #3329 from XRPLF/update_desktop_wallet_js_tutorial
Update Desktop Wallet (JS) tutorial
2025-10-08 12:11:57 -07:00
Rome Reginelli
56ac023098 Apply suggestions from @maria-robobug review
Co-authored-by: Maria Shodunke <maria-robobug@users.noreply.github.com>
2025-10-07 14:49:48 -07:00
mDuo13
fd82a05ca1 Fix links in desktop wallet tutorial & update some details 2025-10-02 13:01:26 -07:00
mDuo13
929a4cbced Update Desktop Wallet (JS) tutorial dependencies, copy edits 2025-10-01 13:37:04 -07:00
45 changed files with 1043 additions and 635 deletions

View File

@@ -326,7 +326,7 @@ export function AmendmentDisclaimer(props: {
) : (
<>
{translate("component.amendment-status.updates.1", "The ")}{link()}
{translate("component.amendment-status.updates.2", "updates this.")}
{translate("component.amendment-status.updates.2", " updates this.")}
{" "}
<AmendmentBadge amendment={amendmentStatus} />
</>

View File

@@ -10,7 +10,7 @@
"https-browserify": "^1.0.0",
"stream-browserify": "^3.0.0",
"stream-http": "^3.2.0",
"vite": "^4.5.14"
"vite": "^5.4.21"
},
"dependencies": {
"dotenv": "^16.0.3",

View File

@@ -2,115 +2,120 @@
# yarn lockfile v1
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
"@esbuild/aix-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
"@esbuild/android-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
"@esbuild/android-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
"@esbuild/android-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
"@esbuild/android-arm@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
"@esbuild/darwin-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
"@esbuild/android-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
"@esbuild/darwin-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
"@esbuild/darwin-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
"@esbuild/freebsd-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
"@esbuild/darwin-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
"@esbuild/freebsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
"@esbuild/freebsd-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
"@esbuild/linux-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
"@esbuild/freebsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
"@esbuild/linux-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
"@esbuild/linux-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
"@esbuild/linux-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
"@esbuild/linux-arm@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
"@esbuild/linux-loong64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
"@esbuild/linux-ia32@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
"@esbuild/linux-mips64el@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
"@esbuild/linux-loong64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
"@esbuild/linux-ppc64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
"@esbuild/linux-mips64el@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
"@esbuild/linux-riscv64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
"@esbuild/linux-ppc64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
"@esbuild/linux-s390x@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
"@esbuild/linux-riscv64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
"@esbuild/linux-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
"@esbuild/linux-s390x@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
"@esbuild/netbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
"@esbuild/linux-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
"@esbuild/openbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
"@esbuild/netbsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
"@esbuild/sunos-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
"@esbuild/openbsd-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
"@esbuild/win32-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
"@esbuild/sunos-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
"@esbuild/win32-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
"@esbuild/win32-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@esbuild/win32-ia32@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
"@esbuild/win32-x64@0.21.5":
version "0.21.5"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
"@noble/curves@^1.0.0", "@noble/curves@~1.8.1":
version "1.8.1"
@@ -124,6 +129,116 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f"
integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==
"@rollup/rollup-android-arm-eabi@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz#0f44a2f8668ed87b040b6fe659358ac9239da4db"
integrity sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==
"@rollup/rollup-android-arm64@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz#25b9a01deef6518a948431564c987bcb205274f5"
integrity sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==
"@rollup/rollup-darwin-arm64@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz#8a102869c88f3780c7d5e6776afd3f19084ecd7f"
integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==
"@rollup/rollup-darwin-x64@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz#8e526417cd6f54daf1d0c04cf361160216581956"
integrity sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==
"@rollup/rollup-freebsd-arm64@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz#0e7027054493f3409b1f219a3eac5efd128ef899"
integrity sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==
"@rollup/rollup-freebsd-x64@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz#72b204a920139e9ec3d331bd9cfd9a0c248ccb10"
integrity sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==
"@rollup/rollup-linux-arm-gnueabihf@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz#ab1b522ebe5b7e06c99504cc38f6cd8b808ba41c"
integrity sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==
"@rollup/rollup-linux-arm-musleabihf@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz#f8cc30b638f1ee7e3d18eac24af47ea29d9beb00"
integrity sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==
"@rollup/rollup-linux-arm64-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz#7af37a9e85f25db59dc8214172907b7e146c12cc"
integrity sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==
"@rollup/rollup-linux-arm64-musl@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz#a623eb0d3617c03b7a73716eb85c6e37b776f7e0"
integrity sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==
"@rollup/rollup-linux-loong64-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz#76ea038b549c5c6c5f0d062942627c4066642ee2"
integrity sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==
"@rollup/rollup-linux-ppc64-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz#d9a4c3f0a3492bc78f6fdfe8131ac61c7359ccd5"
integrity sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==
"@rollup/rollup-linux-riscv64-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz#87ab033eebd1a9a1dd7b60509f6333ec1f82d994"
integrity sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==
"@rollup/rollup-linux-riscv64-musl@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz#bda3eb67e1c993c1ba12bc9c2f694e7703958d9f"
integrity sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==
"@rollup/rollup-linux-s390x-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz#f7bc10fbe096ab44694233dc42a2291ed5453d4b"
integrity sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==
"@rollup/rollup-linux-x64-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz#a151cb1234cc9b2cf5e8cfc02aa91436b8f9e278"
integrity sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==
"@rollup/rollup-linux-x64-musl@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz#7859e196501cc3b3062d45d2776cfb4d2f3a9350"
integrity sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==
"@rollup/rollup-openharmony-arm64@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz#85d0df7233734df31e547c1e647d2a5300b3bf30"
integrity sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==
"@rollup/rollup-win32-arm64-msvc@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz#e62357d00458db17277b88adbf690bb855cac937"
integrity sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==
"@rollup/rollup-win32-ia32-msvc@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz#fc7cd40f44834a703c1f1c3fe8bcc27ce476cd50"
integrity sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==
"@rollup/rollup-win32-x64-gnu@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz#1a22acfc93c64a64a48c42672e857ee51774d0d3"
integrity sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==
"@rollup/rollup-win32-x64-msvc@4.52.5":
version "4.52.5"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz#1657f56326bbe0ac80eedc9f9c18fc1ddd24e107"
integrity sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==
"@scure/base@^1.1.3", "@scure/base@~1.2.2", "@scure/base@~1.2.4":
version "1.2.4"
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9"
@@ -146,6 +261,11 @@
"@noble/hashes" "~1.7.1"
"@scure/base" "~1.2.4"
"@types/estree@1.0.8":
version "1.0.8"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
"@xrplf/isomorphic@^1.0.0", "@xrplf/isomorphic@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz#d7676e0ec0e55a39f37ddc1f3cc30eeab52e0739"
@@ -433,33 +553,34 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
dependencies:
es-errors "^1.3.0"
esbuild@^0.18.10:
version "0.18.20"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
esbuild@^0.21.3:
version "0.21.5"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
optionalDependencies:
"@esbuild/android-arm" "0.18.20"
"@esbuild/android-arm64" "0.18.20"
"@esbuild/android-x64" "0.18.20"
"@esbuild/darwin-arm64" "0.18.20"
"@esbuild/darwin-x64" "0.18.20"
"@esbuild/freebsd-arm64" "0.18.20"
"@esbuild/freebsd-x64" "0.18.20"
"@esbuild/linux-arm" "0.18.20"
"@esbuild/linux-arm64" "0.18.20"
"@esbuild/linux-ia32" "0.18.20"
"@esbuild/linux-loong64" "0.18.20"
"@esbuild/linux-mips64el" "0.18.20"
"@esbuild/linux-ppc64" "0.18.20"
"@esbuild/linux-riscv64" "0.18.20"
"@esbuild/linux-s390x" "0.18.20"
"@esbuild/linux-x64" "0.18.20"
"@esbuild/netbsd-x64" "0.18.20"
"@esbuild/openbsd-x64" "0.18.20"
"@esbuild/sunos-x64" "0.18.20"
"@esbuild/win32-arm64" "0.18.20"
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
"@esbuild/aix-ppc64" "0.21.5"
"@esbuild/android-arm" "0.21.5"
"@esbuild/android-arm64" "0.21.5"
"@esbuild/android-x64" "0.21.5"
"@esbuild/darwin-arm64" "0.21.5"
"@esbuild/darwin-x64" "0.21.5"
"@esbuild/freebsd-arm64" "0.21.5"
"@esbuild/freebsd-x64" "0.21.5"
"@esbuild/linux-arm" "0.21.5"
"@esbuild/linux-arm64" "0.21.5"
"@esbuild/linux-ia32" "0.21.5"
"@esbuild/linux-loong64" "0.21.5"
"@esbuild/linux-mips64el" "0.21.5"
"@esbuild/linux-ppc64" "0.21.5"
"@esbuild/linux-riscv64" "0.21.5"
"@esbuild/linux-s390x" "0.21.5"
"@esbuild/linux-x64" "0.21.5"
"@esbuild/netbsd-x64" "0.21.5"
"@esbuild/openbsd-x64" "0.21.5"
"@esbuild/sunos-x64" "0.21.5"
"@esbuild/win32-arm64" "0.21.5"
"@esbuild/win32-ia32" "0.21.5"
"@esbuild/win32-x64" "0.21.5"
eventemitter3@5.0.1, eventemitter3@^5.0.1:
version "5.0.1"
@@ -486,7 +607,7 @@ for-each@^0.3.5:
dependencies:
is-callable "^1.2.7"
fsevents@~2.3.2:
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
@@ -656,10 +777,10 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
nanoid@^3.3.8:
version "3.3.8"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
nanoid@^3.3.11:
version "3.3.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
parse-asn1@^5.0.0, parse-asn1@^5.1.7:
version "5.1.7"
@@ -695,12 +816,12 @@ possible-typed-array-names@^1.0.0:
resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae"
integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==
postcss@^8.4.27:
version "8.5.1"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214"
integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==
postcss@^8.4.43:
version "8.5.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
dependencies:
nanoid "^3.3.8"
nanoid "^3.3.11"
picocolors "^1.1.1"
source-map-js "^1.2.1"
@@ -800,11 +921,35 @@ ripple-keypairs@^2.0.0:
"@xrplf/isomorphic" "^1.0.0"
ripple-address-codec "^5.0.0"
rollup@^3.27.1:
version "3.29.5"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54"
integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==
rollup@^4.20.0:
version "4.52.5"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.52.5.tgz#96982cdcaedcdd51b12359981f240f94304ec235"
integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==
dependencies:
"@types/estree" "1.0.8"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.52.5"
"@rollup/rollup-android-arm64" "4.52.5"
"@rollup/rollup-darwin-arm64" "4.52.5"
"@rollup/rollup-darwin-x64" "4.52.5"
"@rollup/rollup-freebsd-arm64" "4.52.5"
"@rollup/rollup-freebsd-x64" "4.52.5"
"@rollup/rollup-linux-arm-gnueabihf" "4.52.5"
"@rollup/rollup-linux-arm-musleabihf" "4.52.5"
"@rollup/rollup-linux-arm64-gnu" "4.52.5"
"@rollup/rollup-linux-arm64-musl" "4.52.5"
"@rollup/rollup-linux-loong64-gnu" "4.52.5"
"@rollup/rollup-linux-ppc64-gnu" "4.52.5"
"@rollup/rollup-linux-riscv64-gnu" "4.52.5"
"@rollup/rollup-linux-riscv64-musl" "4.52.5"
"@rollup/rollup-linux-s390x-gnu" "4.52.5"
"@rollup/rollup-linux-x64-gnu" "4.52.5"
"@rollup/rollup-linux-x64-musl" "4.52.5"
"@rollup/rollup-openharmony-arm64" "4.52.5"
"@rollup/rollup-win32-arm64-msvc" "4.52.5"
"@rollup/rollup-win32-ia32-msvc" "4.52.5"
"@rollup/rollup-win32-x64-gnu" "4.52.5"
"@rollup/rollup-win32-x64-msvc" "4.52.5"
fsevents "~2.3.2"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
@@ -898,16 +1043,16 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
vite@^4.5.14:
version "4.5.14"
resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.14.tgz#2e652bc1d898265d987d6543ce866ecd65fa4086"
integrity sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==
vite@^5.4.21:
version "5.4.21"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027"
integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==
dependencies:
esbuild "^0.18.10"
postcss "^8.4.27"
rollup "^3.27.1"
esbuild "^0.21.3"
postcss "^8.4.43"
rollup "^4.20.0"
optionalDependencies:
fsevents "~2.3.2"
fsevents "~2.3.3"
which-typed-array@^1.1.16:
version "1.1.19"

View File

@@ -3,20 +3,19 @@ const { app, BrowserWindow } = require('electron')
const path = require('path')
/**
* This is our main function, it creates our application window, preloads the code we will need to communicate
* between the renderer Process and the main Process, loads a layout and performs the main logic
* Main function: create application window, preload the code to communicate
* between the renderer Process and the main Process, load a layout,
* and perform the main logic.
*/
const createWindow = () => {
// Creates the application window
// Create the application window
const appWindow = new BrowserWindow({
width: 1024,
height: 768
})
// Loads a layout
// Load a layout
appWindow.loadFile(path.join(__dirname, 'view', 'template.html'))
return appWindow
}

View File

@@ -1,40 +1,37 @@
const { app, BrowserWindow } = require('electron')
const path = require('path')
const xrpl = require("xrpl")
// Ledger index code additions - start
const xrpl = require('xrpl')
const TESTNET_URL = "wss://s.altnet.rippletest.net:51233"
const TESTNET_URL = 'wss://s.altnet.rippletest.net:51233'
/**
* This function creates a WebService client, which connects to the XRPL and fetches the latest ledger index.
* Create a WebSocket client, connect to the XRPL, and fetch the latest ledger index.
*
* @returns {Promise<number>}
*/
const getValidatedLedgerIndex = async () => {
const client = new xrpl.Client(TESTNET_URL)
await client.connect()
// Reference: https://xrpl.org/ledger.html#ledger
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger
const ledgerRequest = {
"command": "ledger",
"ledger_index": "validated"
}
const ledgerResponse = await client.request(ledgerRequest)
await client.disconnect()
return ledgerResponse.result.ledger_index
}
// Ledger index code additions - end
/**
* This is our main function, it creates our application window, preloads the code we will need to communicate
* between the renderer Process and the main Process, loads a layout and performs the main logic
* Main function: create application window, preload the code to communicate
* between the renderer Process and the main Process, load a layout,
* and perform the main logic.
*/
const createWindow = () => {
// Creates the application window
// Create the application window
const appWindow = new BrowserWindow({
width: 1024,
height: 768,
@@ -43,9 +40,8 @@ const createWindow = () => {
},
})
// Loads a layout
// Load a layout
appWindow.loadFile(path.join(__dirname, 'view', 'template.html'))
return appWindow
}

View File

@@ -24,9 +24,10 @@ const createWindow = () => {
return appWindow
}
// Step 2 changes - main whenReady function - start
/**
* This function creates a XRPL client, subscribes to 'ledger' events from the XRPL and broadcasts those by
* dispatching the 'update-ledger-data' event which will be picked up by the frontend
* Create an XRPL client, subscribe to 'ledger' events, and broadcast those by
* dispatching an 'update-ledger-data' event to the frontend.
*
* @returns {Promise<void>}
*/
@@ -38,7 +39,7 @@ const main = async () => {
await client.connect()
// Subscribe client to 'ledger' events
// Reference: https://xrpl.org/subscribe.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe
await client.request({
"command": "subscribe",
"streams": ["ledger"]
@@ -51,3 +52,4 @@ const main = async () => {
}
app.whenReady().then(main)
// Step 2 changes - main whenReady function - end

View File

@@ -29,30 +29,30 @@ const main = async () => {
await client.connect()
// Reference: https://xrpl.org/subscribe.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe
await client.request({
"command": "subscribe",
"streams": ["ledger"],
"accounts": [address]
})
// Reference: https://xrpl.org/subscribe.html#ledger-stream
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe#ledger-stream
client.on("ledgerClosed", async (rawLedgerData) => {
const ledger = prepareLedgerData(rawLedgerData)
appWindow.webContents.send('update-ledger-data', ledger)
})
// Initial Ledger Request -> Get account details on startup
// Reference: https://xrpl.org/ledger.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger
const ledgerResponse = await client.request({
"command": "ledger"
})
const initialLedgerData = prepareLedgerData(ledgerResponse.result.closed.ledger)
appWindow.webContents.send('update-ledger-data', initialLedgerData)
// Reference: https://xrpl.org/subscribe.html#transaction-streams
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe#transaction-streams
client.on("transaction", async (transaction) => {
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const accountInfoRequest = {
"command": "account_info",
"account": address,
@@ -64,7 +64,7 @@ const main = async () => {
})
// Initial Account Request -> Get account details on startup
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const accountInfoResponse = await client.request({
"command": "account_info",
"account": address,

View File

@@ -30,14 +30,14 @@ const main = async () => {
await client.connect()
// Reference: https://xrpl.org/subscribe.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe
await client.request({
"command": "subscribe",
"streams": ["ledger"],
"accounts": [address]
})
// Reference: https://xrpl.org/subscribe.html#ledger-stream
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe#ledger-stream
client.on("ledgerClosed", async (rawLedgerData) => {
const ledger = prepareLedgerData(rawLedgerData)
appWindow.webContents.send('update-ledger-data', ledger)
@@ -45,7 +45,7 @@ const main = async () => {
// Wait for transaction on subscribed account and re-request account data
client.on("transaction", async (transaction) => {
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const accountInfoRequest = {
"command": "account_info",
"account": address,
@@ -61,7 +61,7 @@ const main = async () => {
})
// Initial Account Request -> Get account details on startup
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const accountInfoResponse = await client.request({
"command": "account_info",
"account": address,
@@ -71,7 +71,7 @@ const main = async () => {
appWindow.webContents.send('update-account-data', accountData)
// Initial Transaction Request -> List account transactions on startup
// Reference: https://xrpl.org/account_tx.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_tx
const txResponse = await client.request({
"command": "account_tx",
"account": address

View File

@@ -23,6 +23,7 @@ const createWindow = () => {
return appWindow
}
// Step 5 - new main function - start
const main = async () => {
const appWindow = createWindow()
@@ -51,6 +52,9 @@ const main = async () => {
}
const wallet = xrpl.Wallet.fromSeed(seed)
// For compatibility with seeds generated using secp256k1
// (the old default algorithm), use the following instead:
// const wallet = xrpl.Wallet.fromSeed(seed, {algorithm: "secp256k1"})
const client = new xrpl.Client(TESTNET_URL)
@@ -80,5 +84,6 @@ const main = async () => {
}
})
}
// Step 5 - new main function - end
app.whenReady().then(main)

View File

@@ -2,7 +2,7 @@
Build a non-custodial XRP Ledger wallet application in JavaScript that runs on the desktop using Electron.
For the full documentation, refer to the [Build a Wallet in JavaScript tutorial](https://xrpl.org/build-a-wallet-in-javascript.html).
For the full documentation, refer to the [Build a Desktop Wallet in JavaScript tutorial](https://xrpl.org/docs/tutorials/javascript/build-apps/build-a-desktop-wallet-in-javascript).
## TL;DR

View File

@@ -3,7 +3,7 @@ const xrpl = require("xrpl");
// The rippled server and its APIs represent time as an unsigned integer.
// This number measures the number of seconds since the "Ripple Epoch" of
// January 1, 2000 (00:00 UTC). This is like the way the Unix epoch works,
// Reference: https://xrpl.org/basic-data-types.html
// Reference: https://xrpl.org/docs/references/protocol/data-types/basic-data-types#specifying-time
const RIPPLE_EPOCH = 946684800;
const prepareAccountData = (rawAccountData) => {

View File

@@ -14,7 +14,7 @@ const fernet = require("fernet");
* @returns {Promise<void>}
*/
const initialize = async (client, wallet, appWindow) => {
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const accountInfoResponse = await client.request({
"command": "account_info",
"account": wallet.address,
@@ -23,7 +23,7 @@ const initialize = async (client, wallet, appWindow) => {
const accountData = prepareAccountData(accountInfoResponse.result.account_data)
appWindow.webContents.send('update-account-data', accountData)
// Reference: https://xrpl.org/account_tx.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_tx
const txResponse = await client.request({
"command": "account_tx",
"account": wallet.address
@@ -42,14 +42,14 @@ const initialize = async (client, wallet, appWindow) => {
*/
const subscribe = async (client, wallet, appWindow) => {
// Reference: https://xrpl.org/subscribe.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe
await client.request({
"command": "subscribe",
"streams": ["ledger"],
"accounts": [wallet.address]
})
// Reference: https://xrpl.org/subscribe.html#ledger-stream
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/subscription-methods/subscribe#ledger-stream
client.on("ledgerClosed", async (rawLedgerData) => {
const ledger = prepareLedgerData(rawLedgerData)
appWindow.webContents.send('update-ledger-data', ledger)
@@ -57,7 +57,7 @@ const subscribe = async (client, wallet, appWindow) => {
// Wait for transaction on subscribed account and re-request account data
client.on("transaction", async (transaction) => {
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const accountInfoRequest = {
"command": "account_info",
"account": wallet.address,

View File

@@ -9,7 +9,7 @@ const xrpl = require("xrpl");
* @returns {Promise<*>}
*/
const sendXrp = async (paymentData, client, wallet) => {
// Reference: https://xrpl.org/submit.html#request-format-1
// Reference: https://xrpl.org/docs/references/protocol/transactions/types/payment
const paymentTx = {
"TransactionType": "Payment",
"Account": wallet.address,

View File

@@ -39,7 +39,7 @@ async function checkDestination(accountData) {
/**
* Verify an account using a xrp-ledger.toml file.
* https://xrpl.org/xrp-ledger-toml.html#xrp-ledgertoml-file
* https://xrpl.org/docs/references/xrp-ledger-toml
*
* @param accountData
* @returns {Promise<{domain: string, verified: boolean}>}
@@ -89,7 +89,7 @@ async function verifyAccountDomain(accountData) {
* @returns {Promise<{domain: string, verified: boolean}>}
*/
async function verify(accountAddress, client) {
// Reference: https://xrpl.org/account_info.html
// Reference: https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/account-methods/account_info
const request = {
"command": "account_info",
"account": accountAddress,

View File

@@ -1,6 +1,6 @@
{
"name": "xrpl-javascript-desktop-wallet",
"version": "1.0.0",
"version": "1.1.0",
"license": "MIT",
"scripts": {
"hello": "electron 0-hello/index.js",
@@ -14,15 +14,15 @@
"domain-verification": "electron 8-domain-verification/index.js"
},
"dependencies": {
"async": "^3.2.4",
"async": "^3.2.6",
"fernet": "=0.3.3",
"node-fetch": "^2.6.9",
"pbkdf2-hmac": "^1.1.0",
"node-fetch": "^2.7.0",
"pbkdf2-hmac": "^1.2.1",
"open": "^8.4.0",
"toml": "^3.0.0",
"xrpl": "^4.3.0"
"xrpl": "^4.4.2"
},
"devDependencies": {
"electron": "28.3.2"
"electron": "38.2.0"
}
}

View File

@@ -17,6 +17,7 @@ const infoSession4 = require("../static/img/events/xrpl-builder-office-hours-04.
const decarb = require('../static/img/events/xrpl-decarb.png')
const townHall = require('../static/img/events/town-hall-meetup.png')
const devBootcamp = require('../static/img/events/dev-bootcamp.png')
const italyHackathon = require("../static/img/events/italy-hackathon.png");
export const frontmatter = {
seo: {
title: "Events",
@@ -26,8 +27,8 @@ export const frontmatter = {
};
export const sortEvents = (arr, asc = true) => {
return arr.sort((a, b) => {
const dateA = moment(a.date, "MMMM D, YYYY");
const dateB = moment(b.date, "MMMM D, YYYY");
const dateA = moment(a.end_date, "MMMM D, YYYY");
const dateB = moment(b.end_date, "MMMM D, YYYY");
return asc ? dateB.diff(dateA) : dateA.diff(dateB); // Returns a negative value if dateA is before dateB, positive if after, and 0 if the same
});
};
@@ -1275,14 +1276,36 @@ const events = [
{
name: "Vega House Hackathon",
description:
"The Vega House XRPL Hackathon is calling all developers, designers, and innovators to create incredible solutions on the XRP Ledger (XRPL).",
"Vega House Hackathon: Compete in two XRPL tracks—Ledger Track to build MVP financial services using payments, tokenization, RLUSD, or AMM/DEX flows, and Exploration Track to create innovative apps leveraging XRPL features and upcoming amendments. Prizes total $25,000, including track awards and bounties for best use of new XRPL features.",
type: "hackathon",
link: "https://xrpl.vegahacks.xyz/",
location: "Virtual",
date: "October 01, 2025",
image: hackathon,
date: "Oct 01 - Nov 14, 2025",
image: italyHackathon,
end_date: "November 14, 2025",
},
{
name: "XRPL Town Hall Meeting #5",
description:
"Join Us for the 5th XRPL Town Hall Meeting!",
type: "info",
link: "https://luma.com/wo0g0fpv",
location: "Virtual",
date: "October 16, 2025",
image: require("../static/img/events/townhall-5.png"),
end_date: "October 16, 2025",
},
{
name: "XRPL Aquarium Residency Demo Day #7",
description:
"The Aquarium Residency is a 12-week program for entrepreneurs & developers building on the XRP Ledger blockchain. Join us at our Paris HQ to connect with our 11 residents, discover their projects focused on DeFi II, and engage with the XRPL community.",
type: "meetup",
link: "https://luma.com/mnby11vr",
location: "Paris, France",
image: require("../static/img/events/aquarium-residency.png"),
date: "December 10, 2025",
end_date: "December 10, 2025",
},
];

View File

@@ -20,6 +20,7 @@ const brazil = require("../static/img/events/event-meetup-brazil.png");
const infoSession2 = require("../static/img/events/xrpl-builder-office-hours-02.png");
const infoSession3 = require("../static/img/events/xrpl-builder-office-hours-03.png");
const infoSession4 = require("../static/img/events/xrpl-builder-office-hours-04.png");
const italyHackathon = require("../static/img/events/italy-hackathon.png");
const events = [
{
name: "New Horizon: Innovate Without Limits: New Horizons Await",
@@ -377,18 +378,18 @@ const events = [
link: "https://luma.com/llwjrmcx",
location: "Rome, Italy",
date: "November 07, 2025",
image: hackathon,
image: italyHackathon,
end_date: "November 08, 2025",
start_date: "November 07, 2025",
},
{
name: "Vega House Hackathon",
description:
"The Vega House XRPL Hackathon is calling all developers, designers, and innovators to create incredible solutions on the XRP Ledger (XRPL).",
"Vega House Hackathon: Compete in two XRPL tracks—Ledger Track to build MVP financial services using payments, tokenization, RLUSD, or AMM/DEX flows, and Exploration Track to create innovative apps leveraging XRPL features and upcoming amendments. Prizes total $25,000, including track awards and bounties for best use of new XRPL features.",
type: "hackathon",
link: "https://xrpl.vegahacks.xyz/",
location: "Virtual",
date: "October 01, 2025",
date: "October 01 - November 14, 2025",
image: hackathon,
end_date: "November 14, 2025",
start_date: "October 01, 2025",

View File

@@ -1,6 +1,4 @@
---
html: escrow.html
parent: payment-types.html
seo:
description: Escrow holds funds until specified conditions are met.
labels:
@@ -12,27 +10,45 @@ Traditionally, an escrow is a contract between two parties to facilitate financi
The XRP Ledger takes escrow a step further, replacing the third party with an automated system built into the ledger. An escrow locks up XRP or fungible tokens, which can't be used or destroyed until conditions are met.
{% amendment-disclaimer name="TokenEscrow" mode="updated" /%}
## Token Escrow
The [TokenEscrow amendment][] extends escrow functionality to fungible tokens, which means [Trust Line Tokens](../../concepts/tokens/fungible-tokens/trust-line-tokens.md) and [Multi-Purpose Tokens (MPTs)](../../concepts/tokens/fungible-tokens/multi-purpose-tokens.md#transferability-controls) can be held in escrow.
For Trust Line Tokens to be held in escrow, the issuing account must have the **Allow Trust Line Locking** flag enabled, which allows tokens issued by the account to be held in escrow. For MPTs, the issuer needs to enable the **Can Escrow** and **Can Transfer** flags when creating the token issuance, so that the tokens can be held in escrow and transferred.
While issuers can't create escrows with their own issued tokens, they can serve as recipients. When an issuer receives escrowed tokens, the process works the same way as a direct payment.
If a token requires authorization, the sender must be pre-authorized by the issuer before creating an escrow and must also be authorized to receive the tokens back when an expired escrow is canceled, regardless of who submits the cancellation transaction. The recipient must be pre-authorized before the escrow can be finished.
## Types of Escrow
The XRP Ledger supports three types of escrow:
- **Time-based Escrow:** Funds only become available after a certain amount of time passes.
- **Conditional Escrow:** This escrow is created with a corresponding condition and fulfillment. The condition serves as a lock on the funds and won't release until the correct fulfillment key is provided.
- **Combination Escrow:** This escrow combines the features of time-based and conditional escrow. The escrow is completely inaccessible until the specified time passes, after which the funds can be release by providing the correct fulfillment.
- **Combination Escrow:** This escrow combines the features of time-based and conditional escrow. The escrow is completely inaccessible until the specified time passes, after which the funds can be released by providing the correct fulfillment.
## Escrow Lifecycle
The lifecycle of an escrow is as follows:
1. The sender creates an escrow using the `EscrowCreate` transaction. This transaction defines:
- An number of XRP or fungible tokens to lock up.
- The conditions to release the XRP or fungible tokens.
- The recipient of the XRP or fungible tokens.
- An amount of XRP or fungible tokens to lock up.
- The conditions to release the funds.
- For **XRP escrows** this can include a time when the escrow can complete, a cryptographic condition that must be fulfilled, and optionally a time when the escrow expires.
- For **token escrows** similar conditions apply, but an expiration time is _mandatory_.
- The recipient of the funds. Any applicable transfer rates or fees are captured at creation time and will apply when the escrow completes, ensuring predictability for the recipient.
2. When the transaction is processed, the XRP Ledger creates an `Escrow` object that holds the escrowed XRP or fungible token.
2. When the transaction is processed successfully, the XRP Ledger creates an `Escrow` object that holds the escrowed funds.
3. The recipient sends an `EscrowFinish` transaction to deliver the XRP or fungible tokens. If the conditions have been met, this destroys the `Escrow` object and delivers the XRP or fungible tokens to the recipient.
3. The recipient sends an `EscrowFinish` transaction to deliver the funds. If the conditions are met, this destroys the `Escrow` object and delivers the funds to the recipient. Additionally, any missing trust lines or MPT entries may be auto-created for recipients if authorization isn't required.
{% admonition type="info" name="Note" %}If the escrow has an expiration time and isn't successfully finished before then, the escrow becomes expired. An expired escrow remains in the ledger until an `EscrowCancel` transaction cancels it, destroying the `Escrow` object and returning the escrowed XRP or fungible tokens to the sender.{% /admonition %}
{% admonition type="info" name="Note" %}
If the escrow has an expiration time and isn't successfully finished before then, the escrow becomes expired. An expired escrow remains in the ledger until an `EscrowCancel` transaction cancels it, returning the escrowed funds to the sender.
{% /admonition %}
## Escrow States
@@ -42,13 +58,16 @@ The following diagram shows the states an Escrow can progress through:
The diagram shows three different cases for three possible combinations of the escrow's "finish-after" time (`FinishAfter` field), crypto-condition (`Condition` field), and expiration time (`CancelAfter` field):
{% admonition type="info" name="Note" %}
While XRP escrows can sometimes exist without an expiration time, token escrows must **always** have an expiration time (`CancelAfter` field).
{% /admonition %}
- **Time-based Escrow (left):** With only a finish-after time, the escrow is created in the **Held** state. After the specified time has passed, it becomes **Ready** and anyone can finish it. If the escrow has an expiration time and no one finishes it before that time passes, then the escrow becomes **Expired**. In the expired state, an escrow cannot be finished, and anyone can cancel it. If the escrow does not have a `CancelAfter` field, it never expires and cannot be canceled.
- **Combination Escrow (center):** If the escrow specifies both a crypto-condition (`Condition` field) _and_ a "finish-after" time (`FinishAfter` field), the escrow is **Held** until its finish-after time has passed. Then it becomes **Conditionally Ready**, and can finish it if they supply the correct fulfillment to the crypto-condition. If the escrow has an expiration time (`CancelAfter` field), and no one finishes it before that time passes, then the escrow becomes **Expired**. In the expired state, an escrow cannot be finished, and anyone can cancel it. If the escrow does not have a `CancelAfter` field, it never expires and cannot be canceled.
- **Conditional Escrow (right):** If the escrow specifies a crypto-condition (`Condition` field) and not a finish-after time, the escrow becomes **Conditionally Ready** immediately when it is created. During this time, anyone can finish the escrow, but only if they supply the correct fulfillment to the crypto-condition. If no one finishes the escrow before its expiration time (`CancelAfter` field), the escrow becomes **Expired**. (An escrow without a finish-after time _must_ have an expiration time.) In the expired state, the escrow can no longer be finished, and anyone can cancel it.
## Limitations
- The costs can make it infeasible for small amounts.
@@ -57,7 +76,9 @@ The diagram shows three different cases for three possible combinations of the e
- You can't create an escrow with past time values.
- Timed releases and expirations resolve according to [ledger close times](../ledgers/ledger-close-times.md). In practice, actual release and expiration times can vary by about five seconds as ledgers close.
- The only supported crypto-condition type is PREIMAGE-SHA-256.
- If a token holder is deep frozen (Trust Line Tokens) or locked (MPTs), they cannot finish an escrow to receive tokens, but they can still cancel an escrow to return tokens to the sender. Individual or global freezes for Trust Line Tokens don't prevent escrow completion.
- For tokens requiring authorization, both sender and recipient must be pre-authorized by the issuer before creating or finishing the escrow, respectively. Authorization cannot be granted during the escrow completion process.
## EscrowFinish Transaction Cost
@@ -65,7 +86,7 @@ When using crypto-conditions, the EscrowFinish transaction must pay a [higher tr
The additional transaction cost required is proportional to the size of the fulfillment. If the transaction is [multi-signed](../accounts/multi-signing.md), the cost of multi-signing is added to the cost of the fulfillment.
Currently, an EscrowFinish with a fulfillment requires a minimum transaction cost of **330 [drops of XRP](../../references/protocol/data-types/basic-data-types.md#specifying-currency-amounts)** plus 10 drops per 16 bytes in the size of the fulfillment**.
Currently, an EscrowFinish with a fulfillment requires a minimum transaction cost of **330 [drops of XRP](../../references/protocol/data-types/basic-data-types.md#specifying-currency-amounts)** plus 10 drops per 16 bytes in the size of the fulfillment.
{% admonition type="info" name="Note" %}The above formula is based on the assumption that the reference cost of a transaction is 10 drops of XRP.{% /admonition %}

View File

@@ -1,22 +1,22 @@
---
seo:
description: Payment Channels enable fast, asynchronous payments that can be divided into very small increments and settled later.
description: Payment Channels enable fast, asynchronous XRP payments that can be divided into very small increments and settled later.
labels:
- Payment Channels
- Smart Contracts
---
# Payment Channels
Payment Channels are an advanced feature for sending "asynchronous" payments that can be divided into very small increments and settled later.
Payment Channels are an advanced feature for sending "asynchronous" XRP payments that can be divided into very small increments and settled later.
The XRP or fungible tokens for a payment channel are set aside temporarily. The sender creates _Claims_ against the channel, which the recipient verifies without sending an XRP Ledger transaction or waiting for a new ledger version to be approved by [consensus](../consensus-protocol/index.md). (This is an _asynchronous_ process because it happens separate from the usual pattern of getting transactions approved by consensus.) At any time, the recipient can _redeem_ a Claim to receive an amount of XRP or fungible tokens authorized by that Claim. Settling a Claim like this uses a standard XRP Ledger transaction, as part of the usual consensus process. This single transaction can encompass any number of transactions guaranteed by smaller Claims.
The XRP for a payment channel is set aside temporarily. The sender creates _Claims_ against the channel, which the recipient verifies without sending an XRP Ledger transaction or waiting for a new ledger version to be approved by [consensus](../consensus-protocol/index.md). (This is an _asynchronous_ process because it happens separate from the usual pattern of getting transactions approved by consensus.) At any time, the recipient can _redeem_ a Claim to receive an amount of XRP authorized by that Claim. Settling a Claim like this uses a standard XRP Ledger transaction, as part of the usual consensus process. This single transaction can encompass any number of transactions guaranteed by smaller Claims.
Because Claims can be verified individually but settled in bulk later, payment channels make it possible to conduct transactions at a rate only limited by the participants' ability to create and verify the digital signatures of those Claims. This limit is primarily based on the speed of the participants' hardware and the complexity of the signature algorithms. For maximum speed, use Ed25519 signatures, which are faster than the XRP Ledger's default secp256k1 ECDSA signatures. Research has [demonstrated the ability to create over Ed25519 100,000 signatures per second and to verify over 70,000 per second](https://ed25519.cr.yp.to/ed25519-20110926.pdf) on commodity hardware in 2011.
## Why Use Payment Channels
The process of using a payment channel always involves two parties, a payer and a payee. The payer is an individual person or institution using the XRP Ledger who is a customer of the payee. The payee is a person or business who receives XRP or fungible tokens as payment for goods or services.
The process of using a payment channel always involves two parties, a payer and a payee. The payer is an individual person or institution using the XRP Ledger who is a customer of the payee. The payee is a person or business who receives XRP as payment for goods or services.
Payment Channels do not intrinsically specify anything about what you can buy and sell with them. However, the types of goods and services that are a good fit for payment channels are:

View File

@@ -5,7 +5,7 @@ labels:
- Payment Channels
---
# account_channels
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/rpc/handlers/AccountChannels.cpp "Source")
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/rpc/handlers/AccountChannels.cpp "Source")
The `account_channels` method returns information about an account's Payment Channels. This includes only channels where the specified account is the channel's source, not the destination. (A channel's "source" and "owner" are the same.) All information retrieved is relative to a particular version of the ledger.
@@ -57,14 +57,11 @@ The request includes the following parameters:
| Field | Type | Required? | Description |
|:----------------------|:---------------------|:----------|-------------|
| `account` | String - [Address][] | Yes | Look up channels where this account is the channel's owner/source. |
| `amount` | Object or String | No | The total amount allocated to this channel. |
| `balance` | Object or String | No | The total amount paid out from this channel, as of the ledger version used. (You can calculate the amount left in the channel by subtracting `balance` from `amount`). |
| `destination_account` | String - [Address][] | No | A second account; if provided, filter results to payment channels whose destination is this account. |
| `ledger_hash` | String | No | The unique hash of the ledger version to use. (See [Specifying Ledgers][]) |
| `ledger_index` | Number or String | No | The [ledger index][] of the ledger to use, or a shortcut string to choose a ledger automatically. (See [Specifying Ledgers][]) |
| `limit` | Number | No | Limit the number of transactions to retrieve. Cannot be less than 10 or more than 400. Positive values outside this range are replaced with the closest valid option. The default is 200. |
| `marker` | [Marker][] | No | Value from a previous paginated response. Resume retrieving data where that response left off. |
| `transfer_rate` | Number | No | The fee to charge when users make claims on a payment channel, initially set on the creation of a payment channel and updated on subsequent funding or claim transactions. |
## Response Format
@@ -175,8 +172,6 @@ Each Channel Object has the following fields:
| Field | Type | Description |
|:----------------------|:-----------------|:----------------------------------|
| `account` | String | The owner of the channel, as an [Address][]. |
| `amount` | Object or String | The total amount of [XRP, in drops][] or fungible tokens allocated to this channel. |
| `balance` | String | The total amount of [XRP, in drops][] or fungible tokens paid out from this channel, as of the ledger version used. (You can calculate the amount left in the channel by subtracting `balance` from `amount`.) |
| `channel_id` | String | A unique ID for this channel, as a 64-character hexadecimal string. This is also the [ID of the channel object](../../../protocol/ledger-data/ledger-entry-types/paychannel.md#paychannel-id-format) in the ledger's state data. |
| `destination_account` | String | The destination account of the channel, as an [Address][]. Only this account can receive the `amount` in the channel while it is open. |
| `settle_delay` | Unsigned Integer | The number of seconds the payment channel must stay open after the owner of the channel requests to close it. |

View File

@@ -65,8 +65,6 @@ The request accepts the following parameters:
| `limit` | Number | No | Limit the number of trust lines to retrieve. The server may return less than the specified limit, even if there are more pages of results. Must be within the inclusive range 10 to 400. Positive values outside this range are replaced with the closest valid option. The default is 200. |
| `marker` | [Marker][] | No | Value from a previous paginated response. Resume retrieving data where that response left off. |
| `peer` | String - [Address][] | No | A second account; if provided, filter results to trust lines connecting the two accounts. |
| `locked_balance` | Object | No | The total amount locked in payment channels or escrow. |
| `lock_count` | Number | No | the total number of lock balances on a RippleState ledger object. |
The following parameters are deprecated and may be removed without further notice: `ledger` and `peer_index`.

View File

@@ -24,7 +24,7 @@ An example of the request format:
{
"id": 1,
"command": "nft_history",
"nft_id": "00080000B4F4AFC5FBCBD76873F18006173D2193467D3EE70000099B00000000"
"nft_id": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9"
}
```
{% /tab %}
@@ -35,7 +35,7 @@ An example of the request format:
"method": "nft_history",
"params": [
{
"nft_id": "00080000B4F4AFC5FBCBD76873F18006173D2193467D3EE70000099B00000000"
"nft_id": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9"
}
]
}
@@ -48,17 +48,17 @@ An example of the request format:
The request contains the following parameters:
| `Field` | Type | Description |
|:---------------|:---------------------------|:-------------------------------|
| `nft_id` | String | A unique identifier for the non-fungible token (NFT). |
| `ledger_index_min` | Integer | _(Optional)_ Use to specify the earliest ledger from which to include NFTs. A value of `-1` instructs the server to use the earliest validated ledger version available. |
| `ledger_index_max` | Integer | _(Optional)_ Use to specify the most recent ledger to include NFTs from. A value of `-1` instructs the server to use the most recent validated ledger version available. |
| `ledger_hash` | String | _(Optional)_ The unique hash of the ledger version to use. (See [Specifying Ledgers][]) |
| `ledger_index` | String or Unsigned Integer | _(Optional)_ The [ledger index][] of the ledger to use, or a shortcut string to choose a ledger automatically. Do not specify the `ledger_index` as `closed` or `current`; doing so forwards the request to the P2P `rippled` server and the `nft_history` API is not available on `rippled`. (See [Specifying Ledgers][]) |
| `binary` | Boolean | _(Optional)_ Defaults to `false`. If set to `true`, returns transactions as hex strings instead of JSON. |
| `forward` | Boolean | _(Optional)_ Defaults to `false`. If set to `true`, returns values indexed with the oldest ledger first. Otherwise, the results are indexed with the newest ledger first. (Each page of results might not be internally ordered, but the pages are ordered overall.) |
| `limit` | UInt32 | _(Optional)_ Limit the number of NFTs to retrieve. The server is not required to honor this value. |
| `marker` | Marker | Value from a previous paginated response. Resume retrieving data where that response left off. This value is NOT stable if there is a change in the server's range of available ledgers. If you are querying the “validated” ledger, it is possible that new NFTs are created during your paging. |
| `Field` | Type | Description |
|:-------------------|:---------------------------|:------------|
| `nft_id` | String | A unique identifier for the non-fungible token (NFT). |
| `ledger_index_min` | Integer | _(Optional)_ Use to specify the earliest ledger from which to include NFTs. A value of `-1` instructs the server to use the earliest validated ledger version available. |
| `ledger_index_max` | Integer | _(Optional)_ Use to specify the most recent ledger to include NFTs from. A value of `-1` instructs the server to use the most recent validated ledger version available. |
| `ledger_hash` | String | _(Optional)_ The unique hash of the ledger version to use. (See [Specifying Ledgers][]) |
| `ledger_index` | String or Unsigned Integer | _(Optional)_ The [ledger index][] of the ledger to use, or a shortcut string to choose a ledger automatically. Do not specify the `ledger_index` as `closed` or `current`; doing so forwards the request to the P2P `rippled` server and the `nft_history` API is not available on `rippled`. (See [Specifying Ledgers][]) |
| `binary` | Boolean | _(Optional)_ Defaults to `false`. If set to `true`, returns transactions as hex strings instead of JSON. |
| `forward` | Boolean | _(Optional)_ Defaults to `false`. If set to `true`, returns values indexed with the oldest ledger first. Otherwise, the results are indexed with the newest ledger first. (Each page of results might not be internally ordered, but the pages are ordered overall.) |
| `limit` | UInt32 | _(Optional)_ Limit the number of NFTs to retrieve. The server is not required to honor this value. |
| `marker` | Marker | Value from a previous paginated response. Resume retrieving data where that response left off. This value is NOT stable if there is a change in the server's range of available ledgers. If you are querying the “validated” ledger, it is possible that new NFTs are created during your paging. |
{% admonition type="info" name="Note" %}If you do not specify a ledger version, Clio uses the latest validated ledger.{% /admonition %}
@@ -71,78 +71,221 @@ An example of a successful response:
{% tab label="WebSocket" %}
```json
{
"id": 0,
"type": "response",
"result": {
"ledger_index_min": 21377274,
"ledger_index_max": 27876163,
"nft_id": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"ledger_index_min": 32570,
"ledger_index_max": 99409949,
"transactions": [
{
"meta": {
"AffectedNodes": [
{
"CreatedNode": {
"LedgerEntryType": "NFTokenPage",
"LedgerIndex": "97707A94B298B50334C39FB46E245D4744C0F5B5FFFFFFFFFFFFFFFFFFFFFFFF",
"NewFields": {
"NFTokens": [
{
"NFToken": {
"NFTokenID": "0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B00000000",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469"
}
}
]
}
"DeletedNode": {
"FinalFields": {
"Flags": 2,
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"PreviousTxnID": "FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A5619",
"PreviousTxnLgrSeq": 92840801,
"RootIndex": "1C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "1C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D"
}
},
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "587E28972F3B63D2260C0671E59593EE6C4D27AB857D1AF230F5CAA959BB3EAC",
"PreviousTxnID": "15DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A",
"PreviousTxnLgrSeq": 93800929
}
},
{
"DeletedNode": {
"FinalFields": {
"Amount": "3000000",
"Destination": "rpx9JThQ2y37FaGeeJP7PXDUVEXY3PHZSC",
"Flags": 1,
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"NFTokenOfferNode": "0",
"Owner": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"OwnerNode": "a3",
"PreviousTxnID": "FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A5619",
"PreviousTxnLgrSeq": 92840801
},
"LedgerEntryType": "NFTokenOffer",
"LedgerIndex": "6267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rNoj836fhDm1eXaHHefPKs7iDb4gwzS7nc",
"Balance": "999999988",
"Account": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"Balance": "270183296",
"BurnedNFTokens": 72,
"FirstNFTokenSequence": 66004341,
"Flags": 0,
"MintedNFTokens": 1,
"OwnerCount": 1,
"Sequence": 27876155
"MintedNFTokens": 111,
"OwnerCount": 1204,
"Sequence": 66025366
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "AC0A2AD29B67B5E6DA1C5DE696440F59BCD8DEA0A4CF7AFD683D1489AAB1ED24",
"LedgerIndex": "993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019",
"PreviousFields": {
"Balance": "1000000000",
"OwnerCount": 0,
"Sequence": 27876154
"Balance": "270183308",
"OwnerCount": 1205,
"Sequence": 66025365
},
"PreviousTxnID": "B483F0F7100658380E42BCF1B15AD59B71C4082635AD53B78D08A5198BBB6939",
"PreviousTxnLgrSeq": 27876154
"PreviousTxnID": "15DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A",
"PreviousTxnLgrSeq": 93800929
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"IndexNext": "a6",
"IndexPrevious": "a2",
"Owner": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"RootIndex": "FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD7140"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "D397E071F0DE6F26875FA9ABD92FAFC13B1CE6E6A612DD9FDB1EF4FA2D79B0B6",
"PreviousTxnID": "15DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A",
"PreviousTxnLgrSeq": 93800929
}
}
],
"TransactionIndex": 0,
"TransactionIndex": 98,
"TransactionResult": "tesSUCCESS"
},
"tx": {
"Account": "rNoj836fhDm1eXaHHefPKs7iDb4gwzS7nc",
"Account": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"Fee": "12",
"LastLedgerSequence": 93800952,
"NFTokenOffers": [
"6267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8"
],
"Sequence": 66025365,
"SigningPubKey": "03F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D4",
"SourceTag": 101102979,
"TransactionType": "NFTokenCancelOffer",
"TxnSignature": "30450221009897AFA16980838EAB0DD819E199E77E80879AA303DAEFF36FB970406715050402205892143D89D07CBD95CA101B2DE561465615A05E670A0A7A15209A0EFC52FE44",
"hash": "324EA92E3B2FD79B53655682045667BA7B683D5FB1051BF33BDDA982F21CB531",
"ledger_index": 93800934,
"date": 791530220
},
"validated": true
}
// ... Additional Metadata omitted for brevity
},
{
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"NFTokens": [
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816B4066980521CFFD",
"URI": "697066733A2F2F516D577335764370506278664A48466351514335385534585778614536446E68376E36414457516F517154714364"
}
},
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816BABD2130521D078",
"URI": "697066733A2F2F516D50363735763661326A5379316263656D70444D355A70365638683842685677594E77737A667053417439394A"
}
}
// ... Additional NFToken entries omitted for brevity
],
"NextPageMin": "6807BF848FACD972F2F617E27003D75B2CAAC9812CAAC9818A6641830521CFE8",
"PreviousPageMin": "6807BF848FACD972F2F617E27003D75B2CAAC9812CAAC9816B4066980521CFFD"
},
"LedgerEntryType": "NFTokenPage",
"LedgerIndex": "6807BF848FACD972F2F617E27003D75B2CAAC9812CAAC98179E62DAF0521D014",
"PreviousFields": {
"NFTokens": [
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816B4066980521CFFD",
"URI": "697066733A2F2F516D577335764370506278664A48466351514335385534585778614536446E68376E36414457516F517154714364"
}
},
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816BABD2130521D078",
"URI": "697066733A2F2F516D50363735763661326A5379316263656D70444D355A70365638683842685677594E77737A667053417439394A"
}
}
// ... Additional NFToken entries omitted for brevity
]
},
"PreviousTxnID": "75036C0D3740CEBF1A45E1EAA080F434E8CE865375A962D9F809A92B79ABBBBE",
"PreviousTxnLgrSeq": 86769021
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rwVhZJLcdtioxdETLq31Ne2K97xm4zA8Jv",
"Balance": "62592375",
"BurnedNFTokens": 129,
"FirstNFTokenSequence": 86101877,
"Flags": 0,
"MintedNFTokens": 629,
"OwnerCount": 20,
"Sequence": 86102636
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "DD1EBD4FBD7B5FD90A271F416083636046FBEA37342114A0026C444F95FFE1F3",
"PreviousFields": {
"Balance": "62592387",
"MintedNFTokens": 628,
"Sequence": 86102635
},
"PreviousTxnID": "C43C70DD5921EAFEFDC2EDC43DF83FF0FE74FB796D9E3F32EA4BFAF890968876",
"PreviousTxnLgrSeq": 86774497
}
}
],
"TransactionIndex": 3,
"TransactionResult": "tesSUCCESS"
},
"tx": {
"Account": "rwVhZJLcdtioxdETLq31Ne2K97xm4zA8Jv",
"Fee": "12",
"Flags": 8,
"LastLedgerSequence": 27876176,
"LastLedgerSequence": 86774537,
"Memos": [
{
"Memo": {
"MemoData": "43726561746564206F6E206E66742E6F6E7872702E636F6D"
}
}
],
"NFTokenTaxon": 0,
"Sequence": 27876154,
"SigningPubKey": "EDDC20C6791F9FB13AFDCE2C717BE8779DD451BB556243F1FDBAA3CD159D68A9F6",
"Sequence": 86102635,
"SigningPubKey": "027A4E42790158269E1FAD03364B5A365C26D1C686DEA1A22BFE889AC0C759B2CD",
"SourceTag": 69420589,
"TransactionType": "NFTokenMint",
"TransferFee": 10000,
"TxnSignature": "EF657AB47E86FDC112BA054D90587DFE64A61604D9EDABAA7B01B61B56433E3C2AC5BF5AD2E8F5D2A9EAC22778F289094AC383A3F172B2304157A533E0C79802",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"hash": "E0774E1B8628E397C6E88F67D4424E55E4C81324607B19318255310A6FBAA4A2",
"ledger_index": 27876158,
"date": 735167200
"TxnSignature": "3045022100B6AD2D48CFBBA1700A45853D779CEA05A4E438F0B98A6BEDB2200ABEA1D9F87902207E5879CDE873807B945344D2C872632103989097AE3660DEEAD52D84640C414D",
"URI": "697066733A2F2F516D57515A4167695A337041327065654A4D7441703663326A394151666E78706A754E62674D5A505748617A3267",
"hash": "FB9F697C4C9C7E8248BA63E7EDB4435B3CC12AF0BF426E618B184B76B7F94D28",
"ledger_index": 86774529,
"date": 764373881
},
"validated": true
}
],
"nft_id": "0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B00000000",
"validated": true
},
"id": "example_nft_history",
"status": "success",
"type": "response",
"warnings": [
{
"id": 2001,
@@ -157,74 +300,216 @@ An example of a successful response:
```json
{
"result": {
"ledger_index_min": 21377274,
"ledger_index_max": 27876163,
"nft_id": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"ledger_index_min": 32570,
"ledger_index_max": 99413196,
"transactions": [
{
"meta": {
"AffectedNodes": [
{
"CreatedNode": {
"LedgerEntryType": "NFTokenPage",
"LedgerIndex": "97707A94B298B50334C39FB46E245D4744C0F5B5FFFFFFFFFFFFFFFFFFFFFFFF",
"NewFields": {
"NFTokens": [
{
"NFToken": {
"NFTokenID": "0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B00000000",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469"
}
}
]
}
"DeletedNode": {
"FinalFields": {
"Flags": 2,
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"PreviousTxnID": "FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A5619",
"PreviousTxnLgrSeq": 92840801,
"RootIndex": "1C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "1C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D"
}
},
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "587E28972F3B63D2260C0671E59593EE6C4D27AB857D1AF230F5CAA959BB3EAC",
"PreviousTxnID": "15DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A",
"PreviousTxnLgrSeq": 93800929
}
},
{
"DeletedNode": {
"FinalFields": {
"Amount": "3000000",
"Destination": "rpx9JThQ2y37FaGeeJP7PXDUVEXY3PHZSC",
"Flags": 1,
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"NFTokenOfferNode": "0",
"Owner": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"OwnerNode": "a3",
"PreviousTxnID": "FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A5619",
"PreviousTxnLgrSeq": 92840801
},
"LedgerEntryType": "NFTokenOffer",
"LedgerIndex": "6267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rNoj836fhDm1eXaHHefPKs7iDb4gwzS7nc",
"Balance": "999999988",
"Account": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"Balance": "270183296",
"BurnedNFTokens": 72,
"FirstNFTokenSequence": 66004341,
"Flags": 0,
"MintedNFTokens": 1,
"OwnerCount": 1,
"Sequence": 27876155
"MintedNFTokens": 111,
"OwnerCount": 1204,
"Sequence": 66025366
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "AC0A2AD29B67B5E6DA1C5DE696440F59BCD8DEA0A4CF7AFD683D1489AAB1ED24",
"LedgerIndex": "993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019",
"PreviousFields": {
"Balance": "1000000000",
"OwnerCount": 0,
"Sequence": 27876154
"Balance": "270183308",
"OwnerCount": 1205,
"Sequence": 66025365
},
"PreviousTxnID": "B483F0F7100658380E42BCF1B15AD59B71C4082635AD53B78D08A5198BBB6939",
"PreviousTxnLgrSeq": 27876154
"PreviousTxnID": "15DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A",
"PreviousTxnLgrSeq": 93800929
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"IndexNext": "a6",
"IndexPrevious": "a2",
"Owner": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"RootIndex": "FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD7140"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "D397E071F0DE6F26875FA9ABD92FAFC13B1CE6E6A612DD9FDB1EF4FA2D79B0B6",
"PreviousTxnID": "15DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A",
"PreviousTxnLgrSeq": 93800929
}
}
],
"TransactionIndex": 0,
"TransactionIndex": 98,
"TransactionResult": "tesSUCCESS"
},
"tx": {
"Account": "rNoj836fhDm1eXaHHefPKs7iDb4gwzS7nc",
"Account": "rBodLLeMx7mqEBv4B2BsaWeTJYnALQddd6",
"Fee": "12",
"LastLedgerSequence": 93800952,
"NFTokenOffers": [
"6267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8"
],
"Sequence": 66025365,
"SigningPubKey": "03F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D4",
"SourceTag": 101102979,
"TransactionType": "NFTokenCancelOffer",
"TxnSignature": "30450221009897AFA16980838EAB0DD819E199E77E80879AA303DAEFF36FB970406715050402205892143D89D07CBD95CA101B2DE561465615A05E670A0A7A15209A0EFC52FE44",
"hash": "324EA92E3B2FD79B53655682045667BA7B683D5FB1051BF33BDDA982F21CB531",
"ledger_index": 93800934,
"date": 791530220
},
"validated": true
}
// ... Additional metadata entries omitted for brevity
{
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"NFTokens": [
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816B4066980521CFFD",
"URI": "697066733A2F2F516D577335764370506278664A48466351514335385534585778614536446E68376E36414457516F517154714364"
}
},
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816BABD2130521D078",
"URI": "697066733A2F2F516D50363735763661326A5379316263656D70444D355A70365638683842685677594E77737A667053417439394A"
}
}
// ... Additional NFToken entries omitted for brevity
],
"NextPageMin": "6807BF848FACD972F2F617E27003D75B2CAAC9812CAAC9818A6641830521CFE8",
"PreviousPageMin": "6807BF848FACD972F2F617E27003D75B2CAAC9812CAAC9816B4066980521CFFD"
},
"LedgerEntryType": "NFTokenPage",
"LedgerIndex": "6807BF848FACD972F2F617E27003D75B2CAAC9812CAAC98179E62DAF0521D014",
"PreviousFields": {
"NFTokens": [
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816B4066980521CFFD",
"URI": "697066733A2F2F516D577335764370506278664A48466351514335385534585778614536446E68376E36414457516F517154714364"
}
},
{
"NFToken": {
"NFTokenID": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816BABD2130521D078",
"URI": "697066733A2F2F516D50363735763661326A5379316263656D70444D355A70365638683842685677594E77737A667053417439394A"
}
}
// ... Additional NFToken entries omitted for brevity
]
},
"PreviousTxnID": "75036C0D3740CEBF1A45E1EAA080F434E8CE865375A962D9F809A92B79ABBBBE",
"PreviousTxnLgrSeq": 86769021
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rwVhZJLcdtioxdETLq31Ne2K97xm4zA8Jv",
"Balance": "62592375",
"BurnedNFTokens": 129,
"FirstNFTokenSequence": 86101877,
"Flags": 0,
"MintedNFTokens": 629,
"OwnerCount": 20,
"Sequence": 86102636
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "DD1EBD4FBD7B5FD90A271F416083636046FBEA37342114A0026C444F95FFE1F3",
"PreviousFields": {
"Balance": "62592387",
"MintedNFTokens": 628,
"Sequence": 86102635
},
"PreviousTxnID": "C43C70DD5921EAFEFDC2EDC43DF83FF0FE74FB796D9E3F32EA4BFAF890968876",
"PreviousTxnLgrSeq": 86774497
}
}
],
"TransactionIndex": 3,
"TransactionResult": "tesSUCCESS"
},
"tx": {
"Account": "rwVhZJLcdtioxdETLq31Ne2K97xm4zA8Jv",
"Fee": "12",
"Flags": 8,
"LastLedgerSequence": 27876176,
"LastLedgerSequence": 86774537,
"Memos": [
{
"Memo": {
"MemoData": "43726561746564206F6E206E66742E6F6E7872702E636F6D"
}
}
],
"NFTokenTaxon": 0,
"Sequence": 27876154,
"SigningPubKey": "EDDC20C6791F9FB13AFDCE2C717BE8779DD451BB556243F1FDBAA3CD159D68A9F6",
"Sequence": 86102635,
"SigningPubKey": "027A4E42790158269E1FAD03364B5A365C26D1C686DEA1A22BFE889AC0C759B2CD",
"SourceTag": 69420589,
"TransactionType": "NFTokenMint",
"TransferFee": 10000,
"TxnSignature": "EF657AB47E86FDC112BA054D90587DFE64A61604D9EDABAA7B01B61B56433E3C2AC5BF5AD2E8F5D2A9EAC22778F289094AC383A3F172B2304157A533E0C79802",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"hash": "E0774E1B8628E397C6E88F67D4424E55E4C81324607B19318255310A6FBAA4A2",
"ledger_index": 27876158,
"date": 735167200
"TxnSignature": "3045022100B6AD2D48CFBBA1700A45853D779CEA05A4E438F0B98A6BEDB2200ABEA1D9F87902207E5879CDE873807B945344D2C872632103989097AE3660DEEAD52D84640C414D",
"URI": "697066733A2F2F516D57515A4167695A337041327065654A4D7441703663326A394151666E78706A754E62674D5A505748617A3267",
"hash": "FB9F697C4C9C7E8248BA63E7EDB4435B3CC12AF0BF426E618B184B76B7F94D28",
"ledger_index": 86774529,
"date": 764373881
},
"validated": true
}
],
"nft_id": "0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B00000000",
"validated": true
"validated": true,
"status": "success"
},
"warnings": [
{
@@ -240,28 +525,56 @@ An example of a successful response:
With the `binary` parameter set to _true_, you receive a compact response that uses hex strings. It's not human readable, but much more concise.
{% admonition type="info" name="Note" %}
The example response below uses `api_version: 2`.
{% /admonition %}
{% tabs %}
{% tab label="WebSocket" %}
```json
{
"id": 0,
"type": "response",
"result": {
"ledger_index_min": 21377274,
"ledger_index_max": 27876275,
"nft_id": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"ledger_index_min": 32570,
"ledger_index_max": 99435937,
"transactions": [
{
"meta": "201C00000000F8E31100505697707A94B298B50334C39FB46E245D4744C0F5B5FFFFFFFFFFFFFFFFFFFFFFFFE8FAEC5A0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B000000007542697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469E1F1E1E1E51100612501A95B3A55B483F0F7100658380E42BCF1B15AD59B71C4082635AD53B78D08A5198BBB693956AC0A2AD29B67B5E6DA1C5DE696440F59BCD8DEA0A4CF7AFD683D1489AAB1ED24E62401A95B3A2D0000000062400000003B9ACA00E1E722000000002401A95B3B2D00000001202B0000000162400000003B9AC9F4811497707A94B298B50334C39FB46E245D4744C0F5B5E1E1F1031000",
"tx_blob": "12001914271022000000082401A95B3A201B01A95B50202A0000000068400000000000000C7321EDDC20C6791F9FB13AFDCE2C717BE8779DD451BB556243F1FDBAA3CD159D68A9F67440EF657AB47E86FDC112BA054D90587DFE64A61604D9EDABAA7B01B61B56433E3C2AC5BF5AD2E8F5D2A9EAC22778F289094AC383A3F172B2304157A533E0C798027542697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469811497707A94B298B50334C39FB46E245D4744C0F5B5",
"ledger_index": 27876158,
"date": 735167200,
"meta_blob": "201C00000062F8E4110064561C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231DE72200000002250588A36155FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A5619581C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E511006125059749E15515DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A56587E28972F3B63D2260C0671E59593EE6C4D27AB857D1AF230F5CAA959BB3EACE1E4110037566267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8E72200000001250588A3613400000000000000A33C000000000000000055FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A56195A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000002DC6C082147682B8C119F94724861D13A4B5307CBFABB669DD83141565EED165BA79999425204A8491C73B1301E34FE1E1E511006125059749E15515DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A56993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019E62403EF77952D000004B56240000000101AAB8CE1E722000000002403EF77962D000004B4202B0000006F202C00000048203203EF25756240000000101AAB8081147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E511006425059749E15515DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A56D397E071F0DE6F26875FA9ABD92FAFC13B1CE6E6A612DD9FDB1EF4FA2D79B0B6E722000000003100000000000000A63200000000000000A258FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD714082147682B8C119F94724861D13A4B5307CBFABB669DDE1E1F1031000",
"tx_blob": "12001C230606B5832403EF7795201B059749F868400000000000000C732103F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D4744730450221009897AFA16980838EAB0DD819E199E77E80879AA303DAEFF36FB970406715050402205892143D89D07CBD95CA101B2DE561465615A05E670A0A7A15209A0EFC52FE4481147682B8C119F94724861D13A4B5307CBFABB669DD0413206267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8",
"ledger_index": 93800934,
"date": 791530220,
"validated": true
},
{
"meta_blob": "201C0000004BF8E3110064561C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231DE82200000002581C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E5110061250588A35E55A1525FDCD490BD83BB936612B5C76D52507E40CB8384223AAC95E9ECDDD816BD56587E28972F3B63D2260C0671E59593EE6C4D27AB857D1AF230F5CAA959BB3EACE1E3110037566267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8E822000000013400000000000000A35A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000002DC6C082147682B8C119F94724861D13A4B5307CBFABB669DD83141565EED165BA79999425204A8491C73B1301E34FE1E1E5110061250588A35D554489CBBC591F7828A27B281FE513CDFC1E032ECF9483F01530404D3C29DDE5DC56993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019E62403EF5AB42D00000A1A62400000003AD61EBEE1E722000000002403EF5AB52D00000A1B202B0000006F202C00000048203203EF257562400000003AD61EB281147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E5110064250588A35D554489CBBC591F7828A27B281FE513CDFC1E032ECF9483F01530404D3C29DDE5DC56D397E071F0DE6F26875FA9ABD92FAFC13B1CE6E6A612DD9FDB1EF4FA2D79B0B6E722000000003200000000000000A258FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD714082147682B8C119F94724861D13A4B5307CBFABB669DDE1E1F1031000",
"tx_blob": "12001B2200000001230606B5832403EF5AB4201B0588A3735A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000002DC6C068400000000000000C732103F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D474473045022100F9AD1F24218A86E0C4ED87D7A80D30E64BED3158F369383EE2DAF8F215779C7C0220059A7B626D7F38E352BCCA7F45D3B4C10726BA2CAE64F8147089CF057297062281147682B8C119F94724861D13A4B5307CBFABB669DD83141565EED165BA79999425204A8491C73B1301E34F",
"ledger_index": 92840801,
"date": 787788902,
"validated": true
},
{
"meta_blob": "201C00000001F8E311003756417A1F7087351FF2F091149125B8537A08561DAA07B35399943DC4A3B1E591DAE83400000000000000185A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001EBF1882147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E5110064566400E79FD76837F48323E54A66DA168891E601EBDBF0BA3F9AD6A334784407ABE7220000000032000000000000001758FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD714082147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E311006456889A03272E16CBCA081FF39EE838C3A217485670113019DAA4A84932AEFC7F02E8220000000158889A03272E16CBCA081FF39EE838C3A217485670113019DAA4A84932AEFC7F025A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E511006125052C7E41558176DA2BA3363B0901379B292270CA089EDE39A255D4A8F0224C86483467BCEA56993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019E62403EF20182D0000017A6240000000E53A6064E1E722000000002403EF20192D0000017B6240000000E53A605881147682B8C119F94724861D13A4B5307CBFABB669DDE1E1F1031000",
"tx_blob": "12001B230423462D2403EF2018201B052C7E635A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001EBF1868400000000000000C732103F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D474473045022100991746A6AD5FC763B658D592AE6301AB19504C8032C97538AFE938FA375EBE8A0220200F7848848653D59151F432D6C6374C4838EE1373F7EFAA5C1EF4570B5FFBFA81147682B8C119F94724861D13A4B5307CBFABB669DD82146807BF848FACD972F2F617E27003D75B2CAAC981F9EA7D1843726561746564206F6E206E66742E6F6E7872702E636F6DE1F1",
"ledger_index": 86802011,
"date": 764479561,
"validated": true
},
{
"meta_blob": "201C0000000EF8E3110064561C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231DE82200000002581C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E5110064566096E1D8134722843D499E983F3A092D9B74AD2039F7F4FC3C17587B34DAFA24E7220000000032000000000000000D58830BE57DF6ED1C3103070BF1968CEFB15ADE866418A1B176E9B188ECE82BC63382146807BF848FACD972F2F617E27003D75B2CAAC981E1E1E511006125052C1F3F558DA0521A7779A7F845981EA94D551062C611F492F60F9ECEF53978340A63E32B56CD3CA85955F9B786BAD89F9125200EB9BCBEE5DCC996CC71A565FAA876CD1ACCE1E311003756D8C83BE4736E856BD18F92FC9A4ABD45641313508E5412D6ACACB90A82F948F5E8220000000134000000000000000E5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001E848082146807BF848FACD972F2F617E27003D75B2CAAC9818314112DE2804BD473EB8A77E01E1C43A9CDC79A6EBFE1E1E511006125052C1F3F558DA0521A7779A7F845981EA94D551062C611F492F60F9ECEF53978340A63E32B56DD1EBD4FBD7B5FD90A271F416083636046FBEA37342114A0026C444F95FFE1F3E6240521D44B2D000001EB62400000003C5AD883E1E72200000000240521D44C2D000001EC202B00000275202C0000008120320521CF7562400000003C5AD87781146807BF848FACD972F2F617E27003D75B2CAAC981E1E1F1031000",
"tx_blob": "12001B2200000001230423462D240521D44B201B052C1F4A5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001E848068400000000000000C7321027A4E42790158269E1FAD03364B5A365C26D1C686DEA1A22BFE889AC0C759B2CD7447304502210084109EB534DC4C45F5CA0AA10C08E396FDC1A84925B20B4188426EA0E56090CD02203555F331713600C91C09E72EFAC8BCC594A95561C16880866735F62D1DB0794381146807BF848FACD972F2F617E27003D75B2CAAC9818314112DE2804BD473EB8A77E01E1C43A9CDC79A6EBFF9EA7D1843726561746564206F6E206E66742E6F6E7872702E636F6DE1F1",
"ledger_index": 86777666,
"date": 764385850,
"validated": true
}
// ... Additional metadata omitted for brevity
],
"nft_id": "0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B00000000",
"validated": true
},
"id": "example_nft_history",
"api_version": 2,
"status": "success",
"type": "response",
"warnings": [
{
"id": 2001,
@@ -276,19 +589,42 @@ With the `binary` parameter set to _true_, you receive a compact response that u
```json
{
"result": {
"ledger_index_min": 21377274,
"ledger_index_max": 27876275,
"nft_id": "000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9",
"ledger_index_min": 32570,
"ledger_index_max": 99435993,
"transactions": [
{
"meta": "201C00000000F8E31100505697707A94B298B50334C39FB46E245D4744C0F5B5FFFFFFFFFFFFFFFFFFFFFFFFE8FAEC5A0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B000000007542697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469E1F1E1E1E51100612501A95B3A55B483F0F7100658380E42BCF1B15AD59B71C4082635AD53B78D08A5198BBB693956AC0A2AD29B67B5E6DA1C5DE696440F59BCD8DEA0A4CF7AFD683D1489AAB1ED24E62401A95B3A2D0000000062400000003B9ACA00E1E722000000002401A95B3B2D00000001202B0000000162400000003B9AC9F4811497707A94B298B50334C39FB46E245D4744C0F5B5E1E1F1031000",
"tx_blob": "12001914271022000000082401A95B3A201B01A95B50202A0000000068400000000000000C7321EDDC20C6791F9FB13AFDCE2C717BE8779DD451BB556243F1FDBAA3CD159D68A9F67440EF657AB47E86FDC112BA054D90587DFE64A61604D9EDABAA7B01B61B56433E3C2AC5BF5AD2E8F5D2A9EAC22778F289094AC383A3F172B2304157A533E0C798027542697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469811497707A94B298B50334C39FB46E245D4744C0F5B5",
"ledger_index": 27876158,
"date": 735167200,
"meta_blob": "201C00000062F8E4110064561C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231DE72200000002250588A36155FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A5619581C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E511006125059749E15515DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A56587E28972F3B63D2260C0671E59593EE6C4D27AB857D1AF230F5CAA959BB3EACE1E4110037566267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8E72200000001250588A3613400000000000000A33C000000000000000055FD779D4C51C30730EB3EC7B20D07CDB0BC5A259D165F29C8CFDE86752D5A56195A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000002DC6C082147682B8C119F94724861D13A4B5307CBFABB669DD83141565EED165BA79999425204A8491C73B1301E34FE1E1E511006125059749E15515DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A56993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019E62403EF77952D000004B56240000000101AAB8CE1E722000000002403EF77962D000004B4202B0000006F202C00000048203203EF25756240000000101AAB8081147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E511006425059749E15515DF0F4622A6BBA7051D029A1ED16930DB3D476D2B29CDF63FFDA5B320BF385A56D397E071F0DE6F26875FA9ABD92FAFC13B1CE6E6A612DD9FDB1EF4FA2D79B0B6E722000000003100000000000000A63200000000000000A258FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD714082147682B8C119F94724861D13A4B5307CBFABB669DDE1E1F1031000",
"tx_blob": "12001C230606B5832403EF7795201B059749F868400000000000000C732103F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D4744730450221009897AFA16980838EAB0DD819E199E77E80879AA303DAEFF36FB970406715050402205892143D89D07CBD95CA101B2DE561465615A05E670A0A7A15209A0EFC52FE4481147682B8C119F94724861D13A4B5307CBFABB669DD0413206267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8",
"ledger_index": 93800934,
"date": 791530220,
"validated": true
},
{
"meta_blob": "201C0000004BF8E3110064561C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231DE82200000002581C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E5110061250588A35E55A1525FDCD490BD83BB936612B5C76D52507E40CB8384223AAC95E9ECDDD816BD56587E28972F3B63D2260C0671E59593EE6C4D27AB857D1AF230F5CAA959BB3EACE1E3110037566267FBBCE11EEFB9931BFD2BB7E2D4455A60CBA6DE60830266DA4C1C7966D2A8E822000000013400000000000000A35A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000002DC6C082147682B8C119F94724861D13A4B5307CBFABB669DD83141565EED165BA79999425204A8491C73B1301E34FE1E1E5110061250588A35D554489CBBC591F7828A27B281FE513CDFC1E032ECF9483F01530404D3C29DDE5DC56993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019E62403EF5AB42D00000A1A62400000003AD61EBEE1E722000000002403EF5AB52D00000A1B202B0000006F202C00000048203203EF257562400000003AD61EB281147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E5110064250588A35D554489CBBC591F7828A27B281FE513CDFC1E032ECF9483F01530404D3C29DDE5DC56D397E071F0DE6F26875FA9ABD92FAFC13B1CE6E6A612DD9FDB1EF4FA2D79B0B6E722000000003200000000000000A258FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD714082147682B8C119F94724861D13A4B5307CBFABB669DDE1E1F1031000",
"tx_blob": "12001B2200000001230606B5832403EF5AB4201B0588A3735A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000002DC6C068400000000000000C732103F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D474473045022100F9AD1F24218A86E0C4ED87D7A80D30E64BED3158F369383EE2DAF8F215779C7C0220059A7B626D7F38E352BCCA7F45D3B4C10726BA2CAE64F8147089CF057297062281147682B8C119F94724861D13A4B5307CBFABB669DD83141565EED165BA79999425204A8491C73B1301E34F",
"ledger_index": 92840801,
"date": 787788902,
"validated": true
},
{
"meta_blob": "201C00000001F8E311003756417A1F7087351FF2F091149125B8537A08561DAA07B35399943DC4A3B1E591DAE83400000000000000185A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001EBF1882147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E5110064566400E79FD76837F48323E54A66DA168891E601EBDBF0BA3F9AD6A334784407ABE7220000000032000000000000001758FF1CF158ED5CE0E41E954B6CD1C3B5ECF1D4A3901113F1E2B9DCBF9532FD714082147682B8C119F94724861D13A4B5307CBFABB669DDE1E1E311006456889A03272E16CBCA081FF39EE838C3A217485670113019DAA4A84932AEFC7F02E8220000000158889A03272E16CBCA081FF39EE838C3A217485670113019DAA4A84932AEFC7F025A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E511006125052C7E41558176DA2BA3363B0901379B292270CA089EDE39A255D4A8F0224C86483467BCEA56993F123FC11F0FDD065FB33C99007369E4768994C03936C67B92C44F47DE5019E62403EF20182D0000017A6240000000E53A6064E1E722000000002403EF20192D0000017B6240000000E53A605881147682B8C119F94724861D13A4B5307CBFABB669DDE1E1F1031000",
"tx_blob": "12001B230423462D2403EF2018201B052C7E635A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001EBF1868400000000000000C732103F314C754C26C0B9A859693C57CFCE464A14E86ADA0CAA174817A637E828E64D474473045022100991746A6AD5FC763B658D592AE6301AB19504C8032C97538AFE938FA375EBE8A0220200F7848848653D59151F432D6C6374C4838EE1373F7EFAA5C1EF4570B5FFBFA81147682B8C119F94724861D13A4B5307CBFABB669DD82146807BF848FACD972F2F617E27003D75B2CAAC981F9EA7D1843726561746564206F6E206E66742E6F6E7872702E636F6DE1F1",
"ledger_index": 86802011,
"date": 764479561,
"validated": true
},
{
"meta_blob": "201C0000000EF8E3110064561C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231DE82200000002581C7421BF3CBA58699FF855EFF8BB68E63B843B17442FEED9CF3FDB5F497C231D5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E9E1E1E5110064566096E1D8134722843D499E983F3A092D9B74AD2039F7F4FC3C17587B34DAFA24E7220000000032000000000000000D58830BE57DF6ED1C3103070BF1968CEFB15ADE866418A1B176E9B188ECE82BC63382146807BF848FACD972F2F617E27003D75B2CAAC981E1E1E511006125052C1F3F558DA0521A7779A7F845981EA94D551062C611F492F60F9ECEF53978340A63E32B56CD3CA85955F9B786BAD89F9125200EB9BCBEE5DCC996CC71A565FAA876CD1ACCE1E311003756D8C83BE4736E856BD18F92FC9A4ABD45641313508E5412D6ACACB90A82F948F5E8220000000134000000000000000E5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001E848082146807BF848FACD972F2F617E27003D75B2CAAC9818314112DE2804BD473EB8A77E01E1C43A9CDC79A6EBFE1E1E511006125052C1F3F558DA0521A7779A7F845981EA94D551062C611F492F60F9ECEF53978340A63E32B56DD1EBD4FBD7B5FD90A271F416083636046FBEA37342114A0026C444F95FFE1F3E6240521D44B2D000001EB62400000003C5AD883E1E72200000000240521D44C2D000001EC202B00000275202C0000008120320521CF7562400000003C5AD87781146807BF848FACD972F2F617E27003D75B2CAAC981E1E1F1031000",
"tx_blob": "12001B2200000001230423462D240521D44B201B052C1F4A5A000827106807BF848FACD972F2F617E27003D75B2CAAC9816CEE14840521D1E96140000000001E848068400000000000000C7321027A4E42790158269E1FAD03364B5A365C26D1C686DEA1A22BFE889AC0C759B2CD7447304502210084109EB534DC4C45F5CA0AA10C08E396FDC1A84925B20B4188426EA0E56090CD02203555F331713600C91C09E72EFAC8BCC594A95561C16880866735F62D1DB0794381146807BF848FACD972F2F617E27003D75B2CAAC9818314112DE2804BD473EB8A77E01E1C43A9CDC79A6EBFF9EA7D1843726561746564206F6E206E66742E6F6E7872702E636F6DE1F1",
"ledger_index": 86777666,
"date": 764385850,
"validated": true
}
// ... Additional metadata omitted for brevity
],
"nft_id": "0008271097707A94B298B50334C39FB46E245D4744C0F5B50000099B00000000",
"validated": true
"validated": true,
"status": "success"
},
"warnings": [
{
@@ -297,7 +633,6 @@ With the `binary` parameter set to _true_, you receive a compact response that u
}
]
}
```
{% /tab %}
@@ -319,13 +654,14 @@ The response follows the [standard format][], with a successful result containin
Each transaction object includes the following fields, depending on whether it was requested in JSON or hex string (`"binary":true`) format.
| `Field` | Type | Description |
|:---------------|:---------------------------------|:-------------------------|
| `ledger_index` | Integer | The [ledger index][] of the ledger version that included this transaction. |
| `meta` | Object (JSON) or String (Binary) | If `binary` is True, then this is a hex string of the transaction metadata. Otherwise, the transaction metadata is included in JSON format. |
| `tx` | Object | (JSON mode only) JSON object defining the transaction |
| `tx_blob` | String | (Binary mode only) Unique hashed String representing the transaction. |
| `validated` | Boolean | Whether or not the transaction is included in a validated ledger. Any transaction not yet in a validated ledger is subject to change. |
| `Field` | Type | Description |
|:----------------|:---------------------------------|:-------------------------|
| `ledger_index` | Integer | The [ledger index][] of the ledger version that included this transaction. |
| `meta` (API v1) | Object (JSON) or String (Binary) | If `binary` is true, then this is a hex string of the transaction metadata. Otherwise, the transaction metadata is included in JSON format. |
| `meta_blob` (API v2) | String (Binary) | If `binary` is true, then this is a hex string of the transaction metadata. Otherwise, the transaction metadata is included as `meta` in JSON format. |
| `tx` | Object | (JSON mode only) JSON object defining the transaction |
| `tx_blob` | String | (Binary mode only) Unique hashed String representing the transaction. |
| `validated` | Boolean | Whether or not the transaction is included in a validated ledger. Any transaction not yet in a validated ledger is subject to change. |
For definitions of the fields returned in the `tx` object, see [Transaction Metadata](../../../protocol/transactions/metadata.md).

View File

@@ -7,7 +7,7 @@ labels:
# channel_authorize
[[Source]](https://github.com/XRPLF/rippled/blob/d4a56f223a3b80f64ff70b4e90ab6792806929ca/src/ripple/rpc/handlers/PayChanClaim.cpp#L41 "Source")
The `channel_authorize` method creates a signature that can be used to redeem a specific amount of XRP or fungible tokens from a payment channel.
The `channel_authorize` method creates a signature that can be used to redeem a specific amount of XRP from a payment channel.
{% amendment-disclaimer name="PayChan" /%}
@@ -65,7 +65,7 @@ The request includes the following parameters:
| `seed_hex` | String | _(Optional)_ The secret seed to use to sign the claim. This must be the same key pair as the public key specified in the channel. Must be in hexadecimal format. If provided, you must also specify the `key_type`. Cannot be used with `secret`, `seed`, or `passphrase`. |
| `passphrase` | String | _(Optional)_ A string passphrase to use to sign the claim. This must be the same key pair as the public key specified in the channel. The [key derived from this passphrase](../../../../concepts/accounts/cryptographic-keys.md#key-derivation) must match the public key specified in the channel. If provided, you must also specify the `key_type`. Cannot be used with `secret`, `seed`, or `seed_hex`. |
| `key_type` | String | _(Optional)_ The [signing algorithm](../../../../concepts/accounts/cryptographic-keys.md#signing-algorithms) of the cryptographic key pair provided. Valid types are `secp256k1` or `ed25519`. The default is `secp256k1`. |
| `amount` | Object or String | Cumulative amount of XRP, in drops, or fungible tokens to authorize. If the destination has already received a lesser amount from this channel, the signature created by this method can be redeemed for the difference. |
| `amount` | String | Cumulative amount of XRP, in drops, to authorize. If the destination has already received a lesser amount from this channel, the signature created by this method can be redeemed for the difference. |
The request **must** specify exactly one of `secret`, `seed`, `seed_hex`, or `passphrase`.

View File

@@ -9,7 +9,7 @@ labels:
# channel_verify
[[Source]](https://github.com/XRPLF/rippled/blob/d4a56f223a3b80f64ff70b4e90ab6792806929ca/src/ripple/rpc/handlers/PayChanClaim.cpp#L89 "Source")
The `channel_verify` method checks the validity of a signature that can be used to redeem a specific amount of XRP or fungible tokens from a payment channel.
The `channel_verify` method checks the validity of a signature that can be used to redeem a specific amount of XRP from a payment channel.
{% amendment-disclaimer name="PayChan" /%}
@@ -58,7 +58,7 @@ The request includes the following parameters:
| Field | Type | Description |
|-------|------|-------------|
| `amount` | Object or String | The amount of [XRP, in drops][], or fungible tokens the provided `signature` authorizes. |
| `amount` | String | The amount of [XRP, in drops][], that the provided `signature` authorizes. |
| `channel_id` | String | The Channel ID of the channel that provides the amount. This is a 64-character hexadecimal string. |
| `public_key` | String | The public key of the channel and the key pair that was used to create the signature, in hexadecimal or the XRP Ledger's [base58][] format. {% badge href="https://github.com/XRPLF/rippled/releases/tag/0.90.0" %}Updated in: rippled 0.90.0{% /badge %} |
| `signature` | String | The signature to verify, in hexadecimal. |

View File

@@ -88,6 +88,7 @@ AccountRoot objects can have the following flags combined in the `Flags` field:
| Flag Name | Hex Value | Decimal Value | Corresponding [AccountSet Flag](../../transactions/types/accountset.md#accountset-flags) | Description |
|-----------------------------------|--------------|-------------------|-----------------------------------|----|
| `lsfAllowTrustLineClawback` | `0x80000000` | 2147483648 | `asfAllowTrustLineClawback` | Enable [Clawback](../../../../concepts/tokens/fungible-tokens/clawing-back-tokens.md) for this account. {% amendment-disclaimer name="Clawback" /%} |
| `lsfAllowTrustLineLocking` | `0x40000000` | 1073741824 | `asfAllowTrustLineLocking` | Enable [Escrow](../../../../concepts/payment-types/escrow.md) for Trust Line Tokens issued by this account. {% amendment-disclaimer name="TokenEscrow" /%} |
| `lsfDefaultRipple` | `0x00800000` | 8388608 | `asfDefaultRipple` | Enable [rippling](../../../../concepts/tokens/fungible-tokens/rippling.md) on this addresses's trust lines by default. Required for issuing addresses; discouraged for others. |
| `lsfDepositAuth` | `0x01000000` | 16777216 | `asfDepositAuth` | This account has [DepositAuth](../../../../concepts/accounts/depositauth.md) enabled, meaning it can only receive funds from transactions it sends, and from [preauthorized](../../../../concepts/accounts/depositauth.md#preauthorization) accounts. {% amendment-disclaimer name="DepositAuth" /%} |
| `lsfDisableMaster` | `0x00100000` | 1048576 | `asfDisableMaster` | Disallows use of the master key to sign transactions for this account. |

View File

@@ -5,11 +5,11 @@ labels:
- Escrow
---
# Escrow
[[Source]](https://github.com/XRPLF/rippled/blob/f64cf9187affd69650907d0d92e097eb29693945/include/xrpl/protocol/detail/ledger_entries.macro#L329-L342 "Source")
[[Source]](https://github.com/XRPLF/rippled/blob/master/include/xrpl/protocol/detail/ledger_entries.macro#L344-L359 "Source")
An `Escrow` ledger entry represents an [escrow](../../../../concepts/payment-types/escrow.md), which holds XRP until specific conditions are met. You can create an escrow by sending an [EscrowCreate transaction][].
An `Escrow` ledger entry represents an [escrow](../../../../concepts/payment-types/escrow.md), which holds funds until specific conditions are met. You can create an escrow by sending an [EscrowCreate transaction][].
{% amendment-disclaimer name="Escrow" /%}
{% amendment-disclaimer name="TokenEscrow" mode="updated" /%}
## Example {% $frontmatter.seo.title %} JSON
@@ -39,8 +39,8 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
| Name | JSON Type | [Internal Type][] | Required? | Description |
|:--------------------|:----------|:------------------|:----------|:-----------------------|
| `Account` | String | AccountID | Yes | The address of the owner (sender) of this escrow. This is the account that provided the XRP, and gets it back if the escrow is canceled. |
| `Amount` | Object or String | Amount | Yes | The amount to be delivered by the payment is escrow. |
| `Account` | String | AccountID | Yes | The address of the owner (sender) of this escrow. This is the account that provided the funds, and gets it back if the escrow is canceled. |
| `Amount` | Object or String | Amount | Yes | The amount to be delivered by the payment in escrow. The amount can be XRP, or with the TokenEscrow amendment, a fungible token. {% amendment-disclaimer name="TokenEscrow" mode="updated" /%} |
| `CancelAfter` | Number | UInt32 | No | The escrow can be canceled if and only if this field is present _and_ the time it specifies has passed. Specifically, this is specified as [seconds since the Ripple Epoch][] and it "has passed" if it's earlier than the close time of the previous validated ledger. |
| `Condition` | String | Blob | No | A [PREIMAGE-SHA-256 crypto-condition](https://tools.ietf.org/html/draft-thomas-crypto-conditions-02#section-8.1), as hexadecimal. If present, the [EscrowFinish transaction][] must contain a fulfillment that satisfies this condition. |
| `Destination` | String | AccountID | Yes | The destination address where the XRP is paid if the escrow is successful. |
@@ -52,7 +52,8 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
| `PreviousTxnID` | String | UInt256 | Yes | The identifying hash of the transaction that most recently modified this entry. |
| `PreviousTxnLgrSeq` | Number | UInt32 | Yes | The [index of the ledger][Ledger Index] that contains the transaction that most recently modified this entry. |
| `SourceTag` | Number | UInt32 | No | An arbitrary tag to further specify the source for this escrow, such as a hosted recipient at the owner's address. |
| `TransferRate` | Number | UInt32 | No | The fee to charge when users finish an escrow, initially set on the creation of an escrow contract and updated on subsequent finish transactions. |
| `TransferRate` | Number | UInt32 | No | The transfer rate or fee to charge when users finish an escrow, locked at the creation of an escrow contract and used during settlement. Applicable to Trust Line Tokens and MPTs only. {% amendment-disclaimer name="TokenEscrow" /%} |
| `IssuerNode` | Number | UInt64 | No | The ledger index of the issuer's directory node associated with the `Escrow`. Used when the issuer is neither the source nor destination account. {% amendment-disclaimer name="TokenEscrow" /%} |
## {% $frontmatter.seo.title %} Flags

View File

@@ -41,6 +41,7 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
| `AssetScale` | Number | UInt8 | Yes | Where to put the decimal place when displaying amounts of this MPT. More formally, the asset scale is a non-negative integer (0, 1, 2, …) such that one standard unit equals 10^(-scale) of a corresponding fractional unit. For example, if a US Dollar Stablecoin has an asset scale of _2_, then 1 unit of that MPT would equal 0.01 US Dollars. This indicates to how many decimal places the MPT can be subdivided. The default is `0`, meaning that the MPT cannot be divided into smaller than 1 unit. |
| `MaximumAmount` | String - Number | UInt64 | No | The maximum number of MPTs that can exist at one time. If omitted, the maximum is currently limited to 2<sup>63</sup>-1. |
| `OutstandingAmount` | String - Number | UInt64 | Yes | The total amount of MPTs of this issuance currently in circulation. This value increases when the issuer sends MPTs to a non-issuer, and decreases whenever the issuer receives MPTs. |
| `LockedAmount` | String - Number | UInt64 | No | The amount of tokens currently locked up (for example, in escrow). This amount is already included in the `OutstandingAmount`. {% amendment-disclaimer name="TokenEscrow" /%} |
| `TransferFee` | Number | UInt16 | Yes | This value specifies the fee, in tenths of a basis point, charged by the issuer for secondary sales of the token, if such sales are allowed at all. Valid values for this field are between 0 and 50,000 inclusive. A value of 1 is equivalent to 1/10 of a basis point or 0.001%, allowing transfer rates between 0% and 50%. A `TransferFee` of 50,000 corresponds to 50%. The default value for this field is 0. Any decimals in the transfer fee are rounded down. The fee can be rounded down to zero if the payment is small. Issuers should make sure that their MPT's `AssetScale` is large enough. |
| `MPTokenMetadata` | String - Hexadecimal | Blob | Yes | Arbitrary metadata about this issuance, in hex format. The limit for this field is 1024 bytes. |
| `OwnerNode` | String - Hexadecimal | UInt64 | Yes | A hint indicating which page of the owner directory links to this entry, in case the directory consists of multiple pages. |

View File

@@ -42,8 +42,8 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
| Name | JSON Type | [Internal Type][] | Required? | Description |
|:--------------------|:----------|:------------------|:----------|:-----------------------|
| `Account` | String | AccountID | Yes | The source address that owns this payment channel. This comes from the sending address of the transaction that created the channel. |
| `Amount` | String | Amount | Yes | Total [XRP, in drops][] or tokens, that have been allocated to this channel. This includes amounts that have been paid to the destination address. This is initially set by the transaction that created the channel and can be increased if the source address sends a `PaymentChannelFund` transaction. |
| `Balance` | Object or String | Amount | Yes | Total already paid out by the channel. The difference between this value and the `Amount` field is how much can still be paid to the destination address with `PaymentChannelClaim` transactions. If the channel closes, the remaining difference is returned to the source address. |
| `Amount` | String | Amount | Yes | Total [XRP, in drops][], that have been allocated to this channel. This includes amounts that have been paid to the destination address. This is initially set by the transaction that created the channel and can be increased if the source address sends a `PaymentChannelFund` transaction. |
| `Balance` | String | Amount | Yes | Total [XRP, in drops][] already paid out by the channel. The difference between this value and the `Amount` field is how much can still be paid to the destination address with `PaymentChannelClaim` transactions. If the channel closes, the remaining difference is returned to the source address. |
| `CancelAfter` | Number | UInt32 | No | The immutable expiration time for this payment channel, in [seconds since the Ripple Epoch][]. This channel is expired if this value is present and smaller than the previous ledger's [`close_time` field](../ledger-header.md). This is optionally set by the transaction that created the channel, and cannot be changed. |
| `Destination` | String | AccountID | Yes | The destination address for this payment channel. While the payment channel is open, this address is the only one that can receive XRP from the channel. This comes from the `Destination` field of the transaction that created the channel. |
| `DestinationTag` | Number | UInt32 | No | An arbitrary tag to further specify the destination for this payment channel, such as a hosted recipient at the destination address. |
@@ -56,7 +56,6 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
| `PublicKey` | String | Blob | Yes | Public key, in hexadecimal, of the key pair that can be used to sign claims against this channel. This can be any valid secp256k1 or Ed25519 public key. This is set by the transaction that created the channel and must match the public key used in claims against the channel. The channel source address can also send XRP from this channel to the destination without signed claims. |
| `SettleDelay` | Number | UInt32 | Yes | Number of seconds the source address must wait to close the channel if it still has any XRP in it. Smaller values mean that the destination address has less time to redeem any outstanding claims after the source address requests to close the channel. Can be any value that fits in a 32-bit unsigned integer (0 to 2^32-1). This is set by the transaction that creates the channel. |
| `SourceTag` | Number | UInt32 | No | An arbitrary tag to further specify the source for this payment channel, such as a hosted recipient at the owner's address. |
| `TransferRate` | Number | UInt32 | No | The fee to charge when users make claims on a payment channel, initially set on the creation of a payment channel and updated on subsequent funding or claim transactions. |
## Channel Expiration

View File

@@ -58,8 +58,6 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
| `HighQualityIn` | Number | UInt32 | No | The inbound quality set by the high account, as an integer in the implied ratio `HighQualityIn`:1,000,000,000. As a special case, the value 0 is equivalent to 1 billion, or face value. |
| `HighQualityOut` | Number | UInt32 | No | The outbound quality set by the high account, as an integer in the implied ratio `HighQualityOut`:1,000,000,000. As a special case, the value 0 is equivalent to 1 billion, or face value. |
| `LedgerEntryType` | String | UInt16 | Yes | The value `0x0072`, mapped to the string `RippleState`, indicates that this is a RippleState entry. |
| `LockCount` | Object or String | Amount | No | The total number of lock balances on a `RippleState` ledger object. |
| `LockedBalance` | Object or String | Amount | No | The total number of locked tokens on a `RippleState` ledger object. |
| `LowLimit` | Object | Amount | Yes | The limit that the low account has set on the trust line. The `issuer` is the address of the low account that set this limit. |
| `LowNode` | String | UInt64 | Yes | (Omitted in some historical ledgers) A hint indicating which page of the low account's owner directory links to this entry, in case the directory consists of multiple pages. |
| `LowQualityIn` | Number | UInt32 | No | The inbound quality set by the low account, as an integer in the implied ratio `LowQualityIn`:1,000,000,000. As a special case, the value 0 is equivalent to 1 billion, or face value. |

View File

@@ -73,6 +73,7 @@ The available AccountSet flags are:
|:----------------------------------|:--------------|:--------------|
| `asfAccountTxnID` | 5 | Track the ID of this account's most recent transaction. Required for [`AccountTxnID`](../common-fields.md#accounttxnid) |
| `asfAllowTrustLineClawback` | 16 | Allow account to claw back tokens it has issued. _(Requires the Clawback amendment.)_ Can only be set if the account has an empty owner directory (no trust lines, offers, escrows, payment channels, checks, or signer lists). After you set this flag, it cannot be reverted. The account permanently gains the ability to claw back issued assets on trust lines. |
| `asfAllowTrustLineLocking` | 17 | Allow Trust Line tokens issued by this account to be held in [escrow](../../../../concepts/payment-types/escrow.md). If not enabled, tokens issued by this account can't be escrowed. After you enable this flag, it cannot be disabled. {% amendment-disclaimer name="TokenEscrow" /%} |
| `asfAuthorizedNFTokenMinter` | 10 | Enable to allow another account to mint non-fungible tokens (NFTokens) on this account's behalf. Specify the authorized account in the `NFTokenMinter` field of the [AccountRoot](../../ledger-data/ledger-entry-types/accountroot.md) object. To remove an authorized minter, enable this flag and omit the `NFTokenMinter` field. {% amendment-disclaimer name="NonFungibleTokensV1_1" /%} |
| `asfDefaultRipple` | 8 | Enable [rippling](../../../../concepts/tokens/fungible-tokens/rippling.md) on this account's trust lines by default. |
| `asfDepositAuth` | 9 | Enable [Deposit Authorization](../../../../concepts/accounts/depositauth.md) on this account. {% amendment-disclaimer name="DepositAuth" /%} |

View File

@@ -9,8 +9,6 @@ labels:
Return funds from an expired [escrow](../../../../concepts/payment-types/escrow.md) to its sender.
{% amendment-disclaimer name="Escrow" /%}
## Example {% $frontmatter.seo.title %} JSON
```json
@@ -37,6 +35,17 @@ Any account may submit an EscrowCancel transaction.
* If the corresponding [EscrowCreate transaction][] did not specify a `CancelAfter` time, the EscrowCancel transaction fails.
* Otherwise the EscrowCancel transaction fails if the `CancelAfter` time is after the close time of the most recently-closed ledger.
## Error Cases
Besides errors that can occur for all transactions, {% $frontmatter.seo.title %} transactions can result in the following [transaction result codes](../transaction-results/index.md):
| Error Code | Description |
|:------------------------- |:------------|
| `tecNO_AUTH` | The transaction failed because authorization requirements were not met. For example, the issuer requires authorization and the sender is not authorized. |
| `tecNO_LINE` | The sender does not have a trust line with the issuer. For Trust Line Tokens only. |
| `tecNO_ENTRY` | The sender does not hold the MPT. |
| `tecINSUFFICIENT_RESERVE` | Unable to create a trust line or MPToken due to lack of reserves. |
## See Also
- [Escrow entry][]

View File

@@ -9,7 +9,17 @@ labels:
Set aside funds in an [escrow](../../../../concepts/payment-types/escrow.md) that delivers them to a predetermined recipient when certain conditions are met. If the escrow has an expiration, the funds can also be returned to the sender after it expires.
{% amendment-disclaimer name="Escrow" /%}
{% admonition type="info" name="Note" %}
To escrow fungible tokens you must take note of the following:
- Trust Line Tokens must have the **Allow Trust Line Locking** flag enabled on their account.
- Multi-Purpose-Tokens (MPTs) must have both the **Can Escrow** and **Can Transfer** flags enabled.
- All token escrows must specify a **Cancel After** time.
- If the token requires **authorization**, both sender and recipient must be pre-authorized by the issuer.
{% /admonition %}
{% amendment-disclaimer name="TokenEscrow" mode="updated" /%}
## Example {% $frontmatter.seo.title %} JSON
@@ -34,29 +44,41 @@ Set aside funds in an [escrow](../../../../concepts/payment-types/escrow.md) tha
| Field | JSON Type | [Internal Type][] | Description |
|:-----------------|:----------|:------------------|:--------------------------|
| `Amount` | Object or String | Amount | Amount of XRP or fungible tokens to deduct from the sender's balance and escrow. Once escrowed, the payment can either go to the `Destination` address (after the `FinishAfter` time) or be returned to the sender (after the `CancelAfter` time). |
| `Destination` | String | AccountID | Address to receive escrowed XRP. |
| `CancelAfter` | Number | UInt32 | _(Optional)_ The time, in [seconds since the Ripple Epoch][], when this escrow expires. This value is immutable; the funds can only be returned to the sender after this time. |
| `FinishAfter` | Number | UInt32 | _(Optional)_ The time, in [seconds since the Ripple Epoch][], when the escrowed XRP can be released to the recipient. This value is immutable, and the funds can't be accessed until this time. |
| `Condition` | String | Blob | _(Optional)_ Hex value representing a [PREIMAGE-SHA-256 crypto-condition](https://tools.ietf.org/html/draft-thomas-crypto-conditions-02#section-8.1). The funds can only be delivered to the recipient if this condition is fulfilled. If the condition is not fulfilled before the expiration time specified in the `CancelAfter` field, the XRP can only revert to the sender. |
| `Amount` | Object or String | Amount | Amount of XRP, in drops, or fungible tokens to deduct from the sender's balance and escrow. Once escrowed, the payment can either go to the `Destination` address (after the `FinishAfter` time) or be returned to the sender (after the `CancelAfter` time). {% amendment-disclaimer name="TokenEscrow" mode="updated" /%} |
| `Destination` | String | AccountID | Address to receive escrowed funds. |
| `CancelAfter` | Number | UInt32 | _(Optional for XRP escrows, but mandatory for token escrows)_ The time, in [seconds since the Ripple Epoch][], when this escrow expires. This value is immutable; the funds can only be returned to the sender after this time. |
| `FinishAfter` | Number | UInt32 | _(Optional)_ The time, in [seconds since the Ripple Epoch][], when the escrowed funds can be released to the recipient. This value is immutable, and the funds can't be accessed until this time. |
| `Condition` | String | Blob | _(Optional)_ Hex value representing a [PREIMAGE-SHA-256 crypto-condition](https://tools.ietf.org/html/draft-thomas-crypto-conditions-02#section-8.1). The funds can only be delivered to the recipient if this condition is fulfilled. If the condition is not fulfilled before the expiration time specified in the `CancelAfter` field, the funds can only revert to the sender. |
| `DestinationTag` | Number | UInt32 | _(Optional)_ Arbitrary tag to further specify the destination for this escrowed payment, such as a hosted recipient at the destination address. |
You must specify one of the following combinations of fields:
| Summary | `FinishAfter` | `Condition` | `CancelAfter` |
|-----------------------------------|---------------|-------------|---------------|
| Time-based | ✅ | | |
| Time-based (XRP only) | ✅ | | |
| Time-based with expiration | ✅ | | ✅ |
| Timed conditional | ✅ | ✅ | |
| Timed conditional (XRP only) | ✅ | ✅ | |
| Timed conditional with expiration | ✅ | ✅ | ✅ |
| Conditional with expiration | | ✅ | ✅ |
It is not possible to create a conditional escrow with no expiration, but you can specify an expiration that is very far in the future.
{% admonition type="info" name="Note" %}
Before the [fix1571 amendment][] became enabled on 2018-06-19, it was possible to create an escrow with `CancelAfter` only. These escrows could be finished by anyone at any time before the specified expiration.
Before the [fix1571 amendment][] became enabled on 2018-06-19, it was possible to create an XRP escrow with `CancelAfter` only. These escrows could be finished by anyone at any time before the specified expiration.
{% /admonition %}
## Error Cases
Besides errors that can occur for all transactions, {% $frontmatter.seo.title %} transactions can result in the following [transaction result codes](../transaction-results/index.md):
| Error Code | Description |
|:--------------------- |:---------------------------------------------|
| `tecNO_PERMISSION` | The transaction failed because the necessary permissions for token escrow are not in place. For example, the issuer hasn't enabled the Allow Trust Line Locking flag for a Trust Line Token.|
| `tecNO_AUTH` | The transaction failed because authorization requirements for the token were not met. For example, the sender lacks authorization when creating the escrow. |
| `tecUNFUNDED` | The sender lacks sufficient spendable balance. For Trust Line Tokens, this means the sender's trust line with the issuer has insufficient available balance. For XRP escrows, this means the sender doesn't have enough XRP. |
| `tecOBJECT_NOT_FOUND` | The sender does not hold the MPT. |
| `tecFROZEN` | The token is frozen (for Trust Line Tokens) or locked (for MPTs) for the sender. |
## See Also
- [Escrow entry][]

View File

@@ -9,9 +9,6 @@ labels:
Deliver funds from an [escrow](../../../../concepts/payment-types/escrow.md) to the recipient.
{% amendment-disclaimer name="Escrow" /%}
## Example {% $frontmatter.seo.title %} JSON
```json
@@ -48,6 +45,18 @@ Any account may submit an EscrowFinish transaction.
In [non-production networks](../../../../concepts/networks-and-servers/parallel-networks.md), it may be possible [to delete](../../../../concepts/accounts/deleting-accounts.md) the destination account of a pending escrow. In this case, an attempt to finish the escrow fails with the result `tecNO_TARGET`, but the escrow object remains unless it has expired normally. If another payment re-creates the destination account, the escrow can be finished successfully. The destination account of an escrow can only be deleted if the escrow was created before the [fix1523 amendment](/resources/known-amendments.md#fix1523) became enabled. No such escrows exist in the production XRP Ledger, so this edge case is not possible on the production XRP Ledger. This edge case is also not possible in test networks that enable both fix1523 and Escrow amendments at the same time, which is the default when you [start a new genesis ledger](../../../../infrastructure/testing-and-auditing/start-a-new-genesis-ledger-in-stand-alone-mode.md).
## Error Cases
Besides errors that can occur for all transactions, {% $frontmatter.seo.title %} transactions can result in the following [transaction result codes](../transaction-results/index.md):
| Error Code | Description |
|:------------------------- |:------------|
| `tecNO_AUTH` | The transaction failed because authorization requirements were not met. For example, the issuer requires authorization and the destination is not authorized. |
| `tecNO_LINE` | The destination account does not have a trust line with the issuer. For Trust Line Tokens only. |
| `tecNO_ENTRY` | The destination account does not hold the MPT. |
| `tecINSUFFICIENT_RESERVE` | Unable to create a trust line or MPToken due to lack of reserves. |
| `tecFROZEN` | The token is deep frozen (Trust Line Tokens) or locked (for MPTs). |
## See Also
- [Escrow entry][]

View File

@@ -15,6 +15,23 @@ Control whether an account can hold a given [Multi-purpose Token (MPT)](../../..
{% amendment-disclaimer name="MPTokensV1" /%}
## Example MPTokenAuthorize JSON
This example assumes that the transaction is submitted by the holder of the token.
```json
{
"TransactionType": "MPTokenAuthorize",
"Account": "rsNw23ygZatXv7h8QVSgAE4jktY2uW1iZP",
"MPTokenIssuanceID": "05EECEBE97A7D635DE2393068691A015FED5A89AD203F5AA",
"Fee": "10",
"Flags": 0,
"Sequence": 99537811
}
```
{% tx-example txid="9C19FBB8C0C92C17B11DF626A94303776D44AC36D7A760863FF3585532C38230" /%}
{% raw-partial file="/docs/_snippets/tx-fields-intro.md" /%}
| Field | JSON Type | [Internal Type][] | Required? | Description |

View File

@@ -20,16 +20,20 @@ This example assumes that the issuer of the token is the signer of the transacti
```json
{
"TransactionType": "MPTokenIssuanceCreate",
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"AssetScale": 2,
"TransferFee": 314,
"Account": "rNFta7UKwcoiCpxEYbhH2v92numE3cceB6",
"AssetScale": 4,
"TransferFee": 0,
"MaximumAmount": "50000000",
"Flags": 83659,
"MPTokenMetadata": "7B227469636B6572223A20225442494C4C222C20226E616D65223A2022542D42696C6C205969656C6420546F6B656E222C202264657363223A202241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C202269636F6E223A202268747470733A2F2F6578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C202261737365745F636C617373223A2022727761222C202261737365745F737562636C617373223A20227472656173757279222C20226973737565725F6E616D65223A20224578616D706C65205969656C6420436F2E222C202275726C73223A205B7B2275726C223A202268747470733A2F2F6578616D706C657969656C642E636F2F7462696C6C222C202274797065223A202277656273697465222C20227469746C65223A202250726F647563742050616765227D2C207B2275726C223A202268747470733A2F2F6578616D706C657969656C642E636F2F646F6373222C202274797065223A2022646F6373222C20227469746C65223A20225969656C6420546F6B656E20446F6373227D5D2C20226164646974696F6E616C5F696E666F223A207B22696E7465726573745F72617465223A2022352E303025222C2022696E7465726573745F74797065223A20227661726961626C65222C20227969656C645F736F75726365223A2022552E532E2054726561737572792042696C6C73222C20226D617475726974795F64617465223A2022323034352D30362D3330222C20226375736970223A2022393132373936525830227D7D",
"Fee": "10"
"MPTokenMetadata": "7B2274223A225442494C4C222C226E223A22542D42696C6C205969656C6420546F6B656E222C2264223A2241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C2269223A226578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C226163223A22727761222C226173223A227472656173757279222C22696E223A224578616D706C65205969656C6420436F2E222C227573223A5B7B2275223A226578616D706C657969656C642E636F2F7462696C6C222C2263223A2277656273697465222C2274223A2250726F647563742050616765227D2C7B2275223A226578616D706C657969656C642E636F2F646F6373222C2263223A22646F6373222C2274223A225969656C6420546F6B656E20446F6373227D5D2C226169223A7B22696E7465726573745F72617465223A22352E303025222C22696E7465726573745F74797065223A227661726961626C65222C227969656C645F736F75726365223A22552E532E2054726561737572792042696C6C73222C226D617475726974795F64617465223A22323034352D30362D3330222C226375736970223A22393132373936525830227D7D",
"Fee": "12",
"Flags": 122,
"Sequence": 99536574
}
```
{% tx-example txid="F4491A84EE3BC27A2F5B63FEBF0CB310368E27E9EF07E00A46F1DC2764852133" /%}
{% raw-partial file="/docs/_snippets/tx-fields-intro.md" /%}
| Field | JSON Type | [Internal Type][] | Required? | Description |

View File

@@ -13,14 +13,18 @@ Delete a [Multi-purpose Token (MPT)](../../../../concepts/tokens/fungible-tokens
## Example MPTokenIssuanceDestroy JSON
```json
```json
{
"TransactionType": "MPTokenIssuanceDestroy",
"Account": "rNFta7UKwcoiCpxEYbhH2v92numE3cceB6",
"MPTokenIssuanceID": "05EECEBC97A7D635DE2393068691A015FED5A89AD203F5AA",
"Fee": "10",
"MPTokenIssuanceID": "00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000"
"Flags": 0,
"Sequence": 99536573
}
```
{% tx-example txid="B270DEE7D229D626699935B7B3CC37A1BAD3E832044CE5129722C2965D3EB228" /%}
{% raw-partial file="/docs/_snippets/tx-fields-intro.md" /%}

View File

@@ -11,17 +11,23 @@ Update a mutable property of a [Multi-purpose Token (MPT)](../../../../concepts/
{% amendment-disclaimer name="MPTokensV1" /%}
## Example
## Example MPTokenIssuanceSet JSON
```json
This example locks the balances of all holders of the specified MPT issuance.
```json
{
"TransactionType": "MPTokenIssuanceSet",
"Account": "rNFta7UKwcoiCpxEYbhH2v92numE3cceB6",
"MPTokenIssuanceID": "05EECEBE97A7D635DE2393068691A015FED5A89AD203F5AA",
"Fee": "10",
"MPTokenIssuanceID": "00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000",
"Flags": 1
"Flags": 1,
"Sequence": 99536577
}
```
{% tx-example txid="5DB41F975E3AC04DD4AE9E93764AFBBABB0E4C7322B2D6F2E84B253FAA170BF3" /%}
{% raw-partial file="/docs/_snippets/tx-fields-intro.md" /%}
| Field | JSON Type | [Internal Type][] | Required? | Description |

View File

@@ -51,8 +51,8 @@ The **destination address** of a channel can:
| Field | JSON Type | [Internal Type][] | Required? | Description |
|:----------------|:---------------------|:------------------|:----------|:------------|
| `Amount` | [Currency Amount][] | Amount | No | The amount of [XRP, in drops][Currency Amount], or fungible tokens authorized by the `Signature`. This must match the amount in the signed message. This is the cumulative amount that can be dispensed by the channel, including funds previously redeemed. Non-XRP tokens can only be used if the [TokenEscrow amendment][] {% not-enabled /%} is enabled. |
| `Balance` | [Currency Amount][] | Amount | No | Total amount of [XRP, in drops][Currency Amount], or fungible tokens delivered by this channel after processing this claim. Required to deliver XRP or fungible tokens. Must be more than the total amount delivered by the channel so far, but not greater than the `Amount` of the signed claim. Must be provided except when closing the channel. Non-XRP tokens can only be used if the [TokenEscrow amendment][] {% not-enabled /%} is enabled. |
| `Amount` | [Currency Amount][] | Amount | No | The amount of XRP, in drops, authorized by the `Signature`. This must match the amount in the signed message. This is the cumulative amount of XRP that can be dispensed by the channel, including XRP previously redeemed. Must be provided except when closing the channel.|
| `Balance` | [Currency Amount][] | Amount | No | Total amount of XRP, in drops, delivered by this channel after processing this claim. Required to deliver XRP. Must be more than the total amount delivered by the channel so far, but not greater than the `Amount` of the signed claim. Must be provided except when closing the channel. |
| `Channel` | String - Hexadecimal | UInt256 | Yes | The unique ID of the channel. |
| `CredentialIDs` | Array of Strings | Vector256 | No | Set of credentials to authorize a deposit made by this transaction. Each member of the array must be the ledger entry ID of a Credential entry in the ledger. For details, see [Credential IDs](./payment.md#credential-ids). |
| `PublicKey` | String - Hexadecimal | Blob | No | The public key used for the signature. This must match the `PublicKey` stored in the ledger for the channel. Required unless the sender of the transaction is the source address of the channel and the `Signature` field is omitted. (The transaction includes the public key so that `rippled` can check the validity of the signature before trying to apply the transaction to the ledger.) |

View File

@@ -34,7 +34,7 @@ Create a [payment channel](../../../../concepts/payment-types/payment-channels.m
| Field | JSON Type | [Internal Type][] | Required? | Description |
|:-----------------|:---------------------|:------------------|:----------|:------------|
| `Amount` | [Currency Amount][] | Amount | Yes | Amount to deduct from the sender's balance and set aside in this channel. While the channel is open, the amount can only go to the `Destination` address. When the channel closes, any unclaimed amount is returned to the source account's balance. Non-XRP tokens can only be used if the [TokenEscrow amendment][] {% not-enabled /%} is enabled. |
| `Amount` | [Currency Amount][] | Amount | Yes | Amount of XRP, in drops, to deduct from the sender's balance and set aside in this channel. While the channel is open, the XRP can only go to the `Destination` address. When the channel closes, any unclaimed XRP is returned to the source account's balance. |
| `Destination` | String - [Address][] | AccountID | Yes | The account that can receive money from this channel. This is also known as the "destination address" for the channel. Cannot be the same as the sender (`Account`). |
| `SettleDelay` | Number | UInt32 | Yes | Amount of time, in seconds, the source address must wait before closing the channel if it has unclaimed funds. |
| `PublicKey` | String - Hexadecimal | Blob | Yes | The 33-byte public key of the key pair the source will use to sign claims against this channel. This can be any secp256k1 or Ed25519 public key. For more information on key pairs, see [Key Derivation](../../../../concepts/accounts/cryptographic-keys.md#key-derivation) <!-- STYLE_OVERRIDE: will --> |

View File

@@ -30,7 +30,7 @@ Add an additional amount to an open [payment channel](../../../../concepts/payme
| Field | JSON Type | [Internal Type][] | Required? | Description |
|:-------------|:---------------------|:------------------|:----------|:------------|
| `Channel` | String - Hexadecimal | UInt256 | Yes | The unique ID of the channel to fund. |
| `Amount` | [Currency Amount][] | Amount | Yes | Amount to add to the channel. Must be a positive amount. Non-XRP tokens can only be used if the [TokenEscrow amendment][] {% not-enabled /%} is enabled. |
| `Amount` | [Currency Amount][] | Amount | Yes | Amount of XRP, in drops, to add to the channel. Must be a positive amount of XRP. |
| `Expiration` | Number | UInt32 | No | New expiration time to set for the channel, in [seconds since the Ripple Epoch][]. This must be later than either the current time plus the `SettleDelay` of the channel, or the existing `Expiration` of the channel. After the `Expiration` time, any transaction that would access the channel closes the channel without taking its normal action. (`Expiration` is separate from the channel's immutable `CancelAfter` time.) For more information, see the [PayChannel ledger entry type](../../ledger-data/ledger-entry-types/paychannel.md). |
## Error Cases

View File

@@ -1,13 +1,10 @@
---
parent: javascript.html
html: build-a-desktop-wallet-in-javascript.html
seo:
description: Build a graphical desktop wallet for the XRPL using JavaScript.
---
# Build a Desktop Wallet in JavaScript
<!-- STYLE_OVERRIDE: wallet -->
This tutorial demonstrates how to build a desktop wallet for the XRP Ledger using the JavaScript programming language, the Electron Framework and various libraries. This application can be used as a starting point for building a more complex and powerful application, as a reference point for building comparable apps, or as a learning experience to better understand how to integrate XRP Ledger functionality into a larger project.
This tutorial demonstrates how to build a desktop wallet for the XRP Ledger using the JavaScript programming language, the [Electron Framework](https://www.electronjs.org/) and various libraries. This application can be used as a starting point for building a more complex and powerful application, as a reference point for building comparable apps, or as a learning experience to better understand how to integrate XRP Ledger functionality into a larger project.
## Prerequisites
@@ -25,10 +22,7 @@ You can find the complete source code for all of this tutorial's examples in the
## Rationale
This tutorial will take you through the process of creating a XRP Wallet application from scratch. Starting with a simple,
"Hello World" like example with minimal functionality, we will step-by-step add more complex features.
We will use the well-established [Electron Framework](https://www.electronjs.org/) to let us use JavaScript to write this desktop application.
This tutorial takes you through the process of creating an XRP Wallet application from scratch. It begins with a "Hello World"-like example with minimal functionality, and adds more features in each step.
## Goals
@@ -47,9 +41,7 @@ The application we are going to build here will be capable of the following:
- If the address doesn't want to receive XRP (**Disallow XRP** flag enabled).
- If the address has a [verified domain name](../../../references/xrp-ledger-toml.md#account-verification) associated with it.
The application in this tutorial _doesn't_ have the ability to send or trade [tokens](../../../concepts/tokens/index.md) or
use other [payment types](../../../concepts/payment-types/index.md) like [Escrow](https://xrpl.org/escrow.html) or [Payment Channels](https://xrpl.org/payment-channels.html). However, it provides a foundation
that you can implement those and other features on top of.
The application in this tutorial _doesn't_ have the ability to send or trade [tokens](../../../concepts/tokens/index.md) or use other [payment types](../../../concepts/payment-types/index.md) like [Escrow](../../../concepts/payment-types/escrow.md) or [Payment Channels](../../../concepts/payment-types/payment-channels.md). However, it provides a foundation that you can implement those and other features on top of.
In addition to the above features, you'll also learn a bit about Events, IPC (inter-process-communication) and asynchronous (async) code in JavaScript.
@@ -59,28 +51,7 @@ In addition to the above features, you'll also learn a bit about Events, IPC (in
1. To initialize the project, create a file named `package.json` with the following content:
```json
{
"name": "xrpl-javascript-desktop-wallet",
"version": "1.0.0",
"license": "MIT",
"scripts": {
"start": "electron ./index.js"
},
"dependencies": {
"async": "^3.2.4",
"fernet": "^0.4.0",
"node-fetch": "^2.6.9",
"pbkdf2-hmac": "^1.1.0",
"open": "^8.4.0",
"toml": "^3.0.0",
"xrpl": "^3.0.0"
},
"devDependencies": {
"electron": "22.3.24"
}
}
```
{% code-snippet file="/_code-samples/build-a-desktop-wallet/js/package.json" language="json" /%}
Here we define the libraries our application will use in the `dependencies` section as well as shortcuts for running our application in the `scripts` section.
@@ -94,70 +65,25 @@ application to work.
3. In the root folder, create an `index.js` file with the following content:
```javascript
const { app, BrowserWindow } = require('electron')
const path = require('path')
/**
* This is our main function, it creates our application window, preloads the code we will need to communicate
* between the renderer Process and the main Process, loads a layout and performs the main logic
*/
const createWindow = () => {
// Creates the application window
const appWindow = new BrowserWindow({
width: 1024,
height: 768
})
// Loads a layout
appWindow.loadFile(path.join(__dirname, 'view', 'template.html'))
return appWindow
}
// Here we have to wait for the application to signal that it is ready
// to execute our code. In this case we just create a main window.
app.whenReady().then(() => {
createWindow()
})
```
{% code-snippet file="/_code-samples/build-a-desktop-wallet/js/0-hello/index.js" language="js" /%}
4. Make a new folder named `view` in the root directory of the project.
5. Now, inside the `view` folder, add a `template.html` file with the following content:
```html
<!DOCTYPE html>
<html>
{% code-snippet file="/_code-samples/build-a-desktop-wallet/js/0-hello/view/template.html" language="html" /%}
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'" />
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'" />
<title>XRPL Wallet Tutorial (JavaScript / Electron)</title>
</head>
<body>
<h3>Build a XRPL Wallet</h3>
<span>Hello world!</span>
</body>
</html>
```
6. Now, start the application with the following command:
```console
npm run start
```
{% admonition type="success" name="Tip" %}When you need to debug the application, you can open Developer Tools like in Chrome or Firefox by selecting "View / Toggle Developer Tools" from The application Menu or using a Shortcut ("Ctrl+Shift+I" on Windows or Linux, "Option+Command+I on Mac).{% /admonition %}
{% admonition type="success" name="Tip" %}When you need to debug the application, you can open Developer Tools by selecting "View / Toggle Developer Tools" from the application menu or using a keyboard shortcut (Ctrl+Shift+i on Windows or Linux; Option+Command+i on Mac).{% /admonition %}
You should see a window appear that displays the text "Build a XRPL Wallet" and "Hello world!"
To run the reference application found in `_code-samples/build-a-desktop-wallet/desktop-js` for this step, run:
To run the reference application for this step, run:
```console
npm run hello
@@ -166,64 +92,24 @@ npm run hello
In the next steps we will continually expand on this very basic setup. To better keep track of all the changes that will be made, the files in the {% repo-link path="_code-samples/build-a-desktop-wallet/js/" %}reference section{% /repo-link %} are numbered/prefixed with the respective step number:
**Full code for this step:**
{% repo-link path="_code-samples/build-a-desktop-wallet/js/0_hello.js" %}`0-hello/0_hello.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/0_hello.html" %}`0-hello/view/0_hello.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/0-hello/index.js" %}`0-hello/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/0-hello/view/template.html" %}`0-hello/view/template.html`{% /repo-link %},
### 1. Ledger Index
**Full code for this step:**
{% repo-link path="_code-samples/build-a-desktop-wallet/js/1_ledger-index.js" %}`1-ledger-index/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/1_preload.js" %}`1-ledger-index/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/1_ledger-index.html" %}`1-ledger-index/view/template.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/1_renderer.js" %}`1-ledger-index/view/renderer.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/1-ledger-index/index.js" %}`1-ledger-index/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/1-ledger-index/view/preload.js" %}`1-ledger-index/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/1-ledger-index/view/template.html" %}`1-ledger-index/view/template.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/1-ledger-index/view/renderer.js" %}`1-ledger-index/view/renderer.js`{% /repo-link %}.
Our first step was to have a running "Hello World" application. Now we want to expand on that so that the application can interact on a very basic level with the XRP Ledger and display some information about the current ledger state on the screen. After completing this step, the - for the time being unstyled - application should look like this:
Our first step was to have a running "Hello World" application. Now we want to expand on that so that the application can interact on a very basic level with the XRP Ledger and display some information about the current ledger state on the screen. After completing this step, the application should look like this:
![Screenshot: Step 1, hello world equivalent](/docs/img/javascript-wallet-1.png)
1. Update `index.js` by adding the following snippet in the import section at the top of the file below the `path` import:
```javascript
const { app, BrowserWindow } = require('electron')
const path = require('path')
// Step 3 code additions - start
const xrpl = require("xrpl")
const TESTNET_URL = "wss://s.altnet.rippletest.net:51233"
/**
* This function creates a WebService client, which connects to the XRPL and fetches the latest ledger index.
*
* @returns {Promise<number>}
*/
const getValidatedLedgerIndex = async () => {
const client = new xrpl.Client(TESTNET_URL)
await client.connect()
// Reference: https://xrpl.org/ledger.html#ledger
const ledgerRequest = {
"command": "ledger",
"ledger_index": "validated"
}
const ledgerResponse = await client.request(ledgerRequest)
await client.disconnect()
return ledgerResponse.result.ledger_index
}
// Step 3 code additions - end
/**
* This is our main function, it creates our application window, preloads the code we will need to communicate
* between the renderer Process and the main Process, loads a layout and performs the main logic
*/
const createWindow = () => {
```
{% code-snippet file="/_code-samples/build-a-desktop-wallet/js/1-ledger-index/index.js" language="js" from="// Ledger index code additions - start" before="// Ledger index code additions - end" /%}
This helper function does the following: It establishes a WebSocket connection to the XRP Ledger, calls the XRP Ledger API's [ledger method](../../../references/http-websocket-apis/public-api-methods/ledger-methods/ledger.md) and returns the ledger index from the response. We will wire up this function at the end of this step.
@@ -341,10 +227,10 @@ npm run ledger-index
### 2. Show Ledger Updates by using WebSocket subscriptions
**Full code for this step:**
{% repo-link path="_code-samples/build-a-desktop-wallet/js/2_async-subscribe.js" %}`2-async/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/2_preload.js" %}`2-async/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/2_renderer.js" %}`2-async/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/2_async.html" %}`2-async/view/template.html`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/2-async/index.js" %}`2-async/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/2-async/view/preload.js" %}`2-async/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/2-async/view/renderer.js" %}`2-async/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/2-async/view/template.html" %}`2-async/view/template.html`{% /repo-link %}.
Our application so far only shows the latest validated ledger sequence at the time when we opened it. Let's take things up a notch and add some dashboard like functionality where our wallet app will keep in sync with the ledger and display the latest specs and stats like a clock that is keeping track of time. The result will look something like this:
@@ -354,35 +240,7 @@ Our application so far only shows the latest validated ledger sequence at the ti
2. Then update the `app.whenReady().then()` section at the bottom of the file section in the following way:
```javascript
/**
* This function creates a XRPL client, subscribes to 'ledger' events from the XRPL and broadcasts those by
* dispatching the 'update-ledger-data' event which will be picked up by the frontend
*
* @returns {Promise<void>}
*/
const main = async () => {
const appWindow = createWindow()
const client = new xrpl.Client(TESTNET_URL)
await client.connect()
// Subscribe client to 'ledger' events
// Reference: https://xrpl.org/subscribe.html
await client.request({
"command": "subscribe",
"streams": ["ledger"]
})
// Dispatch 'update-ledger-data' event
client.on("ledgerClosed", async (ledger) => {
appWindow.webContents.send('update-ledger-data', ledger)
})
}
app.whenReady().then(main)
```
{% code-snippet file="/_code-samples/build-a-desktop-wallet/js/2-async/index.js" language="javascript" from="// Step 2 changes - main whenReady function - start" before="// Step 2 changes - main whenReady function - end" /%}
Here, we have reduced the `app.whenReady` logic to an one-liner and put the necessary functionality into a separate `main()` function. The most relevant piece of code here is the swapping of a single call to the ledger for a subscription. Our client is now connecting to the XRPL via [WebSockets](https://en.wikipedia.org/wiki/WebSocket). This establishes a permanent bidirectional connection to the XRPL, which allows us to subscribe to events that the server sends out. This saves resources on the server, which now only sends out data we explicitly asked for when a change happens, as well as the client which does not have to sort through incoming data for relevant changes. It also reduces the complexity of the application and saves us a couple of lines of code.
@@ -447,11 +305,11 @@ npm run async
### 3. Display an Account
**Full code for this step:**
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/3_account.js" %}`3-account/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/3_preload.js" %}`3-account/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/3_renderer.js" %}`3-account/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/3_account.html" %}`3-account/view/template.html`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/3-account/index.js" %}`3-account/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/3-account/view/preload.js" %}`3-account/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/3-account/view/renderer.js" %}`3-account/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/3-account/view/template.html" %}`3-account/view/template.html`{% /repo-link %}.
We now have a permanent connection to the XRPL and some code to bring the delivered data to life on our screen, it's time to add some "wallet" functionality by managing an individual account.
@@ -657,10 +515,10 @@ npm run account
**Full code for this step:**
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/4_helpers.js" %}`library/4_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/4_tx-history.js" %}`4-tx-history/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/4_tx-preload.js" %}`4-tx-history/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/4_tx-renderer.js" %}`4-tx-history/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/4_tx-history.html" %}`4-tx-history/view/index.html`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/4-tx-history/index.js" %}`4-tx-history/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/4-tx-history/view/preload.js" %}`4-tx-history/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/4-tx-history/view/renderer.js" %}`4-tx-history/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/4-tx-history/view/template.html" %}`4-tx-history/view/template.html`{% /repo-link %}.
At this point, our wallet shows the account's balance getting updated, but doesn't give us any clue about how this state came about, namely the actual transactions that caused the updates. So, our next step is to display the account's up to date transaction history using subscriptions once again:
@@ -821,13 +679,13 @@ npm run tx-history
### 5. Saving the Private Keys with a Password
**Full code for this step:**
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/4_helpers.js" %}`library/4_helpers.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/5_helpers.js" %}`library/5_helpers.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/5_password.js" %}`5-password/index.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/5_tx-preload.js" %}`5-password/view/preload.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/5_password.html" %}`5-password/view/template.html`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/5_tx-renderer.js" %}`5-password/view/renderer.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/4_helpers.js" %}`library/4_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/5_helpers.js" %}`library/5_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/5-password/index.js" %}`5-password/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/5-password/view/preload.js" %}`5-password/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/5-password/view/template.html" %}`5-password/view/template.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/5-password/view/renderer.js" %}`5-password/view/renderer.js`{% /repo-link %}.
After finishing this step the application should look like this:
@@ -863,68 +721,14 @@ We also added a new constant containing the directory name where we are going to
3. In `index.js` replace the existing `main` function with the following one:
```javascript
const main = async () => {
const appWindow = createWindow()
// Create Wallet directory in case it does not exist yet
if (!fs.existsSync(path.join(__dirname, WALLET_DIR))) {
fs.mkdirSync(path.join(__dirname, WALLET_DIR));
}
let seed = null;
ipcMain.on('seed-entered', async (event, providedSeed) => {
seed = providedSeed
appWindow.webContents.send('open-password-dialog')
})
ipcMain.on('password-entered', async (event, password) => {
if (!fs.existsSync(path.join(__dirname, WALLET_DIR , 'seed.txt'))) {
saveSaltedSeed('../' + WALLET_DIR, seed, password)
} else {
try {
seed = loadSaltedSeed('../' + WALLET_DIR, password)
} catch (error) {
appWindow.webContents.send('open-password-dialog', true)
return
}
}
const wallet = xrpl.Wallet.fromSeed(seed)
const client = new xrpl.Client(TESTNET_URL)
await client.connect()
await subscribe(client, wallet, appWindow)
await initialize(client, wallet, appWindow)
})
ipcMain.on('request-seed-change', (event) => {
fs.rmSync(path.join(__dirname, WALLET_DIR , 'seed.txt'))
fs.rmSync(path.join(__dirname, WALLET_DIR , 'salt.txt'))
appWindow.webContents.send('open-seed-dialog')
})
// We have to wait for the application frontend to be ready, otherwise
// we might run into a race condition and the open-dialog events
// get triggered before the callbacks are attached
appWindow.once('ready-to-show', () => {
// If there is no seed present yet, ask for it, otherwise query for the password
// for the seed that has been saved
if (!fs.existsSync(path.join(__dirname, WALLET_DIR, 'seed.txt'))) {
appWindow.webContents.send('open-seed-dialog')
} else {
appWindow.webContents.send('open-password-dialog')
}
})
}
```
{% code-snippet file="/_code-samples/build-a-desktop-wallet/js/5-password/index.js" language="javascript" from="// Step 5 - new main function - start" before="// Step 5 - new main function - end" /%}
Since we are now making this a full-fledged wallet, instead of asking the user for an address we will now be prompting the user for a seed and password to encrypt the seed. If there is already a seed, the user will only be asked for their password.
{% admonition type="danger" name="Warning: Default algorithms" %}
When using `Wallet.fromSeed(...)` you may get a different address than expected unless you explicitly specify the algorithm that was used when creating the key pair and funding the account. Versions 2.x and earlier of xrpl.js, as well as the `rippled` commandline and various other software, use the secp256k1 algorithm by default, but xrpl.js 3.x and up use Ed25519 by default. If you don't use the same algorithm, you won't be able to look up the correct account or send transactions.
{% /admonition %}
3. Then modify the `view/preload.js` file (Note that the `onEnterAccountAddress` function is no longer needed):
```javascript
@@ -1057,7 +861,7 @@ npm run start
On first run, It should first prompt you for an account seed and then for a password.
You can generate a test account's seed via the [testnet faucet here](https://xrpl.org/xrp-testnet-faucet.html).
You can generate a test account's seed via the [testnet faucet](/resources/dev-tools/xrp-faucets.page.tsx).
After you have created a wallet this way, you should close the application and start it up a second time: On second run it should prompt you for the password, and you should see the same result as in the last step.
@@ -1073,12 +877,12 @@ npm run password
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/4_helpers.js" %}`library/4_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/5_helpers.js" %}`library/5_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/6_styling.js" %}`6-styling/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/6_tx-preload.js" %}`6-styling/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/6_styling.html" %}`6-styling/view/template.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/6_tx-renderer.js" %}`6-styling/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/6-styling/index.js" %}`6-styling/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/6-styling/view/preload.js" %}`6-styling/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/6-styling/view/template.html" %}`6-styling/view/template.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/6-styling/view/renderer.js" %}`6-styling/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/bootstrap/bootstrap.bundle.min.js" %}`bootstrap/bootstrap.bundle.min.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/bootstrap/bootstrap.bundle.min.css" %}`bootstrap/bootstrap.min.css`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/bootstrap/bootstrap.min.css" %}`bootstrap/bootstrap.min.css`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/bootstrap/custom.css" %}`bootstrap/custom.css`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/bootstrap/XRPLedger_DevPortal-white.svg" %}`bootstrap/XRPLedger_DevPortal-white.svg`{% /repo-link %}.
@@ -1236,12 +1040,11 @@ npm run styling
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/4_helpers.js" %}`library/4_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/5_helpers.js" %}`library/5_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/6_helpers.js" %}`library/6_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/7_helpers.js" %}`library/7_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/7_send-xrp.js" %}`7-send-xrp/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/7_preload.js" %}`7-send-xrp/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/7_renderer.js" %}`7-send-xrp/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/7_send-xrp.html" %}`7-send-xrp/view/template.html`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/7-send-xrp/index.js" %}`7-send-xrp/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/7-send-xrp/view/preload.js" %}`7-send-xrp/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/7-send-xrp/view/renderer.js" %}`7-send-xrp/view/renderer.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/7-send-xrp/view/template.html" %}`7-send-xrp/view/template.html`{% /repo-link %}.
Up until now we have enabled our app to query and display data from the XRPL. Now it's time to actively participate in the ledger by enabling our application to send transactions. For now, we can stick to sending direct XRP payments because there are more complexities involved in sending issued tokens. After finishing this step the application should look like this:
@@ -1382,13 +1185,12 @@ npm run send-xrp
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/3_helpers.js" %}`library/3_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/4_helpers.js" %}`library/4_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/5_helpers.js" %}`library/5_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/6_helpers.js" %}`library/6_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/7_helpers.js" %}`library/7_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/library/8_helpers.js" %}`library/8_helpers.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/8_domain-verification.js" %}`8-domain-verification/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/8_preload.js" %}`8-domain-verification/view/8_prelaod.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/8_domain-verification.html" %}`8-domain-verification/view/8_domain-verification.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/view/8_renderer.js" %}`8-domain-verification/view/8_renderer.js`{% /repo-link %}.
{% repo-link path="_code-samples/build-a-desktop-wallet/js/8-domain-verification/index.js" %}`8-domain-verification/index.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/8-domain-verification/view/preload.js" %}`8-domain-verification/view/preload.js`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/8-domain-verification/view/template.html" %}`8-domain-verification/view/template.html`{% /repo-link %},
{% repo-link path="_code-samples/build-a-desktop-wallet/js/8-domain-verification/view/renderer.js" %}`8-domain-verification/view/renderer.js`{% /repo-link %}.
One of the biggest shortcomings of the wallet app from the previous step is that it doesn't provide a lot of protections or feedback for users to save them from human error and scams. These sorts of protections are extra important when dealing with the cryptocurrency space because decentralized systems like the XRP Ledger don't have an admin or support team one can ask to cancel or refund a payment if you made a mistake such as sending it to the wrong address.

View File

@@ -1762,10 +1762,23 @@ Introduces a `TickSize` field to accounts, which can be set with the [AccountSet
| Default Vote (Latest stable release) | No |
| Pre-amendment functionality retired? | No |
Extends the existing Escrow functionality to support escrowing issued tokens or MPTs.
Extends escrow functionality to fungible tokens, enabling Trust Line Tokens and Multi-Purpose Tokens (MPTs) to be held in escrow. Issuers can control whether their tokens can be escrowed through flags. To issue Trust Line Tokens, issuers must enable the **Allow TrustLine Locking** flag on their account, or the **Can Escrow** and **Can Transfer** flags for an MPT issuance.
Specification: [XLS-85](https://github.com/XRPLF/XRPL-Standards/pull/272/)
Modifies existing transactions:
- EscrowCreate - Can now escrow fungible tokens in addition to XRP.
- EscrowFinish - Can now deliver escrowed fungible tokens to recipients.
- EscrowCancel - Can now return escrowed fungible tokens to senders.
- AccountSet - Can now enable the **Allow Trust Line Locking** flag to allow Trust Line Tokens issued by an account to be escrowed.
Updates existing ledger entry types:
- Escrow - Adds support for fungible token amounts and two new fields; `TransferRate` and `IssuerNode`.
- MPToken - Adds optional `LockedAmount` field to track tokens in escrow.
- MPTokenIssuance - Adds optional `LockedAmount` field to track tokens in escrow.
- AccountRoot - Adds **Allow Trust Line Locking** flag.
Specification: [XLS-85](https://xls.xrpl.org/xls/XLS-0085-token-escrow.html)
### TrustSetAuth
[TrustSetAuth]: #trustsetauth

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB