This commit is contained in:
Denis Angell
2024-11-27 19:47:13 +01:00
parent 92eb809397
commit 7916a14be2
611 changed files with 11369 additions and 4191 deletions

View File

@@ -1,180 +0,0 @@
[server]
port_rpc_admin_local
port_ws_public
port_ws_admin_local
# port_peer
# port_ws_admin_local
# ssl_key = /etc/ssl/private/server.key
# ssl_cert = /etc/ssl/certs/server.crt
# IPs must be 0.0.0.0 instead of 127.0.0.1 to be accessed outside the docker container
[port_rpc_admin_local]
port = 5005
ip = 0.0.0.0
admin = 0.0.0.0
protocol = http
[port_ws_public]
port = 80
ip = 0.0.0.0
protocol = ws
# [port_peer]
# port = 51235
# ip = 0.0.0.0
# protocol = peer
[port_ws_admin_local]
port = 6006
ip = 0.0.0.0
admin = 0.0.0.0
protocol = ws
[node_size]
small
# tiny
# small
# medium
# large
# huge
[node_db]
type=NuDB
path=/var/lib/rippled/db/nudb
advisory_delete=0
# How many ledgers do we want to keep (history)?
# Integer value that defines the number of ledgers
# between online deletion events
online_delete=256
[ledger_history]
# How many ledgers do we want to keep (history)?
# Integer value (ledger count)
# or (if you have lots of TB SSD storage): 'full'
256
[database_path]
/var/lib/rippled/db
[debug_logfile]
/var/log/rippled/debug.log
[sntp_servers]
time.windows.com
time.apple.com
time.nist.gov
pool.ntp.org
[ips]
r.ripple.com 51235
[validators_file]
validators.txt
[rpc_startup]
{ "command": "log_level", "severity": "info" }
# severity (order: lots of information .. only errors)
# debug
# info
# warn
# error
# fatal
[ssl_verify]
1
# The [features] stanza does not currently work for standalone mode: https://github.com/XRPLF/xrpl-dev-portal/issues/1762#issuecomment-1441252450
# In order to enable an amendment which by default would vote "No", you must include its amendment id and name here.
# To add amendments specifically from the latest releases of rippled:
# 1. Go to https://xrpl.org/known-amendments.html
# 2. Find the first amendment in the latest releases of rippled which are not already in the list below
# 3. Click on each amendment to get their Amendment ID and name to add to this list manually.
# You will likely update the list with all amendments from a new release of rippled all at once.
# To get the list of amendments on a network (e.g. devnet) follow the steps in xrpl.js's CONTRIBUTING.md for "Updating the Docker container".
# https://github.com/XRPLF/xrpl.js/blob/main/CONTRIBUTING.md
# (Running the script `getNewAmendments.js` should help you identify any new amendments that should be added.)
#
# Note: The version of rippled you use this config with must have an implementation for the amendments you attempt to enable or it will crash.
# If you need the version of rippled to be more up to date, you may need to make a comment on this repo: https://github.com/WietseWind/docker-rippled
[features]
# Devnet amendments as of June 28th, 2023
NegativeUNL
fixRemoveNFTokenAutoTrustLine
NonFungibleTokensV1
CheckCashMakesTrustLine
fixRmSmallIncreasedQOffers
fixSTAmountCanonicalize
FlowSortStrands
TicketBatch
fix1201
fixQualityUpperBound
FlowCross
EnforceInvariants
fix1523
HardenedValidations
DepositPreauth
MultiSignReserve
fix1623
FeeEscalation
PayChan
fix1513
RequireFullyCanonicalSig
fix1543
TickSize
fix1781
fixCheckThreading
fix1515
CryptoConditions
fix1528
fixPayChanRecipientOwnerDir
SortedDirectories
fix1578
fix1571
fixAmendmentMajorityCalc
fixTakerDryOfferRemoval
fixMasterKeyAsRegularKey
Flow
Escrow
TrustSetAuth
DeletableAccounts
DepositAuth
fix1368
fix1512
fix1373
MultiSign
Checks
NonFungibleTokensV1_1
# 1.10.0 Amendments
DisallowIncoming
fixNonFungibleTokensV1_2
fixTrustLinesToSelf
fixUniversalNumber
ImmediateOfferKilled
XRPFees
# 1.11.0 Amendments
ExpandedSignerList
# 1.12.0 Amendments
AMM
Clawback
fixReducedOffersV1
fixNFTokenRemint
# 2.0.0 Amendments
XChainBridge
DID
# 2.2.0-b3 Amendments
fixNFTokenReserve
fixInnerObjTemplate
fixAMMOverflowOffer
PriceOracle
fixEmptyDID
fixXChainRewardRounding
fixPreviousTxnID

109
.ci-config/xahaud.cfg Normal file
View File

@@ -0,0 +1,109 @@
[server]
port_rpc_admin_local
port_ws_public
port_ws_admin_local
# port_peer
# port_ws_admin_local
# ssl_key = /etc/ssl/private/server.key
# ssl_cert = /etc/ssl/certs/server.crt
# IPs must be 0.0.0.0 instead of 127.0.0.1 to be accessed outside the docker container
[port_rpc_admin_local]
port = 5005
ip = 0.0.0.0
admin = 0.0.0.0
protocol = http
[port_ws_public]
port = 80
ip = 0.0.0.0
protocol = ws
# [port_peer]
# port = 51235
# ip = 0.0.0.0
# protocol = peer
[port_ws_admin_local]
port = 6006
ip = 0.0.0.0
admin = 0.0.0.0
protocol = ws
[node_size]
small
# tiny
# small
# medium
# large
# huge
[node_db]
type=NuDB
path=/var/lib/xahaud/db/nudb
advisory_delete=0
# How many ledgers do we want to keep (history)?
# Integer value that defines the number of ledgers
# between online deletion events
online_delete=256
[ledger_history]
# How many ledgers do we want to keep (history)?
# Integer value (ledger count)
# or (if you have lots of TB SSD storage): 'full'
256
[database_path]
/var/lib/xahaud/db
[debug_logfile]
/var/log/xahaud/debug.log
[sntp_servers]
time.windows.com
time.apple.com
time.nist.gov
pool.ntp.org
[ips]
r.xahau.com 51235
# # # # # [validators_file]
# # # # # validators.txt
[rpc_startup]
{ "command": "log_level", "severity": "info" }
# severity (order: lots of information .. only errors)
# debug
# info
# warn
# error
# fatal
[ssl_verify]
1
# The [features] stanza does not currently work for standalone mode: https://github.com/XRPLF/xrpl-dev-portal/issues/1762#issuecomment-1441252450
# In order to enable an amendment which by default would vote "No", you must include its amendment id and name here.
# To add amendments specifically from the latest releases of xahaud:
# 1. Go to https://xrpl.org/known-amendments.html
# 2. Find the first amendment in the latest releases of xahaud which are not already in the list below
# 3. Click on each amendment to get their Amendment ID and name to add to this list manually.
# You will likely update the list with all amendments from a new release of xahaud all at once.
# To get the list of amendments on a network (e.g. devnet) follow the steps in xahau.js's CONTRIBUTING.md for "Updating the Docker container".
# https://github.com/XRPLF/xahau.js/blob/main/CONTRIBUTING.md
# (Running the script `getNewAmendments.js` should help you identify any new amendments that should be added.)
#
# Note: The version of xahaud you use this config with must have an implementation for the amendments you attempt to enable or it will crash.
# If you need the version of xahaud to be more up to date, you may need to make a comment on this repo: https://github.com/WietseWind/docker-xahaud
[network_id]
63456

View File

@@ -4,11 +4,11 @@
name: Node.js CI
env:
RIPPLED_DOCKER_IMAGE: rippleci/rippled:2.2.0-b3
XAHAUD_DOCKER_IMAGE: xahauci/xahaud:2025.2.6
on:
push:
branches: [main, 1.x]
branches: [main-xahau, 1.x]
pull_request:
workflow_dispatch:
@@ -108,7 +108,7 @@ jobs:
- name: Run docker in background
run: |
docker run --detach --rm --name rippled-service -p 6006:6006 --volume "${{ github.workspace }}/.ci-config/":"/opt/ripple/etc/" --health-cmd="wget localhost:6006 || exit 1" --health-interval=5s --health-retries=10 --health-timeout=2s --env GITHUB_ACTIONS=true --env CI=true ${{ env.RIPPLED_DOCKER_IMAGE }} /opt/ripple/bin/rippled -a --conf /opt/ripple/etc/rippled.cfg
docker run --detach --rm --name xahaud-service -p 6006:6006 --volume "${{ github.workspace }}/.ci-config/":"/opt/xahau/etc/" --health-cmd="wget localhost:6006 || exit 1" --health-interval=5s --health-retries=10 --health-timeout=2s --env GITHUB_ACTIONS=true --env CI=true ${{ env.XAHAUD_DOCKER_IMAGE }} /opt/xahau/bin/xahaud -a --conf /opt/xahau/etc/xahaud.cfg
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
@@ -145,7 +145,7 @@ jobs:
- name: Stop docker container
if: always()
run: docker stop rippled-service
run: docker stop xahaud-service
browser:
runs-on: ubuntu-latest
@@ -165,7 +165,7 @@ jobs:
- name: Run docker in background
run: |
docker run --detach --rm --name rippled-service -p 6006:6006 --volume "${{ github.workspace }}/.ci-config/":"/opt/ripple/etc/" --health-cmd="wget localhost:6006 || exit 1" --health-interval=5s --health-retries=10 --health-timeout=2s --env GITHUB_ACTIONS=true --env CI=true ${{ env.RIPPLED_DOCKER_IMAGE }} /opt/ripple/bin/rippled -a --conf /opt/ripple/etc/rippled.cfg
docker run --detach --rm --name xahaud-service -p 6006:6006 --volume "${{ github.workspace }}/.ci-config/":"/opt/ripple/etc/" --health-cmd="wget localhost:6006 || exit 1" --health-interval=5s --health-retries=10 --health-timeout=2s --env GITHUB_ACTIONS=true --env CI=true ${{ env.XAHAUD_DOCKER_IMAGE }} /opt/ripple/bin/xahaud -a --conf /opt/ripple/etc/xahaud.cfg
- name: Setup npm version 9
run: |
@@ -197,7 +197,7 @@ jobs:
- name: Stop docker container
if: always()
run: docker stop rippled-service
run: docker stop xahaud-service
snippets:
runs-on: ubuntu-latest

View File

@@ -1,175 +0,0 @@
# Applications using xrpl.js
A curated list of some of the projects and apps that leverage `xrpl.js` in some way.
**Have one to add?** Please edit this file and open a PR!
## Notice (disclaimer)
These sites are independent of Ripple and have not been authorized, endorsed, sponsored or otherwise approved by Ripple or its affiliates.
Warning: Use at your own risk.
## Exchanges
- **[The World Exchange](https://www.theworldexchange.net/)**
Trade, issue, and send directly on the XRP Ledger. A user interface for the XRPL's decentralized exchange. Includes an implementation of an autobridged order book for token-to-token trading pairs in the [source code](https://github.com/pftq/TheWorldExchange).
- **[Bitso](https://bitso.com/)**
Exchange allowing clients to buy and sell XRP, based in Mexico.
## Explorers
- **[xrpintel - XRP Intelligence](https://xrpintel.com/)**
Monitor the XRP Network in real time and explore historical statistics.
- **[XRP Charts](https://xrpcharts.ripple.com/)** (xrpcharts.ripple.com)
XRP Charts provides information based on public data, including trade volume, top markets, metrics, transactions, and more.
- **[Ripple Live](https://gatehub.net/live)** (gatehub.net/live)
Visualize XRP network transactions.
- **[XRPL Dev. Dashboard](https://xrp.fans/)** (xrp.fans)
Debugging dashboard for `rippled-ws-client-pool`, transaction and query explorer, and transaction signing and submission tool.
- **[XRP Value](http://xrpvalue.com/)**
Real-time XRP price, trades, and orderbook data from the XRP Ledger.
- **[Bithomp - XRP Explorer](https://bithomp.com/explorer/)**
Look up information by entering an address, transaction hash, username, or PayID.
- **[Bithomp - XRPL validators](https://bithomp.com/validators)**
List of XRPL validators, nodes, and testnet validators.
- **[XRP Scan - XRP Ledger explorer](https://xrpscan.com)**
XRP Ledger explorer, metrics and analytics.
- **[xrplorer](https://xrplorer.com)**
XRP Ledger explorer, API, metrics, and analytics using a graph database that is synchronized live with the XRPL.
- **[XRPLWin](https://xrplwin.com)**
XRP Ledger and Xahau explorer, Hooks explorer, metrics, and analytics using a XWA backend that is synchronized live with the XRPL and Xahau.
## Data monitoring
- **[zerptracker](https://zerptracker.com)**
Monitor the XRPL using powerful JSONPath expressions, and receive notifications via email, SMS, webhooks, and more.
- **[Utility-Scan](https://utility-scan.com)**
Attempts to detect RippleNet on-demand liquidity (ODL) transactions through known fiat corridors and report these transactions in real time.
- **[XRPL Rosetta](https://threexrp.dev/)**
3D Globe written in three.js connected to a Node.js websocket server that is listening to exchanges and the XRPL. The visualization aims to show trading, ODL, and liquidity at exchanges, intra-exchange volume, and flows.
## Wallets and wallet tools
- **[GemWallet](https://gemwallet.app/)**
Users can use the GemWallet (non-custodial) web extension to interact with the XRPL from their browser. The documentation is available at [https://gemwallet.app/](https://gemwallet.app/docs/user-guide/introduction).
- **[XUMM](https://xumm.app/)**
Users can use the xumm application to track their accounts, balances and transactions. The true power of xumm is the platform available for developers.
- **[Xpring Wallet](https://xpring.io)** (uses `ripple-keypairs`)
Non-custodial XRP wallet.
- **[XRP Toolkit](https://www.xrptoolkit.com)**
A web interface to the XRP Ledger, supporting both hardware and software wallets.
- **[Toast Wallet](https://toastwallet.com/)**
A free, open source XRP Wallet for iOS, Android, Windows, Mac and Linux.
- **[Toastify Ledger](https://github.com/WietseWind/toastify-ledger)** (uses `ripple-keypairs`)
Add a Regular Key to a mnemonic XRP Wallet (e.g. Ledger Nano S) to use the account with a Family Seed (secret).
- **[Bithomp-submit](https://github.com/Bithomp/bithomp-submit)** (GitHub)
A tool to submit an offline-signed XRPL transaction.
- **[Kyte](https://kyteapp.co/)** (kyteapp.co) ([Source](https://github.com/WietseWind/Zerp-Wallet)) (Deprecated)
Web-based XRP wallet.
- **[XRP Vanity Address Generator](https://github.com/WietseWind/xrp-vanity-generator)** (Node.js)
A vanity address is a wallet address containing a few characters you like at the beginning or the end of the wallet address.
- **[XRP Account Mnemonic Recovery](https://github.com/WietseWind/xrp-mnemonic-recovery)** (uses `ripple-keypairs`)
Recover a 24 word mnemonic if one word is wrong or one word is missing.
- **[Trustline](https://trustline.co)**
A decentralized stablecoin wallet that runs on the XRP Ledger.
## Send and request payments
- **[XRP Tip Bot](https://www.xrptipbot.com/)**
A bot that enables users on reddit, Twitter and Discord to send XRP to each other through reddit comments and Twitter tweets.
- **[XRP Text](https://xrptext.com/)**
Send XRP using SMS text messages.
- **[XRParrot](https://xrparrot.com/)** (uses `ripple-address-codec`)
Easy EUR (SEPA) to XRP transfer (currency conversion).
- **[XRP Payment](https://xrpayments.co/)** (xrpayments.co)
Tool for generating a XRP payment request URI in a QR code, with currency converter.
## Development tools
- **[XRP Faucets for Testnet and Devnet](https://xrpl.org/xrp-testnet-faucet.html)**
Get some test funds for development on the test network. The faucet uses `xrpl.js`.
## Code samples and libraries
- **[ilp-plugin-xrp-paychan](https://github.com/interledgerjs/ilp-plugin-xrp-paychan)**
Send ILP payments using XRP and payment channels (PayChan).
- **[RunKit: WietseWind](https://runkit.com/wietsewind/)**
XRP Ledger code samples for Node.js.
- **[GitHub Gist: WietseWind](https://gist.github.com/WietseWind)**
XRP Ledger code samples for Node.js and the web (mostly).
- **[rippled-ws-client-sign](https://github.com/WietseWind/rippled-ws-client-sign)**
Sign transactions, with support for MultiSign.
- **[ILP-enabled power switch](https://xrpcommunity.blog/raspberry-pi-interledger-xp-powerswitch-howto/)** ([video](https://www.youtube.com/watch?v=c-eS0HQUuJg)) (uses [`moneyd-uplink-xrp`](https://github.com/interledgerjs/moneyd-uplink-xrp))
For about $30 in parts (Raspberry Pi, 3.3V Relay board and a few wires) you can build your own power switch that will switch on if a streaming ILP payment comes in. When the payment stream stops, the power turns off.
## Related apps that do not appear to use xrpl.js
- **[XRP Stats](https://ledger.exposed/)** (ledger.exposed)
Rich list, live ledger stats and XRP distribution. Visualize escrows and flow of funds.

View File

@@ -47,7 +47,7 @@ npm run lint
## Running Tests
For integration and browser tests, we use a `rippled` node in standalone mode to test xrpl.js code against. To set this up, you can either configure and run `rippled` locally, or set up the Docker container `rippleci/rippled` by [following these instructions](#integration-tests). The latter will require you to [install Docker](https://docs.docker.com/get-docker/).
For integration and browser tests, we use a `xahaud` node in standalone mode to test xahau.js code against. To set this up, you can either configure and run `xahaud` locally, or set up the Docker container `xahauci/xahaud` by [following these instructions](#integration-tests). The latter will require you to [install Docker](https://docs.docker.com/get-docker/).
### Unit Tests
@@ -59,12 +59,12 @@ npm test
### Integration Tests
From the top-level xrpl.js folder (one level above `packages`), run the following commands:
From the top-level xahau.js folder (one level above `packages`), run the following commands:
```bash
npm install
# sets up the rippled standalone Docker container - you can skip this step if you already have it set up
docker run -p 6006:6006 --interactive -t --volume $PWD/.ci-config:/opt/ripple/etc/ --platform linux/amd64 rippleci/rippled:2.0.0-b4 /opt/ripple/bin/rippled -a --conf /opt/ripple/etc/rippled.cfg
# sets up the xahaud standalone Docker container - you can skip this step if you already have it set up
docker run -p 6006:6006 --interactive -t --volume $PWD/.ci-config:/opt/xahau/etc/ --platform linux/amd64 xahauci/xahaud:2025.2.6 /opt/xahau/bin/xahaud -a --conf /opt/xahau/etc/xahaud.cfg
npm run build
npm run test:integration
```
@@ -73,9 +73,9 @@ Breaking down the command:
* `docker run -p 6006:6006` starts a Docker container with an open port for admin WebSocket requests.
* `--interactive` allows you to interact with the container.
* `-t` starts a terminal in the container for you to send commands to.
* `--volume $PWD/.ci-config:/config/` identifies the `rippled.cfg` and `validators.txt` to import. It must be an absolute path, so we use `$PWD` instead of `./`.
* `rippleci/rippled` is an image that is regularly updated with the latest `rippled` releases
* `/opt/ripple/bin/rippled -a --conf /opt/ripple/etc/rippled.cfg` starts `rippled` in standalone mode
* `--volume $PWD/.ci-config:/config/` identifies the `xahaud.cfg` and `validators.txt` to import. It must be an absolute path, so we use `$PWD` instead of `./`.
* `xahauci/xahaud` is an image that is regularly updated with the latest `xahaud` releases
* `/opt/xahau/bin/xahaud -a --conf /opt/xahau/etc/xahaud.cfg` starts `xahaud` in standalone mode
### Browser Tests
@@ -85,12 +85,12 @@ One is in the browser - run `npm run build:browserTests` and open `test/localInt
The other is in the command line (this is what we use for CI) -
This should be run from the `xrpl.js` top level folder (one above the `packages` folder).
This should be run from the `xahau.js` top level folder (one above the `packages` folder).
```bash
npm run build
# sets up the rippled standalone Docker container - you can skip this step if you already have it set up
docker run -p 6006:6006 --interactive -t --volume $PWD/.ci-config:/opt/ripple/etc/ --platform linux/amd64 rippleci/rippled:2.2.0-b3 /opt/ripple/bin/rippled -a --conf /opt/ripple/etc/rippled.cfg
# sets up the xahaud standalone Docker container - you can skip this step if you already have it set up
docker run -p 6006:6006 --interactive -t --volume $PWD/.ci-config:/opt/xahau/etc/ --platform linux/amd64 xahauci/xahaud:2025.2.6 /opt/xahau/bin/xahaud -a --conf /opt/xahau/etc/xahaud.cfg
npm run test:browser
```
@@ -100,47 +100,47 @@ This is a monorepo, which means that there are multiple packages in a single Git
The 4 packages currently here are:
1. xrpl.js - The client library for interacting with the ledger.
2. ripple-binary-codec - A library for serializing and deserializing transactions for the ledger.
3. ripple-keypairs - A library for generating and using cryptographic keypairs.
4. ripple-address-codec - A library for encoding and decoding XRP Ledger addresses and seeds.
1. xahau.js - The client library for interacting with the ledger.
2. xahau-binary-codec - A library for serializing and deserializing transactions for the ledger.
3. xahau-keypairs - A library for generating and using cryptographic keypairs.
4. xahau-address-codec - A library for encoding and decoding Xahau Ledger addresses and seeds.
5. isomorphic - A collection of isomorphic implementations of crypto and utility functions.
6. secret-numbers - Generate XRPL Accounts with a number-based secret: 8 chunks of 6 digits.
Each package has it's own README which dives deeper into what it's main purpose is, and the core functionality it offers.
They also run tests independently as they were originally in separate repositories.
These are managed in a monorepo because often a change in a lower-level library will also require a change in xrpl.js, and so it makes sense to be able to allow for modifications of all packages at once without coordinating versions across multiple repositories.
These are managed in a monorepo because often a change in a lower-level library will also require a change in xahau.js, and so it makes sense to be able to allow for modifications of all packages at once without coordinating versions across multiple repositories.
Let's dive a bit into how xrpl.js is structured!
Let's dive a bit into how xahau.js is structured!
### The File Structure
Within the xrpl package, each folder has a specific purpose:
**Client** - This contains logic for handling the websocket connection to rippled servers.
**Client** - This contains logic for handling the websocket connection to xahaud servers.
**Models** - These types model LedgerObjects, Requests/Methods, and Transactions in order to give type hints and nice errors for users.
**Sugar** - This is where handy helper functions end up, like `submit`, `autofill`, and `getXRPBalance` amongst others.
**Sugar** - This is where handy helper functions end up, like `submit`, `autofill`, and `getXAHBalance` amongst others.
**Utils** - These are shared functions which are useful for conversions, or internal implementation details within the library.
**Wallet** - This logic handles managing keys, addresses, and signing within xrpl.js
**Wallet** - This logic handles managing keys, addresses, and signing within xahau.js
### Writing Tests for xrpl.js
### Writing Tests for xahau.js
For every file in `src`, we try to have a corresponding file in `test` with unit tests.
The goal is to maintain above 80% code coverage, and generally any new feature or bug fix should be accompanied by unit tests, and integration tests if applicable.
For an example of a unit test, check out the [autofill tests here](./packages/xrpl/test/client/autofill.ts).
For an example of a unit test, check out the [autofill tests here](./packages/xahau/test/client/autofill.ts).
If your code connects to the ledger (ex. Adding a new transaction type) it's handy to write integration tests to ensure that you can successfully interact with the ledger. Integration tests are generally run against a docker instance of rippled which contains the latest updates. Since standalone mode allows us to manually close ledgers, this allows us to run integration tests at a much faster rate than if we had to wait 4-5 seconds per transaction for the ledger to validate the transaction. [See above](#running-tests) for how to start up the docker container to run integration tests.
If your code connects to the ledger (ex. Adding a new transaction type) it's handy to write integration tests to ensure that you can successfully interact with the ledger. Integration tests are generally run against a docker instance of xahaud which contains the latest updates. Since standalone mode allows us to manually close ledgers, this allows us to run integration tests at a much faster rate than if we had to wait 4-5 seconds per transaction for the ledger to validate the transaction. [See above](#running-tests) for how to start up the docker container to run integration tests.
All integration tests should be written in the `test/integration` folder, with new `Requests` and `Transactions` tests being in their respective folders.
For an example of how to write an integration test for `xrpl.js`, you can look at the [Payment integration test](./packages/xrpl/test/integration/transactions/payment.ts).
For an example of how to write an integration test for `xahau.js`, you can look at the [Payment integration test](./packages/xahau/test/integration/transactions/payment.ts).
## Generate reference docs
You can see the complete reference documentation at [`xrpl.js` docs](https://js.xrpl.org). You can also generate them locally using `typedoc`:
You can see the complete reference documentation at [`xahau.js` docs](https://js.xrpl.org). You can also generate them locally using `typedoc`:
```bash
npm run docgen
@@ -150,17 +150,17 @@ This updates `docs/` at the top level, where GitHub Pages looks for the docs.
## Update `definitions.json`
Use [this repo](https://github.com/RichardAH/xrpl-codec-gen) to generate a new `definitions.json` file from the rippled source code. Instructions are available in that README.
Use [this repo](https://github.com/RichardAH/xrpl-codec-gen) to generate a new `definitions.json` file from the xahaud source code. Instructions are available in that README.
## Adding and removing packages
`xrpl.js` uses `lerna` and `npm`'s workspaces features to manage a monorepo.
`xahau.js` uses `lerna` and `npm`'s workspaces features to manage a monorepo.
Adding and removing packages requires a slightly different process than normal
as a result.
### Adding or removing development dependencies
`xrpl.js` strives to use the same development dependencies in all packages.
`xahau.js` strives to use the same development dependencies in all packages.
You may add and remove dev dependencies like normal:
```bash
@@ -175,38 +175,38 @@ npm uninstall --save-dev abbrev
You need to specify which package is changing using the `-w` flag:
```bash
### adding a new dependency to `xrpl`
npm install abbrev -w xrpl
### adding a new dependency to `ripple-keypairs`
npm install abbrev -w ripple-keypairs
### adding a new dependency to `xahau`
npm install abbrev -w xahau
### adding a new dependency to `xahau-keypairs`
npm install abbrev -w xahau-keypairs
### removing a dependency
npm uninstall abbrev -w xrpl
npm uninstall abbrev -w xahau
```
## Updating the Docker container for CI
In order to test the library, we need to enable the latest amendments in the docker container.
This requires updating the `/.ci-config/rippled.cfg` file with the hashes and names of new amendments.
This requires updating the `/.ci-config/xahaud.cfg` file with the hashes and names of new amendments.
In order to update the list, follow these steps from the top level of the library:
1. Run `node ./.ci-config/getNewAmendments.js`
2. If there are any new amendment hashes, add a comment to the end of `/.ci-config/rippled.cfg` with the date
2. If there are any new amendment hashes, add a comment to the end of `/.ci-config/xahaud.cfg` with the date
- `Ex. "# Added August 9th, 2023"`
3. For each hash printed out by the script, add the hash and name to the config file.
- Ex. `B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856 ExpandedSignerList`
- You can look up the name by searching for the hash on https://xrpl.org/known-amendments.html
4. Push your changes
Note: The same updated config can be used to update xrpl-py's CI as well.
Note: The same updated config can be used to update xahau-py's CI as well.
## Updating `definitions.json`
This should almost always be done using the [`xrpl-codec-gen`](https://github.com/RichardAH/xrpl-codec-gen) script - if the output needs manual intervention afterwards, consider updating the script instead.
1. Clone / pull the latest changes from [rippled](https://github.com/XRPLF/rippled) - Specifically the `develop` branch is usually the right one.
1. Clone / pull the latest changes from [xahaud](https://github.com/XRPLF/xahaud) - Specifically the `develop` branch is usually the right one.
2. Clone / pull the latest changes from [`xrpl-codec-gen`](https://github.com/RichardAH/xrpl-codec-gen)
3. From the `xrpl-codec-gen` tool, follow the steps in the `README.md` to generate a new `definitions.json` file.
4. Replace the `definitions.json` file in the `ripple-binary-codec` with the newly generated file.
4. Replace the `definitions.json` file in the `xahau-binary-codec` with the newly generated file.
5. Verify that the changes make sense by inspection before submitting, as there may be updates required for the `xrpl-codec-gen` tool depending on the latest amendments we're updating to match.
@@ -246,13 +246,13 @@ This should almost always be done using the [`xrpl-codec-gen`](https://github.co
- Stable release: Run `npx lerna publish from-package --yes`
- Beta release: Run `npx lerna publish from-package --dist-tag beta --yes`
Notice this allows developers to install the package with `npm add xrpl@beta`
Notice this allows developers to install the package with `npm add xahau@beta`
1. If requested, enter your [npmjs.com](https://npmjs.com) OTP (one-time password) to complete publication.
NOW YOU HAVE PUBLISHED! But you're not done; we have to notify people!
1. Run `git tag <tagname> -m <tagname>`, where `<tagname>` is the new package and version (e.g. `xrpl@2.1.1`), for each version released.
1. Run `git tag <tagname> -m <tagname>`, where `<tagname>` is the new package and version (e.g. `xahau@2.1.1`), for each version released.
1. Run `git push --follow-tags`, to push the tags to Github.
1. On GitHub, click the "Releases" link on the right-hand side of the page.
@@ -262,19 +262,19 @@ This should almost always be done using the [`xrpl-codec-gen`](https://github.co
1. Click "Choose a tag", and choose a tag that you just created.
1. Edit the name of the release to match the tag (IE \<package\>@\<version\>) and edit the description as you see fit.
1. Send an email to [xrpl-announce](https://groups.google.com/g/xrpl-announce).
1. Lastly, send a similar message to the XRPL Discord in the [`javascript` channel](https://discord.com/channels/886050993802985492/886053111179915295). The message should include:
1. The version changes for xrpl libraries
1. Send an email to [xahau-announce](https://groups.google.com/g/xahau-announce).
1. Lastly, send a similar message to the Xahau Discord in the [`javascript` channel](https://discord.com/channels/1085202760548499486/1085203623111295068). The message should include:
1. The version changes for xahau libraries
1. A link to the more detailed changes
1. Highlights of important changes
## Mailing Lists
We have a low-traffic mailing list for announcements of new `xrpl.js` releases. (About 1 email every couple of weeks)
We have a low-traffic mailing list for announcements of new `xahau.js` releases. (About 1 email every couple of weeks)
- [Subscribe to xrpl-announce](https://groups.google.com/g/xrpl-announce)
- [Subscribe to xahau-announce](https://groups.google.com/g/xahau-announce)
If you're using the XRP Ledger in production, you should run a [rippled server](https://github.com/ripple/rippled) and subscribe to the ripple-server mailing list as well.
If you're using the Xahau Ledger in production, you should run a [xahaud server](https://github.com/xahau/xahaud) and subscribe to the xahau-server mailing list as well.
- [Subscribe to ripple-server](https://groups.google.com/g/ripple-server)
- [Subscribe to xahau-server](https://groups.google.com/g/xahau-server)

View File

@@ -1,31 +1,31 @@
# Unique Setup Steps for Xrpl.js
# Unique Setup Steps for Xahau.js
Starting in 3.0 xrpl and all the packages in this repo no longer require custom configurations (ex. polyfills) to run.
Starting in 3.0 xahau and all the packages in this repo no longer require custom configurations (ex. polyfills) to run.
### Using xrpl.js from a CDN
### Using xahau.js from a CDN
You can avoid setting up your build system to handle `xrpl.js` by using a cdn version that is prebuilt for the browser.
You can avoid setting up your build system to handle `xahau.js` by using a cdn version that is prebuilt for the browser.
- unpkg `<script src="https://unpkg.com/xrpl@2.3.0/build/xrpl-latest-min.js"></script>`
- jsdelivr `<script src="https://cdn.jsdelivr.net/npm/xrpl@2.3.0/build/xrpl-latest-min.js"></script>`
- unpkg `<script src="https://unpkg.com/xahau@2.3.0/build/xahau-latest-min.js"></script>`
- jsdelivr `<script src="https://cdn.jsdelivr.net/npm/xahau@2.3.0/build/xahau-latest-min.js"></script>`
Ensure that the full path is provided so the browser can find the sourcemaps.
### Using xrpl.js with `create-react-app`
### Using xahau.js with `create-react-app`
Starting in 3.0 xrpl and its related packages no longer require custom configurations (ex. polyfills) to run.
Starting in 3.0 xahau and its related packages no longer require custom configurations (ex. polyfills) to run.
This online template uses these steps to run xrpl.js with React in the browser:
https://codesandbox.io/s/xrpl-intro-pxgdjr?file=/src/App.js
This online template uses these steps to run xahau.js with React in the browser:
https://codesandbox.io/s/xahau-intro-pxgdjr?file=/src/App.js
### Using xrpl.js with React Native
### Using xahau.js with React Native
If you want to use `xrpl.js` with React Native you will need to install polyfills for core NodeJS modules.
If you want to use `xahau.js` with React Native you will need to install polyfills for core NodeJS modules.
1. Install dependencies (you can use `yarn` as well):
```shell
npm install xrpl \
npm install xahau \
fast-text-encoding \
react-native-get-random-values
```
@@ -36,7 +36,7 @@ If you want to use `xrpl.js` with React Native you will need to install polyfill
# compile `react-native-get-random-values` pods see https://www.npmjs.com/package/react-native-get-random-values#installation
npx pod-install
```
3. Create `polyfills.js` and add
```javascript
@@ -53,23 +53,23 @@ import './polyfills'
...
```
### Using xrpl.js with Vite React
### Using xahau.js with Vite React
Starting in 3.0 xrpl and all the packages in this repo no longer require custom configurations (ex. polyfills) to run.
Starting in 3.0 xahau and all the packages in this repo no longer require custom configurations (ex. polyfills) to run.
### Using xrpl.js with Deno
### Using xahau.js with Deno
Until official support for [Deno](https://deno.land) is added, you can use the following work-around to use `xrpl.js` with Deno:
Until official support for [Deno](https://deno.land) is added, you can use the following work-around to use `xahau.js` with Deno:
> [!NOTE]
> The following is currently broken due to https://github.com/denoland/deno/issues/20516.
> Once that is fixed there could be other issues as well.
```javascript
import xrpl from 'https://dev.jspm.io/npm:xrpl';
import xahau from 'https://dev.jspm.io/npm:xahau';
(async () => {
const api = new (xrpl as any).Client('wss://s.altnet.rippletest.net:51233');
const api = new (xahau as any).Client('wss://xahau-test.net');
const address = 'rH8NxV12EuV...khfJ5uw9kT';
api.connect().then(() => {

View File

@@ -1,5 +1,4 @@
{
"version": "independent",
"useWorkspaces": true,
"npmClient": "npm"
}

440
migrate.ts Normal file
View File

@@ -0,0 +1,440 @@
// replaceScript.ts
// @ts-ignore -- No types available for fs/promises
import * as fs from "fs/promises";
// @ts-ignore -- No types available for fs/promises
import * as path from "path";
// Constants
const rippleDocker: string = "rippleci/rippled:2.2.0-b3";
const xahauDocker: string = "xahauci/xahaud:2025.2.6";
/**
* Replace text in a file with the given replacements.
* @param filePath - Path to the file.
* @param replacements - Object with key-value pairs for replacement.
*/
async function replaceTextInFile(
filePath: string,
replacements: { [key: string]: string }
): Promise<void> {
try {
let content = await fs.readFile(filePath, "utf-8");
for (const [key, value] of Object.entries(replacements)) {
const regex = new RegExp(escapeRegExp(key), "g");
content = content.replace(regex, value);
}
await fs.writeFile(filePath, content, "utf-8");
console.log(`Updated: ${filePath}`);
} catch (error) {
console.error(
`Error processing file ${filePath}: ${(error as Error).message}`
);
}
}
/**
* Escape special characters for use in RegExp.
* @param string - The string to escape.
* @returns The escaped string.
*/
function escapeRegExp(string: string): string {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
/**
* Replace occurrences in pyproject.toml, specifically in the [tool.poetry] authors section.
* @param filePath - Path to pyproject.toml.
* @param newAuthors - Array of new authors to add.
*/
// async function replaceInPoetry(filePath: string, newAuthors: string[]): Promise<void> {
// try {
// let content = await fs.readFile(filePath, 'utf-8');
// // Replace specific texts
// const replacements: { [key: string]: string } = {
// "https://github.com/XRPLF/xrpl-py": "https://github.com/Xahau/xahau-py",
// "xrpl": "xahau",
// "xrp": "xah",
// "XRP ledger": "Xahau Ledger",
// };
// await replaceTextInFile(filePath, replacements);
// // Handle authors separately
// content = await fs.readFile(filePath, 'utf-8');
// const authorsRegex = /^authors\s*=\s*\[(.*?)\]/ms;
// const match = authorsRegex.exec(content);
// if (match) {
// const existingAuthors = match[1]
// .split(',')
// .map(author => author.trim().replace(/"/g, ''))
// .filter(author => author);
// const combinedAuthors = [...existingAuthors, ...newAuthors.map(author => author.trim())];
// const newAuthorsList = combinedAuthors.map(author => ` "${author}"`).join(',\n ');
// const newAuthorsSection = `authors = [\n${newAuthorsList}\n]`;
// content = content.replace(authorsRegex, newAuthorsSection);
// await fs.writeFile(filePath, content, 'utf-8');
// console.log(`Updated authors in: ${filePath}`);
// } else {
// console.warn(`Authors section not found in: ${filePath}`);
// }
// } catch (error) {
// console.error(`Error processing file ${filePath}: ${(error as Error).message}`);
// }
// }
/**
* Replace text in README.md.
* @param filePath - Path to README.md.
*/
async function replaceInReadme(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
"from xrpl": "from xahau",
"xrpl-py": "xahau-py",
"xrpl.": "xahau.",
"xrpl-announce": "xahau-announce",
"xrpl-keypairs": "xahau-keypairs",
"XRP Ledger": "Xahau Ledger",
"https://s.altnet.rippletest.net:51234": "https://xahau-test.net",
};
await replaceTextInFile(filePath, replacements);
}
async function replaceInUnique(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
"Xrpl.js": "Xahau.js",
xrpl: "xahau",
"wss://s.altnet.rippletest.net:51233": "wss://xahau-test.net",
};
await replaceTextInFile(filePath, replacements);
}
/**
* Replace text in CONTRIBUTING.md or other contributing files.
* @param filePath - Path to the contributing file.
*/
async function replaceInContrib(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
"xrpl.js": "xahau.js",
"xrpl-announce": "xahau-announce",
[rippleDocker]: xahauDocker,
"/opt/ripple/bin/rippled": "/opt/xahau/bin/xahaud",
"/opt/ripple/etc/rippled.cfg": "/opt/xahau/etc/xahaud.cfg",
ripple: "xahau",
rippled: "xahaud",
RIPPLED: "XAHAUD",
getXRPBalance: "getXAHBalance",
"/packages/xrpl": "/packages/xahau",
"`xrpl`": "`xahau`",
"-w xrpl": "-w xahau",
"xrpl-py": "xahau-py",
"xrpl@beta": "xahau@beta",
"`xrpl@2.1.1`": "`xahau@2.1.1`",
"xrpl libraries": "xahau libraries",
"XRP Ledger": "Xahau Ledger",
"XRPL Discord": "Xahau Discord",
"https://discord.com/channels/886050993802985492/886053111179915295":
"https://discord.com/channels/1085202760548499486/1085203623111295068",
};
await replaceTextInFile(filePath, replacements);
}
/**
* Replace text in CONTRIBUTING.md or other contributing files.
* @param filePath - Path to the contributing file.
*/
async function replaceInConfig(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
"[validators_file]": "# [validators_file]",
"validators.txt": "# validators.txt",
};
await replaceTextInFile(filePath, replacements);
}
/**
* Replace text in GitHub workflow and config files.
* @param filePath - Path to the GitHub-related file.
*/
async function replaceInGitHub(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
"[xahau]": "[main, xahau]",
"flake8 xrpl": "flake8 xahau",
"reexport xrpl": "reexport xahau",
"xrpl/": "xahau/",
"source xrpl": "source xahau",
};
await replaceTextInFile(filePath, replacements);
}
/**
* Replace text in generic Python or JSON files.
* @param filePath - Path to the file.
*/
async function replaceInPackage(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
'"xrpl.js"': '"xahau.js"',
'"xrpl"': '"xahau"',
'"ripple-address-codec"': '"xahau-address-codec"',
'"ripple-binary-codec"': '"xahau-binary-codec"',
'"ripple-keypairs"': '"xahau-keypairs"',
'"file:packages/ripple-address-codec"':
'"file:packages/xahau-address-codec"',
'"file:packages/ripple-binary-codec"': '"file:packages/xahau-binary-codec"',
'"file:packages/ripple-keypairs"': '"file:packages/xahau-keypairs"',
'"file:packages/xrpl"': '"file:packages/xahau"',
};
await replaceTextInFile(filePath, replacements);
}
/**
* Replace text in generic Python or JSON files.
* @param filePath - Path to the file.
*/
async function replaceInIsomorphic(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
'"git@github.com:XRPLF/xrpl.js.git"':
'"git@github.com:Xahaud/xahau.js.git"',
'"xrpl.js"': '"xahau.js"',
};
await replaceTextInFile(filePath, replacements);
}
/**
* Replace text in generic Python or JSON files.
* @param filePath - Path to the file.
*/
async function replaceInFile(filePath: string): Promise<void> {
const replacements: { [key: string]: string } = {
"from 'xrpl'": "from 'xahau'",
'"xrpl"': '"xahau"',
'"ripple-address-codec"': '"xahau-address-codec"',
'"ripple-binary-codec"': '"xahau-binary-codec"',
'"ripple-keypairs"': '"xahau-keypairs"',
"from xrpl": "from xahau",
"from './xrp-codec'": "from './xah-codec'",
"from './enums/xrpl-definitions'": "from './enums/xahau-definitions'",
"from '../src/enums/xrpl-definitions'":
"from '../src/enums/xahau-definitions'",
"from './xrpl-definitions-base'": "from './xahau-definitions-base'",
"from './fixtures/rippled'": "from './fixtures/xahaud'",
"`fixtures/rippled/": "`fixtures/xahaud/",
"from 'ripple-address-codec'": "from 'xahau-address-codec'",
"from 'ripple-binary-codec'": "from 'xahau-binary-codec'",
"from 'ripple-binary-codec/dist/types'":
"from 'xahau-binary-codec/dist/types'",
"from 'ripple-keypairs'": "from 'xahau-keypairs'",
"from '../fixtures/rippled'": "from '../fixtures/xahaud'",
"from '../fixtures/rippled/accountLines'":
"from '../fixtures/xahaud/accountLines'",
'"rootDir": "../../xrpl"': '"rootDir": "../../xahau"',
"../ripple-address-codec/tsconfig.json":
"../xahau-address-codec/tsconfig.json",
"../ripple-binary-codec/tsconfig.json":
"../xahau-binary-codec/tsconfig.json",
"../ripple-keypairs/tsconfig.json": "../xahau-keypairs/tsconfig.json",
"../ripple-address-codec/tsconfig.build.json":
"../xahau-address-codec/tsconfig.build.json",
"../ripple-binary-codec/tsconfig.build.json":
"../xahau-binary-codec/tsconfig.build.json",
"../ripple-keypairs/tsconfig.build.json":
"../xahau-keypairs/tsconfig.build.json",
"./getFeeXrp": "./getFeeXah",
"../../src/sugar/getFeeXrp": "../../src/sugar/getFeeXah",
"xrpl-announce": "xahau-announce",
"wss://s.altnet.rippletest.net:51233": "wss://xahau-test.net",
"wss://s.devnet.rippletest.net": "wss://jshooks.xahau-test.net",
"wss://testnet.xrpl-labs.com": "wss://xahau-test.net",
// "XRP": "XAH",
xrpToDrops: "xahToDrops",
dropsToXrp: "dropsToXah",
xrpConversion: "xahConversion",
XrplError: "XahlError",
RippledError: "XahaudError",
RippledNotInitializedError: "XahaudNotInitializedError",
XRPLFaucetError: "XAHLFaucetError",
'"xrp"': '"xah"',
'"xrpl-ledger"': '"xahau-ledger"',
'"xrp ledger"': '"xahau ledger"',
'"ripple",': '"xahau",',
"faucet.altnet.rippletest.net": "xahau-test.net/accounts",
"faucet.devnet.rippletest.net": "jshooks.xahau-test.net/accounts",
"0000000000000000000000005852500000000000":
"0000000000000000000000005841480000000000",
RIPPLED_API_V2: "XAHAUD_API_V2",
RIPPLED_API_V1: "XAHAUD_API_V1",
"export const DEFAULT_API_VERSION = XAHAUD_API_V2":
"export const DEFAULT_API_VERSION = XAHAUD_API_V1",
"api_version: 2,": "api_version: 1,",
"'XRP'": "'XAH'",
};
// const replacements: { [key: string]: string } = {
// "from xrpl": "from xahau",
// "import xrpl": "import xahau",
// "xrpl.utils": "xahau.utils",
// "xrpl.models.": "xahau.models.",
// "xrpl.core.": "xahau.core.",
// "flake8 xrpl": "flake8 xahau",
// "xrpl-announce": "xahau-announce",
// "../xrpl": "../xahau",
// "xrpllabsofficial/xrpld:1.12.0": "xahaulabsofficial/xahaud:1.12.0",
// "xrpl-py": "xahau-py",
// "https://s.altnet.rippletest.net:51234": "https://xahau-test.net",
// "https://xrplcluster.com/": "https://xahau.network",
// '_TEST_FAUCET_URL: Final[str] = "https://faucet.altnet.rippletest.net/accounts"':
// '_TEST_FAUCET_URL: Final[str] = "https://xahau-test.net/accounts"',
// '_DEV_FAUCET_URL: Final[str] = "https://faucet.devnet.rippletest.net/accounts"':
// '_DEV_FAUCET_URL: Final[str] = "https://xahau-test.net/accounts"',
// 'if "altnet" in url or "testnet" in url:':
// 'if "xahau-test" in url or "testnet" in url:',
// "https://s.devnet.rippletest.net:51234": "https://xahau-test.net",
// "wss://s.altnet.rippletest.net:51233": "wss://xahau-test.net",
// "wss://s.devnet.rippletest.net": "wss://xahau-test.net",
// "https://testnet.xrpl-labs.com": "https://xahau-test.net",
// "wss://testnet.xrpl-labs.com": "wss://xahau-test.net",
// "faucet.devnet.rippletest.net": "xahau-test.net",
// "wss://xahau-test.net:51233": "wss://xahau-test.net",
// '_DEFAULT_API_VERSION: Final[int] = 2': '_DEFAULT_API_VERSION: Final[int] = 1',
// '"xrpl.': '"xahau.',
// "XRP": "XAH",
// "xrp_to_drops": "xah_to_drops",
// "drops_to_xrp": "drops_to_xah",
// "xrp_conversions": "xah_conversions",
// // "XAHLModelException": "XRPLModelException", // Commented out as in Python
// "XRPLModelException": "XAHLModelException",
// "xahau.models.currencies.xrp": "xahau.models.currencies.xah",
// '"xrp"': '"xah"',
// "0000000000000000000000005852500000000000": "0000000000000000000000005841480000000000",
// "def test_does_account_exist_throws_for_invalid_account":
// "def _test_does_account_exist_throws_for_invalid_account",
// "def test_run_faucet_tests": "def _test_run_faucet_tests",
// // Additional replacements commented out as in Python
// // "TestAccountDelete": "NoTestAccountDelete",
// // "TestAMM": "NoTestAMM",
// // "TestClawback": "NoTestClawback",
// // "TestDeleteOracle": "NoTestDeleteOracle",
// // "TestDID": "NoTestDID",
// // "TestSetOracle": "NoTestSetOracle",
// // "TestXChain": "NoTestXChain",
// // "TestFeature": "NoTestFeature",
// };
await replaceTextInFile(filePath, replacements);
}
/**
* Search for Python and JSON files in the given folders and perform replacements.
* @param folderPaths - Array of folder paths to search.
*/
async function searchAndReplaceInFolders(folderPaths: string[]): Promise<void> {
for (const folderPath of folderPaths) {
try {
const entries = await fs.readdir(folderPath, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(folderPath, entry.name);
if (entry.isDirectory()) {
await searchAndReplaceInFolders([fullPath]);
} else if (
entry.isFile() &&
(fullPath.endsWith(".ts") ||
fullPath.endsWith(".js") ||
fullPath.endsWith(".json"))
) {
await replaceInFile(fullPath);
}
}
} catch (error) {
console.error(
`Error reading folder ${folderPath}: ${(error as Error).message}`
);
}
}
}
/**
* Rename a folder or file.
* @param oldName - Current name/path.
* @param newName - New name/path.
*/
async function renameItem(oldName: string, newName: string): Promise<void> {
try {
await fs.rename(oldName, newName);
console.log(`Renamed ${oldName} to ${newName}`);
} catch (error) {
console.error(
`Error renaming ${oldName} to ${newName}: ${(error as Error).message}`
);
}
}
/**
* Delete a file.
* @param fileName - Path to the file to delete.
*/
async function deleteFile(fileName: string): Promise<void> {
try {
await fs.unlink(fileName);
console.log(`Deleted file: ${fileName}`);
} catch (error) {
console.error(
`Error deleting file ${fileName}: ${(error as Error).message}`
);
}
}
/**
* Main function to execute all operations.
*/
async function main() {
// Delete Files
// await deleteFile("APPLICATIONS.md")
// Renaming folders/files
// await renameItem("packages/xrpl", "packages/xahau");
// await renameItem("packages/ripple-address-codec", "packages/xahau-address-codec");
// await renameItem("packages/ripple-binary-codec", "packages/xahau-binary-codec");
// await renameItem("packages/ripple-keypairs", "packages/xahau-keypairs");
// await renameItem(".ci-config/rippled.cfg", ".ci-config/xahaud.cfg");
// await renameItem("packages/xahau/src/utils/xrpConversion.ts", "packages/xahau/src/utils/xahConversion.ts");
// await renameItem("packages/xahau/test/utils/xrpToDrops.ts", "packages/xahau/test/utils/xahToDrops.ts");
// await renameItem("packages/xrpl/test/client/getFeeXrp.test.ts", "packages/xrpl/test/client/getFeeXah.test.ts");
// await renameItem("packages/xrpl/test/client/getXahBalance.test.ts", "packages/xrpl/test/client/getXahBalance.test.ts")
// await renameItem("packages/xahau/src/sugar/getFeeXrp.ts", "packages/xahau/src/sugar/getFeeXah.ts")
// await renameItem("packages/xahau/test/fixtures/rippled", "packages/xahau/test/fixtures/xahaud")
// // Address Codec
// await renameItem("packages/xahau-address-codec/src/xrp-codec.ts", "packages/xahau-address-codec/src/xah-codec.ts");
// await renameItem("packages/xahau-address-codec/test/xrp-codec.test.ts", "packages/xahau-address-codec/test/xah-codec.test.ts");
// // Binary Codec
// await renameItem("packages/xahau-binary-codec/src/enums/xrpl-definitions-base.ts", "packages/xahau-binary-codec/src/enums/xahau-definitions-base.ts");
// await renameItem("packages/xahau-binary-codec/src/enums/xrpl-definitions.ts", "packages/xahau-binary-codec/src/enums/xahau-definitions.ts");
await replaceInIsomorphic("package.json");
await replaceInPackage("package.json");
// // Search and replace in specified folders
const folderList: string[] = ["packages"];
await searchAndReplaceInFolders(folderList);
// await replaceInUnique("UNIQUE_SETUPS.md");
// // Perform replacements in specific files
await replaceInConfig(".ci-config/xahaud.cfg");
await replaceInContrib("CONTRIBUTING.md");
// await replaceInGitHub(".github/workflows/integration_test.yml");
// await replaceInGitHub(".github/workflows/unit_test.yml");
// await replaceInGitHub(".pre-commit-config.yaml");
// // Uncomment and use if needed
// // await replaceInPoetry(
// // "pyproject.toml",
// // ["Denis Angell <denis@xrpl-labs.com>", "Tequ <tequ@xrplf.com>"],
// // );
// await replaceInReadme("README.md");
// // Delete a specific file
// await deleteFile(".github/workflows/snippet_test.yml");
}
// Execute the main function
main().catch((error) => {
console.error(`Unexpected error: ${(error as Error).message}`);
});

10151
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
{
"name": "xrpl.js",
"name": "xahau.js",
"private": true,
"scripts": {
"analyze": "lerna run analyze --stream",
@@ -16,10 +16,10 @@
"dependencies": {
"@xrplf/isomorphic": "file:packages/isomorphic",
"@xrplf/secret-numbers": "file:packages/secret-numbers",
"ripple-address-codec": "file:packages/ripple-address-codec",
"ripple-binary-codec": "file:packages/ripple-binary-codec",
"ripple-keypairs": "file:packages/ripple-keypairs",
"xrpl": "file:packages/xrpl"
"xahau-address-codec": "file:packages/xahau-address-codec",
"xahau-binary-codec": "file:packages/xahau-binary-codec",
"xahau-keypairs": "file:packages/xahau-keypairs",
"xahau": "file:packages/xahau"
},
"devDependencies": {
"@types/chai": "^4.2.21",

View File

@@ -5,7 +5,7 @@
"keywords": [
"crypto",
"isomorphic",
"xrpl"
"xahau"
],
"scripts": {
"build": "tsc --build ./tsconfig.build.json",

View File

@@ -30,7 +30,7 @@
},
"dependencies": {
"@xrplf/isomorphic": "^1.0.0",
"ripple-keypairs": "^2.0.0"
"xahau-keypairs": "^2.0.0"
},
"prettier": "@xrplf/prettier-config",
"repository": {
@@ -40,8 +40,8 @@
"license": "ISC",
"readmeFilename": "README.md",
"keywords": [
"xrp",
"xrpl-ledger",
"xah",
"xahau-ledger",
"multi sign",
"sign"
]

View File

@@ -1,4 +1,4 @@
import { deriveAddress, deriveKeypair, generateSeed } from 'ripple-keypairs'
import { deriveAddress, deriveKeypair, generateSeed } from 'xahau-keypairs'
import {
entropyToSecret,

View File

@@ -1,5 +1,5 @@
import { hexToBytes } from '@xrplf/isomorphic/utils'
import { deriveAddress, deriveKeypair, generateSeed } from 'ripple-keypairs'
import { deriveAddress, deriveKeypair, generateSeed } from 'xahau-keypairs'
import { Account, secretToEntropy } from '../src'

View File

@@ -6,7 +6,7 @@
"include": ["./src/**/*.ts", "./src/**/*.json"],
"references": [
{
"path": "../ripple-keypairs/tsconfig.json"
"path": "../xahau-keypairs/tsconfig.json"
}
]
}

View File

@@ -1,5 +1,5 @@
{
"name": "ripple-address-codec",
"name": "xahau-address-codec",
"version": "5.0.0",
"description": "encodes/decodes base58 encoded XRP Ledger identifiers",
"files": [
@@ -14,10 +14,10 @@
"@xrplf/isomorphic": "^1.0.0"
},
"keywords": [
"ripple",
"xrp",
"xrp ledger",
"xrpl"
"xahau",
"xah",
"xahau ledger",
"xahau"
],
"repository": {
"type": "git",

View File

@@ -11,7 +11,7 @@ import {
encodeAccountPublic,
decodeAccountPublic,
isValidClassicAddress,
} from './xrp-codec'
} from './xah-codec'
const PREFIX_BYTES = {
// 5, 68

View File

@@ -1,5 +1,5 @@
{
"name": "ripple-binary-codec",
"name": "xahau-binary-codec",
"version": "2.1.0",
"description": "XRP Ledger binary codec",
"files": [
@@ -13,7 +13,7 @@
"dependencies": {
"@xrplf/isomorphic": "^1.0.1",
"bignumber.js": "^9.0.0",
"ripple-address-codec": "^5.0.0"
"xahau-address-codec": "^5.0.0"
},
"scripts": {
"build": "tsc --build tsconfig.build.json && copyfiles ./src/enums/definitions.json ./dist/enums/",
@@ -24,10 +24,10 @@
"lint": "eslint . --ext .ts --ext .test.js"
},
"keywords": [
"ripple",
"xrp",
"xrp ledger",
"xrpl"
"xahau",
"xah",
"xahau ledger",
"xahau"
],
"repository": {
"type": "git",

View File

@@ -3,7 +3,7 @@ import {
XrplDefinitionsBase,
FieldInstance,
Bytes,
} from './xrpl-definitions-base'
} from './xahau-definitions-base'
/**
* By default, coreTypes from the `types` folder is where known type definitions are initialized to avoid import cycles.
*/

View File

@@ -1,7 +1,7 @@
import {
type DefinitionsData,
XrplDefinitionsBase,
} from './xrpl-definitions-base'
} from './xahau-definitions-base'
import { coreTypes } from '../types'
import { SerializedType } from '../types/serialized-type'

View File

@@ -7,7 +7,7 @@ import {
TRANSACTION_TYPES,
DEFAULT_DEFINITIONS,
} from './enums'
import { XrplDefinitions } from './enums/xrpl-definitions'
import { XrplDefinitions } from './enums/xahau-definitions'
import { coreTypes } from './types'
import { bytesToHex } from '@xrplf/isomorphic/utils'

View File

@@ -3,7 +3,7 @@ import {
encodeAccountID,
isValidXAddress,
xAddressToClassicAddress,
} from 'ripple-address-codec'
} from 'xahau-address-codec'
import { Hash160 } from './hash-160'
import { hexToBytes } from '@xrplf/isomorphic/utils'

View File

@@ -12,7 +12,7 @@ const STANDARD_FORMAT_HEX_REGEX = /^0{24}[\x00-\x7F]{6}0{10}$/
*/
function isoToBytes(iso: string): Uint8Array {
const bytes = new Uint8Array(20)
if (iso !== 'XRP') {
if (iso !== 'XAH') {
const isoBytes = iso.split('').map((c) => c.charCodeAt(0))
bytes.set(isoBytes, 12)
}
@@ -28,7 +28,7 @@ function isIsoCode(iso: string): boolean {
function isoCodeFromHex(code: Uint8Array): string | null {
const iso = hexToString(bytesToHex(code))
if (iso === 'XRP') {
if (iso === 'XAH') {
return null
}
if (isIsoCode(iso)) {
@@ -89,7 +89,7 @@ class Currency extends Hash160 {
const hex = bytesToHex(this.bytes)
if (XRP_HEX_REGEX.test(hex)) {
this._iso = 'XRP'
this._iso = 'XAH'
} else if (STANDARD_FORMAT_HEX_REGEX.test(hex)) {
this._iso = isoCodeFromHex(this.bytes.slice(12, 15))
} else {

View File

@@ -66,7 +66,7 @@ class Issue extends SerializedType {
*/
static fromParser(parser: BinaryParser): Issue {
const currency = parser.read(20)
if (new Currency(currency).toJSON() === 'XRP') {
if (new Currency(currency).toJSON() === 'XAH') {
return new Issue(currency)
}
const currencyAndIssuer = [currency, parser.read(20)]
@@ -81,7 +81,7 @@ class Issue extends SerializedType {
toJSON(): IssueObject {
const parser = new BinaryParser(this.toString())
const currency = Currency.fromParser(parser) as Currency
if (currency.toJSON() === 'XRP') {
if (currency.toJSON() === 'XAH') {
return { currency: currency.toJSON() }
}
const issuer = AccountID.fromParser(parser) as AccountID

View File

@@ -5,7 +5,7 @@ import {
XrplDefinitionsBase,
} from '../enums'
import { SerializedType, JsonObject } from './serialized-type'
import { xAddressToClassicAddress, isValidXAddress } from 'ripple-address-codec'
import { xAddressToClassicAddress, isValidXAddress } from 'xahau-address-codec'
import { BinaryParser } from '../serdes/binary-parser'
import { BinarySerializer, BytesList } from '../serdes/binary-serializer'

View File

@@ -1,5 +1,6 @@
import fixtures from './fixtures/codec-fixtures.json'
import { decode, encode, decodeLedgerData } from '../src'
// import { decode, encode, decodeLedgerData } from '../src'
import { decode, encode } from '../src'
function json(object) {
return JSON.stringify(object)
@@ -30,16 +31,17 @@ describe('ripple-binary-codec', function () {
makeSuite('transactions', fixtures.transactions)
makeSuite('accountState', fixtures.accountState)
describe('ledgerData', function () {
if (fixtures.ledgerData) {
fixtures.ledgerData.forEach((t, testN) => {
it(`ledgerData[${testN}] can decode ${t.binary} to ${json(
t.json,
)}`, () => {
const decoded = decodeLedgerData(t.binary)
expect(t.json).toEqual(decoded)
})
})
}
})
// describe('ledgerData', function () {
// console.log(fixtures)
// if (fixtures.ledgerData) {
// fixtures.ledgerData.forEach((t, testN) => {
// it(`ledgerData[${testN}] can decode ${t.binary} to ${json(
// t.json,
// )}`, () => {
// const decoded = decodeLedgerData(t.binary)
// expect(t.json).toEqual(decoded)
// })
// })
// }
// })
})

View File

@@ -2,7 +2,7 @@ import { hexOnly } from './utils'
import { coreTypes, Amount, Hash160 } from '../src/types'
import BigNumber from 'bignumber.js'
import { encodeAccountID } from 'ripple-address-codec'
import { encodeAccountID } from 'xahau-address-codec'
import { Field, TransactionType } from '../src/enums'
import { makeParser, readJSON } from '../src/binary'
import { BytesList } from '../src/serdes/binary-serializer'
@@ -387,7 +387,7 @@ function pathSetBinaryTests() {
currency: 'BTC',
issuer: 'r3AWbdp2jQLXLywJypdoNwVSvr81xs3uhn',
},
{ currency: 'XRP' },
{ currency: 'XAH' },
{
currency: 'USD',
issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',

View File

@@ -4449,469 +4449,6 @@
"Flags": 0,
"Sequence": 62
}
},
{
"binary": "1200302200000000240000000168400000000000000A601D40000000000003E8601E400000000000271073210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020744630440220101BCA4B5B5A37C6F44480F9A34752C9AA8B2CDF5AD47E3CB424DEDC21C06DB702206EEB257E82A89B1F46A0A2C7F070B0BD181D980FF86FE4269E369F6FC7A270918114B5F762798A53D543A014CAF8B297CFF8F2F937E8011914AF80285F637EE4AF3C20378F9DFB12511ACB8D27000000000000000000000000000000000000000014550FC62003E785DC231A1058A05E56E3F09CF4E60000000000000000000000000000000000000000",
"json": {
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"XChainBridge": {
"LockingChainDoor": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"LockingChainIssue": {"currency": "XRP"},
"IssuingChainDoor": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"IssuingChainIssue": {"currency": "XRP"}
},
"Fee": "10",
"Flags": 0,
"MinAccountCreateAmount": "10000",
"Sequence": 1,
"SignatureReward": "1000",
"SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
"TransactionType": "XChainCreateBridge",
"TxnSignature": "30440220101BCA4B5B5A37C6F44480F9A34752C9AA8B2CDF5AD47E3CB424DEDC21C06DB702206EEB257E82A89B1F46A0A2C7F070B0BD181D980FF86FE4269E369F6FC7A27091"
}
},
{
"binary": "12002F2200000000240000000168400000000000000A601D40000000000003E8601E400000000000271073210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02074473045022100D2CABC1B0E0635A8EE2E6554F6D474C49BC292C995C5C9F83179F4A60634B04C02205D1DB569D9593136F2FBEA7140010C8F46794D653AFDBEA8D30B8750BA4805E58114B5F762798A53D543A014CAF8B297CFF8F2F937E8011914AF80285F637EE4AF3C20378F9DFB12511ACB8D27000000000000000000000000000000000000000014550FC62003E785DC231A1058A05E56E3F09CF4E60000000000000000000000000000000000000000",
"json": {
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"XChainBridge": {
"LockingChainDoor": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"LockingChainIssue": {"currency": "XRP"},
"IssuingChainDoor": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"IssuingChainIssue": {"currency": "XRP"}
},
"Fee": "10",
"Flags": 0,
"MinAccountCreateAmount": "10000",
"Sequence": 1,
"SignatureReward": "1000",
"SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
"TransactionType": "XChainModifyBridge",
"TxnSignature": "3045022100D2CABC1B0E0635A8EE2E6554F6D474C49BC292C995C5C9F83179F4A60634B04C02205D1DB569D9593136F2FBEA7140010C8F46794D653AFDBEA8D30B8750BA4805E5"
}
},
{
"binary": "1200292280000000240000000168400000000000000A601D400000000000271073210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020744630440220247B20A1B9C48E21A374CB9B3E1FE2A7C528151868DF8D307E9FBE15237E531A02207C20C092DDCC525E583EF4AB7CB91E862A6DED19426997D3F0A2C84E2BE8C5DD8114B5F762798A53D543A014CAF8B297CFF8F2F937E8801214AF80285F637EE4AF3C20378F9DFB12511ACB8D27011914AF80285F637EE4AF3C20378F9DFB12511ACB8D27000000000000000000000000000000000000000014550FC62003E785DC231A1058A05E56E3F09CF4E60000000000000000000000000000000000000000",
"json": {
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"XChainBridge": {
"LockingChainDoor": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"LockingChainIssue": {"currency": "XRP"},
"IssuingChainDoor": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"IssuingChainIssue": {"currency": "XRP"}
},
"Fee": "10",
"Flags": 2147483648,
"OtherChainSource": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"Sequence": 1,
"SignatureReward": "10000",
"SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
"TransactionType": "XChainCreateClaimID",
"TxnSignature": "30440220247B20A1B9C48E21A374CB9B3E1FE2A7C528151868DF8D307E9FBE15237E531A02207C20C092DDCC525E583EF4AB7CB91E862A6DED19426997D3F0A2C84E2BE8C5DD"
}
},
{
"binary": "12002A228000000024000000013014000000000000000161400000000000271068400000000000000A73210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02074453043021F177323F0D93612C82A4393A99B23905A7E675753FD80C52997AFAB13F5F9D002203BFFAF457E90BDA65AABE8F8762BD96162FAD98A0C030CCD69B06EE9B12BBFFE8114B5F762798A53D543A014CAF8B297CFF8F2F937E8011914AF80285F637EE4AF3C20378F9DFB12511ACB8D27000000000000000000000000000000000000000014550FC62003E785DC231A1058A05E56E3F09CF4E60000000000000000000000000000000000000000",
"json": {
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"Amount": "10000",
"XChainBridge": {
"LockingChainDoor": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"LockingChainIssue": {"currency": "XRP"},
"IssuingChainDoor": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"IssuingChainIssue": {"currency": "XRP"}
},
"Fee": "10",
"Flags": 2147483648,
"Sequence": 1,
"SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
"TransactionType": "XChainCommit",
"TxnSignature": "3043021F177323F0D93612C82A4393A99B23905A7E675753FD80C52997AFAB13F5F9D002203BFFAF457E90BDA65AABE8F8762BD96162FAD98A0C030CCD69B06EE9B12BBFFE",
"XChainClaimID": "0000000000000001"
}
},
{
"binary": "12002B228000000024000000013014000000000000000161400000000000271068400000000000000A73210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020744630440220445F7469FDA401787D9EE8A9B6E24DFF81E94F4C09FD311D2C0A58FCC02C684A022029E2EF34A5EA35F50D5BB57AC6320AD3AE12C13C8D1379B255A486D72CED142E8114B5F762798A53D543A014CAF8B297CFF8F2F937E88314550FC62003E785DC231A1058A05E56E3F09CF4E6011914AF80285F637EE4AF3C20378F9DFB12511ACB8D27000000000000000000000000000000000000000014550FC62003E785DC231A1058A05E56E3F09CF4E60000000000000000000000000000000000000000",
"json": {
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"Amount": "10000",
"XChainBridge": {
"LockingChainDoor": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"LockingChainIssue": {"currency": "XRP"},
"IssuingChainDoor": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"IssuingChainIssue": {"currency": "XRP"}
},
"Destination": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 1,
"SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
"TransactionType": "XChainClaim",
"TxnSignature": "30440220445F7469FDA401787D9EE8A9B6E24DFF81E94F4C09FD311D2C0A58FCC02C684A022029E2EF34A5EA35F50D5BB57AC6320AD3AE12C13C8D1379B255A486D72CED142E",
"XChainClaimID": "0000000000000001"
}
},
{
"binary": "12002C228000000024000000016140000000000F424068400000000000000A601D400000000000271073210330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD0207446304402202984DDE7F0B566F081F7953D7212BF031ACBF8860FE114102E9512C4C8768C77022070113F4630B1DC3045E4A98DDD648CEBC31B12774F7B44A1B8123CD2C9F5CF188114B5F762798A53D543A014CAF8B297CFF8F2F937E88314AF80285F637EE4AF3C20378F9DFB12511ACB8D27011914AF80285F637EE4AF3C20378F9DFB12511ACB8D27000000000000000000000000000000000000000014550FC62003E785DC231A1058A05E56E3F09CF4E60000000000000000000000000000000000000000",
"json": {
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"XChainBridge": {
"LockingChainDoor": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"LockingChainIssue": {"currency": "XRP"},
"IssuingChainDoor": "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
"IssuingChainIssue": {"currency": "XRP"}
},
"Amount": "1000000",
"Fee": "10",
"Flags": 2147483648,
"Destination": "rGzx83BVoqTYbGn7tiVAnFw7cbxjin13jL",
"Sequence": 1,
"SignatureReward": "10000",
"SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
"TransactionType": "XChainAccountCreateCommit",
"TxnSignature": "304402202984DDE7F0B566F081F7953D7212BF031ACBF8860FE114102E9512C4C8768C77022070113F4630B1DC3045E4A98DDD648CEBC31B12774F7B44A1B8123CD2C9F5CF18"
}
},
{
"binary": "12002E2400000005201B0000000D30150000000000000006614000000000989680684000000000000014601D40000000000000647121ED1F4A024ACFEBDB6C7AA88DEDE3364E060487EA31B14CC9E0D610D152B31AADC27321EDF54108BA2E0A0D3DC2AE3897F8BE0EFE776AE8D0F9FB0D0B9D64233084A8DDD1744003E74AEF1F585F156786429D2FC87A89E5C6B5A56D68BFC9A6A329F3AC67CBF2B6958283C663A4522278CA162C69B23CF75149AF022B410EA0508C16F42058007640EEFCFA3DC2AB4AB7C4D2EBBC168CB621A11B82BABD86534DFC8EFA72439A49662D744073CD848E7A587A95B35162CDF9A69BB237E72C9537A987F5B8C394F30D81145E7A3E3D7200A794FA801C66CE3775B6416EE4128314C15F113E49BCC4B9FFF43CD0366C23ACD82F75638012143FD9ED9A79DEA67CB5D585111FEF0A29203FA0408014145E7A3E3D7200A794FA801C66CE3775B6416EE4128015145E7A3E3D7200A794FA801C66CE3775B6416EE4120010130101191486F0B1126CE1205E59FDFDD2661A9FB7505CA70F000000000000000000000000000000000000000014B5F762798A53D543A014CAF8B297CFF8F2F937E80000000000000000000000000000000000000000",
"json": {
"Account": "r9cYxdjQsoXAEz3qQJc961SNLaXRkWXCvT",
"Amount": "10000000",
"AttestationRewardAccount": "r9cYxdjQsoXAEz3qQJc961SNLaXRkWXCvT",
"AttestationSignerAccount": "r9cYxdjQsoXAEz3qQJc961SNLaXRkWXCvT",
"Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi",
"Fee": "20",
"LastLedgerSequence": 13,
"OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym",
"PublicKey": "ED1F4A024ACFEBDB6C7AA88DEDE3364E060487EA31B14CC9E0D610D152B31AADC2",
"Sequence": 5,
"Signature": "EEFCFA3DC2AB4AB7C4D2EBBC168CB621A11B82BABD86534DFC8EFA72439A49662D744073CD848E7A587A95B35162CDF9A69BB237E72C9537A987F5B8C394F30D",
"SignatureReward": "100",
"SigningPubKey": "EDF54108BA2E0A0D3DC2AE3897F8BE0EFE776AE8D0F9FB0D0B9D64233084A8DDD1",
"TransactionType": "XChainAddAccountCreateAttestation",
"TxnSignature": "03E74AEF1F585F156786429D2FC87A89E5C6B5A56D68BFC9A6A329F3AC67CBF2B6958283C663A4522278CA162C69B23CF75149AF022B410EA0508C16F4205800",
"WasLockingChainSend": 1,
"XChainAccountCreateCount": "0000000000000006",
"XChainBridge": {
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"IssuingChainIssue": {
"currency": "XRP"
},
"LockingChainDoor": "rDJVtEuDKr4rj1B3qtW7R5TVWdXV2DY7Qg",
"LockingChainIssue": {
"currency": "XRP"
}
}
}
},
{
"binary": "12002D2400000009201B00000013301400000000000000016140000000009896806840000000000000147121ED7541DEC700470F54276C90C333A13CDBB5D341FD43C60CEA12170F6D6D4E11367321ED0406B134786FE0751717226657F7BF8AFE96442C05D28ACEC66FB64852BA604C7440D0423649E48A44F181262CF5FC08A68E7FA5CD9E55843E4F09014B76E602574741E8553383A4B43CABD194BB96713647FC0B885BE248E4FFA068FA3E6994CF0476407C175050B08000AD35EEB2D87E16CD3F95A0AEEBF2A049474275153D9D4DD44528FE99AA50E71660A15B0B768E1B90E609BBD5DC7AFAFD45D9705D72D40EA10C81141F30A4D728AB98B0950EC3B9815E6C8D43A7D5598314C15F113E49BCC4B9FFF43CD0366C23ACD82F75638012143FD9ED9A79DEA67CB5D585111FEF0A29203FA0408014141F30A4D728AB98B0950EC3B9815E6C8D43A7D5598015141F30A4D728AB98B0950EC3B9815E6C8D43A7D5590010130101191486F0B1126CE1205E59FDFDD2661A9FB7505CA70F000000000000000000000000000000000000000014B5F762798A53D543A014CAF8B297CFF8F2F937E80000000000000000000000000000000000000000",
"json": {
"Account": "rsqvD8WFFEBBv4nztpoW9YYXJ7eRzLrtc3",
"Amount": "10000000",
"AttestationRewardAccount": "rsqvD8WFFEBBv4nztpoW9YYXJ7eRzLrtc3",
"AttestationSignerAccount": "rsqvD8WFFEBBv4nztpoW9YYXJ7eRzLrtc3",
"Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi",
"Fee": "20",
"LastLedgerSequence": 19,
"OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym",
"PublicKey": "ED7541DEC700470F54276C90C333A13CDBB5D341FD43C60CEA12170F6D6D4E1136",
"Sequence": 9,
"Signature": "7C175050B08000AD35EEB2D87E16CD3F95A0AEEBF2A049474275153D9D4DD44528FE99AA50E71660A15B0B768E1B90E609BBD5DC7AFAFD45D9705D72D40EA10C",
"SigningPubKey": "ED0406B134786FE0751717226657F7BF8AFE96442C05D28ACEC66FB64852BA604C",
"TransactionType": "XChainAddClaimAttestation",
"TxnSignature": "D0423649E48A44F181262CF5FC08A68E7FA5CD9E55843E4F09014B76E602574741E8553383A4B43CABD194BB96713647FC0B885BE248E4FFA068FA3E6994CF04",
"WasLockingChainSend": 1,
"XChainBridge": {
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"IssuingChainIssue": {
"currency": "XRP"
},
"LockingChainDoor": "rDJVtEuDKr4rj1B3qtW7R5TVWdXV2DY7Qg",
"LockingChainIssue": {
"currency": "XRP"
}
},
"XChainClaimID": "0000000000000001"
}
},
{
"binary": "12002315000A2200000000240015DAE161400000000000271068400000000000000A6BD5838D7EA4C680000000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C7321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440B3154D968314FCEB58001E1B0C3A4CFB33DF9FF6C73207E5EAEB9BD07E2747672168E1A2786D950495C38BD8DEE3391BF45F3008DD36F4B12E7C07D82CA5250E8114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMCreate",
"TxnSignature": "B3154D968314FCEB58001E1B0C3A4CFB33DF9FF6C73207E5EAEB9BD07E2747672168E1A2786D950495C38BD8DEE3391BF45F3008DD36F4B12E7C07D82CA5250E",
"Amount": "10000",
"Amount2": {
"currency": "ETH",
"issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9",
"value": "10000"
},
"TradingFee": 10,
"Fee": "10",
"Flags": 0,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8"
}
},
{
"binary": "1200242200010000240015DAE168400000000000000A6019D5438D7EA4C68000B3813FCAB4EE68B3D0D735D6849465A9113EE048B3813FCAB4EE68B3D0D735D6849465A9113EE0487321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B874408073C588E7EF672DD171E414638D9AF8DBE9A1359E030DE3E1C9AA6A38A2CE9E138CB56482BB844F7228D48B1E4AD7D09BB7E9F639C115958EEEA374749CA00B8114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMDeposit",
"TxnSignature": "8073C588E7EF672DD171E414638D9AF8DBE9A1359E030DE3E1C9AA6A38A2CE9E138CB56482BB844F7228D48B1E4AD7D09BB7E9F639C115958EEEA374749CA00B",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"LPTokenOut": {"currency": "B3813FCAB4EE68B3D0D735D6849465A9113EE048", "issuer": "rH438jEAzTs5PYtV6CHZqpDpwCKQmPW9Cg", "value": "1000"},
"Fee": "10",
"Flags": 65536,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8"
}
},
{
"binary": "1200242200080000240015DAE16140000000000003E868400000000000000A7321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8744096CA066F42871C55088D2758D64148921B1ACAA5C6C648D0F7D675BBF47F87DF711F17C5BD172666D5AEC257520C587A849A6E063345609D91E121A78816EB048114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMDeposit",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"Fee": "10",
"Flags": 524288,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "96CA066F42871C55088D2758D64148921B1ACAA5C6C648D0F7D675BBF47F87DF711F17C5BD172666D5AEC257520C587A849A6E063345609D91E121A78816EB04"
}
},
{
"binary": "1200242200100000240015DAE16140000000000003E868400000000000000A6BD511C37937E080000000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C7321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440FC22B16A098C236ED7EDB3EBC983026DFD218A03C8BAA848F3E1D5389D5B8B00473C1178C5BA257BFA2DCD433C414690A430A5CFD71C1C0A7F7BF725EC1759018114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMDeposit",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"Amount2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9", "value": "500"},
"Fee": "10",
"Flags": 1048576,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "FC22B16A098C236ED7EDB3EBC983026DFD218A03C8BAA848F3E1D5389D5B8B00473C1178C5BA257BFA2DCD433C414690A430A5CFD71C1C0A7F7BF725EC175901"
}
},
{
"binary": "1200242200200000240015DAE16140000000000003E868400000000000000A6019D5438D7EA4C68000B3813FCAB4EE68B3D0D735D6849465A9113EE048B3813FCAB4EE68B3D0D735D6849465A9113EE0487321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440117CF90F9B113AD3BD638B6DB63562B37C287D5180F278B3CCF58FC14A5BAEE98307EA0F6DFE19E2FBA887C92955BA5D1A04F92ADAAEB309DE89C3610D074C098114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMDeposit",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"LPTokenOut": {"currency": "B3813FCAB4EE68B3D0D735D6849465A9113EE048", "issuer": "rH438jEAzTs5PYtV6CHZqpDpwCKQmPW9Cg", "value": "1000"},
"Fee": "10",
"Flags": 2097152,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "117CF90F9B113AD3BD638B6DB63562B37C287D5180F278B3CCF58FC14A5BAEE98307EA0F6DFE19E2FBA887C92955BA5D1A04F92ADAAEB309DE89C3610D074C09"
}
},
{
"binary": "1200242200400000240015DAE16140000000000003E868400000000000000A601B40000000000000197321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B874405E51EBC6B52A7C3BA5D0AE2FC8F62E779B80182009B3108A87AB6D770D68F56053C193DB0640128E4765565970625B1E2878E116AC854E6DED412202CCDE0B0D8114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMDeposit",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"EPrice": "25",
"Fee": "10",
"Flags": 4194304,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "5E51EBC6B52A7C3BA5D0AE2FC8F62E779B80182009B3108A87AB6D770D68F56053C193DB0640128E4765565970625B1E2878E116AC854E6DED412202CCDE0B0D"
}
},
{
"binary": "1200252200010000240015DAE168400000000000000A601AD5438D7EA4C68000B3813FCAB4EE68B3D0D735D6849465A9113EE048B3813FCAB4EE68B3D0D735D6849465A9113EE0487321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B874409D4F41FC452526C0AD17191959D9B6D04A3C73B3A6C29E0F34C8459675A83A7A7D6E3021390EC8C9BE6C93E11C167E12016465E523F64F9EB3194B0A52E418028114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMWithdraw",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"LPTokenIn": {"currency": "B3813FCAB4EE68B3D0D735D6849465A9113EE048", "issuer": "rH438jEAzTs5PYtV6CHZqpDpwCKQmPW9Cg", "value": "1000"},
"Fee": "10",
"Flags": 65536,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "9D4F41FC452526C0AD17191959D9B6D04A3C73B3A6C29E0F34C8459675A83A7A7D6E3021390EC8C9BE6C93E11C167E12016465E523F64F9EB3194B0A52E41802"
}
},
{
"binary": "1200252200080000240015DAE16140000000000003E868400000000000000A7321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440E2C60D56C337D6D73E4B7D53579C93C666605494E82A89DD58CFDE79E2A4866BCF52370A2146877A2EF748E98168373710001133A51B645D89491849079035018114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMWithdraw",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"Fee": "10",
"Flags": 524288,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "E2C60D56C337D6D73E4B7D53579C93C666605494E82A89DD58CFDE79E2A4866BCF52370A2146877A2EF748E98168373710001133A51B645D8949184907903501"
}
},
{
"binary": "1200252200100000240015DAE16140000000000003E868400000000000000A6BD511C37937E080000000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C7321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440D2FCD7D03E53358BC6188BA88A7BA4FF2519B639C3B5C0EBCBDCB704426CA2837111430E92A6003D1CD0D81C63682C74839320539EC4F89B82AA5607714952028114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMWithdraw",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"Amount2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9", "value": "500"},
"Fee": "10",
"Flags": 1048576,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "D2FCD7D03E53358BC6188BA88A7BA4FF2519B639C3B5C0EBCBDCB704426CA2837111430E92A6003D1CD0D81C63682C74839320539EC4F89B82AA560771495202"
}
},
{
"binary": "1200252200200000240015DAE16140000000000003E868400000000000000A601AD5438D7EA4C68000B3813FCAB4EE68B3D0D735D6849465A9113EE048B3813FCAB4EE68B3D0D735D6849465A9113EE0487321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8744042DA5620E924E2D2059BBB4E0C4F03244140ACED93B543136FEEDF802165F814D09F45C7E2A4618468442516F4712A23B1D3332D5DBDBAE830337F39F259C90F8114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMWithdraw",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"LPTokenIn": {"currency": "B3813FCAB4EE68B3D0D735D6849465A9113EE048", "issuer": "rH438jEAzTs5PYtV6CHZqpDpwCKQmPW9Cg", "value": "1000"},
"Fee": "10",
"Flags": 2097152,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "42DA5620E924E2D2059BBB4E0C4F03244140ACED93B543136FEEDF802165F814D09F45C7E2A4618468442516F4712A23B1D3332D5DBDBAE830337F39F259C90F"
}
},
{
"binary": "1200252200400000240015DAE16140000000000003E868400000000000000A601B40000000000000197321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8744045BCEE5A12E5F5F1FB085A24F2F7FD962BBCB0D89A44A5319E3F7E3799E1870341880B6F684132971DDDF2E6B15356B3F407962D6D4E8DE10989F3B16E3CB90D8114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMWithdraw",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"Amount": "1000",
"EPrice": "25",
"Fee": "10",
"Flags": 4194304,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "45BCEE5A12E5F5F1FB085A24F2F7FD962BBCB0D89A44A5319E3F7E3799E1870341880B6F684132971DDDF2E6B15356B3F407962D6D4E8DE10989F3B16E3CB90D"
}
},
{
"binary": "1200272200000000240015DAE168400000000000000A6CD4C8E1BC9BF04000B3813FCAB4EE68B3D0D735D6849465A9113EE048B3813FCAB4EE68B3D0D735D6849465A9113EE0486DD4CC6F3B40B6C000B3813FCAB4EE68B3D0D735D6849465A9113EE048B3813FCAB4EE68B3D0D735D6849465A9113EE0487321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440F8EAAFB5EC1A69275167589969F0B9764BACE6BC8CC81482C2FC5ACCE691EDBD0D88D141137B1253BB1B9AC90A8A52CB37F5B6F7E1028B06DD06F91BE06F5A0F8114F92F27CC5EE2F2760278FE096D0CBE32BDD3653AF019E01B81149A91957F8F16BC57F3F200CD8C98375BF1791586E1F10318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMBid",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"AuthAccounts": [{"AuthAccount": {"Account": "rEaHTti4HZsMBpxTAF4ncWxkcdqDh1h6P7"}}],
"BidMax": {"currency": "B3813FCAB4EE68B3D0D735D6849465A9113EE048", "issuer": "rH438jEAzTs5PYtV6CHZqpDpwCKQmPW9Cg", "value": "35"},
"BidMin": {"currency": "B3813FCAB4EE68B3D0D735D6849465A9113EE048", "issuer": "rH438jEAzTs5PYtV6CHZqpDpwCKQmPW9Cg", "value": "25"},
"Fee": "10",
"Flags": 0,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "F8EAAFB5EC1A69275167589969F0B9764BACE6BC8CC81482C2FC5ACCE691EDBD0D88D141137B1253BB1B9AC90A8A52CB37F5B6F7E1028B06DD06F91BE06F5A0F"
}
},
{
"binary": "1200261500EA2200000000240015DAE168400000000000000A7321ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B87440BC2F6E76969E3747E9BDE183C97573B086212F09D5387460E6EE2F32953E85EAEB9618FBBEF077276E30E59D619FCF7C7BDCDDDD9EB94D7CE1DD5CE9246B21078114F92F27CC5EE2F2760278FE096D0CBE32BDD3653A0318000000000000000000000000000000000000000004180000000000000000000000004554480000000000FBEF9A3A2B814E807745FA3D9C32FFD155FA2E8C",
"json": {
"Account": "rP5ZkB5RZQaECsSVR4DeSFK4fAw52BYtbw",
"TransactionType": "AMMVote",
"Asset": {"currency": "XRP"},
"Asset2": {"currency": "ETH", "issuer": "rPyfep3gcLzkosKC9XiE77Y8DZWG6iWDT9"},
"TradingFee": 234,
"Fee": "10",
"Flags": 0,
"Sequence": 1432289,
"SigningPubKey": "ED7453D2572A2104E7B266A45888C53F503CEB1F11DC4BB3710EB2995238EC65B8",
"TxnSignature": "BC2F6E76969E3747E9BDE183C97573B086212F09D5387460E6EE2F32953E85EAEB9618FBBEF077276E30E59D619FCF7C7BDCDDDD9EB94D7CE1DD5CE9246B2107"
}
},
{
"binary": "1200322280000000240000000468400000000000000A7321ED9861C4CB029C0DA737B823D7D3459A70F227958D5C0C111CC7CF947FC5A93347744071E28B12465A1B47162C22E121DF61089DCD9AAF5773704B76179E771666886C8AAD5A33A87E34CC381A7D924E3FE3645F0BF98D565DE42C81E1A7A7E7981802811401476926B590BA3245F63C829116A0A3AF7F382D",
"json": {
"Account": "rfmDuhDyLGgx94qiwf3YF8BUV5j6KSvE8",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 4,
"SigningPubKey": "ED9861C4CB029C0DA737B823D7D3459A70F227958D5C0C111CC7CF947FC5A93347",
"TransactionType": "DIDDelete",
"TxnSignature": "71E28B12465A1B47162C22E121DF61089DCD9AAF5773704B76179E771666886C8AAD5A33A87E34CC381A7D924E3FE3645F0BF98D565DE42C81E1A7A7E7981802"
}
},
{
"binary": "1200312280000000240000000368400000000000000A7321ED9861C4CB029C0DA737B823D7D3459A70F227958D5C0C111CC7CF947FC5A933477440AACD31A04CAE14670FC483A1382F393AA96B49C84479B58067F049FBD772999325667A6AA2520A63756EE84F3657298815019DD56A1AECE796B08535C4009C08750B6469645F6578616D706C65701A03646F63701B06617474657374811401476926B590BA3245F63C829116A0A3AF7F382D",
"json": {
"Account": "rfmDuhDyLGgx94qiwf3YF8BUV5j6KSvE8",
"Data": "617474657374",
"DIDDocument": "646F63",
"Fee": "10",
"Flags": 2147483648,
"Sequence": 3,
"SigningPubKey": "ED9861C4CB029C0DA737B823D7D3459A70F227958D5C0C111CC7CF947FC5A93347",
"TransactionType": "DIDSet",
"TxnSignature": "AACD31A04CAE14670FC483A1382F393AA96B49C84479B58067F049FBD772999325667A6AA2520A63756EE84F3657298815019DD56A1AECE796B08535C4009C08",
"URI": "6469645F6578616D706C65"
}
},
{
"binary": "1200332FFFFFFFFF2033000004D2750B6469645F6578616D706C65701C0863757272656E6379701D0870726F7669646572811401476926B590BA3245F63C829116A0A3AF7F382DF018E020301700000000000001E2041003011A0000000000000000000000000000000000000000021A0000000000000000000000005553440000000000E1F1",
"json": {
"TransactionType": "OracleSet",
"Account": "rfmDuhDyLGgx94qiwf3YF8BUV5j6KSvE8",
"OracleDocumentID": 1234,
"LastUpdateTime": 4294967295,
"PriceDataSeries": [
{
"PriceData": {
"BaseAsset": "XRP",
"QuoteAsset": "USD",
"AssetPrice": "00000000000001E2",
"Scale": 3
}
}
],
"Provider": "70726F7669646572",
"URI": "6469645F6578616D706C65",
"AssetClass": "63757272656E6379"
}
},
{
"binary": "1200342033000004D2811401476926B590BA3245F63C829116A0A3AF7F382D",
"json": {
"TransactionType": "OracleDelete",
"Account": "rfmDuhDyLGgx94qiwf3YF8BUV5j6KSvE8",
"OracleDocumentID": 1234
}
}
],
"ledgerData": [{
"binary": "01E91435016340767BF1C4A3EACEB081770D8ADE216C85445DD6FB002C6B5A2930F2DECE006DA18150CB18F6DD33F6F0990754C962A7CCE62F332FF9C13939B03B864117F0BDA86B6E9B4F873B5C3E520634D343EF5D9D9A4246643D64DAD278BA95DC0EAC6EB5350CF970D521276CDE21276CE60A00",
"json": {
"account_hash": "3B5C3E520634D343EF5D9D9A4246643D64DAD278BA95DC0EAC6EB5350CF970D5",
"close_flags": 0,
"close_time": 556231910,
"close_time_resolution": 10,
"ledger_index": 32052277,
"parent_close_time": 556231902,
"parent_hash": "EACEB081770D8ADE216C85445DD6FB002C6B5A2930F2DECE006DA18150CB18F6",
"total_coins": "99994494362043555",
"transaction_hash": "DD33F6F0990754C962A7CCE62F332FF9C13939B03B864117F0BDA86B6E9B4F87"
}
}]
]
}

Some files were not shown because too many files have changed in this diff Show More