mirror of
https://github.com/Xahau/xahau.js.git
synced 2026-06-07 10:46:49 +00:00
Compare commits
24 Commits
xahau@4.0.
...
xahau@4.0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4918e914c5 | ||
|
|
7552ae8635 | ||
|
|
fd100f6e92 | ||
|
|
587a75403a | ||
|
|
9444693967 | ||
|
|
1de9e4e35b | ||
|
|
fd43b82827 | ||
|
|
b310c6c25a | ||
|
|
a8939c883b | ||
|
|
05e8c2dbda | ||
|
|
e838caaffc | ||
|
|
b9fb8a1924 | ||
|
|
de97ef13e9 | ||
|
|
c1aed4ef48 | ||
|
|
35c294218d | ||
|
|
58150f156e | ||
|
|
d7b3a02ad2 | ||
|
|
ac33a1584d | ||
|
|
8bbc84057c | ||
|
|
0ca36e1314 | ||
|
|
e454c61994 | ||
|
|
b5f15ac075 | ||
|
|
5ec5ad8e1e | ||
|
|
043620b637 |
8
.ci-config/validators.txt
Normal file
8
.ci-config/validators.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
[validator_list_sites]
|
||||
http://vl/vl.json
|
||||
|
||||
[validator_list_keys]
|
||||
ED87E0EA91AAFFA130B78B75D2CC3E53202AA1BD8AB3D5E7BAC530C8440E328501
|
||||
|
||||
[import_vl_keys]
|
||||
ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1
|
||||
@@ -63,11 +63,6 @@ online_delete=256
|
||||
[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
|
||||
@@ -167,6 +162,8 @@ fixXahauV1
|
||||
fixXahauV2
|
||||
fixXahauV3
|
||||
PaychanAndEscrowForTokens
|
||||
DeepFreeze
|
||||
Clawback
|
||||
|
||||
[network_id]
|
||||
21337
|
||||
|
||||
67
.github/workflows/nodejs.yml
vendored
67
.github/workflows/nodejs.yml
vendored
@@ -4,7 +4,7 @@
|
||||
name: Node.js CI
|
||||
|
||||
env:
|
||||
XAHAUD_DOCKER_IMAGE: xahauci/xahaud:2025.2.6
|
||||
XAHAUD_VERSION: 2025.12.1-release+2609
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
node-version: [20.x, 22.x, 24.x, 26.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -60,7 +60,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x, 20.x]
|
||||
node-version: [20.x, 22.x, 24.x, 26.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -95,20 +95,55 @@ jobs:
|
||||
- run: npm run build
|
||||
- run: npm test
|
||||
|
||||
download-binary:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- name: cache binary
|
||||
id: cache-binary
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: xahaud
|
||||
key: ${{ runner.os }}-xahaud-${{ env.XAHAUD_VERSION }}
|
||||
|
||||
- name: Download binary
|
||||
if: steps.cache-binary.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
wget https://build.xahau.tech/${{ env.XAHAUD_VERSION }} -q -O xahaud
|
||||
chmod +x xahaud
|
||||
|
||||
integration:
|
||||
runs-on: ubuntu-latest
|
||||
needs: download-binary
|
||||
timeout-minutes: 10
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x, 20.x]
|
||||
node-version: [20.x, 22.x, 24.x, 26.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Restore binary
|
||||
uses: actions/cache/restore@v5
|
||||
with:
|
||||
path: xahaud
|
||||
key: ${{ runner.os }}-xahaud-${{ env.XAHAUD_VERSION }}
|
||||
|
||||
- name: Run docker in background
|
||||
run: |
|
||||
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
|
||||
docker run --detach --rm \
|
||||
--name xahaud-service \
|
||||
-p 6006:6006 \
|
||||
--volume "${{ github.workspace }}/.ci-config/":"/opt/xahau/etc/" \
|
||||
--volume "${{ github.workspace }}/xahaud":"/opt/xahau/bin/xahaud" \
|
||||
--health-cmd="wget localhost:6006 || exit 1" \
|
||||
--health-interval=5s \
|
||||
--health-retries=10 \
|
||||
--health-timeout=2s \
|
||||
--env GITHUB_ACTIONS=true \
|
||||
--env CI=true \
|
||||
ubuntu:latest /opt/xahau/bin/xahaud -a --conf /opt/xahau/etc/xahaud.cfg
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
@@ -149,11 +184,12 @@ jobs:
|
||||
|
||||
browser:
|
||||
runs-on: ubuntu-latest
|
||||
needs: download-binary
|
||||
timeout-minutes: 10
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
node-version: [20.x, 22.x, 24.x, 26.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -163,9 +199,26 @@ jobs:
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Restore binary
|
||||
uses: actions/cache/restore@v5
|
||||
with:
|
||||
path: xahaud
|
||||
key: ${{ runner.os }}-xahaud-${{ env.XAHAUD_VERSION }}
|
||||
|
||||
- name: Run docker in background
|
||||
run: |
|
||||
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
|
||||
docker run --detach --rm \
|
||||
--name xahaud-service \
|
||||
-p 6006:6006 \
|
||||
--volume "${{ github.workspace }}/.ci-config/":"/opt/xahau/etc/" \
|
||||
--volume "${{ github.workspace }}/xahaud":"/opt/xahau/bin/xahaud" \
|
||||
--health-cmd="wget localhost:6006 || exit 1" \
|
||||
--health-interval=5s \
|
||||
--health-retries=10 \
|
||||
--health-timeout=2s \
|
||||
--env GITHUB_ACTIONS=true \
|
||||
--env CI=true \
|
||||
ubuntu:latest /opt/xahau/bin/xahaud -a --conf /opt/xahau/etc/xahaud.cfg
|
||||
|
||||
- name: Setup npm version 9
|
||||
run: |
|
||||
|
||||
102
.github/workflows/npm-publish.yml
vendored
Normal file
102
.github/workflows/npm-publish.yml
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
name: Publish npm packages
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
concurrency:
|
||||
group: npm-publish-${{ github.event.release.tag_name }}
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: Publish ${{ github.event.release.tag_name }}
|
||||
runs-on: ubuntu-latest
|
||||
environment: npm
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
steps:
|
||||
- id: release
|
||||
name: Resolve package from tag
|
||||
shell: bash
|
||||
run: |
|
||||
case "$RELEASE_TAG" in
|
||||
xahau@*) package_path="packages/xahau" ;;
|
||||
xahau-address-codec@*) package_path="packages/xahau-address-codec" ;;
|
||||
xahau-binary-codec@*) package_path="packages/xahau-binary-codec" ;;
|
||||
xahau-keypairs@*) package_path="packages/xahau-keypairs" ;;
|
||||
*)
|
||||
echo "Unsupported release tag: $RELEASE_TAG" >&2
|
||||
echo "Expected xahau@<version>, xahau-address-codec@<version>, xahau-binary-codec@<version>, or xahau-keypairs@<version>." >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "package-path=$package_path" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ github.event.release.tag_name }}
|
||||
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "20"
|
||||
registry-url: https://registry.npmjs.org
|
||||
package-manager-cache: false
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Build package
|
||||
run: npm run build
|
||||
|
||||
- id: package
|
||||
name: Read package metadata
|
||||
shell: bash
|
||||
run: |
|
||||
package_json="${{ steps.release.outputs.package-path }}/package.json"
|
||||
name="$(jq -r .name "$package_json")"
|
||||
version="$(jq -r .version "$package_json")"
|
||||
tag="$name@$version"
|
||||
|
||||
{
|
||||
echo "name=$name"
|
||||
echo "version=$version"
|
||||
echo "tag=$tag"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Check release tag matches package version
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ "$RELEASE_TAG" != "$PACKAGE_TAG" ]]; then
|
||||
echo "Release tag $RELEASE_TAG does not match package tag $PACKAGE_TAG." >&2
|
||||
exit 1
|
||||
fi
|
||||
env:
|
||||
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
||||
PACKAGE_TAG: ${{ steps.package.outputs.tag }}
|
||||
|
||||
- name: Check package version is unpublished
|
||||
shell: bash
|
||||
run: |
|
||||
package_spec="${{ steps.package.outputs.tag }}"
|
||||
stderr_file="$(mktemp)"
|
||||
|
||||
if npm view "$package_spec" version --registry https://registry.npmjs.org 2>"$stderr_file"; then
|
||||
echo "$package_spec is already published." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if grep -Eq "E404|404 Not Found|is not in this registry" "$stderr_file"; then
|
||||
echo "$package_spec is not published yet."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
cat "$stderr_file" >&2
|
||||
exit 1
|
||||
|
||||
- name: Publish to npm
|
||||
run: npm publish --workspace "${{ steps.release.outputs.package-path }}" --registry https://registry.npmjs.org
|
||||
@@ -226,49 +226,51 @@ This should almost always be done using the [`xrpl-codec-gen`](https://github.co
|
||||
## Release
|
||||
|
||||
1. Checkout `main` (or your beta branch) and `git pull`.
|
||||
1. Create a new branch (`git checkout -b <BRANCH_NAME>`) to capture updates that take place during this process.
|
||||
1. Update `HISTORY.md` to reflect release changes.
|
||||
2. Create a new branch (`git checkout -b <BRANCH_NAME>`) to capture updates that take place during this process.
|
||||
3. Update `HISTORY.md` to reflect release changes.
|
||||
|
||||
- [ ] Update the version number and release date, and ensure it lists the changes since the previous release.
|
||||
|
||||
1. Run `npm run docgen` if the docs were modified in this release to update them (skip this step for a beta).
|
||||
1. Run `npm run build` to triple check the build still works
|
||||
1. Run `npx lerna version --no-git-tag-version` - This bumps the package versions.
|
||||
4. Run `npm run docgen` if the docs were modified in this release to update them (skip this step for a beta).
|
||||
5. Run `npm run clean` to delete previously generated artifacts.
|
||||
6. Run `npm run build` to triple check the build still works
|
||||
7. Run `npx lerna version --no-git-tag-version` - This bumps the package versions.
|
||||
|
||||
- For each changed package, pick what the new version should be. Lerna will bump the versions, commit version bumps to `main`, and create a new git tag for each published package.
|
||||
- If you do NOT want to update the package number, choose "Custom Version" and set the version to be the same as the existing version. Lerna will not publish any changes in this case.
|
||||
- If publishing a beta, make sure that the versions are all of the form `a.b.c-beta.d`, where `a`, `b`, and `c` are identical to the last normal release except for one, which has been incremented by 1.
|
||||
|
||||
1. Run `npm i` to update the package-lock with the updated versions.
|
||||
1. Create a new PR from this branch into `main` and merge it (you can directly merge into the beta branch for a beta).
|
||||
1. Checkout `main` and `git pull` (you can skip this step for a beta since you already have the latest version of the beta branch).
|
||||
1. Actually publish the packages with one of the following:
|
||||
8. Run `npm i` to update the package-lock with the updated versions.
|
||||
9. Create a new PR from this branch into `main` and merge it (you can directly merge into the beta branch for a beta).
|
||||
10. Checkout `main` and `git pull` (you can skip this step for a beta since you already have the latest version of the beta branch).
|
||||
11. Actually publish the packages with one of the following:
|
||||
|
||||
- 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 xahau@beta`
|
||||
- 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 xahau@beta`
|
||||
|
||||
1. If requested, enter your [npmjs.com](https://npmjs.com) OTP (one-time password) to complete publication.
|
||||
12. 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!
|
||||
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. `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.
|
||||
13. Run `git tag <tagname> -m <tagname>`, where `<tagname>` is the new package and version (e.g. `xahau@2.1.1`), for each version released.
|
||||
14. Run `git push --follow-tags`, to push the tags to Github.
|
||||
15. On GitHub, click the "Releases" link on the right-hand side of the page.
|
||||
|
||||
1. Repeat for each release:
|
||||
16. Repeat for each release:
|
||||
|
||||
1. Click "Draft a new release"
|
||||
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. Click "Draft a new release"
|
||||
2. Click "Choose a tag", and choose a tag that you just created.
|
||||
3. 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 [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:
|
||||
17. Send an email to [xahau-announce](https://groups.google.com/g/xahau-announce).
|
||||
18. 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
|
||||
2. A link to the more detailed changes
|
||||
3. Highlights of important changes
|
||||
|
||||
|
||||
<!--
|
||||
## Mailing Lists
|
||||
|
||||
We have a low-traffic mailing list for announcements of new `xahau.js` releases. (About 1 email every couple of weeks)
|
||||
@@ -278,3 +280,4 @@ We have a low-traffic mailing list for announcements of new `xahau.js` releases.
|
||||
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 xahau-server](https://groups.google.com/g/xahau-server)
|
||||
-->
|
||||
|
||||
@@ -86,6 +86,7 @@ As you develop with xahau.js, there's two sites you'll use extensively:
|
||||
- What kinds of transactions there are ([Transaction Types](https://docs.xahau.network/technical/protocol-reference/transactions/transaction-types))
|
||||
- Requests you can send ([Public API Methods](https://docs.xahau.network/features/http-websocket-apis))
|
||||
|
||||
<!--
|
||||
### Mailing Lists
|
||||
|
||||
If you want to hear when we release new versions of xahau.js, you can join our low-traffic mailing list (About 1 email per week):
|
||||
@@ -97,3 +98,4 @@ If you're using the Xahau Ledger in production, you should run a [xahaud server]
|
||||
- [Subscribe to xahau-server](https://groups.google.com/g/xahau-server)
|
||||
|
||||
You are also welcome to create an [issue](https://github.com/Xahau/xahau.js/issues) here and we'll do our best to respond within 3 days.
|
||||
-->
|
||||
|
||||
8
command.sh
Executable file
8
command.sh
Executable file
@@ -0,0 +1,8 @@
|
||||
for file in $(git log --diff-filter=D --name-only --format="" | grep -E "oracle.*\.ts$"); do
|
||||
commit=$(git rev-list -n 1 HEAD -- "$file")
|
||||
if [ ! -z "$commit" ]; then
|
||||
git checkout "$commit~1" -- "$file"
|
||||
echo "restore: $file"
|
||||
fi
|
||||
done
|
||||
rsync -av packages/xrpl/ packages/xahau/ && rm -rf packages/xrpl/
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"version": "independent",
|
||||
"useWorkspaces": true,
|
||||
"npmClient": "npm"
|
||||
}
|
||||
|
||||
7772
package-lock.json
generated
7772
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -16,10 +16,10 @@
|
||||
"dependencies": {
|
||||
"@xrplf/isomorphic": "file:packages/isomorphic",
|
||||
"@xrplf/secret-numbers": "file:packages/secret-numbers",
|
||||
"xahau": "file:packages/xahau",
|
||||
"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"
|
||||
"xahau-keypairs": "file:packages/xahau-keypairs"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.2.21",
|
||||
@@ -45,7 +45,7 @@
|
||||
"expect": "^29.3.1",
|
||||
"jest": "^29.3.1",
|
||||
"jest-mock": "^29.3.1",
|
||||
"lerna": "^4.0.0",
|
||||
"lerna": "^9.0.7",
|
||||
"lodash": "^4.17.21",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prettier": "^2.3.2",
|
||||
|
||||
@@ -4,6 +4,9 @@ Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xr
|
||||
|
||||
## Unreleased
|
||||
|
||||
### BREAKING CHANGES:
|
||||
* Renamed `build/xrplf-secret-numbers-latest.min.js` to `build/xrplf-secret-numbers-latest-min.js`.
|
||||
|
||||
## 1.0.0 (2024-02-01)
|
||||
|
||||
### BREAKING CHANGES:
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"types": "dist/index.d.ts",
|
||||
"scripts": {
|
||||
"prepublish": "npm run clean && npm run lint && npm run test && npm run test:browser && npm run build",
|
||||
"clean": "rm -rf ./dist ./coverage ./test/testCompiledForWeb tsconfig.build.tsbuildinfo",
|
||||
"clean": "rm -rf ./build ./dist ./coverage ./test/testCompiledForWeb tsconfig.build.tsbuildinfo",
|
||||
"test": "jest --verbose",
|
||||
"test:browser": "npm run build && npm run build:browserTests && karma start ./karma.config.js",
|
||||
"build": "run-s build:lib build:web",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "xahau-address-codec",
|
||||
"version": "5.0.0",
|
||||
"description": "encodes/decodes base58 encoded XAH Ledger identifiers",
|
||||
"description": "encodes/decodes base58 encoded Xahau Network identifiers",
|
||||
"files": [
|
||||
"dist/*",
|
||||
"src/*"
|
||||
|
||||
@@ -162,9 +162,9 @@ export {
|
||||
encodeAccountID,
|
||||
// Decode a classic address to its raw bytes
|
||||
decodeAccountID,
|
||||
// Encode bytes to XAH Ledger node public key format
|
||||
// Encode bytes to Xahau Network node public key format
|
||||
encodeNodePublic,
|
||||
// Decode an XAH Ledger node public key into its raw bytes
|
||||
// Decode an Xahau Network node public key into its raw bytes
|
||||
decodeNodePublic,
|
||||
// Encode a public key, as for payment channels
|
||||
encodeAccountPublic,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "xahau-binary-codec",
|
||||
"version": "2.1.0",
|
||||
"description": "XAH Ledger binary codec",
|
||||
"version": "2.1.3",
|
||||
"description": "Xahau Network binary codec",
|
||||
"files": [
|
||||
"dist/*",
|
||||
"src/*"
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
"LEDGER_ENTRY_TYPES": {
|
||||
"Invalid": -1,
|
||||
"AccountRoot": 97,
|
||||
"Cron": 65,
|
||||
"DirectoryNode": 100,
|
||||
"RippleState": 114,
|
||||
"Ticket": 84,
|
||||
@@ -328,6 +329,16 @@
|
||||
"type": "UInt16"
|
||||
}
|
||||
],
|
||||
[
|
||||
"HookStateScale",
|
||||
{
|
||||
"nth": 21,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt16"
|
||||
}
|
||||
],
|
||||
[
|
||||
"NetworkID",
|
||||
{
|
||||
@@ -798,6 +809,36 @@
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"StartTime",
|
||||
{
|
||||
"nth": 93,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"RepeatCount",
|
||||
{
|
||||
"nth": 94,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"DelaySeconds",
|
||||
{
|
||||
"nth": 95,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"XahauActivationLgrSeq",
|
||||
{
|
||||
@@ -1488,6 +1529,16 @@
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Cron",
|
||||
{
|
||||
"nth": 95,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Amount",
|
||||
{
|
||||
@@ -2797,6 +2848,7 @@
|
||||
"tecINSUF_RESERVE_SELLER": 187,
|
||||
"tecIMMUTABLE": 188,
|
||||
"tecTOO_MANY_REMARKS": 189,
|
||||
"tecHAS_HOOK_STATE": 190,
|
||||
"tecLAST_POSSIBLE_ENTRY": 255
|
||||
},
|
||||
"TRANSACTION_TYPES": {
|
||||
@@ -2829,11 +2881,14 @@
|
||||
"NFTokenCreateOffer": 27,
|
||||
"NFTokenCancelOffer": 28,
|
||||
"NFTokenAcceptOffer": 29,
|
||||
"Clawback": 30,
|
||||
"URITokenMint": 45,
|
||||
"URITokenBurn": 46,
|
||||
"URITokenBuy": 47,
|
||||
"URITokenCreateSellOffer": 48,
|
||||
"URITokenCancelSellOffer": 49,
|
||||
"Cron": 92,
|
||||
"CronSet": 93,
|
||||
"SetRemarks": 94,
|
||||
"Remit": 95,
|
||||
"GenesisMint": 96,
|
||||
|
||||
@@ -74,7 +74,13 @@ class XrplDefinitionsBase {
|
||||
.filter(([_key, value]) => value >= 0)
|
||||
.map(([key, _value]) => key)
|
||||
|
||||
const ignoreList = ['EnableAmendment', 'SetFee', 'UNLModify', 'EmitFailure']
|
||||
const ignoreList = [
|
||||
'EnableAmendment',
|
||||
'SetFee',
|
||||
'UNLModify',
|
||||
'EmitFailure',
|
||||
'Cron',
|
||||
]
|
||||
this.transactionMap = Object.assign(
|
||||
{},
|
||||
...Object.entries(enums.TRANSACTION_TYPES)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "xahau-keypairs",
|
||||
"version": "2.0.0",
|
||||
"description": "Cryptographic key pairs for the XAH Ledger",
|
||||
"description": "Cryptographic key pairs for the Xahau Network",
|
||||
"scripts": {
|
||||
"build": "tsc --build tsconfig.build.json",
|
||||
"test": "jest --verbose false --silent=false ./test/*.test.ts",
|
||||
|
||||
@@ -47,7 +47,7 @@ const ed25519: SigningScheme = {
|
||||
// ZIP 215 is a stricter Ed25519 signature verification scheme.
|
||||
// However, setting it to false adheres to the more commonly used
|
||||
// RFC8032 / NIST186-5 standards, making it compatible with systems
|
||||
// like the XAH Ledger.
|
||||
// like the Xahau Network.
|
||||
{ zip215: false },
|
||||
)
|
||||
},
|
||||
|
||||
@@ -4,8 +4,22 @@ Subscribe to [the **xrpl-announce** mailing list](https://groups.google.com/g/xr
|
||||
|
||||
## Unreleased Changes
|
||||
|
||||
## 4.0.3 (2025-11-18)
|
||||
|
||||
### Added
|
||||
* Fixed minified `build/xahau-latest-min.js` to have all the latest xahau package changes.
|
||||
|
||||
## 4.0.2 (2025-11-12)
|
||||
|
||||
### Added
|
||||
* Support for Cron Amendment
|
||||
* Support for ExtendedHookState Amendment
|
||||
|
||||
## 4.0.1 (2025-10-03)
|
||||
|
||||
### Added
|
||||
* parseTransactionFlags as a utility function in the xrpl package to streamline transactions flags-to-map conversion
|
||||
* Support for XLS-77d Deep-Freeze amendment
|
||||
|
||||
### Fixed
|
||||
* `TransactionStream` model supports APIv2
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "xahau",
|
||||
"version": "4.0.0",
|
||||
"version": "4.0.4-alpha.1",
|
||||
"license": "ISC",
|
||||
"description": "A TypeScript/JavaScript API for interacting with the XAH Ledger in Node.js and the browser",
|
||||
"description": "A TypeScript/JavaScript API for interacting with the Xahau Network in Node.js and the browser",
|
||||
"files": [
|
||||
"build/xahau-latest-min.js",
|
||||
"build/xahau-latest-min.js.map",
|
||||
@@ -29,7 +29,7 @@
|
||||
"bignumber.js": "^9.0.0",
|
||||
"eventemitter3": "^5.0.1",
|
||||
"xahau-address-codec": "^5.0.0",
|
||||
"xahau-binary-codec": "^2.1.0",
|
||||
"xahau-binary-codec": "^2.1.3",
|
||||
"xahau-keypairs": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -56,7 +56,7 @@
|
||||
"build:browserTests": "webpack --config ./test/webpack.config.js",
|
||||
"analyze": "webpack --analyze",
|
||||
"watch": "run-s build:lib --watch",
|
||||
"clean": "rm -rf ./dist ./coverage ./test/testCompiledForWeb tsconfig.build.tsbuildinfo",
|
||||
"clean": "rm -rf ./build ./dist ./coverage ./test/testCompiledForWeb tsconfig.build.tsbuildinfo",
|
||||
"docgen": "tsc --build tsconfig.docs.json && typedoc && echo js.xahau.org >> ../../docs/CNAME",
|
||||
"prepare": "copyfiles ../../README.md xahau/README.md",
|
||||
"prepublish": "run-s clean build",
|
||||
|
||||
@@ -355,13 +355,13 @@ export class Wallet {
|
||||
* Output of `sign` includes a `tx_blob` and a `hash`, both of which are needed to submit & verify the results.
|
||||
* Note: If you pass a `Wallet` to `client.submit` or `client.submitAndWait` it will do signing like this under the hood.
|
||||
*
|
||||
* `tx_blob` is a binary representation of a transaction on the XAH Ledger. It's essentially a byte array
|
||||
* `tx_blob` is a binary representation of a transaction on the Xahau Network. It's essentially a byte array
|
||||
* that encodes all of the data necessary to execute the transaction, including the source address, the destination
|
||||
* address, the amount, and any additional fields required for the specific transaction type.
|
||||
*
|
||||
* `hash` is a unique identifier that's generated from the signed transaction data on the XAH Ledger. It's essentially
|
||||
* `hash` is a unique identifier that's generated from the signed transaction data on the Xahau Network. It's essentially
|
||||
* A cryptographic digest of the signed transaction blob, created using a hash function. The signed transaction hash is
|
||||
* Useful for identifying and tracking specific transactions on the XAH Ledger. It can be used to query transaction
|
||||
* Useful for identifying and tracking specific transactions on the Xahau Network. It can be used to query transaction
|
||||
* Information, verify the authenticity of a transaction, and detect any tampering with the transaction data.
|
||||
*
|
||||
* @param this - Wallet instance.
|
||||
|
||||
@@ -1063,7 +1063,7 @@ class Client extends EventEmitter<EventTypes> {
|
||||
|
||||
/**
|
||||
* The fundWallet() method is used to send an amount of XAH (usually 1000) to a new (randomly generated)
|
||||
* or existing XAH Ledger wallet.
|
||||
* or existing Xahau Network wallet.
|
||||
*
|
||||
* @category Faucet
|
||||
*
|
||||
|
||||
@@ -64,10 +64,11 @@ function isPartialPayment(
|
||||
}
|
||||
|
||||
const delivered = meta.delivered_amount
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment -- DeliverMax is a valid field on Payment response
|
||||
// @ts-expect-error -- DeliverMax is a valid field on Payment response
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- DeliverMax is a valid field on Payment response
|
||||
const amount = tx.DeliverMax
|
||||
const amount = tx.DeliverMax ?? tx.Amount
|
||||
|
||||
if (delivered === undefined) {
|
||||
return false
|
||||
|
||||
@@ -71,7 +71,7 @@ export interface SignerEntry {
|
||||
*/
|
||||
SignerEntry: {
|
||||
/**
|
||||
* An XAH Ledger address whose signature contributes to the multi-signature.
|
||||
* An Xahau Network address whose signature contributes to the multi-signature.
|
||||
* It does not need to be a funded address in the ledger.
|
||||
*/
|
||||
Account: string
|
||||
|
||||
@@ -1,5 +1,28 @@
|
||||
import { Amount } from '.'
|
||||
|
||||
/**
|
||||
* Enum representing values for Hook Flags for SetHook Transaction.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*/
|
||||
export enum HookFlags {
|
||||
/**
|
||||
*/
|
||||
hsfOverride = 0x00000001,
|
||||
/**
|
||||
*/
|
||||
hsfNSDelete = 0x0000002,
|
||||
/**
|
||||
*/
|
||||
hsfCollect = 0x00000004,
|
||||
}
|
||||
|
||||
export interface HookFlagsInterface {
|
||||
hsfOverride?: boolean
|
||||
hsfNSDelete?: boolean
|
||||
hsfCollect?: boolean
|
||||
}
|
||||
|
||||
export interface AmountEntry {
|
||||
AmountEntry: { Amount: Amount }
|
||||
}
|
||||
@@ -58,7 +81,7 @@ export interface Hook {
|
||||
/**
|
||||
* The flags that are set on the hook.
|
||||
*/
|
||||
Flags?: number
|
||||
Flags?: number | HookFlagsInterface
|
||||
/**
|
||||
* The transactions that triggers the hook. Represented as a 256Hash
|
||||
*/
|
||||
@@ -98,6 +121,14 @@ export interface EmitDetails {
|
||||
sfEmitCallback?: string
|
||||
}
|
||||
|
||||
export enum MintURITokenFlags {
|
||||
tfBurnable = 0x00000001,
|
||||
}
|
||||
|
||||
export interface MintURITokenFlagsInterface {
|
||||
tfBurnable?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* The object that describes the uritoken in MintURIToken.
|
||||
*/
|
||||
@@ -113,5 +144,5 @@ export interface MintURIToken {
|
||||
/**
|
||||
* The flags that are set on the uritoken.
|
||||
*/
|
||||
Flags?: number
|
||||
Flags?: number | MintURITokenFlagsInterface
|
||||
}
|
||||
|
||||
@@ -84,6 +84,9 @@ export default interface AccountRoot extends BaseLedgerEntry, HasPreviousTxnID {
|
||||
GovernanceMarks?: string
|
||||
AccountIndex?: number
|
||||
TouchCount?: number
|
||||
HookStateScale?: number
|
||||
/* The cron job that is associated with this account. */
|
||||
Cron?: string
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,6 +155,11 @@ export interface AccountRootFlagsInterface {
|
||||
* Disallow incoming Remit from other accounts.
|
||||
*/
|
||||
lsfDisallowIncomingRemit?: boolean
|
||||
|
||||
/**
|
||||
* This address can claw back issued IOUs. Once enabled, cannot be disabled.
|
||||
*/
|
||||
lsfAllowTrustLineClawback?: boolean
|
||||
}
|
||||
|
||||
export enum AccountRootFlags {
|
||||
@@ -192,6 +200,10 @@ export enum AccountRootFlags {
|
||||
* (It has DepositAuth enabled.)
|
||||
*/
|
||||
lsfDepositAuth = 0x01000000,
|
||||
/**
|
||||
* The TSH pays for the execution of their own Hook Chain. Added by the Hooks amendment.
|
||||
*/
|
||||
lsfTshCollect = 0x02000000,
|
||||
/**
|
||||
* Disallow incoming NFTOffers from other accounts.
|
||||
*/
|
||||
@@ -216,4 +228,8 @@ export enum AccountRootFlags {
|
||||
* Disallow incoming Remits from other accounts.
|
||||
*/
|
||||
lsfDisallowIncomingRemit = 0x80000000,
|
||||
/**
|
||||
* This address can claw back issued IOUs. Once enabled, cannot be disabled.
|
||||
*/
|
||||
lsfAllowTrustLineClawback = 0x00001000,
|
||||
}
|
||||
|
||||
25
packages/xahau/src/models/ledger/Cron.ts
Normal file
25
packages/xahau/src/models/ledger/Cron.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { Account } from '../transactions/common'
|
||||
|
||||
import { BaseLedgerEntry, HasPreviousTxnID } from './BaseLedgerEntry'
|
||||
|
||||
/**
|
||||
* The EmittedTxn object type contains the
|
||||
*
|
||||
* @category Ledger Entries
|
||||
*/
|
||||
export default interface Cron extends BaseLedgerEntry, HasPreviousTxnID {
|
||||
LedgerEntryType: 'Cron'
|
||||
/** The owner of the cron job. */
|
||||
Owner: Account
|
||||
/** The start time of the cron job. */
|
||||
StartTime: number
|
||||
/** The delay seconds of the cron job. */
|
||||
DelaySeconds: number
|
||||
/** The repeat count of the cron job. */
|
||||
RepeatCount: number
|
||||
/**
|
||||
* A hint indicating which page of the sender's owner directory links to this
|
||||
* object, in case the directory consists of multiple pages.
|
||||
*/
|
||||
OwnerNode: string
|
||||
}
|
||||
@@ -11,7 +11,7 @@ export interface FeeSettingsPreAmendmentFields {
|
||||
BaseFee: string
|
||||
/** The BaseFee translated into "fee units". */
|
||||
ReferenceFeeUnits: number
|
||||
/** The base reserve for an account in the XAH Ledger, as drops of XAH. */
|
||||
/** The base reserve for an account in the Xahau Network, as drops of XAH. */
|
||||
ReserveBase: number
|
||||
/** The incremental owner reserve for owning objects, as drops of XAH. */
|
||||
ReserveIncrement: number
|
||||
@@ -20,7 +20,7 @@ export interface FeeSettingsPreAmendmentFields {
|
||||
export interface FeeSettingsPostAmendmentFields {
|
||||
/** The transaction cost of the "reference transaction" in drops of XAH as hexadecimal. */
|
||||
BaseFeeDrops: string
|
||||
/** The base reserve for an account in the XAH Ledger, as drops of XAH. */
|
||||
/** The base reserve for an account in the Xahau Network, as drops of XAH. */
|
||||
ReserveBaseDrops: string
|
||||
/** The incremental owner reserve for owning objects, as drops of XAH. */
|
||||
ReserveIncrementDrops: string
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import AccountRoot from './AccountRoot'
|
||||
import Amendments from './Amendments'
|
||||
import Check from './Check'
|
||||
import Cron from './Cron'
|
||||
import DepositPreauth from './DepositPreauth'
|
||||
import DirectoryNode from './DirectoryNode'
|
||||
import EmittedTxn from './EmittedTxn'
|
||||
@@ -23,6 +24,7 @@ import URIToken from './URIToken'
|
||||
type LedgerEntry =
|
||||
| AccountRoot
|
||||
| Amendments
|
||||
| Cron
|
||||
| Check
|
||||
| DepositPreauth
|
||||
| DirectoryNode
|
||||
@@ -46,6 +48,7 @@ type LedgerEntry =
|
||||
type LedgerEntryFilter =
|
||||
| 'account'
|
||||
| 'amendments'
|
||||
| 'cron'
|
||||
| 'check'
|
||||
| 'deposit_preauth'
|
||||
| 'directory'
|
||||
|
||||
@@ -77,4 +77,8 @@ export enum RippleStateFlags {
|
||||
lsfHighFreeze = 0x00800000,
|
||||
// True, trust line to AMM. Used by client apps to identify payments via AMM.
|
||||
lsfAMMNode = 0x01000000,
|
||||
// True, low side has set deep freeze flag
|
||||
lsfLowDeepFreeze = 0x02000000,
|
||||
// True, high side has set deep freeze flag
|
||||
lsfHighDeepFreeze = 0x04000000,
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import AccountRoot, {
|
||||
} from './AccountRoot'
|
||||
import Amendments, { Majority, AMENDMENTS_ID } from './Amendments'
|
||||
import Check from './Check'
|
||||
import Cron from './Cron'
|
||||
import DepositPreauth from './DepositPreauth'
|
||||
import DirectoryNode from './DirectoryNode'
|
||||
import EmittedTxn from './EmittedTxn'
|
||||
@@ -36,6 +37,7 @@ export {
|
||||
AMENDMENTS_ID,
|
||||
Amendments,
|
||||
Check,
|
||||
Cron,
|
||||
DepositPreauth,
|
||||
DirectoryNode,
|
||||
EmittedTxn,
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Amount } from '../common'
|
||||
import { BaseRequest, BaseResponse, LookupByLedgerRequest } from './baseMethod'
|
||||
|
||||
/**
|
||||
* Represents a payment channel in the XAH Ledger.
|
||||
* Represents a payment channel in the Xahau Network.
|
||||
*/
|
||||
export interface Channel {
|
||||
/** The owner of the channel, as an Address. */
|
||||
@@ -38,7 +38,7 @@ export interface Channel {
|
||||
settle_delay: number
|
||||
|
||||
/**
|
||||
* The public key for the payment channel in the XAH Ledger's base58 format.
|
||||
* The public key for the payment channel in the Xahau Network's base58 format.
|
||||
* Signed claims against this channel must be redeemed with the matching key pair.
|
||||
*/
|
||||
public_key?: string
|
||||
|
||||
@@ -14,7 +14,7 @@ export interface AccountCurrenciesRequest
|
||||
/** A unique identifier for the account, most commonly the account's address. */
|
||||
account: string
|
||||
/**
|
||||
* If true, then the account field only accepts a public key or XAH Ledger
|
||||
* If true, then the account field only accepts a public key or Xahau Network
|
||||
* address. Otherwise, account can be a secret or passphrase (not
|
||||
* recommended). The default is false.
|
||||
*/
|
||||
|
||||
@@ -25,7 +25,7 @@ export interface AccountInfoRequest extends BaseRequest, LookupByLedgerRequest {
|
||||
*/
|
||||
signer_lists?: boolean
|
||||
/**
|
||||
* If true, then the account field only accepts a public key or XAH Ledger
|
||||
* If true, then the account field only accepts a public key or Xahau Network
|
||||
* address. Otherwise, account can be a secret or passphrase (not
|
||||
* recommended). The default is false.
|
||||
*/
|
||||
@@ -159,7 +159,7 @@ interface BaseAccountInfoResponse extends BaseResponse {
|
||||
/**
|
||||
* Information about queued transactions sent by this account. This
|
||||
* information describes the state of the local xahaud server, which may be
|
||||
* different from other servers in the peer-to-peer XAH Ledger network. Some
|
||||
* different from other servers in the peer-to-peer Xahau Network network. Some
|
||||
* fields may be omitted because the values are calculated "lazily" by the
|
||||
* queuing mechanism.
|
||||
*/
|
||||
|
||||
@@ -26,7 +26,7 @@ export interface AccountOffersRequest
|
||||
*/
|
||||
marker?: unknown
|
||||
/**
|
||||
* If true, then the account field only accepts a public key or XAH Ledger
|
||||
* If true, then the account field only accepts a public key or Xahau Network
|
||||
* address. Otherwise, account can be a secret or passphrase (not
|
||||
* recommended). The default is false.
|
||||
*/
|
||||
|
||||
@@ -18,7 +18,7 @@ export interface ChannelVerifyRequest extends BaseRequest {
|
||||
channel_id: string
|
||||
/**
|
||||
* The public key of the channel and the key pair that was used to create the
|
||||
* signature, in hexadecimal or the XAH Ledger's base58 format.
|
||||
* signature, in hexadecimal or the Xahau Network's base58 format.
|
||||
*/
|
||||
public_key: string
|
||||
/** The signature to verify, in hexadecimal. */
|
||||
|
||||
@@ -3,7 +3,7 @@ import { LedgerEntry } from '../ledger'
|
||||
import { BaseRequest, BaseResponse, LookupByLedgerRequest } from './baseMethod'
|
||||
|
||||
/**
|
||||
* The `ledger_entry` method returns a single ledger object from the XAH Ledger
|
||||
* The `ledger_entry` method returns a single ledger object from the Xahau Network
|
||||
* in its raw format. Expects a response in the form of a {@link
|
||||
* LedgerEntryResponse}.
|
||||
*
|
||||
@@ -30,7 +30,7 @@ export interface LedgerEntryRequest extends BaseRequest, LookupByLedgerRequest {
|
||||
include_deleted?: boolean
|
||||
/**
|
||||
* If true, return the requested ledger object's contents as a hex string in
|
||||
* the XAH Ledger's binary format. Otherwise, return data in JSON format. The
|
||||
* the Xahau Network's binary format. Otherwise, return data in JSON format. The
|
||||
* default is false.
|
||||
*/
|
||||
binary?: boolean
|
||||
@@ -200,6 +200,20 @@ export interface LedgerEntryRequest extends BaseRequest, LookupByLedgerRequest {
|
||||
uri: string
|
||||
}
|
||||
| string
|
||||
|
||||
/**
|
||||
* The Cron object to retrieve. If a string, must be the object ID of the
|
||||
* Cron, as hexadecimal. If an object, the `owner` and `time`
|
||||
* sub-fields are required to uniquely specify the Cron entry.
|
||||
*/
|
||||
cron?:
|
||||
| {
|
||||
/** The owner of the Cron object. */
|
||||
owner: string
|
||||
/** The start time of the Cron object. */
|
||||
time: number
|
||||
}
|
||||
| string
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -108,7 +108,7 @@ export interface ServerInfoResponse extends BaseResponse {
|
||||
* The number of times (since starting up) that this server has had over
|
||||
* 250 transactions waiting to be processed at once. A large number here
|
||||
* may mean that your server is unable to handle the transaction load of
|
||||
* the XAH Ledger network.
|
||||
* the Xahau Network network.
|
||||
*/
|
||||
jq_trans_overflow: string
|
||||
/**
|
||||
|
||||
@@ -65,7 +65,7 @@ export interface SubmitResponse extends BaseResponse {
|
||||
applied: boolean
|
||||
/**
|
||||
* The value true indicates this transaction was broadcast to peer servers
|
||||
* in the peer-to-peer XAH Ledger network.
|
||||
* in the peer-to-peer Xahau Network network.
|
||||
*/
|
||||
broadcast: boolean
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,7 @@ export interface SubscribeBook {
|
||||
taker_pays: Currency
|
||||
/**
|
||||
* Unique account address to use as a perspective for viewing offers, in the.
|
||||
* XAH Ledger's base58 format.
|
||||
* Xahau Network's base58 format.
|
||||
*/
|
||||
taker: string
|
||||
/**
|
||||
@@ -54,7 +54,7 @@ export interface SubscribeRequest extends BaseRequest {
|
||||
streams?: StreamType[]
|
||||
/**
|
||||
* Array with the unique addresses of accounts to monitor for validated
|
||||
* transactions. The addresses must be in the XAH Ledger's base58 format.
|
||||
* transactions. The addresses must be in the Xahau Network's base58 format.
|
||||
* The server sends a notification for any transaction that affects at least
|
||||
* one of these accounts.
|
||||
*/
|
||||
@@ -235,7 +235,7 @@ export interface ValidationStream extends BaseStream {
|
||||
load_fee?: number
|
||||
/**
|
||||
* The validator's master public key, if the validator is using a validator
|
||||
* token, in the XAH Ledger's base58 format.
|
||||
* token, in the Xahau Network's base58 format.
|
||||
*/
|
||||
master_key?: string
|
||||
/**
|
||||
@@ -254,7 +254,7 @@ export interface ValidationStream extends BaseStream {
|
||||
signing_time: number
|
||||
/**
|
||||
* The public key from the key-pair that the validator used to sign the
|
||||
* message, in the XAH Ledger's base58 format. This identifies the validator
|
||||
* message, in the Xahau Network's base58 format. This identifies the validator
|
||||
* sending the message and can also be used to verify the signature. If the
|
||||
* validator is using a token, this is an ephemeral public key.
|
||||
*/
|
||||
|
||||
@@ -24,7 +24,7 @@ export interface UnsubscribeRequest extends BaseRequest {
|
||||
streams?: StreamType[]
|
||||
/**
|
||||
* Array of unique account addresses to stop receiving updates for, in the.
|
||||
* XAH Ledger's base58 format.
|
||||
* Xahau Network's base58 format.
|
||||
*/
|
||||
accounts?: string[]
|
||||
/**
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
Account,
|
||||
BaseTransaction,
|
||||
isAccount,
|
||||
isNumber,
|
||||
validateBaseTransaction,
|
||||
validateOptionalField,
|
||||
} from './common'
|
||||
@@ -61,6 +62,8 @@ export enum AccountSetAsfFlags {
|
||||
asfDisallowIncomingTrustline = 15,
|
||||
/** Disallow other accounts from sending incoming Remits */
|
||||
asfDisallowIncomingRemit = 16,
|
||||
/** Permanently gain the ability to claw back issued IOUs */
|
||||
asfAllowTrustLineClawback = 17,
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -161,10 +164,16 @@ export interface AccountSet extends BaseTransaction {
|
||||
* account's behalf using NFTokenMint's `Issuer` field.
|
||||
*/
|
||||
NFTokenMinter?: Account
|
||||
/**
|
||||
* The allowed scale of the hook state.
|
||||
*/
|
||||
HookStateScale?: number
|
||||
}
|
||||
|
||||
const MIN_TICK_SIZE = 3
|
||||
const MAX_TICK_SIZE = 15
|
||||
const MAX_HOOK_STATE_SCALE = 16
|
||||
const MIN_HOOK_STATE_SCALE = 1
|
||||
|
||||
/**
|
||||
* Verify the form and type of an AccountSet at runtime.
|
||||
@@ -172,7 +181,7 @@ const MAX_TICK_SIZE = 15
|
||||
* @param tx - An AccountSet Transaction.
|
||||
* @throws When the AccountSet is Malformed.
|
||||
*/
|
||||
// eslint-disable-next-line max-lines-per-function -- okay for this method, only a little over
|
||||
// eslint-disable-next-line max-lines-per-function, max-statements -- okay for this method, only a little over
|
||||
export function validateAccountSet(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
@@ -223,4 +232,24 @@ export function validateAccountSet(tx: Record<string, unknown>): void {
|
||||
throw new ValidationError('AccountSet: invalid TickSize')
|
||||
}
|
||||
}
|
||||
|
||||
validateOptionalField(tx, 'HookStateScale', isNumber)
|
||||
|
||||
if (
|
||||
typeof tx.HookStateScale === 'number' &&
|
||||
tx.HookStateScale > MAX_HOOK_STATE_SCALE
|
||||
) {
|
||||
throw new ValidationError(
|
||||
`AccountSet: HookStateScale must be less than or equal to ${MAX_HOOK_STATE_SCALE}`,
|
||||
)
|
||||
}
|
||||
|
||||
if (
|
||||
typeof tx.HookStateScale === 'number' &&
|
||||
tx.HookStateScale < MIN_HOOK_STATE_SCALE
|
||||
) {
|
||||
throw new ValidationError(
|
||||
`AccountSet: HookStateScale must be greater than or equal to ${MIN_HOOK_STATE_SCALE}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
import { BaseTransaction, GlobalFlags, validateBaseTransaction } from './common'
|
||||
/**
|
||||
* Transaction Flags for an ClaimReward Transaction.
|
||||
*
|
||||
@@ -13,6 +13,39 @@ export enum ClaimRewardFlags {
|
||||
tfOptOut = 0x00000001,
|
||||
}
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link ClaimReward} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: ClaimReward = {
|
||||
* Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* TransactionType: 'ClaimReward',
|
||||
* Flags: {
|
||||
* tfOptOut: true,
|
||||
* },
|
||||
* }
|
||||
*
|
||||
* // Autofill the tx to see how flags actually look compared to the interface usage.
|
||||
* const autofilledTx = await client.autofill(tx)
|
||||
* console.log(autofilledTx)
|
||||
* // {
|
||||
* // Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* // TransactionType: 'ClaimReward',
|
||||
* // Flags: 0,
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
export interface ClaimRewardFlagsInterface extends GlobalFlags {
|
||||
tfOptOut?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* ClaimReward is a transaction model that allows an account to claim rewards.
|
||||
*
|
||||
@@ -20,7 +53,7 @@ export enum ClaimRewardFlags {
|
||||
*/
|
||||
export interface ClaimReward extends BaseTransaction {
|
||||
TransactionType: 'ClaimReward'
|
||||
Flags?: number | ClaimRewardFlags
|
||||
Flags?: number | ClaimRewardFlagsInterface
|
||||
/** The unique address of the issuer where the reward.c hook is installed. */
|
||||
Issuer?: string
|
||||
}
|
||||
|
||||
49
packages/xahau/src/models/transactions/clawback.ts
Normal file
49
packages/xahau/src/models/transactions/clawback.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { IssuedCurrencyAmount } from '../common'
|
||||
|
||||
import {
|
||||
BaseTransaction,
|
||||
validateBaseTransaction,
|
||||
isIssuedCurrency,
|
||||
} from './common'
|
||||
|
||||
/**
|
||||
* The Clawback transaction is used by the token issuer to claw back
|
||||
* issued tokens from a holder.
|
||||
*/
|
||||
export interface Clawback extends BaseTransaction {
|
||||
TransactionType: 'Clawback'
|
||||
/**
|
||||
* Indicates the AccountID that submitted this transaction. The account MUST
|
||||
* be the issuer of the currency.
|
||||
*/
|
||||
Account: string
|
||||
/**
|
||||
* The amount of currency to deliver, and it must be non-XRP. The nested field
|
||||
* names MUST be lower-case. The `issuer` field MUST be the holder's address,
|
||||
* whom to be clawed back.
|
||||
*/
|
||||
Amount: IssuedCurrencyAmount
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an Clawback at runtime.
|
||||
*
|
||||
* @param tx - An Clawback Transaction.
|
||||
* @throws When the Clawback is Malformed.
|
||||
*/
|
||||
export function validateClawback(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.Amount == null) {
|
||||
throw new ValidationError('Clawback: missing field Amount')
|
||||
}
|
||||
|
||||
if (!isIssuedCurrency(tx.Amount)) {
|
||||
throw new ValidationError('Clawback: invalid Amount')
|
||||
}
|
||||
|
||||
if (isIssuedCurrency(tx.Amount) && tx.Account === tx.Amount.issuer) {
|
||||
throw new ValidationError('Clawback: invalid holder Account')
|
||||
}
|
||||
}
|
||||
17
packages/xahau/src/models/transactions/cron.ts
Normal file
17
packages/xahau/src/models/transactions/cron.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { BaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Cron job to be executed.
|
||||
*
|
||||
* @category Pseudo Transaction Models
|
||||
*/
|
||||
export interface Cron extends BaseTransaction {
|
||||
TransactionType: 'Cron'
|
||||
/**
|
||||
* The ledger index where this pseudo-transaction appears.
|
||||
* This distinguishes the pseudo-transaction from other occurrences of the same change.
|
||||
*/
|
||||
LedgerSequence: number
|
||||
/** The owner of the cron job. */
|
||||
Owner: string
|
||||
}
|
||||
123
packages/xahau/src/models/transactions/cronSet.ts
Normal file
123
packages/xahau/src/models/transactions/cronSet.ts
Normal file
@@ -0,0 +1,123 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
import {
|
||||
BaseTransaction,
|
||||
GlobalFlags,
|
||||
isNumber,
|
||||
validateBaseTransaction,
|
||||
validateOptionalField,
|
||||
validateRequiredField,
|
||||
} from './common'
|
||||
/**
|
||||
* Transaction Flags for an CronSet Transaction.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*/
|
||||
export enum CronSetFlags {
|
||||
/**
|
||||
* If set, indicates that the user would like to unset the cron job.
|
||||
*/
|
||||
tfCronUnset = 0x00000001,
|
||||
}
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link CronSet} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: CronSet = {
|
||||
* Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
* TransactionType: 'CronSet',
|
||||
* Flags: {
|
||||
* tfCronUnset: true,
|
||||
* },
|
||||
* }
|
||||
*
|
||||
* // Autofill the tx to see how flags actually look compared to the interface usage.
|
||||
* const autofilledTx = await client.autofill(tx)
|
||||
* console.log(autofilledTx)
|
||||
* // {
|
||||
* // Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
* // TransactionType: 'CronSet',
|
||||
* // Flags: 0,
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
export interface CronSetFlagsInterface extends GlobalFlags {
|
||||
tfCronUnset?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* CronSet is a transaction model that allows an account to set a cron job.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface CronSet extends BaseTransaction {
|
||||
TransactionType: 'CronSet'
|
||||
Flags?: number | CronSetFlagsInterface
|
||||
RepeatCount?: number
|
||||
DelaySeconds?: number
|
||||
StartTime?: number
|
||||
}
|
||||
|
||||
const MAX_REPEAT_COUNT = 256
|
||||
// eslint-disable-next-line @typescript-eslint/no-magic-numbers -- seconds in a year
|
||||
const MIN_DELAY_SECONDS = 365 * 24 * 60 * 60
|
||||
|
||||
/**
|
||||
* Verify the form and type of an CronSet at runtime.
|
||||
*
|
||||
* @param tx - An CronSet Transaction.
|
||||
* @throws When the CronSet is Malformed.
|
||||
*/
|
||||
export function validateCronSet(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (
|
||||
typeof tx.Flags === 'number' &&
|
||||
// eslint-disable-next-line no-bitwise -- bitwise operation to check if the flag is set
|
||||
tx.Flags & CronSetFlags.tfCronUnset
|
||||
) {
|
||||
if (
|
||||
tx.RepeatCount !== undefined ||
|
||||
tx.DelaySeconds !== undefined ||
|
||||
tx.StartTime !== undefined
|
||||
) {
|
||||
throw new ValidationError(
|
||||
'CronSet: RepeatCount, DelaySeconds, and StartTime must not be set when Flags is set to tfCronUnset',
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
validateRequiredField(tx, 'StartTime', isNumber)
|
||||
validateOptionalField(tx, 'RepeatCount', isNumber)
|
||||
validateOptionalField(tx, 'DelaySeconds', isNumber)
|
||||
|
||||
if ((tx.RepeatCount === undefined) !== (tx.DelaySeconds === undefined)) {
|
||||
throw new ValidationError(
|
||||
'CronSet: Both RepeatCount and DelaySeconds must be set, or neither should be set',
|
||||
)
|
||||
}
|
||||
|
||||
if (typeof tx.RepeatCount === 'number' && tx.RepeatCount > MAX_REPEAT_COUNT) {
|
||||
throw new ValidationError(
|
||||
`CronSet: RepeatCount must be less than ${MAX_REPEAT_COUNT}`,
|
||||
)
|
||||
}
|
||||
|
||||
if (
|
||||
typeof tx.DelaySeconds === 'number' &&
|
||||
tx.DelaySeconds > MIN_DELAY_SECONDS
|
||||
) {
|
||||
throw new ValidationError(
|
||||
`CronSet: DelaySeconds must be less than ${MIN_DELAY_SECONDS}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -11,10 +11,10 @@ import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
*/
|
||||
export interface DepositPreauth extends BaseTransaction {
|
||||
TransactionType: 'DepositPreauth'
|
||||
/** The XAH Ledger address of the sender to preauthorize. */
|
||||
/** The Xahau Network address of the sender to preauthorize. */
|
||||
Authorize?: string
|
||||
/**
|
||||
* The XAH Ledger address of a sender whose preauthorization should be.
|
||||
* The Xahau Network address of a sender whose preauthorization should be.
|
||||
* revoked.
|
||||
*/
|
||||
Unauthorize?: string
|
||||
|
||||
@@ -17,6 +17,8 @@ export { CheckCancel } from './checkCancel'
|
||||
export { CheckCash } from './checkCash'
|
||||
export { CheckCreate } from './checkCreate'
|
||||
export { ClaimReward, ClaimRewardFlags } from './claimReward'
|
||||
export { Cron } from './cron'
|
||||
export { CronSet, CronSetFlags } from './cronSet'
|
||||
export { DepositPreauth } from './depositPreauth'
|
||||
export { EscrowCancel } from './escrowCancel'
|
||||
export { EscrowCreate } from './escrowCreate'
|
||||
@@ -39,7 +41,7 @@ export {
|
||||
export { PaymentChannelCreate } from './paymentChannelCreate'
|
||||
export { PaymentChannelFund } from './paymentChannelFund'
|
||||
export { Remit } from './remit'
|
||||
export { SetHookFlagsInterface, SetHookFlags, SetHook } from './setHook'
|
||||
export { SetHook } from './setHook'
|
||||
export { SetFee, SetFeePreAmendment, SetFeePostAmendment } from './setFee'
|
||||
export { SetRegularKey } from './setRegularKey'
|
||||
export {
|
||||
@@ -61,3 +63,4 @@ export { URITokenCreateSellOffer } from './uriTokenCreateSellOffer'
|
||||
export { URITokenBuy } from './uriTokenBuy'
|
||||
export { URITokenCancelSellOffer } from './uriTokenCancelSellOffer'
|
||||
export { UNLModify } from './UNLModify'
|
||||
export { Clawback } from './clawback'
|
||||
|
||||
@@ -3,7 +3,7 @@ import { ValidationError } from '../../errors'
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* An OfferCancel transaction removes an Offer object from the XAH Ledger.
|
||||
* An OfferCancel transaction removes an Offer object from the Xahau Network.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
|
||||
@@ -1,30 +1,7 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Hook } from '../common/xahau'
|
||||
|
||||
import { BaseTransaction, GlobalFlags, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Enum representing values for Set Hook Transaction Flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*/
|
||||
export enum SetHookFlags {
|
||||
/**
|
||||
*/
|
||||
hsfOverride = 0x00000001,
|
||||
/**
|
||||
*/
|
||||
hsfNSDelete = 0x0000002,
|
||||
/**
|
||||
*/
|
||||
hsfCollect = 0x00000004,
|
||||
}
|
||||
|
||||
export interface SetHookFlagsInterface extends GlobalFlags {
|
||||
hsfOverride?: boolean
|
||||
hsfNSDelete?: boolean
|
||||
hsfCollect?: boolean
|
||||
}
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -37,8 +14,6 @@ export interface SetHook extends BaseTransaction {
|
||||
*
|
||||
*/
|
||||
Hooks: Hook[]
|
||||
|
||||
Flags?: number | SetHookFlagsInterface
|
||||
}
|
||||
|
||||
const MAX_HOOKS = 10
|
||||
|
||||
@@ -10,7 +10,10 @@ import { CheckCancel, validateCheckCancel } from './checkCancel'
|
||||
import { CheckCash, validateCheckCash } from './checkCash'
|
||||
import { CheckCreate, validateCheckCreate } from './checkCreate'
|
||||
import { ClaimReward, validateClaimReward } from './claimReward'
|
||||
import { Clawback, validateClawback } from './clawback'
|
||||
import { BaseTransaction, isIssuedCurrency } from './common'
|
||||
import { Cron } from './cron'
|
||||
import { CronSet, validateCronSet } from './cronSet'
|
||||
import { DepositPreauth, validateDepositPreauth } from './depositPreauth'
|
||||
import { EnableAmendment } from './enableAmendment'
|
||||
import { EscrowCancel, validateEscrowCancel } from './escrowCancel'
|
||||
@@ -66,6 +69,8 @@ export type SubmittableTransaction =
|
||||
| CheckCash
|
||||
| CheckCreate
|
||||
| ClaimReward
|
||||
| Clawback
|
||||
| CronSet
|
||||
| DepositPreauth
|
||||
| EscrowCancel
|
||||
| EscrowCreate
|
||||
@@ -96,7 +101,7 @@ export type SubmittableTransaction =
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export type PseudoTransaction = EnableAmendment | SetFee | UNLModify
|
||||
export type PseudoTransaction = Cron | EnableAmendment | SetFee | UNLModify
|
||||
|
||||
/**
|
||||
* All transactions that can live on the XAHL
|
||||
@@ -204,6 +209,14 @@ export function validate(transaction: Record<string, unknown>): void {
|
||||
validateClaimReward(tx)
|
||||
break
|
||||
|
||||
case 'Clawback':
|
||||
validateClawback(tx)
|
||||
break
|
||||
|
||||
case 'CronSet':
|
||||
validateCronSet(tx)
|
||||
break
|
||||
|
||||
case 'DepositPreauth':
|
||||
validateDepositPreauth(tx)
|
||||
break
|
||||
|
||||
@@ -30,6 +30,11 @@ export enum TrustSetFlags {
|
||||
tfSetFreeze = 0x00100000,
|
||||
/** Unfreeze the trust line. */
|
||||
tfClearFreeze = 0x00200000,
|
||||
/** Deep-Freeze the trustline -- disallow sending and receiving the said IssuedCurrency */
|
||||
/** Allowed only if the trustline is already regularly frozen, or if tfSetFreeze is set in the same transaction. */
|
||||
tfSetDeepFreeze = 0x00400000,
|
||||
/** Clear a Deep-Frozen trustline */
|
||||
tfClearDeepFreeze = 0x00800000,
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,6 +94,11 @@ export interface TrustSetFlagsInterface extends GlobalFlags {
|
||||
tfSetFreeze?: boolean
|
||||
/** Unfreeze the trust line. */
|
||||
tfClearFreeze?: boolean
|
||||
/** Deep-Freeze the trustline -- disallow sending and receiving the said IssuedCurrency */
|
||||
/** Allowed only if the trustline is already regularly frozen, or if tfSetFreeze is set in the same transaction. */
|
||||
tfSetDeepFreeze?: boolean
|
||||
/** Clear a Deep-Frozen trust line */
|
||||
tfClearDeepFreeze?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,24 +1,22 @@
|
||||
/* eslint-disable no-param-reassign -- param reassign is safe */
|
||||
/* eslint-disable no-bitwise -- flags require bitwise operations */
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Hook } from '../common/xahau'
|
||||
import { Hook, HookFlags, MintURITokenFlags } from '../common/xahau'
|
||||
import {
|
||||
AccountRootFlagsInterface,
|
||||
AccountRootFlags,
|
||||
} from '../ledger/AccountRoot'
|
||||
import { AccountSetTfFlags } from '../transactions/accountSet'
|
||||
import { ClaimRewardFlags } from '../transactions/claimReward'
|
||||
import { GlobalFlags } from '../transactions/common'
|
||||
import { CronSetFlags } from '../transactions/cronSet'
|
||||
import { OfferCreateFlags } from '../transactions/offerCreate'
|
||||
import { PaymentFlags } from '../transactions/payment'
|
||||
import { PaymentChannelClaimFlags } from '../transactions/paymentChannelClaim'
|
||||
import { SetHookFlagsInterface, SetHookFlags } from '../transactions/setHook'
|
||||
import {
|
||||
RemarkFlagsInterface,
|
||||
RemarkFlags,
|
||||
Remark,
|
||||
} from '../transactions/setRemarks'
|
||||
import { RemarkFlags, Remark } from '../transactions/setRemarks'
|
||||
import type { Transaction } from '../transactions/transaction'
|
||||
import { TrustSetFlags } from '../transactions/trustSet'
|
||||
import { URITokenMintFlags } from '../transactions/uriTokenMint'
|
||||
|
||||
import { isFlagEnabled } from '.'
|
||||
|
||||
@@ -52,6 +50,9 @@ const txToFlag = {
|
||||
PaymentChannelClaim: PaymentChannelClaimFlags,
|
||||
Payment: PaymentFlags,
|
||||
TrustSet: TrustSetFlags,
|
||||
URITokenMint: URITokenMintFlags,
|
||||
ClaimReward: ClaimRewardFlags,
|
||||
CronSet: CronSetFlags,
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,6 +61,36 @@ const txToFlag = {
|
||||
* @param tx - A transaction to set its flags to its numeric representation.
|
||||
*/
|
||||
export function setTransactionFlagsToNumber(tx: Transaction): void {
|
||||
if (tx.TransactionType === 'SetHook' && Array.isArray(tx.Hooks)) {
|
||||
tx.Hooks.forEach((hook: Hook) => {
|
||||
if (typeof hook.Hook.Flags === 'object') {
|
||||
hook.Hook.Flags = convertFlagsToNumber(hook.Hook.Flags, HookFlags)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (tx.TransactionType === 'Remit') {
|
||||
if (tx.MintURIToken != null && typeof tx.MintURIToken.Flags === 'object') {
|
||||
tx.MintURIToken.Flags = convertFlagsToNumber(
|
||||
tx.MintURIToken.Flags,
|
||||
MintURITokenFlags,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (tx.TransactionType === 'SetRemarks') {
|
||||
if (Array.isArray(tx.Remarks)) {
|
||||
tx.Remarks.forEach((remark: Remark) => {
|
||||
if (typeof remark.Remark.Flags === 'object') {
|
||||
remark.Remark.Flags = convertFlagsToNumber(
|
||||
remark.Remark.Flags,
|
||||
RemarkFlags,
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (tx.Flags == null) {
|
||||
tx.Flags = 0
|
||||
return
|
||||
@@ -68,25 +99,6 @@ export function setTransactionFlagsToNumber(tx: Transaction): void {
|
||||
return
|
||||
}
|
||||
|
||||
if (tx.TransactionType === 'SetHook') {
|
||||
tx.Flags = convertFlagsToNumber(tx.Flags, SetHookFlags)
|
||||
tx.Hooks.forEach((hook: Hook) => {
|
||||
hook.Hook.Flags = convertFlagsToNumber(
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- idk
|
||||
hook.Hook.Flags as SetHookFlagsInterface,
|
||||
SetHookFlags,
|
||||
)
|
||||
})
|
||||
} else if (tx.TransactionType === 'SetRemarks') {
|
||||
tx.Remarks.forEach((remark: Remark) => {
|
||||
remark.Remark.Flags = convertFlagsToNumber(
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- idk
|
||||
remark.Remark.Flags as RemarkFlagsInterface,
|
||||
RemarkFlags,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
tx.Flags = txToFlag[tx.TransactionType]
|
||||
? convertFlagsToNumber(tx.Flags, txToFlag[tx.TransactionType])
|
||||
: 0
|
||||
|
||||
@@ -199,4 +199,28 @@ export function hashURIToken(issuer: string, uri: string): string {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the Hash of a Cron LedgerEntry.
|
||||
*
|
||||
* @param owner - Account of the Cron.
|
||||
* @param time - Time of the Cron.
|
||||
* @returns Hash of the Cron.
|
||||
* @category Utilities
|
||||
*/
|
||||
export function hashCron(owner: string, time: number): string {
|
||||
const timeString = bytesToHex([
|
||||
(time >> 24) & 0xff,
|
||||
(time >> 16) & 0xff,
|
||||
(time >> 8) & 0xff,
|
||||
(time >> 0) & 0xff,
|
||||
])
|
||||
|
||||
const nsHash = sha512Half(ledgerSpaceHex('cron')).slice(0, 16)
|
||||
const accHash = sha512Half(
|
||||
ledgerSpaceHex('cron') + timeString + addressToHex(owner),
|
||||
).slice(0, 40)
|
||||
|
||||
return nsHash + timeString + accHash
|
||||
}
|
||||
|
||||
export { hashLedgerHeader, hashSignedTx, hashLedger, hashStateTree, hashTxTree }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* XAH Ledger namespace prefixes.
|
||||
* Xahau Network namespace prefixes.
|
||||
*
|
||||
* The XAH Ledger is a key-value store. In order to avoid name collisions,
|
||||
* The Xahau Network is a key-value store. In order to avoid name collisions,
|
||||
* names are partitioned into namespaces.
|
||||
*
|
||||
* Each namespace is just a single character prefix.
|
||||
@@ -30,6 +30,7 @@ const ledgerSpaces = {
|
||||
check: 'C',
|
||||
depositPreauth: 'p',
|
||||
uriToken: 'U',
|
||||
cron: 'L',
|
||||
}
|
||||
|
||||
export default ledgerSpaces
|
||||
|
||||
@@ -117,6 +117,7 @@ describe('server_info (xahaud)', function () {
|
||||
'time',
|
||||
'uptime',
|
||||
'complete_ledgers',
|
||||
'complete_ledgers_pinned',
|
||||
'hostid',
|
||||
'load',
|
||||
'state_accounting',
|
||||
|
||||
@@ -105,6 +105,7 @@ describe('server_state', function () {
|
||||
|
||||
const removeKeys = [
|
||||
'complete_ledgers',
|
||||
'complete_ledgers_pinned',
|
||||
'load',
|
||||
'state_accounting',
|
||||
'pubkey_node',
|
||||
|
||||
115
packages/xahau/test/integration/transactions/clawback.test.ts
Normal file
115
packages/xahau/test/integration/transactions/clawback.test.ts
Normal file
@@ -0,0 +1,115 @@
|
||||
import { assert } from 'chai'
|
||||
|
||||
import {
|
||||
AccountSet,
|
||||
AccountSetAsfFlags,
|
||||
TrustSet,
|
||||
Payment,
|
||||
Clawback,
|
||||
} from '../../../src'
|
||||
import serverUrl from '../serverUrl'
|
||||
import {
|
||||
setupClient,
|
||||
teardownClient,
|
||||
type XrplIntegrationTestContext,
|
||||
} from '../setup'
|
||||
import { generateFundedWallet, testTransaction } from '../utils'
|
||||
|
||||
// how long before each test case times out
|
||||
const TIMEOUT = 20000
|
||||
|
||||
describe('Clawback', function () {
|
||||
let testContext: XrplIntegrationTestContext
|
||||
|
||||
beforeEach(async () => {
|
||||
testContext = await setupClient(serverUrl)
|
||||
})
|
||||
afterEach(async () => teardownClient(testContext))
|
||||
|
||||
it(
|
||||
'base',
|
||||
async () => {
|
||||
const wallet2 = await generateFundedWallet(testContext.client)
|
||||
|
||||
const setupAccountSetTx: AccountSet = {
|
||||
TransactionType: 'AccountSet',
|
||||
Account: testContext.wallet.classicAddress,
|
||||
SetFlag: AccountSetAsfFlags.asfAllowTrustLineClawback,
|
||||
}
|
||||
await testTransaction(
|
||||
testContext.client,
|
||||
setupAccountSetTx,
|
||||
testContext.wallet,
|
||||
)
|
||||
|
||||
const setupTrustSetTx: TrustSet = {
|
||||
TransactionType: 'TrustSet',
|
||||
Account: wallet2.classicAddress,
|
||||
LimitAmount: {
|
||||
currency: 'USD',
|
||||
issuer: testContext.wallet.classicAddress,
|
||||
value: '1000',
|
||||
},
|
||||
}
|
||||
await testTransaction(testContext.client, setupTrustSetTx, wallet2)
|
||||
|
||||
const setupPaymentTx: Payment = {
|
||||
TransactionType: 'Payment',
|
||||
Account: testContext.wallet.classicAddress,
|
||||
Destination: wallet2.classicAddress,
|
||||
Amount: {
|
||||
currency: 'USD',
|
||||
issuer: testContext.wallet.classicAddress,
|
||||
value: '1000',
|
||||
},
|
||||
}
|
||||
await testTransaction(
|
||||
testContext.client,
|
||||
setupPaymentTx,
|
||||
testContext.wallet,
|
||||
)
|
||||
|
||||
// verify that line is created
|
||||
const objectsResponse = await testContext.client.request({
|
||||
command: 'account_objects',
|
||||
account: wallet2.classicAddress,
|
||||
type: 'state',
|
||||
})
|
||||
assert.lengthOf(
|
||||
objectsResponse.result.account_objects,
|
||||
1,
|
||||
'Should be exactly one line on the ledger',
|
||||
)
|
||||
|
||||
// actual test - clawback
|
||||
const tx: Clawback = {
|
||||
TransactionType: 'Clawback',
|
||||
Account: testContext.wallet.classicAddress,
|
||||
Amount: {
|
||||
currency: 'USD',
|
||||
issuer: wallet2.classicAddress,
|
||||
value: '500',
|
||||
},
|
||||
}
|
||||
await testTransaction(testContext.client, tx, testContext.wallet)
|
||||
|
||||
// verify amount clawed back
|
||||
const linesResponse = await testContext.client.request({
|
||||
command: 'account_lines',
|
||||
account: wallet2.classicAddress,
|
||||
})
|
||||
|
||||
assert.lengthOf(
|
||||
linesResponse.result.lines,
|
||||
1,
|
||||
'Should be exactly one line on the ledger',
|
||||
)
|
||||
assert.equal(
|
||||
'500',
|
||||
linesResponse.result.lines[0].balance,
|
||||
`Holder balance incorrect after Clawback`,
|
||||
)
|
||||
},
|
||||
TIMEOUT,
|
||||
)
|
||||
})
|
||||
@@ -1,24 +1,36 @@
|
||||
import { assert } from 'chai'
|
||||
|
||||
import { OfferCreate } from '../../../src'
|
||||
import { OfferCreate, TrustSet, Wallet } from '../../../src'
|
||||
import serverUrl from '../serverUrl'
|
||||
import {
|
||||
setupClient,
|
||||
teardownClient,
|
||||
type XrplIntegrationTestContext,
|
||||
} from '../setup'
|
||||
import { testTransaction } from '../utils'
|
||||
import {
|
||||
testTransaction,
|
||||
generateFundedWallet,
|
||||
submitTransaction,
|
||||
} from '../utils'
|
||||
|
||||
// how long before each test case times out
|
||||
const TIMEOUT = 20000
|
||||
|
||||
describe('OfferCreate', function () {
|
||||
let testContext: XrplIntegrationTestContext
|
||||
let wallet_deep_freeze_trustline: Wallet | undefined
|
||||
|
||||
beforeEach(async () => {
|
||||
beforeAll(async () => {
|
||||
testContext = await setupClient(serverUrl)
|
||||
if (!wallet_deep_freeze_trustline) {
|
||||
// eslint-disable-next-line require-atomic-updates -- race condition doesn't really matter
|
||||
wallet_deep_freeze_trustline = await generateFundedWallet(
|
||||
testContext.client,
|
||||
)
|
||||
}
|
||||
})
|
||||
afterEach(async () => teardownClient(testContext))
|
||||
|
||||
afterAll(async () => teardownClient(testContext))
|
||||
|
||||
it(
|
||||
'base',
|
||||
@@ -49,4 +61,52 @@ describe('OfferCreate', function () {
|
||||
},
|
||||
TIMEOUT,
|
||||
)
|
||||
|
||||
it(
|
||||
'OfferCreate with Deep-Frozen trustline must fail',
|
||||
async () => {
|
||||
assert(wallet_deep_freeze_trustline != null)
|
||||
|
||||
// deep-freeze the trust line
|
||||
const trust_set_tx: TrustSet = {
|
||||
TransactionType: 'TrustSet',
|
||||
Account: testContext.wallet.classicAddress,
|
||||
LimitAmount: {
|
||||
currency: 'USD',
|
||||
issuer: wallet_deep_freeze_trustline.classicAddress,
|
||||
value: '10',
|
||||
},
|
||||
Flags: {
|
||||
tfSetFreeze: true,
|
||||
tfSetDeepFreeze: true,
|
||||
},
|
||||
}
|
||||
|
||||
await testTransaction(
|
||||
testContext.client,
|
||||
trust_set_tx,
|
||||
testContext.wallet,
|
||||
)
|
||||
|
||||
const offer_create_tx: OfferCreate = {
|
||||
TransactionType: 'OfferCreate',
|
||||
Account: testContext.wallet.classicAddress,
|
||||
TakerGets: '13100000',
|
||||
TakerPays: {
|
||||
currency: 'USD',
|
||||
issuer: wallet_deep_freeze_trustline.classicAddress,
|
||||
value: '10',
|
||||
},
|
||||
}
|
||||
|
||||
const response = await submitTransaction({
|
||||
client: testContext.client,
|
||||
transaction: offer_create_tx,
|
||||
wallet: testContext.wallet,
|
||||
})
|
||||
|
||||
assert.equal(response.result.engine_result, 'tecFROZEN')
|
||||
},
|
||||
TIMEOUT,
|
||||
)
|
||||
})
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { stringToHex } from '@xrplf/isomorphic/src/utils'
|
||||
import { stringToHex } from '@xrplf/isomorphic/utils'
|
||||
|
||||
import { Remit } from '../../../src'
|
||||
import serverUrl from '../serverUrl'
|
||||
@@ -65,6 +65,9 @@ describe('Remit', function () {
|
||||
Destination: wallet2.classicAddress,
|
||||
MintURIToken: {
|
||||
URI: stringToHex('https://example.com'),
|
||||
Flags: {
|
||||
tfBurnable: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import { assert } from 'chai'
|
||||
|
||||
import { TrustSet, percentToQuality, Wallet } from '../../../src'
|
||||
import { RippleState } from '../../../src/models/ledger/index'
|
||||
import { RippleStateFlags } from '../../../src/models/ledger/RippleState'
|
||||
import serverUrl from '../serverUrl'
|
||||
import {
|
||||
setupClient,
|
||||
@@ -85,4 +87,60 @@ describe('TrustSet', function () {
|
||||
},
|
||||
TIMEOUT,
|
||||
)
|
||||
|
||||
it(
|
||||
'Create a Deep-Frozen trustline',
|
||||
async () => {
|
||||
assert(wallet2 != null)
|
||||
// deep-freeze a trustline with the specified counter-party/currency-code
|
||||
const tx: TrustSet = {
|
||||
TransactionType: 'TrustSet',
|
||||
Account: testContext.wallet.classicAddress,
|
||||
LimitAmount: {
|
||||
currency: 'USD',
|
||||
issuer: wallet2.classicAddress,
|
||||
value: '10',
|
||||
},
|
||||
Flags: {
|
||||
tfSetFreeze: true,
|
||||
tfSetDeepFreeze: true,
|
||||
},
|
||||
}
|
||||
|
||||
const response = await testTransaction(
|
||||
testContext.client,
|
||||
tx,
|
||||
testContext.wallet,
|
||||
)
|
||||
assert.equal(response.result.engine_result, 'tesSUCCESS')
|
||||
|
||||
// assert that the trustline is frozen
|
||||
const trustLine = await testContext.client.request({
|
||||
command: 'account_lines',
|
||||
account: testContext.wallet.classicAddress,
|
||||
})
|
||||
assert.equal(trustLine.result.lines[0].freeze, true)
|
||||
|
||||
// verify that the trust-line is deep-frozen
|
||||
// this operation cannot be done with the account_lines RPC
|
||||
const account_objects = await testContext.client.request({
|
||||
command: 'account_objects',
|
||||
account: testContext.wallet.classicAddress,
|
||||
})
|
||||
|
||||
const rippleState = account_objects.result
|
||||
.account_objects[0] as RippleState
|
||||
|
||||
// Depending on the pseudo-random generation of accounts,
|
||||
// either of the below leger-object flags must be set
|
||||
|
||||
const hasDeepFreeze =
|
||||
// eslint-disable-next-line no-bitwise -- required to validate flag
|
||||
(rippleState.Flags & RippleStateFlags.lsfHighDeepFreeze) |
|
||||
// eslint-disable-next-line no-bitwise -- required to validate flag
|
||||
(rippleState.Flags & RippleStateFlags.lsfLowDeepFreeze)
|
||||
assert.isTrue(hasDeepFreeze !== 0)
|
||||
},
|
||||
TIMEOUT,
|
||||
)
|
||||
})
|
||||
|
||||
@@ -163,4 +163,43 @@ describe('AccountSet', function () {
|
||||
'AccountSet: invalid field NFTokenMinter',
|
||||
)
|
||||
})
|
||||
|
||||
it(`throws w/ invalid HookStateScale`, function () {
|
||||
account.HookStateScale = ''
|
||||
|
||||
assert.throws(
|
||||
() => validateAccountSet(account),
|
||||
ValidationError,
|
||||
'AccountSet: invalid field HookStateScale',
|
||||
)
|
||||
assert.throws(
|
||||
() => validate(account),
|
||||
ValidationError,
|
||||
'AccountSet: invalid field HookStateScale',
|
||||
)
|
||||
|
||||
account.HookStateScale = 17
|
||||
assert.throws(
|
||||
() => validateAccountSet(account),
|
||||
ValidationError,
|
||||
'AccountSet: HookStateScale must be less than or equal to 16',
|
||||
)
|
||||
assert.throws(
|
||||
() => validate(account),
|
||||
ValidationError,
|
||||
'AccountSet: HookStateScale must be less than or equal to 16',
|
||||
)
|
||||
|
||||
account.HookStateScale = 0
|
||||
assert.throws(
|
||||
() => validateAccountSet(account),
|
||||
ValidationError,
|
||||
'AccountSet: HookStateScale must be greater than or equal to 1',
|
||||
)
|
||||
assert.throws(
|
||||
() => validate(account),
|
||||
ValidationError,
|
||||
'AccountSet: HookStateScale must be greater than or equal to 1',
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
81
packages/xahau/test/models/clawback.test.ts
Normal file
81
packages/xahau/test/models/clawback.test.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import { assert } from 'chai'
|
||||
|
||||
import { validate, ValidationError } from '../../src'
|
||||
|
||||
/**
|
||||
* Clawback Transaction Verification Testing.
|
||||
*
|
||||
* Providing runtime verification testing for each specific transaction type.
|
||||
*/
|
||||
describe('Clawback', function () {
|
||||
it(`verifies valid Clawback`, function () {
|
||||
const validClawback = {
|
||||
TransactionType: 'Clawback',
|
||||
Amount: {
|
||||
currency: 'DSH',
|
||||
issuer: 'rcXY84C4g14iFp6taFXjjQGVeHqSCh9RX',
|
||||
value: '43.11584856965009',
|
||||
},
|
||||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm',
|
||||
} as any
|
||||
|
||||
assert.doesNotThrow(() => validate(validClawback))
|
||||
})
|
||||
|
||||
it(`throws w/ missing Amount`, function () {
|
||||
const missingAmount = {
|
||||
TransactionType: 'Clawback',
|
||||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validate(missingAmount),
|
||||
ValidationError,
|
||||
'Clawback: missing field Amount',
|
||||
)
|
||||
})
|
||||
|
||||
it(`throws w/ invalid Amount`, function () {
|
||||
const invalidAmount = {
|
||||
TransactionType: 'Clawback',
|
||||
Amount: 100000000,
|
||||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validate(invalidAmount),
|
||||
ValidationError,
|
||||
'Clawback: invalid Amount',
|
||||
)
|
||||
|
||||
const invalidStrAmount = {
|
||||
TransactionType: 'Clawback',
|
||||
Amount: '1234',
|
||||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validate(invalidStrAmount),
|
||||
ValidationError,
|
||||
'Clawback: invalid Amount',
|
||||
)
|
||||
})
|
||||
|
||||
it(`throws w/ invalid holder Account`, function () {
|
||||
const invalidAccount = {
|
||||
TransactionType: 'Clawback',
|
||||
Amount: {
|
||||
currency: 'DSH',
|
||||
issuer: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm',
|
||||
value: '43.11584856965009',
|
||||
},
|
||||
Account: 'rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validate(invalidAccount),
|
||||
ValidationError,
|
||||
'Clawback: invalid holder Account',
|
||||
)
|
||||
})
|
||||
})
|
||||
121
packages/xahau/test/models/cronSet.test.ts
Normal file
121
packages/xahau/test/models/cronSet.test.ts
Normal file
@@ -0,0 +1,121 @@
|
||||
import { assert } from 'chai'
|
||||
|
||||
import {
|
||||
setTransactionFlagsToNumber,
|
||||
validate,
|
||||
ValidationError,
|
||||
} from '../../src'
|
||||
import {
|
||||
CronSetFlags,
|
||||
validateCronSet,
|
||||
} from '../../src/models/transactions/cronSet'
|
||||
|
||||
/**
|
||||
* CronSet Transaction Verification Testing.
|
||||
*
|
||||
* Providing runtime verification testing for each specific transaction type.
|
||||
*/
|
||||
describe('CronSet', function () {
|
||||
it(`verifies valid CronSet`, function () {
|
||||
let validCronSet = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Fee: '100',
|
||||
RepeatCount: 256,
|
||||
DelaySeconds: 365 * 24 * 60 * 60,
|
||||
StartTime: 0,
|
||||
} as any
|
||||
|
||||
assert.doesNotThrow(() => validateCronSet(validCronSet))
|
||||
assert.doesNotThrow(() => validate(validCronSet))
|
||||
|
||||
validCronSet = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Fee: '100',
|
||||
Flags: CronSetFlags.tfCronUnset,
|
||||
} as any
|
||||
|
||||
assert.doesNotThrow(() => validateCronSet(validCronSet))
|
||||
assert.doesNotThrow(() => validate(validCronSet))
|
||||
|
||||
validCronSet = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Fee: '100',
|
||||
Flags: { tfCronUnset: true },
|
||||
} as any
|
||||
|
||||
assert.doesNotThrow(() => {
|
||||
setTransactionFlagsToNumber(validCronSet)
|
||||
validateCronSet(validCronSet)
|
||||
})
|
||||
assert.doesNotThrow(() => validate(validCronSet))
|
||||
})
|
||||
|
||||
it(`throws w/ invalid Delete Operation`, function () {
|
||||
const invalidDeleteOperation = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Flags: CronSetFlags.tfCronUnset,
|
||||
RepeatCount: 1,
|
||||
DelaySeconds: 1,
|
||||
StartTime: 1,
|
||||
Fee: '100',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validateCronSet(invalidDeleteOperation),
|
||||
ValidationError,
|
||||
'CronSet: RepeatCount, DelaySeconds, and StartTime must not be set when Flags is set to tfCronUnset',
|
||||
)
|
||||
assert.throws(
|
||||
() => validate(invalidDeleteOperation),
|
||||
ValidationError,
|
||||
'CronSet: RepeatCount, DelaySeconds, and StartTime must not be set when Flags is set to tfCronUnset',
|
||||
)
|
||||
})
|
||||
|
||||
it(`throws w/ invalid RepeatCount`, function () {
|
||||
const invalidRepeatCount = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
RepeatCount: 257,
|
||||
StartTime: 1,
|
||||
DelaySeconds: 1,
|
||||
Fee: '100',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validateCronSet(invalidRepeatCount),
|
||||
ValidationError,
|
||||
'CronSet: RepeatCount must be less than 256',
|
||||
)
|
||||
assert.throws(
|
||||
() => validate(invalidRepeatCount),
|
||||
ValidationError,
|
||||
'CronSet: RepeatCount must be less than 256',
|
||||
)
|
||||
})
|
||||
it(`throws w/ invalid DelaySeconds`, function () {
|
||||
const invalidDelaySeconds = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
DelaySeconds: 365 * 24 * 60 * 60 + 1,
|
||||
StartTime: 1,
|
||||
RepeatCount: 1,
|
||||
Fee: '100',
|
||||
} as any
|
||||
|
||||
assert.throws(
|
||||
() => validateCronSet(invalidDelaySeconds),
|
||||
ValidationError,
|
||||
`CronSet: DelaySeconds must be less than ${365 * 24 * 60 * 60}`,
|
||||
)
|
||||
assert.throws(
|
||||
() => validate(invalidDelaySeconds),
|
||||
ValidationError,
|
||||
`CronSet: DelaySeconds must be less than ${365 * 24 * 60 * 60}`,
|
||||
)
|
||||
})
|
||||
})
|
||||
@@ -24,9 +24,11 @@ describe('SetHook', function () {
|
||||
'0061736D01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E02230303656E76057472616365000003656E7606616363657074000103656E76025F670002030201030503010002062B077F0141B088040B7F004180080B7F0041A6080B7F004180080B7F0041B088040B7F0041000B7F0041010B07080104686F6F6B00030AC4800001C0800001017F230041106B220124002001200036020C41920841134180084112410010001A410022002000420010011A41012200200010021A200141106A240042000B0B2C01004180080B254163636570742E633A2043616C6C65642E00224163636570742E633A2043616C6C65642E22',
|
||||
HookOn:
|
||||
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFF7',
|
||||
Flags: {
|
||||
hsfOverride: true,
|
||||
},
|
||||
HookCanEmit:
|
||||
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFF7',
|
||||
Flags: 1,
|
||||
HookApiVersion: 0,
|
||||
HookNamespace:
|
||||
'4FF9961269BF7630D32E15276569C94470174A5DA79FA567C0F62251AA9A36B9',
|
||||
|
||||
@@ -22,6 +22,11 @@ describe('TrustSet', function () {
|
||||
},
|
||||
QualityIn: 1234,
|
||||
QualityOut: 4321,
|
||||
// an example of deep-frozen trustline
|
||||
Flags: {
|
||||
tfSetFreeze: true,
|
||||
tfSetDeepFreeze: true,
|
||||
},
|
||||
} as any
|
||||
})
|
||||
|
||||
|
||||
@@ -11,7 +11,17 @@ import {
|
||||
PaymentFlags,
|
||||
TrustSet,
|
||||
TrustSetFlags,
|
||||
Remit,
|
||||
convertStringToHex,
|
||||
SetHook,
|
||||
URITokenMint,
|
||||
URITokenMintFlags,
|
||||
ClaimReward,
|
||||
ClaimRewardFlags,
|
||||
CronSet,
|
||||
CronSetFlags,
|
||||
} from '../../src'
|
||||
import { HookFlags, MintURITokenFlags } from '../../src/models/common/xahau'
|
||||
import { AccountRootFlags } from '../../src/models/ledger'
|
||||
import { isFlagEnabled } from '../../src/models/utils'
|
||||
import {
|
||||
@@ -141,6 +151,94 @@ describe('Models Utils', function () {
|
||||
assert.strictEqual(tx.Flags, expected)
|
||||
})
|
||||
|
||||
it('sets URITokenMintFlags to its numeric value', function () {
|
||||
const tx: URITokenMint = {
|
||||
TransactionType: 'URITokenMint',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
URI: convertStringToHex('https://xahau.network'),
|
||||
Flags: {
|
||||
tfBurnable: true,
|
||||
},
|
||||
}
|
||||
const { tfBurnable } = URITokenMintFlags
|
||||
const expected: number = tfBurnable
|
||||
|
||||
setTransactionFlagsToNumber(tx)
|
||||
assert.strictEqual(tx.Flags, expected)
|
||||
})
|
||||
|
||||
it('sets ClaimRewardFlags to its numeric value', function () {
|
||||
const tx: ClaimReward = {
|
||||
TransactionType: 'ClaimReward',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Flags: {
|
||||
tfOptOut: true,
|
||||
},
|
||||
}
|
||||
const { tfOptOut } = ClaimRewardFlags
|
||||
const expected: number = tfOptOut
|
||||
|
||||
setTransactionFlagsToNumber(tx)
|
||||
assert.strictEqual(tx.Flags, expected)
|
||||
})
|
||||
|
||||
it('sets CronSetFlags to its numeric value', function () {
|
||||
const tx: CronSet = {
|
||||
TransactionType: 'CronSet',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Flags: {
|
||||
tfCronUnset: true,
|
||||
},
|
||||
}
|
||||
const { tfCronUnset } = CronSetFlags
|
||||
const expected: number = tfCronUnset
|
||||
|
||||
setTransactionFlagsToNumber(tx)
|
||||
assert.strictEqual(tx.Flags, expected)
|
||||
})
|
||||
|
||||
it('sets MintURITokenFlags in Remit Transaction to its numeric value', function () {
|
||||
const tx: Remit = {
|
||||
TransactionType: 'Remit',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Destination: 'rcXY84C4g14iFp6taFXjjQGVeHqSCh9RX',
|
||||
MintURIToken: {
|
||||
URI: convertStringToHex('https://xahau.network'),
|
||||
Flags: {
|
||||
tfBurnable: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
setTransactionFlagsToNumber(tx)
|
||||
const expected = MintURITokenFlags.tfBurnable
|
||||
assert.strictEqual(tx.MintURIToken?.Flags, expected)
|
||||
})
|
||||
|
||||
it('sets HookFlags in SetHook Transaction to its numeric value', function () {
|
||||
const tx: SetHook = {
|
||||
TransactionType: 'SetHook',
|
||||
Account: 'rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo',
|
||||
Hooks: [
|
||||
{
|
||||
Hook: {
|
||||
// invalid flags but for testing purposes
|
||||
Flags: {
|
||||
hsfCollect: true,
|
||||
hsfNSDelete: true,
|
||||
hsfOverride: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
setTransactionFlagsToNumber(tx)
|
||||
const expected =
|
||||
HookFlags.hsfCollect | HookFlags.hsfNSDelete | HookFlags.hsfOverride
|
||||
assert.strictEqual(tx.Hooks[0].Hook.Flags, expected)
|
||||
})
|
||||
|
||||
it('sets other transaction types flags to its numeric value', function () {
|
||||
const tx: DepositPreauth = {
|
||||
TransactionType: 'DepositPreauth',
|
||||
@@ -168,7 +266,8 @@ describe('Models Utils', function () {
|
||||
AccountRootFlags.lsfDisallowIncomingCheck |
|
||||
AccountRootFlags.lsfDisallowIncomingPayChan |
|
||||
AccountRootFlags.lsfDisallowIncomingTrustline |
|
||||
AccountRootFlags.lsfDisallowIncomingRemit
|
||||
AccountRootFlags.lsfDisallowIncomingRemit |
|
||||
AccountRootFlags.lsfAllowTrustLineClawback
|
||||
|
||||
const parsed = parseAccountRootFlags(accountRootFlags)
|
||||
|
||||
@@ -186,7 +285,8 @@ describe('Models Utils', function () {
|
||||
parsed.lsfDisallowIncomingCheck &&
|
||||
parsed.lsfDisallowIncomingPayChan &&
|
||||
parsed.lsfDisallowIncomingTrustline &&
|
||||
parsed.lsfDisallowIncomingRemit,
|
||||
parsed.lsfDisallowIncomingRemit &&
|
||||
parsed.lsfAllowTrustLineClawback,
|
||||
)
|
||||
})
|
||||
|
||||
@@ -207,6 +307,7 @@ describe('Models Utils', function () {
|
||||
assert.isUndefined(parsed.lsfDisallowIncomingPayChan)
|
||||
assert.isUndefined(parsed.lsfDisallowIncomingTrustline)
|
||||
assert.isUndefined(parsed.lsfDisallowIncomingRemit)
|
||||
assert.isUndefined(parsed.lsfAllowTrustLineClawback)
|
||||
})
|
||||
|
||||
it('parseTransactionFlags all enabled', function () {
|
||||
|
||||
@@ -20,6 +20,7 @@ import {
|
||||
hashAccountRoot,
|
||||
hashOfferId,
|
||||
hashSignerListId,
|
||||
hashCron,
|
||||
} from '../../src/utils/hashes'
|
||||
import fixtures from '../fixtures/xahaud'
|
||||
import { assertResultMatch } from '../testUtils'
|
||||
@@ -148,6 +149,15 @@ describe('Hashes', function () {
|
||||
assert.equal(actualEntryHash, expectedEntryHash)
|
||||
})
|
||||
|
||||
it('calcCronEntryHash', function () {
|
||||
const owner = 'rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn'
|
||||
const time = 30758410
|
||||
const expectedEntryHash =
|
||||
'F7B645436187CC6101D5560AF1127C15262825333ADC45B3155918D98149BD3F'
|
||||
const actualEntryHash = hashCron(owner, time)
|
||||
assert.equal(actualEntryHash, expectedEntryHash)
|
||||
})
|
||||
|
||||
it('Hash a signed transaction correctly', function () {
|
||||
const expected_hash =
|
||||
'458101D51051230B1D56E9ACAFAA34451BF65FA000F95DF6F0FF5B3A62D83FC2'
|
||||
|
||||
@@ -48,7 +48,7 @@ module.exports = {
|
||||
const localConfig = merge(config, {
|
||||
mode: "production",
|
||||
output: {
|
||||
filename: `${filename}-latest.min.js`,
|
||||
filename: `${filename}-latest-min.js`,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user