mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-05 13:25:48 +00:00
Compare commits
93 Commits
@transia/x
...
@transia/x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ae372bb08 | ||
|
|
63238773ea | ||
|
|
4aacb1160a | ||
|
|
445d0c6633 | ||
|
|
501d3158a0 | ||
|
|
e27943aa3a | ||
|
|
c7aafb2595 | ||
|
|
036312d361 | ||
|
|
3467680506 | ||
|
|
f209126364 | ||
|
|
33a8b3679a | ||
|
|
572aaa7a40 | ||
|
|
b6c11d1df8 | ||
|
|
526d1e7686 | ||
|
|
3c668f41b8 | ||
|
|
aeb29a20a1 | ||
|
|
8c814482e5 | ||
|
|
5b57ea8b77 | ||
|
|
7663e6049f | ||
|
|
420d6b2c35 | ||
|
|
02c41d2eb1 | ||
|
|
3f1a54f018 | ||
|
|
ac865e472e | ||
|
|
60c97901d2 | ||
|
|
3b234ec8ec | ||
|
|
c7a001e7e9 | ||
|
|
e24cbccc2b | ||
|
|
53310f699a | ||
|
|
46de80131a | ||
|
|
7981faf92f | ||
|
|
0cf024cab1 | ||
|
|
ab34fbeced | ||
|
|
254ac23893 | ||
|
|
68cfcac284 | ||
|
|
7550476b1a | ||
|
|
39d0a04c22 | ||
|
|
edc11a1f88 | ||
|
|
7c81f14ebf | ||
|
|
37b4848023 | ||
|
|
2de5da180e | ||
|
|
659c5c7a22 | ||
|
|
b2b6cb6804 | ||
|
|
3405bceed4 | ||
|
|
bbfd0ff242 | ||
|
|
b1b33794e0 | ||
|
|
7ef8b696f8 | ||
|
|
184ef89ea5 | ||
|
|
3182671df5 | ||
|
|
5ad3d963f6 | ||
|
|
2a35ac24c9 | ||
|
|
be156c9091 | ||
|
|
cb3e24a497 | ||
|
|
cfbc46ee25 | ||
|
|
54681cf821 | ||
|
|
701d1fb209 | ||
|
|
57f1168d8c | ||
|
|
63b01812b6 | ||
|
|
cc67c6efd6 | ||
|
|
454ab81bd7 | ||
|
|
4dd8ac243f | ||
|
|
9cdbd6347b | ||
|
|
abca119eae | ||
|
|
0a60836f68 | ||
|
|
2bad85b626 | ||
|
|
117e682f47 | ||
|
|
dc09dae851 | ||
|
|
32fba22240 | ||
|
|
f4c244ec0a | ||
|
|
e1c80b5ede | ||
|
|
10ea540984 | ||
|
|
77e475ae2d | ||
|
|
3e929eff56 | ||
|
|
f570b89d71 | ||
|
|
29b718b52e | ||
|
|
b127b2e616 | ||
|
|
f85f35cb4d | ||
|
|
f292d9e716 | ||
|
|
c167b3a22d | ||
|
|
baae6b9a9a | ||
|
|
25ab1d08fc | ||
|
|
9a0e2aa8f8 | ||
|
|
8779ef41d7 | ||
|
|
606babe01a | ||
|
|
4fbd5383c4 | ||
|
|
a97c7bb21b | ||
|
|
c00e36bf50 | ||
|
|
c24197f202 | ||
|
|
d50417acbc | ||
|
|
f8b7c6ab15 | ||
|
|
4447a7af09 | ||
|
|
678c5f5fda | ||
|
|
6264c5f3f7 | ||
|
|
62a39c69ce |
6
.github/workflows/codeql-analysis.yml
vendored
6
.github/workflows/codeql-analysis.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -64,4 +64,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
uses: github/codeql-action/analyze@v2
|
||||
|
||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -29,7 +29,7 @@
|
||||
"enable": true
|
||||
},
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": true
|
||||
"source.fixAll.eslint": "explicit"
|
||||
},
|
||||
"files.insertFinalNewline": true,
|
||||
"files.trimFinalNewlines": true,
|
||||
|
||||
@@ -32,19 +32,19 @@ All of which works in Node.js (tested for v14+) & web browsers (tested for Chrom
|
||||
In an existing project (with package.json), install xrpl.js with:
|
||||
|
||||
```
|
||||
$ npm install --save xrpl
|
||||
$ npm install --save @transia/xrpl
|
||||
```
|
||||
|
||||
Or with `yarn`:
|
||||
|
||||
```
|
||||
$ yarn add xrpl
|
||||
$ yarn add @transia/xrpl
|
||||
```
|
||||
|
||||
Example usage:
|
||||
|
||||
```js
|
||||
const xrpl = require("xrpl");
|
||||
const xrpl = require("@transia/xrpl");
|
||||
async function main() {
|
||||
const client = new xrpl.Client("wss://s.altnet.rippletest.net:51233");
|
||||
await client.connect();
|
||||
|
||||
4294
package-lock.json
generated
4294
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -13,10 +13,10 @@
|
||||
"update:confirm": "npx npm-check-updates --configFileName .ncurc.json -u"
|
||||
},
|
||||
"dependencies": {
|
||||
"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"
|
||||
"@transia/ripple-address-codec": "file:packages/ripple-address-codec",
|
||||
"@transia/ripple-binary-codec": "file:packages/ripple-binary-codec",
|
||||
"@transia/ripple-keypairs": "file:packages/ripple-keypairs",
|
||||
"@transia/xrpl": "file:packages/xrpl"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/brorand": "^1.0.30",
|
||||
|
||||
4
packages/ripple-address-codec/package-lock.json
generated
4
packages/ripple-address-codec/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "ripple-address-codec",
|
||||
"version": "4.2.5",
|
||||
"version": "4.2.8-alpha.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "ripple-address-codec",
|
||||
"version": "4.2.4",
|
||||
"version": "4.2.8-alpha.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"base-x": "^3.0.9",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ripple-address-codec",
|
||||
"version": "4.2.5",
|
||||
"name": "@transia/ripple-address-codec",
|
||||
"version": "4.2.8-alpha.0",
|
||||
"description": "encodes/decodes base58 encoded XRP Ledger identifiers",
|
||||
"files": [
|
||||
"dist/*",
|
||||
@@ -15,7 +15,7 @@
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:XRPLF/xrpl.js.git"
|
||||
"url": "git@github.com/Transia-RnD/xrpl.js/tree/beta"
|
||||
},
|
||||
"prepublish": "tsc -b",
|
||||
"prepublishOnly": "tslint -b ./ && jest",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ripple-binary-codec",
|
||||
"version": "1.4.3",
|
||||
"name": "@transia/ripple-binary-codec",
|
||||
"version": "1.4.6-alpha.9",
|
||||
"description": "XRP Ledger binary codec",
|
||||
"files": [
|
||||
"dist/*",
|
||||
@@ -12,12 +12,12 @@
|
||||
"test": "test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@transia/ripple-address-codec": "^4.2.8-alpha.0",
|
||||
"assert": "^2.0.0",
|
||||
"big-integer": "^1.6.48",
|
||||
"buffer": "5.6.0",
|
||||
"create-hash": "^1.2.0",
|
||||
"decimal.js": "^10.2.0",
|
||||
"ripple-address-codec": "^4.2.5"
|
||||
"decimal.js": "^10.2.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc -b && copyfiles ./src/enums/definitions.json ./dist/enums/",
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:XRPLF/xrpl.js.git"
|
||||
"url": "git@github.com/Transia-RnD/xrpl.js/tree/beta"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/XRPLF/xrpl.js/issues"
|
||||
|
||||
@@ -15,6 +15,7 @@ import { STObject } from './types/st-object'
|
||||
import { JsonObject } from './types/serialized-type'
|
||||
import { Buffer } from 'buffer/'
|
||||
import bigInt = require('big-integer')
|
||||
import { AmountObject } from './types/amount'
|
||||
|
||||
/**
|
||||
* Construct a BinaryParser
|
||||
@@ -122,7 +123,7 @@ function signingData(
|
||||
*/
|
||||
interface ClaimObject extends JsonObject {
|
||||
channel: string
|
||||
amount: string | number
|
||||
amount: AmountObject
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,16 +134,19 @@ interface ClaimObject extends JsonObject {
|
||||
* @returns the serialized object with appropriate prefix
|
||||
*/
|
||||
function signingClaimData(claim: ClaimObject): Buffer {
|
||||
const num = bigInt(String(claim.amount))
|
||||
const prefix = HashPrefix.paymentChannelClaim
|
||||
const channel = coreTypes.Hash256.from(claim.channel).toBytes()
|
||||
const amount = coreTypes.UInt64.from(num).toBytes()
|
||||
|
||||
const bytesList = new BytesList()
|
||||
|
||||
bytesList.put(prefix)
|
||||
bytesList.put(channel)
|
||||
bytesList.put(amount)
|
||||
if (typeof claim.amount === 'string') {
|
||||
const num = bigInt(String(claim.amount))
|
||||
const amount = coreTypes.UInt64.from(num).toBytes()
|
||||
bytesList.put(amount)
|
||||
} else {
|
||||
const amount = coreTypes.Amount.from(claim.amount).toBytes()
|
||||
bytesList.put(amount)
|
||||
}
|
||||
return bytesList.toBytes()
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
"LedgerHashes": 104,
|
||||
"Amendments": 102,
|
||||
"FeeSettings": 115,
|
||||
"ImportVLSequence": 73,
|
||||
"Escrow": 117,
|
||||
"PayChannel": 120,
|
||||
"Check": 67,
|
||||
@@ -44,6 +45,8 @@
|
||||
"NegativeUNL": 78,
|
||||
"NFTokenPage": 80,
|
||||
"NFTokenOffer": 55,
|
||||
"URIToken": 85,
|
||||
"UNLReport": 82,
|
||||
"Any": -3,
|
||||
"Child": -2,
|
||||
"Nickname": 110,
|
||||
@@ -138,40 +141,40 @@
|
||||
[
|
||||
"LedgerEntry",
|
||||
{
|
||||
"nth": 1,
|
||||
"nth": 257,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": false,
|
||||
"isSigningField": true,
|
||||
"isSigningField": false,
|
||||
"type": "LedgerEntry"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Transaction",
|
||||
{
|
||||
"nth": 1,
|
||||
"nth": 257,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": false,
|
||||
"isSigningField": true,
|
||||
"isSigningField": false,
|
||||
"type": "Transaction"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Validation",
|
||||
{
|
||||
"nth": 1,
|
||||
"nth": 257,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": false,
|
||||
"isSigningField": true,
|
||||
"isSigningField": false,
|
||||
"type": "Validation"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Metadata",
|
||||
{
|
||||
"nth": 1,
|
||||
"nth": 257,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"isSerialized": false,
|
||||
"isSigningField": false,
|
||||
"type": "Metadata"
|
||||
}
|
||||
],
|
||||
@@ -778,7 +781,67 @@
|
||||
[
|
||||
"LockCount",
|
||||
{
|
||||
"nth": 47,
|
||||
"nth": 49,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"FirstNFTokenSequence",
|
||||
{
|
||||
"nth": 50,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"XahauActivationLgrSeq",
|
||||
{
|
||||
"nth": 96,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ImportSequence",
|
||||
{
|
||||
"nth": 97,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"RewardTime",
|
||||
{
|
||||
"nth": 98,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"RewardLgrFirst",
|
||||
{
|
||||
"nth": 99,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt32"
|
||||
}
|
||||
],
|
||||
[
|
||||
"RewardLgrLast",
|
||||
{
|
||||
"nth": 100,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
@@ -945,6 +1008,36 @@
|
||||
"type": "UInt64"
|
||||
}
|
||||
],
|
||||
[
|
||||
"AccountIndex",
|
||||
{
|
||||
"nth": 98,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt64"
|
||||
}
|
||||
],
|
||||
[
|
||||
"AccountCount",
|
||||
{
|
||||
"nth": 99,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt64"
|
||||
}
|
||||
],
|
||||
[
|
||||
"RewardAccumulator",
|
||||
{
|
||||
"nth": 100,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "UInt64"
|
||||
}
|
||||
],
|
||||
[
|
||||
"EmailHash",
|
||||
{
|
||||
@@ -1325,6 +1418,46 @@
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"URITokenID",
|
||||
{
|
||||
"nth": 36,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"GovernanceFlags",
|
||||
{
|
||||
"nth": 99,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"GovernanceMarks",
|
||||
{
|
||||
"nth": 98,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"EmittedTxnID",
|
||||
{
|
||||
"nth": 97,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Hash256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Amount",
|
||||
{
|
||||
@@ -1485,6 +1618,36 @@
|
||||
"type": "Amount"
|
||||
}
|
||||
],
|
||||
[
|
||||
"BaseFeeDrops",
|
||||
{
|
||||
"nth": 22,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Amount"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ReserveBaseDrops",
|
||||
{
|
||||
"nth": 23,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Amount"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ReserveIncrementDrops",
|
||||
{
|
||||
"nth": 24,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Amount"
|
||||
}
|
||||
],
|
||||
[
|
||||
"PublicKey",
|
||||
{
|
||||
@@ -1835,6 +1998,16 @@
|
||||
"type": "AccountID"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Inform",
|
||||
{
|
||||
"nth": 99,
|
||||
"isVLEncoded": true,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "AccountID"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Indexes",
|
||||
{
|
||||
@@ -1885,6 +2058,16 @@
|
||||
"type": "Vector256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"URITokenIDs",
|
||||
{
|
||||
"nth": 99,
|
||||
"isVLEncoded": true,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "Vector256"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Paths",
|
||||
{
|
||||
@@ -2105,6 +2288,66 @@
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"GenesisMint",
|
||||
{
|
||||
"nth": 96,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ActiveValidator",
|
||||
{
|
||||
"nth": 95,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ImportVLKey",
|
||||
{
|
||||
"nth": 94,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"HookEmission",
|
||||
{
|
||||
"nth": 93,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"MintURIToken",
|
||||
{
|
||||
"nth": 92,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"AmountEntry",
|
||||
{
|
||||
"nth": 91,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STObject"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Signers",
|
||||
{
|
||||
@@ -2244,6 +2487,56 @@
|
||||
"isSigningField": true,
|
||||
"type": "STArray"
|
||||
}
|
||||
],
|
||||
[
|
||||
"GenesisMints",
|
||||
{
|
||||
"nth": 96,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STArray"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ActiveValidators",
|
||||
{
|
||||
"nth": 95,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STArray"
|
||||
}
|
||||
],
|
||||
[
|
||||
"ImportVLKeys",
|
||||
{
|
||||
"nth": 94,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STArray"
|
||||
}
|
||||
],
|
||||
[
|
||||
"HookEmissions",
|
||||
{
|
||||
"nth": 93,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STArray"
|
||||
}
|
||||
],
|
||||
[
|
||||
"Amounts",
|
||||
{
|
||||
"nth": 92,
|
||||
"isVLEncoded": false,
|
||||
"isSerialized": true,
|
||||
"isSigningField": true,
|
||||
"type": "STArray"
|
||||
}
|
||||
]
|
||||
],
|
||||
"TRANSACTION_RESULTS": {
|
||||
@@ -2264,6 +2557,8 @@
|
||||
"telREQUIRES_NETWORK_ID": -385,
|
||||
"telNETWORK_ID_MAKES_TX_NON_CANONICAL": -384,
|
||||
"telNON_LOCAL_EMITTED_TXN": -383,
|
||||
"telIMPORT_VL_KEY_NOT_RECOGNISED": -382,
|
||||
"telCAN_NOT_QUEUE_IMPORT": -381,
|
||||
|
||||
"temMALFORMED": -299,
|
||||
"temBAD_AMOUNT": -298,
|
||||
@@ -2276,11 +2571,11 @@
|
||||
"temBAD_PATH": -291,
|
||||
"temBAD_PATH_LOOP": -290,
|
||||
"temBAD_REGKEY": -289,
|
||||
"temBAD_SEND_XRP_LIMIT": -288,
|
||||
"temBAD_SEND_XRP_MAX": -287,
|
||||
"temBAD_SEND_XRP_NO_DIRECT": -286,
|
||||
"temBAD_SEND_XRP_PARTIAL": -285,
|
||||
"temBAD_SEND_XRP_PATHS": -284,
|
||||
"temBAD_SEND_NATIVE_LIMIT": -288,
|
||||
"temBAD_SEND_NATIVE_MAX": -287,
|
||||
"temBAD_SEND_NATIVE_NO_DIRECT": -286,
|
||||
"temBAD_SEND_NATIVE_PARTIAL": -285,
|
||||
"temBAD_SEND_NATIVE_PATHS": -284,
|
||||
"temBAD_SEQUENCE": -283,
|
||||
"temBAD_SIGNATURE": -282,
|
||||
"temBAD_SRC_ACCOUNT": -281,
|
||||
@@ -2304,15 +2599,14 @@
|
||||
"temSEQ_AND_TICKET": -263,
|
||||
"temBAD_NFTOKEN_TRANSFER_FEE": -262,
|
||||
"temAMM_BAD_TOKENS": -261,
|
||||
"temEQUAL_DOOR_ACCOUNTS": -260,
|
||||
"temBAD_XCHAIN_PROOF": -259,
|
||||
"temSIDECHAIN_BAD_ISSUES": -258,
|
||||
"temSIDECHAIN_NONDOOR_OWNER": -257,
|
||||
"temXCHAIN_EQUAL_DOOR_ACCOUNTS": -260,
|
||||
"temXCHAIN_BAD_PROOF": -259,
|
||||
"temXCHAIN_BRIDGE_BAD_ISSUES": -258,
|
||||
"temXCHAIN_BRIDGE_NONDOOR_OWNER": -257,
|
||||
"temXCHAIN_BRIDGE_BAD_MIN_ACCOUNT_CREATE_AMOUNT": -256,
|
||||
"temXCHAIN_BRIDGE_BAD_REWARD_AMOUNT": -255,
|
||||
"temXCHAIN_TOO_MANY_ATTESTATIONS": -254,
|
||||
"temHOOK_DATA_TOO_LARGE": -253,
|
||||
"temHOOK_REJECTED": -252,
|
||||
|
||||
"tefFAILURE": -199,
|
||||
"tefALREADY": -198,
|
||||
@@ -2335,6 +2629,9 @@
|
||||
"tefTOO_BIG": -181,
|
||||
"tefNO_TICKET": -180,
|
||||
"tefNFTOKEN_IS_NOT_TRANSFERABLE": -179,
|
||||
"tefPAST_IMPORT_SEQ": -178,
|
||||
"tefPAST_IMPORT_VL_SEQ": -177,
|
||||
"tefNONDIR_EMIT": -176,
|
||||
|
||||
"terRETRY": -99,
|
||||
"terFUNDS_SPENT": -98,
|
||||
@@ -2348,7 +2645,8 @@
|
||||
"terNO_RIPPLE": -90,
|
||||
"terQUEUED": -89,
|
||||
"terPRE_TICKET": -88,
|
||||
"terNO_HOOK": -87,
|
||||
"terNO_AMM": -87,
|
||||
"terNO_HOOK": -86,
|
||||
|
||||
"tesSUCCESS": 0,
|
||||
|
||||
@@ -2362,7 +2660,7 @@
|
||||
"tecINSUF_RESERVE_LINE": 122,
|
||||
"tecINSUF_RESERVE_OFFER": 123,
|
||||
"tecNO_DST": 124,
|
||||
"tecNO_DST_INSUF_XRP": 125,
|
||||
"tecNO_DST_INSUF_NATIVE": 125,
|
||||
"tecNO_LINE_INSUF_RESERVE": 126,
|
||||
"tecNO_LINE_REDUNDANT": 127,
|
||||
"tecPATH_DRY": 128,
|
||||
@@ -2423,7 +2721,9 @@
|
||||
"tecXCHAIN_ACCOUNT_CREATE_TOO_MANY": 183,
|
||||
"tecXCHAIN_PAYMENT_FAILED": 184,
|
||||
"tecXCHAIN_SELF_COMMIT": 185,
|
||||
"tecXCHAIN_BAD_PUBLIC_KEY_ACCOUNT_PAIR": 186
|
||||
"tecXCHAIN_BAD_PUBLIC_KEY_ACCOUNT_PAIR": 186,
|
||||
"tecINSUF_RESERVE_SELLER": 187,
|
||||
"tecLAST_POSSIBLE_ENTRY": 255
|
||||
},
|
||||
"TRANSACTION_TYPES": {
|
||||
"Invalid": -1,
|
||||
@@ -2455,10 +2755,20 @@
|
||||
"NFTokenCreateOffer": 27,
|
||||
"NFTokenCancelOffer": 28,
|
||||
"NFTokenAcceptOffer": 29,
|
||||
"URITokenMint": 45,
|
||||
"URITokenBurn": 46,
|
||||
"URITokenBuy": 47,
|
||||
"URITokenCreateSellOffer": 48,
|
||||
"URITokenCancelSellOffer": 49,
|
||||
"Remit": 95,
|
||||
"GenesisMint": 96,
|
||||
"Import": 97,
|
||||
"ClaimReward": 98,
|
||||
"Invoke": 99,
|
||||
"EnableAmendment": 100,
|
||||
"SetFee": 101,
|
||||
"UNLModify": 102,
|
||||
"EmitFailure": 103
|
||||
"EmitFailure": 103,
|
||||
"UNLReport": 104
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
encodeAccountID,
|
||||
isValidXAddress,
|
||||
xAddressToClassicAddress,
|
||||
} from 'ripple-address-codec'
|
||||
} from '@transia/ripple-address-codec'
|
||||
import { Hash160 } from './hash-160'
|
||||
import { Buffer } from 'buffer/'
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ const STANDARD_FORMAT_HEX_REGEX = /^0{24}[\x00-\x7F]{6}0{10}$/
|
||||
*/
|
||||
function isoToBytes(iso: string): Buffer {
|
||||
const bytes = Buffer.alloc(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: Buffer): string | null {
|
||||
const iso = code.toString()
|
||||
if (iso === 'XRP') {
|
||||
if (iso === 'XAH') {
|
||||
return null
|
||||
}
|
||||
if (isIsoCode(iso)) {
|
||||
@@ -89,7 +89,7 @@ class Currency extends Hash160 {
|
||||
const hex = this.bytes.toString('hex')
|
||||
|
||||
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 {
|
||||
|
||||
@@ -5,7 +5,10 @@ import {
|
||||
XrplDefinitionsBase,
|
||||
} from '../enums'
|
||||
import { SerializedType, JsonObject } from './serialized-type'
|
||||
import { xAddressToClassicAddress, isValidXAddress } from 'ripple-address-codec'
|
||||
import {
|
||||
xAddressToClassicAddress,
|
||||
isValidXAddress,
|
||||
} from '@transia/ripple-address-codec'
|
||||
import { BinaryParser } from '../serdes/binary-parser'
|
||||
import { BinarySerializer, BytesList } from '../serdes/binary-serializer'
|
||||
import { Buffer } from 'buffer/'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const { coreTypes } = require('../src/types')
|
||||
const Decimal = require('decimal.js')
|
||||
|
||||
const { encodeAccountID } = require('ripple-address-codec')
|
||||
const { encodeAccountID } = require('@transia/ripple-address-codec')
|
||||
const { binary } = require('../src/coretypes')
|
||||
const { Amount, Hash160 } = coreTypes
|
||||
const { makeParser, readJSON } = binary
|
||||
@@ -369,7 +369,7 @@ function pathSetBinaryTests() {
|
||||
currency: 'BTC',
|
||||
issuer: 'r3AWbdp2jQLXLywJypdoNwVSvr81xs3uhn',
|
||||
},
|
||||
{ currency: 'XRP' },
|
||||
{ currency: 'XAH' },
|
||||
{
|
||||
currency: 'USD',
|
||||
issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
|
||||
|
||||
@@ -105,6 +105,16 @@ let json_omitted = {
|
||||
}
|
||||
|
||||
const NegativeUNL = require('./fixtures/negative-unl.json')
|
||||
const UNLReport = {
|
||||
tx: require('./fixtures/unl-report.json'),
|
||||
binary: require('./fixtures/unl-report-binary.json'),
|
||||
meta: require('./fixtures/unl-report-meta-binary.json'),
|
||||
}
|
||||
|
||||
const Remit = {
|
||||
tx: require('./fixtures/remit-tx.json'),
|
||||
binary: require('./fixtures/remit-binary.json'),
|
||||
}
|
||||
|
||||
function bytesListTest() {
|
||||
const list = new BytesList()
|
||||
@@ -229,6 +239,18 @@ function NegativeUNLTest() {
|
||||
})
|
||||
}
|
||||
|
||||
function UNLReportTest() {
|
||||
test('can serialize UNLReport', () => {
|
||||
expect(encode(UNLReport.tx)).toEqual(UNLReport.binary)
|
||||
})
|
||||
test('can serialize UNLReport metadata', () => {
|
||||
expect(encode(UNLReport.tx.meta)).toEqual(UNLReport.meta)
|
||||
})
|
||||
test('can deserialize UNLReport metadata', () => {
|
||||
expect(decode(UNLReport.meta)).toEqual(UNLReport.tx.meta)
|
||||
})
|
||||
}
|
||||
|
||||
function omitUndefinedTest() {
|
||||
test('omits fields with undefined value', () => {
|
||||
let encodedOmitted = encode(json_omitted)
|
||||
@@ -274,6 +296,12 @@ function nfTokenTest() {
|
||||
}
|
||||
}
|
||||
|
||||
function RemitTest() {
|
||||
test('can serialize Remit', () => {
|
||||
expect(encode(Remit.tx)).toEqual(Remit.binary)
|
||||
})
|
||||
}
|
||||
|
||||
describe('Binary Serialization', function () {
|
||||
describe('nestedObjectTests', nestedObjectTests)
|
||||
describe('BytesList', bytesListTest)
|
||||
@@ -286,4 +314,6 @@ describe('Binary Serialization', function () {
|
||||
describe('OmitUndefined', omitUndefinedTest)
|
||||
describe('TicketTest', ticketTest)
|
||||
describe('NFToken', nfTokenTest)
|
||||
describe('UNLReport', UNLReportTest)
|
||||
describe('Remit', RemitTest)
|
||||
})
|
||||
|
||||
@@ -44,7 +44,7 @@ describe('encode and decode using new types as a parameter', function () {
|
||||
definitions.FIELDS.push([
|
||||
'NewFieldDefinition',
|
||||
{
|
||||
nth: 100,
|
||||
nth: 101,
|
||||
isVLEncoded: false,
|
||||
isSerialized: true,
|
||||
isSigningField: true,
|
||||
|
||||
@@ -2904,7 +2904,7 @@
|
||||
"type_id": 6,
|
||||
"is_native": true,
|
||||
"type": "Amount",
|
||||
"error": "1000000000000 absolute XRP is bigger than max native value 100000000000.0",
|
||||
"error": "1000000000000 absolute XAH is bigger than max native value 100000000000.0",
|
||||
"is_negative": false
|
||||
},
|
||||
{
|
||||
@@ -2912,7 +2912,7 @@
|
||||
"type_id": 6,
|
||||
"is_native": true,
|
||||
"type": "Amount",
|
||||
"error": "10000000000000000000 absolute XRP is bigger than max native value 100000000000.0",
|
||||
"error": "10000000000000000000 absolute XAH is bigger than max native value 100000000000.0",
|
||||
"is_negative": true
|
||||
}
|
||||
]
|
||||
|
||||
1
packages/ripple-binary-codec/test/fixtures/remit-binary.json
vendored
Normal file
1
packages/ripple-binary-codec/test/fixtures/remit-binary.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"12005F22000000002403EDEB4A2E00000001201B03EE5D3150116F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B68400000000000000C732102F9E33F16DF9507705EC954E3F94EB5F10D1FC4A354606DBE6297DBB1096FE65474473045022100E3FAE0EDEC3D6A8FF6D81BC9CF8288A61B7EEDE8071E90FF9314CB4621058D10022043545CF631706D700CEE65A1DB83EFDD185413808292D9D90F14D87D3DC2D8CB701A04DEADBEEF81147990EC5D1D8DF69E070A968D4B186986FDF06ED0831449FF0C73CA6AF9733DA805F76CA2C37776B7C46B806314757C4A9ED08284D61F3D8807280795F858BAB61DE05C220000000150156F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B7504DEADBEEFE1F05CE05B6140000000000003E8E1E05B61D4838D7EA4C68000000000000000000000000000555344000000000006B80F0F1D98AEDA846ED981F741C398FB2C4FD1E1F100136320AED08CC1F50DD5F23A1948AF86153A3F3B7593E5EC77D65A02BB1B29E05AB6AE"
|
||||
39
packages/ripple-binary-codec/test/fixtures/remit-tx.json
vendored
Normal file
39
packages/ripple-binary-codec/test/fixtures/remit-tx.json
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"TransactionType": "Remit",
|
||||
"Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo",
|
||||
"Destination": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy",
|
||||
"DestinationTag": 1,
|
||||
"Fee": "12",
|
||||
"Flags": 0,
|
||||
"LastLedgerSequence": 65953073,
|
||||
"Sequence": 65923914,
|
||||
"SigningPubKey": "02F9E33F16DF9507705EC954E3F94EB5F10D1FC4A354606DBE6297DBB1096FE654",
|
||||
"TxnSignature": "3045022100E3FAE0EDEC3D6A8FF6D81BC9CF8288A61B7EEDE8071E90FF9314CB4621058D10022043545CF631706D700CEE65A1DB83EFDD185413808292D9D90F14D87D3DC2D8CB",
|
||||
"Amounts": [
|
||||
{
|
||||
"AmountEntry": {
|
||||
"Amount": "1000"
|
||||
}
|
||||
},
|
||||
{
|
||||
"AmountEntry": {
|
||||
"Amount": {
|
||||
"currency": "USD",
|
||||
"issuer": "rcXY84C4g14iFp6taFXjjQGVeHqSCh9RX",
|
||||
"value": "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"MintURIToken": {
|
||||
"URI": "DEADBEEF",
|
||||
"Digest": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B",
|
||||
"Flags": 1
|
||||
},
|
||||
"URITokenIDs": [
|
||||
"AED08CC1F50DD5F23A1948AF86153A3F3B7593E5EC77D65A02BB1B29E05AB6AE"
|
||||
],
|
||||
"InvoiceID": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B",
|
||||
"Blob": "DEADBEEF",
|
||||
"Inform": "rB5Ux4Lv2nRx6eeoAAsZmtctnBQ2LiACnk"
|
||||
}
|
||||
1
packages/ripple-binary-codec/test/fixtures/unl-report-binary.json
vendored
Normal file
1
packages/ripple-binary-codec/test/fixtures/unl-report-binary.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"120068240000000026006D2E00684000000000000000730081140000000000000000000000000000000000000000E05F7121ED93B2BE467CAD2F9F56FB3A82BDFF17F84B09E34232DDE8FAF2FC72382F142655E1"
|
||||
1
packages/ripple-binary-codec/test/fixtures/unl-report-meta-binary.json
vendored
Normal file
1
packages/ripple-binary-codec/test/fixtures/unl-report-meta-binary.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
"201C00000000F8E51100525661E32E7A24A238F1C619D5F9DDCC41A94B33B66C0163F7EFCC8A19C9FD6F28DCE6F05FE05F7121ED3ABC6740983BFB13FFD9728EBCC365A2877877D368FC28990819522300C92A698114A53F8465478D79DC0C764F0FB2B67AE92465FD5EE1E05F7121ED49F82B2FFD537F224A1E0A10DEEFC3C25CE3882979E6B327C9F18603D21F0A2281142BF2A77E25382EC1DEF521D81D24BC0FDD35BC9BE1E05F7121ED79EB0F6A9F01A039235E536D19F812B55ACF540C9E22CF62C271E0D42BFF51748114C45147960400DB6B763110CBCE8D641E9365F24EE1E05F7121ED93B2BE467CAD2F9F56FB3A82BDFF17F84B09E34232DDE8FAF2FC72382F142655811408BCFB092DEE1BF0F2662AECE4DCC62C4AECCB8AE1E05F7121ED96F581FED430E8CBE1F08B37408857001D4118D49FBB594B0BE007C2DBFFD3678114A4EF485B50A7D91DF45450A680FAC31C53367B2DE1E05F7121EDCF31B8F683345E1C49B4A1D85BF2731E55E7D6781F3D4BF45EE7ADF2D2FB340281144D854497B48F1A41EF04E09DB656A11AAD01A703E1E05F7121EDDF197FC59A7FAA09EB1AD60A4638BA6201DD51497B5C08A1745115098E229E0E811446550CBD2B655081662AE3159B0488DE27EC0592E1F1E1E72200000000F05EE05E7121ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860811478339DD5880A994A5CB6E56CB7ED13FEEF201928E1F1F05FE05F7121ED93B2BE467CAD2F9F56FB3A82BDFF17F84B09E34232DDE8FAF2FC72382F142655811408BCFB092DEE1BF0F2662AECE4DCC62C4AECCB8AE1F1E1E1F1031000"
|
||||
89
packages/ripple-binary-codec/test/fixtures/unl-report.json
vendored
Normal file
89
packages/ripple-binary-codec/test/fixtures/unl-report.json
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"Account": "",
|
||||
"ActiveValidator": {
|
||||
"PublicKey": "ED93B2BE467CAD2F9F56FB3A82BDFF17F84B09E34232DDE8FAF2FC72382F142655"
|
||||
},
|
||||
"Fee": "0",
|
||||
"LedgerSequence": 7155200,
|
||||
"Sequence": 0,
|
||||
"SigningPubKey": "",
|
||||
"TransactionType": "UNLReport",
|
||||
"hash": "0878863F758F74A5CBD35691CDAB625A3BCD35B21B440E20545C4757DDB0CA43",
|
||||
"meta": {
|
||||
"AffectedNodes": [
|
||||
{
|
||||
"ModifiedNode": {
|
||||
"FinalFields": {
|
||||
"ActiveValidators": [
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "roUo3ygV92bdhfE1v9LGpPETXvJv2kQv5",
|
||||
"PublicKey": "ED93B2BE467CAD2F9F56FB3A82BDFF17F84B09E34232DDE8FAF2FC72382F142655"
|
||||
}
|
||||
}
|
||||
],
|
||||
"Flags": 0,
|
||||
"ImportVLKeys": [
|
||||
{
|
||||
"ImportVLKey": {
|
||||
"Account": "rBxZvQBY551DJ21g9AC1Qc9ASQowqcskbF",
|
||||
"PublicKey": "ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"LedgerEntryType": "UNLReport",
|
||||
"LedgerIndex": "61E32E7A24A238F1C619D5F9DDCC41A94B33B66C0163F7EFCC8A19C9FD6F28DC",
|
||||
"PreviousFields": {
|
||||
"ActiveValidators": [
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "rGhk2uLd8ShzX2Zrcgn8sQk1LWBG4jjEwf",
|
||||
"PublicKey": "ED3ABC6740983BFB13FFD9728EBCC365A2877877D368FC28990819522300C92A69"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "rnr4kwS1VkJhvjVRuq2fbWZtEdN2HbpVVu",
|
||||
"PublicKey": "ED49F82B2FFD537F224A1E0A10DEEFC3C25CE3882979E6B327C9F18603D21F0A22"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "rJupFrPPYgUNFBdoSqhMEJ22hiHKiZSHXQ",
|
||||
"PublicKey": "ED79EB0F6A9F01A039235E536D19F812B55ACF540C9E22CF62C271E0D42BFF5174"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "roUo3ygV92bdhfE1v9LGpPETXvJv2kQv5",
|
||||
"PublicKey": "ED93B2BE467CAD2F9F56FB3A82BDFF17F84B09E34232DDE8FAF2FC72382F142655"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "rGsa7f4arJ8JE9ok9LCht6jCu5xBKUKVMq",
|
||||
"PublicKey": "ED96F581FED430E8CBE1F08B37408857001D4118D49FBB594B0BE007C2DBFFD367"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "r3htgPchiR2r8kMGzPK3Wfv3WTrpaRKjtU",
|
||||
"PublicKey": "EDCF31B8F683345E1C49B4A1D85BF2731E55E7D6781F3D4BF45EE7ADF2D2FB3402"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ActiveValidator": {
|
||||
"Account": "rfQtB8m51sdbWgcmddRX2mMjMpSxzX1AGr",
|
||||
"PublicKey": "EDDF197FC59A7FAA09EB1AD60A4638BA6201DD51497B5C08A1745115098E229E0E"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"TransactionIndex": 0,
|
||||
"TransactionResult": "tesSUCCESS"
|
||||
}
|
||||
}
|
||||
@@ -77,7 +77,7 @@ describe('Hash256', function () {
|
||||
|
||||
describe('Currency', function () {
|
||||
test('Decoding allows dodgy XRP without throwing', function () {
|
||||
const currencyCode = '0000000000000000000000005852500000000000'
|
||||
const currencyCode = '0000000000000000000000005841480000000000'
|
||||
expect(Currency.from(currencyCode).toJSON()).toBe(currencyCode)
|
||||
})
|
||||
test('Currency code with lowercase letters decodes to ISO code', () => {
|
||||
@@ -113,7 +113,7 @@ describe('Currency', function () {
|
||||
|
||||
test('can be constructed from a Buffer', function () {
|
||||
const xrp = new Currency(Buffer.alloc(20))
|
||||
expect(xrp.iso()).toBe('XRP')
|
||||
expect(xrp.iso()).toBe('XAH')
|
||||
})
|
||||
test('Can handle non-standard currency codes', () => {
|
||||
const currency = '015841551A748AD2C1F76FF6ECB0CCCD00000000'
|
||||
|
||||
@@ -170,59 +170,7 @@ describe('Signing data', function () {
|
||||
].join(''),
|
||||
)
|
||||
})
|
||||
|
||||
test('can create multi signing blobs with custom definitions', function () {
|
||||
const customPaymentDefinitions = JSON.parse(
|
||||
JSON.stringify(normalDefinitions),
|
||||
)
|
||||
customPaymentDefinitions.TRANSACTION_TYPES.Payment = 31
|
||||
|
||||
const newDefs = new XrplDefinitions(customPaymentDefinitions)
|
||||
const signingAccount = 'rJZdUusLDtY9NEsGea7ijqhVrXv98rYBYN'
|
||||
const signingJson = { ...tx_json, SigningPubKey: '' }
|
||||
const actual = encodeForMultisigning(signingJson, signingAccount, newDefs)
|
||||
expect(actual).toBe(
|
||||
[
|
||||
'534D5400', // signingPrefix
|
||||
// TransactionType
|
||||
'12',
|
||||
'001F',
|
||||
// Flags
|
||||
'22',
|
||||
'80000000',
|
||||
// Sequence
|
||||
'24',
|
||||
'00000001',
|
||||
// Amount
|
||||
'61',
|
||||
// native amount
|
||||
'40000000000003E8',
|
||||
// Fee
|
||||
'68',
|
||||
// native amount
|
||||
'400000000000000A',
|
||||
// SigningPubKey
|
||||
'73',
|
||||
// VLLength
|
||||
'00',
|
||||
// '',
|
||||
// Account
|
||||
'81',
|
||||
// VLLength
|
||||
'14',
|
||||
'5B812C9D57731E27A2DA8B1830195F88EF32A3B6',
|
||||
// Destination
|
||||
'83',
|
||||
// VLLength
|
||||
'14',
|
||||
'B5F762798A53D543A014CAF8B297CFF8F2F937E8',
|
||||
// signingAccount suffix
|
||||
'C0A5ABEF242802EFED4B041E8F2D4A8CC86AE3D1',
|
||||
].join(''),
|
||||
)
|
||||
})
|
||||
|
||||
test('can create claim blob', function () {
|
||||
test('can create native claim blob', function () {
|
||||
const channel =
|
||||
'43904CBFCDCEC530B4037871F86EE90BF799DF8D2E0EA564BC8A3F332E4F5FB1'
|
||||
const amount = '1000'
|
||||
@@ -239,4 +187,27 @@ describe('Signing data', function () {
|
||||
].join(''),
|
||||
)
|
||||
})
|
||||
test('can create ic claim blob', function () {
|
||||
const channel =
|
||||
'43904CBFCDCEC530B4037871F86EE90BF799DF8D2E0EA564BC8A3F332E4F5FB1'
|
||||
const amount = {
|
||||
issuer: 'rJZdUusLDtY9NEsGea7ijqhVrXv98rYBYN',
|
||||
currency: 'USD',
|
||||
value: '10',
|
||||
}
|
||||
const json = { channel, amount }
|
||||
const actual = encodeForSigningClaim(json)
|
||||
expect(actual).toBe(
|
||||
[
|
||||
// hash prefix
|
||||
'434C4D00',
|
||||
// channel ID
|
||||
'43904CBFCDCEC530B4037871F86EE90BF799DF8D2E0EA564BC8A3F332E4F5FB1',
|
||||
// amount as a uint64
|
||||
'D4C38D7EA4C680000000000000000000000000005553440000000000C0A5ABEF',
|
||||
// amount as a uint64
|
||||
'242802EFED4B041E8F2D4A8CC86AE3D1',
|
||||
].join(''),
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -58,7 +58,7 @@ describe('encoding and decoding tx_json', function () {
|
||||
Sequence: 19,
|
||||
LimitAmount: {
|
||||
value: '200',
|
||||
currency: '0000000000000000000000005852500000000000',
|
||||
currency: '0000000000000000000000005841480000000000',
|
||||
issuer: 'r9hEDb4xBGRfBCcX3E4FirDWQBAYtpxC8K',
|
||||
},
|
||||
Fee: '10',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ripple-keypairs",
|
||||
"version": "1.1.5",
|
||||
"name": "@transia/ripple-keypairs",
|
||||
"version": "1.1.8-alpha.0",
|
||||
"description": "Cryptographic key pairs for the XRP Ledger",
|
||||
"scripts": {
|
||||
"build": "tsc -b",
|
||||
@@ -17,15 +17,15 @@
|
||||
"test": "test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@transia/ripple-address-codec": "^4.2.8-alpha.0",
|
||||
"bn.js": "^5.1.1",
|
||||
"brorand": "^1.0.5",
|
||||
"elliptic": "^6.5.4",
|
||||
"hash.js": "^1.0.3",
|
||||
"ripple-address-codec": "^4.2.5"
|
||||
"hash.js": "^1.0.3"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:XRPLF/xrpl.js.git"
|
||||
"url": "git@github.com/Transia-RnD/xrpl.js/tree/beta"
|
||||
},
|
||||
"license": "ISC",
|
||||
"prettier": "@xrplf/prettier-config",
|
||||
|
||||
@@ -3,7 +3,7 @@ import brorand = require('brorand')
|
||||
import * as hashjs from 'hash.js'
|
||||
import * as elliptic from 'elliptic'
|
||||
|
||||
import * as addressCodec from 'ripple-address-codec'
|
||||
import * as addressCodec from '@transia/ripple-address-codec'
|
||||
import { derivePrivateKey, accountPublicFromPublicGenerator } from './secp256k1'
|
||||
import * as utils from './utils'
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import assert from 'assert'
|
||||
import * as api from 'ripple-address-codec'
|
||||
import * as api from '@transia/ripple-address-codec'
|
||||
|
||||
function toHex(bytes) {
|
||||
return Buffer.from(bytes).toString('hex').toUpperCase()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import assert from 'assert'
|
||||
import * as api from 'ripple-address-codec'
|
||||
import * as api from '@transia/ripple-address-codec'
|
||||
|
||||
function toHex(bytes: Buffer) {
|
||||
return Buffer.from(bytes).toString('hex').toUpperCase()
|
||||
|
||||
@@ -1698,7 +1698,7 @@ __OTHER CHANGES__
|
||||
parseBinary: false
|
||||
}
|
||||
```
|
||||
+ Added full currency name support, e.g. `Currency.from_json('XRP').to_human({full_name:'Ripples'})` will return `XRP - Ripples`
|
||||
+ Added full currency name support, e.g. `Currency.from_json('XAH').to_human({full_name:'Ripples'})` will return `XAH - Ripples`
|
||||
+ Improved interest bearing currency support, e.g. `Currency.from_human('USD - US Dollar (2.5%pa)')`
|
||||
+ Improve test coverage
|
||||
+ Added blob vault client. The vault client facilitates interaction with ripple's namespace and blob vault or 3rd party blob vaults using ripple's blob vault software (https://github.com/ripple/ripple-blobvault). A list of the available functions can be found at [docs/VAULTCLIENT.md](docs/VAULTCLIENT.md)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xrpl",
|
||||
"version": "2.7.0",
|
||||
"name": "@transia/xrpl",
|
||||
"version": "2.7.3-alpha.26",
|
||||
"license": "ISC",
|
||||
"description": "A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser",
|
||||
"files": [
|
||||
@@ -22,14 +22,14 @@
|
||||
"https-proxy-agent": false
|
||||
},
|
||||
"dependencies": {
|
||||
"@transia/ripple-address-codec": "^4.2.8-alpha.0",
|
||||
"@transia/ripple-binary-codec": "^1.4.6-alpha.9",
|
||||
"@transia/ripple-keypairs": "^1.1.8-alpha.0",
|
||||
"bignumber.js": "^9.0.0",
|
||||
"bip32": "^2.0.6",
|
||||
"bip39": "^3.0.4",
|
||||
"https-proxy-agent": "^5.0.0",
|
||||
"lodash": "^4.17.4",
|
||||
"ripple-address-codec": "^4.2.5",
|
||||
"ripple-binary-codec": "^1.4.3",
|
||||
"ripple-keypairs": "^1.1.5",
|
||||
"ws": "^8.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -75,10 +75,11 @@
|
||||
"prettier": "@xrplf/prettier-config",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:XRPLF/xrpl.js.git"
|
||||
"url": "git@github.com/Transia-RnD/xrpl.js/tree/beta"
|
||||
},
|
||||
"readmeFilename": "README.md",
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
}
|
||||
},
|
||||
"gitHead": "3b234ec8ec1c677e0f3f534fd2985c985871c87e"
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ async function createTxWithPaths(): Promise<void> {
|
||||
source_account: wallet.classicAddress,
|
||||
source_currencies: [
|
||||
{
|
||||
currency: 'XRP',
|
||||
currency: 'XAH',
|
||||
},
|
||||
],
|
||||
destination_account,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { IncomingMessage } from 'http'
|
||||
import { request as httpsRequest, RequestOptions } from 'https'
|
||||
|
||||
import { isValidClassicAddress } from 'ripple-address-codec'
|
||||
import { isValidClassicAddress } from '@transia/ripple-address-codec'
|
||||
|
||||
import type { Client } from '../client'
|
||||
import { RippledError, XRPLFaucetError } from '../errors'
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
/* eslint-disable max-lines -- There are lots of equivalent constructors which make sense to have here. */
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { fromSeed } from 'bip32'
|
||||
import { mnemonicToSeedSync, validateMnemonic } from 'bip39'
|
||||
import isEqual from 'lodash/isEqual'
|
||||
import omitBy from 'lodash/omitBy'
|
||||
import {
|
||||
classicAddressToXAddress,
|
||||
isValidXAddress,
|
||||
xAddressToClassicAddress,
|
||||
encodeSeed,
|
||||
} from 'ripple-address-codec'
|
||||
} from '@transia/ripple-address-codec'
|
||||
import {
|
||||
decode,
|
||||
encodeForSigning,
|
||||
encodeForMultisigning,
|
||||
encode,
|
||||
} from 'ripple-binary-codec'
|
||||
} from '@transia/ripple-binary-codec'
|
||||
import {
|
||||
deriveAddress,
|
||||
deriveKeypair,
|
||||
generateSeed,
|
||||
verify,
|
||||
sign,
|
||||
} from 'ripple-keypairs'
|
||||
} from '@transia/ripple-keypairs'
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { fromSeed } from 'bip32'
|
||||
import { mnemonicToSeedSync, validateMnemonic } from 'bip39'
|
||||
import isEqual from 'lodash/isEqual'
|
||||
import omitBy from 'lodash/omitBy'
|
||||
|
||||
import ECDSA from '../ECDSA'
|
||||
import { ValidationError, XrplError } from '../errors'
|
||||
@@ -485,10 +485,10 @@ class Wallet {
|
||||
|
||||
if (
|
||||
txCurrency.length === standard_currency_code_len &&
|
||||
txCurrency.toUpperCase() === 'XRP'
|
||||
txCurrency.toUpperCase() === 'XAH'
|
||||
) {
|
||||
throw new XrplError(
|
||||
`Trying to sign an issued currency with a similar standard code to XRP (received '${txCurrency}'). XRP is not an issued currency.`,
|
||||
`Trying to sign an issued currency with a similar standard code to XAH (received '${txCurrency}'). XAH is not an issued currency.`,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -575,7 +575,7 @@ function removeTrailingZeros(tx: Transaction): void {
|
||||
/* eslint-disable @typescript-eslint/no-magic-numbers -- Magic numbers are from rippleds of currency code encoding */
|
||||
function isoToHex(iso: string): string {
|
||||
const bytes = Buffer.alloc(20)
|
||||
if (iso !== 'XRP') {
|
||||
if (iso !== 'XAH') {
|
||||
const isoBytes = iso.split('').map((chr) => chr.charCodeAt(0))
|
||||
bytes.set(isoBytes, 12)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { BigNumber } from 'bignumber.js'
|
||||
import { flatMap } from 'lodash'
|
||||
import { decodeAccountID } from 'ripple-address-codec'
|
||||
import { decodeAccountID } from '@transia/ripple-address-codec'
|
||||
import {
|
||||
decode,
|
||||
encode,
|
||||
encodeForSigning,
|
||||
encodeForSigningClaim,
|
||||
} from 'ripple-binary-codec'
|
||||
import { sign as signWithKeypair, verify } from 'ripple-keypairs'
|
||||
} from '@transia/ripple-binary-codec'
|
||||
import { sign as signWithKeypair, verify } from '@transia/ripple-keypairs'
|
||||
import { BigNumber } from 'bignumber.js'
|
||||
import { flatMap } from 'lodash'
|
||||
|
||||
import { ValidationError } from '../errors'
|
||||
import { Signer } from '../models/common'
|
||||
|
||||
@@ -101,6 +101,7 @@ import {
|
||||
getXrpBalance,
|
||||
submit,
|
||||
submitAndWait,
|
||||
getNetworkID,
|
||||
} from '../sugar'
|
||||
import fundWallet from '../Wallet/fundWallet'
|
||||
|
||||
@@ -200,6 +201,13 @@ class Client extends EventEmitter {
|
||||
*/
|
||||
public readonly maxFeeXRP: string
|
||||
|
||||
/**
|
||||
* Network ID of the server this sdk is connected to
|
||||
*
|
||||
* @category Fee
|
||||
*/
|
||||
public networkID: number
|
||||
|
||||
/**
|
||||
* Creates a new Client with a websocket connection to a rippled server.
|
||||
*
|
||||
@@ -218,6 +226,7 @@ class Client extends EventEmitter {
|
||||
|
||||
this.feeCushion = options.feeCushion ?? DEFAULT_FEE_CUSHION
|
||||
this.maxFeeXRP = options.maxFeeXRP ?? DEFAULT_MAX_FEE_XRP
|
||||
this.networkID = 1
|
||||
|
||||
this.connection = new Connection(server, options)
|
||||
|
||||
@@ -634,6 +643,11 @@ class Client extends EventEmitter {
|
||||
*/
|
||||
public getLedgerIndex = getLedgerIndex
|
||||
|
||||
/**
|
||||
* @category Abstraction
|
||||
*/
|
||||
public getNetworkID = getNetworkID
|
||||
|
||||
/**
|
||||
* @category Faucet
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { decode } from '@transia/ripple-binary-codec'
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { decode } from 'ripple-binary-codec'
|
||||
|
||||
import type {
|
||||
AccountTxResponse,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
export type LedgerIndex = number | ('validated' | 'closed' | 'current')
|
||||
|
||||
interface XRP {
|
||||
currency: 'XRP'
|
||||
currency: 'XAH'
|
||||
}
|
||||
|
||||
interface IssuedCurrency {
|
||||
@@ -17,6 +17,8 @@ export interface IssuedCurrencyAmount extends IssuedCurrency {
|
||||
|
||||
export type Amount = IssuedCurrencyAmount | string
|
||||
|
||||
export type AmountEntry = Amount
|
||||
|
||||
export interface Signer {
|
||||
Signer: {
|
||||
Account: string
|
||||
@@ -97,14 +99,15 @@ export interface Hook {
|
||||
* The object that describes the hook in Hooks.
|
||||
*/
|
||||
Hook: {
|
||||
HookHash?: string
|
||||
/**
|
||||
* The code that is executed when the hook is triggered.
|
||||
*/
|
||||
CreateCode: string
|
||||
CreateCode?: string
|
||||
/**
|
||||
* The flags that are set on the hook.
|
||||
*/
|
||||
Flags: number
|
||||
Flags?: number
|
||||
/**
|
||||
* The transactions that triggers the hook. Represented as a 256Hash
|
||||
*/
|
||||
@@ -194,3 +197,31 @@ export interface NFTOffer {
|
||||
destination?: string
|
||||
expiration?: number
|
||||
}
|
||||
|
||||
/**
|
||||
* This information is added to emitted Transactions.
|
||||
*/
|
||||
export interface EmitDetails {
|
||||
EmitBurden: number
|
||||
EmitGeneration: number
|
||||
EmitHookHash: string
|
||||
EmitParentTxnID: string
|
||||
}
|
||||
|
||||
/**
|
||||
* The object that describes the uritoken in MintURIToken.
|
||||
*/
|
||||
export interface MintURIToken {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
URI: string
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Digest?: string
|
||||
/**
|
||||
* The flags that are set on the uritoken.
|
||||
*/
|
||||
Flags?: number
|
||||
}
|
||||
|
||||
@@ -72,6 +72,10 @@ export default interface AccountRoot extends BaseLedgerEntry {
|
||||
* account to each other.
|
||||
*/
|
||||
TransferRate?: number
|
||||
ImportSequence?: string
|
||||
GovernanceFlags?: string
|
||||
GovernanceMarks?: string
|
||||
AccountIndex?: number
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { Amount } from '../common'
|
||||
|
||||
import BaseLedgerEntry from './BaseLedgerEntry'
|
||||
|
||||
/**
|
||||
* The Escrow object type represents a held payment of XRP waiting to be
|
||||
* The Escrow object type represents a held payment waiting to be
|
||||
* executed or canceled.
|
||||
*
|
||||
* @category Ledger Entries
|
||||
@@ -10,17 +12,17 @@ export default interface Escrow extends BaseLedgerEntry {
|
||||
LedgerEntryType: 'Escrow'
|
||||
/**
|
||||
* The address of the owner (sender) of this held payment. This is the
|
||||
* account that provided the XRP, and gets it back if the held payment is
|
||||
* account that provided the amounts, and gets it back if the held payment is
|
||||
* canceled.
|
||||
*/
|
||||
Account: string
|
||||
/**
|
||||
* The destination address where the XRP is paid if the held payment is
|
||||
* The destination address where the amounts are paid if the held payment is
|
||||
* successful.
|
||||
*/
|
||||
Destination: string
|
||||
/** The amount of XRP, in drops, to be delivered by the held payment. */
|
||||
Amount: string
|
||||
/** The amount to be delivered by the held payment. */
|
||||
Amount: Amount
|
||||
/**
|
||||
* A PREIMAGE-SHA-256 crypto-condition, as hexadecimal. If present, the
|
||||
* EscrowFinish transaction must contain a fulfillment that satisfies this
|
||||
@@ -71,4 +73,9 @@ export default interface Escrow extends BaseLedgerEntry {
|
||||
* modified this object.
|
||||
*/
|
||||
PreviousTxnLgrSeq: number
|
||||
/**
|
||||
* The fee to charge when users finish an escrow, initially set on the
|
||||
* creation of an escrow contract, and updated on subsequent finish transactions
|
||||
*/
|
||||
TransferRate?: number
|
||||
}
|
||||
|
||||
@@ -24,4 +24,6 @@ export default interface FeeSettings extends BaseLedgerEntry {
|
||||
* type.
|
||||
*/
|
||||
Flags: number
|
||||
XahauActivationLgrSeq?: number
|
||||
AccountCount?: number
|
||||
}
|
||||
|
||||
19
packages/xrpl/src/models/ledger/ImportVLSequence.ts
Normal file
19
packages/xrpl/src/models/ledger/ImportVLSequence.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import BaseLedgerEntry from './BaseLedgerEntry'
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*
|
||||
* @category Ledger Entries
|
||||
*/
|
||||
export default interface ImportVLSequence extends BaseLedgerEntry {
|
||||
LedgerEntryType: 'ImportVLSequence'
|
||||
/**
|
||||
*
|
||||
*/
|
||||
PublicKey: string
|
||||
/**
|
||||
*
|
||||
*/
|
||||
ImportSequence: string
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import FeeSettings from './FeeSettings'
|
||||
import Hook from './Hook'
|
||||
import HookDefinition from './HookDefinition'
|
||||
import HookState from './HookState'
|
||||
import ImportVLSequence from './ImportVLSequence'
|
||||
import LedgerHashes from './LedgerHashes'
|
||||
import NegativeUNL from './NegativeUNL'
|
||||
import Offer from './Offer'
|
||||
@@ -16,6 +17,8 @@ import PayChannel from './PayChannel'
|
||||
import RippleState from './RippleState'
|
||||
import SignerList from './SignerList'
|
||||
import Ticket from './Ticket'
|
||||
import UNLReport from './UNLReport'
|
||||
import URIToken from './URIToken'
|
||||
|
||||
type LedgerEntry =
|
||||
| AccountRoot
|
||||
@@ -29,6 +32,7 @@ type LedgerEntry =
|
||||
| Hook
|
||||
| HookDefinition
|
||||
| HookState
|
||||
| ImportVLSequence
|
||||
| LedgerHashes
|
||||
| NegativeUNL
|
||||
| Offer
|
||||
@@ -36,5 +40,7 @@ type LedgerEntry =
|
||||
| RippleState
|
||||
| SignerList
|
||||
| Ticket
|
||||
| UNLReport
|
||||
| URIToken
|
||||
|
||||
export default LedgerEntry
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { Amount } from '../common'
|
||||
|
||||
import BaseLedgerEntry from './BaseLedgerEntry'
|
||||
|
||||
/**
|
||||
* The PayChannel object type represents a payment channel. Payment channels
|
||||
* enable small, rapid off-ledger payments of XRP that can be later reconciled
|
||||
* with the consensus ledger. A payment channel holds a balance of XRP that can
|
||||
* enable small, rapid off-ledger payments that can be later reconciled
|
||||
* with the consensus ledger. A payment channel holds a balance that can
|
||||
* only be paid out to a specific destination address until the channel is
|
||||
* closed.
|
||||
*
|
||||
@@ -18,37 +20,37 @@ export default interface PayChannel extends BaseLedgerEntry {
|
||||
Account: string
|
||||
/**
|
||||
* The destination address for this payment channel. While the payment
|
||||
* channel is open, this address is the only one that can receive XRP from the
|
||||
* channel is open, this address is the only one that can receive amounts from the
|
||||
* channel. This comes from the Destination field of the transaction that
|
||||
* created the channel.
|
||||
*/
|
||||
Destination: string
|
||||
/**
|
||||
* Total XRP, in drops, that has been allocated to this channel. This
|
||||
* includes XRP that has been paid to the destination address. This is
|
||||
* initially set by the transaction that created the channel and can be
|
||||
* increased if the source address sends a PaymentChannelFund transaction.
|
||||
* Total amount that has been allocated to this channel. This includes amounts
|
||||
* that have been paid to the destination address. This is initially set by the
|
||||
* transaction that created the channel and can be increased if the source
|
||||
* address sends a PaymentChannelFund transaction.
|
||||
*/
|
||||
Amount: string
|
||||
Amount: Amount
|
||||
/**
|
||||
* Total XRP, in drops, already paid out by the channel. The difference
|
||||
* between this value and the Amount field is how much XRP can still be paid
|
||||
* to the destination address with PaymentChannelClaim transactions. If the
|
||||
* channel closes, the remaining difference is returned to the source address.
|
||||
* Total amount already paid out by the channel. The difference between this value
|
||||
* and the Amount field is how much can still be paid to the destination address
|
||||
* with PaymentChannelClaim transactions. If the channel closes, the remaining
|
||||
* difference is returned to the source address.
|
||||
*/
|
||||
Balance: string
|
||||
Balance: Amount
|
||||
/**
|
||||
* Public key, in hexadecimal, of the key pair that can be used to sign
|
||||
* claims against this channel. This can be any valid secp256k1 or Ed25519
|
||||
* public key. This is set by the transaction that created the channel and
|
||||
* must match the public key used in claims against the channel. The channel
|
||||
* source address can also send XRP from this channel to the destination
|
||||
* source address can also send amounts from this channel to the destination
|
||||
* without signed claims.
|
||||
*/
|
||||
PublicKey: string
|
||||
/**
|
||||
* Number of seconds the source address must wait to close the channel if
|
||||
* it still has any XRP in it. Smaller values mean that the destination
|
||||
* it still has any amount in it. Smaller values mean that the destination
|
||||
* address has less time to redeem any outstanding claims after the source
|
||||
* address requests to close the channel. Can be any value that fits in a
|
||||
* 32-bit unsigned integer (0 to 2^32-1). This is set by the transaction that
|
||||
@@ -104,4 +106,10 @@ export default interface PayChannel extends BaseLedgerEntry {
|
||||
* this object, in case the directory consists of multiple pages.
|
||||
*/
|
||||
DestinationNode?: string
|
||||
/**
|
||||
* The fee to charge when users make claims on a payment channel, initially
|
||||
* set on the creation of a payment channel and updated on subsequent funding
|
||||
* or claim transactions.
|
||||
*/
|
||||
TransferRate?: number
|
||||
}
|
||||
|
||||
42
packages/xrpl/src/models/ledger/UNLReport.ts
Normal file
42
packages/xrpl/src/models/ledger/UNLReport.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import BaseLedgerEntry from './BaseLedgerEntry'
|
||||
|
||||
interface ImportVLKey {
|
||||
ImportVLKey: {
|
||||
PublicKey: string
|
||||
Account?: string
|
||||
}
|
||||
}
|
||||
interface ActiveValidator {
|
||||
ActiveValidator: {
|
||||
PublicKey: string
|
||||
Account?: string
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*
|
||||
* @category Ledger Entries
|
||||
*/
|
||||
export default interface UNLReport extends BaseLedgerEntry {
|
||||
LedgerEntryType: 'UNLReport'
|
||||
/**
|
||||
*
|
||||
*/
|
||||
ImportVLKeys?: ImportVLKey[]
|
||||
/**
|
||||
*
|
||||
*/
|
||||
ActiveValidators?: ActiveValidator[]
|
||||
/**
|
||||
* The identifying hash of the transaction that most recently modified this
|
||||
* object.
|
||||
*/
|
||||
PreviousTxnID: string
|
||||
/**
|
||||
* The index of the ledger that contains the transaction that most recently
|
||||
* modified this object.
|
||||
*/
|
||||
PreviousTxnLgrSeq: number
|
||||
}
|
||||
53
packages/xrpl/src/models/ledger/URIToken.ts
Normal file
53
packages/xrpl/src/models/ledger/URIToken.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { Amount } from '../common'
|
||||
|
||||
import BaseLedgerEntry from './BaseLedgerEntry'
|
||||
|
||||
/**
|
||||
* The URIToken object type contains the
|
||||
*
|
||||
* @category Ledger Entries
|
||||
*/
|
||||
export default interface URIToken extends BaseLedgerEntry {
|
||||
LedgerEntryType: 'URIToken'
|
||||
|
||||
/**
|
||||
*/
|
||||
Owner: string
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
||||
/**
|
||||
*/
|
||||
Issuer: string
|
||||
|
||||
/**
|
||||
*/
|
||||
URI: string
|
||||
|
||||
/**
|
||||
*/
|
||||
Digest: string
|
||||
|
||||
/**
|
||||
*/
|
||||
Amount: Amount
|
||||
|
||||
/**
|
||||
*/
|
||||
Destination: string
|
||||
|
||||
/**
|
||||
* The identifying hash of the transaction that most recently modified this
|
||||
* object.
|
||||
*/
|
||||
PreviousTxnID: string
|
||||
/**
|
||||
* The index of the ledger that contains the transaction that most recently
|
||||
* modified this object.
|
||||
*/
|
||||
PreviousTxnLgrSeq: number
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import FeeSettings from './FeeSettings'
|
||||
import Hook from './Hook'
|
||||
import HookDefinition from './HookDefinition'
|
||||
import HookState from './HookState'
|
||||
import ImportVLSequence from './ImportVLSequence'
|
||||
import Ledger from './Ledger'
|
||||
import LedgerEntry from './LedgerEntry'
|
||||
import LedgerHashes from './LedgerHashes'
|
||||
@@ -21,6 +22,8 @@ import PayChannel from './PayChannel'
|
||||
import RippleState, { RippleStateFlags } from './RippleState'
|
||||
import SignerList, { SignerListFlags } from './SignerList'
|
||||
import Ticket from './Ticket'
|
||||
import UNLReport from './UNLReport'
|
||||
import URIToken from './URIToken'
|
||||
|
||||
export {
|
||||
AccountRoot,
|
||||
@@ -36,6 +39,7 @@ export {
|
||||
Hook,
|
||||
HookDefinition,
|
||||
HookState,
|
||||
ImportVLSequence,
|
||||
Ledger,
|
||||
LedgerEntry,
|
||||
LedgerHashes,
|
||||
@@ -48,4 +52,6 @@ export {
|
||||
SignerList,
|
||||
SignerListFlags,
|
||||
Ticket,
|
||||
UNLReport,
|
||||
URIToken,
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { LedgerIndex } from '../common'
|
||||
import { Amount, LedgerIndex } from '../common'
|
||||
|
||||
import { BaseRequest, BaseResponse } from './baseMethod'
|
||||
|
||||
interface Channel {
|
||||
account: string
|
||||
amount: string
|
||||
amount: Amount
|
||||
balance: string
|
||||
channel_id: string
|
||||
destination_account: string
|
||||
@@ -15,6 +15,7 @@ interface Channel {
|
||||
cancel_after?: number
|
||||
source_tab?: number
|
||||
destination_tag?: number
|
||||
transfer_rate?: number
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { LedgerIndex } from '../common'
|
||||
import { Amount, LedgerIndex } from '../common'
|
||||
|
||||
import { BaseRequest, BaseResponse } from './baseMethod'
|
||||
|
||||
@@ -64,6 +64,14 @@ export interface Trustline {
|
||||
* false.
|
||||
*/
|
||||
freeze_peer?: boolean
|
||||
/**
|
||||
* The total amount of FT, in drops/Amount locked in payment channels or escrow.
|
||||
*/
|
||||
locked_balance?: Amount
|
||||
/**
|
||||
* The total number of lock balances on a RippleState ledger object.
|
||||
*/
|
||||
lock_count?: number
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
46
packages/xrpl/src/models/methods/accountNamespace.ts
Normal file
46
packages/xrpl/src/models/methods/accountNamespace.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { HookState } from '../ledger'
|
||||
|
||||
import { BaseRequest, BaseResponse } from './baseMethod'
|
||||
|
||||
/**
|
||||
* The `account_namespace` command retrieves the account namespace. All information retrieved is relative to a
|
||||
* particular version of the ledger. Returns an {@link AccountNamespaceResponse}.
|
||||
*
|
||||
* @category Requests
|
||||
*/
|
||||
export interface AccountNamespaceRequest extends BaseRequest {
|
||||
command: 'account_namespace'
|
||||
/** A unique identifier for the account, most commonly the account's address. */
|
||||
account: string
|
||||
/** The hex namespace. */
|
||||
namespace_id?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Response expected from an {@link AccountNamespaceRequest}.
|
||||
*
|
||||
* @category Responses
|
||||
*/
|
||||
export interface AccountNamespaceResponse extends BaseResponse {
|
||||
result: {
|
||||
/**
|
||||
* The account requested.
|
||||
*/
|
||||
account: string
|
||||
/**
|
||||
* The namespace_id requested.
|
||||
*/
|
||||
namespace_id: string
|
||||
/**
|
||||
* A list of HookStates for the specified account namespace_id.
|
||||
*/
|
||||
namespace_entries: HookState[]
|
||||
/**
|
||||
* The ledger index of the current open ledger, which was used when
|
||||
* retrieving this information.
|
||||
*/
|
||||
ledger_current_index: number
|
||||
/** If true, this data comes from a validated ledger. */
|
||||
validated: boolean
|
||||
}
|
||||
}
|
||||
@@ -3,11 +3,13 @@ import {
|
||||
Check,
|
||||
DepositPreauth,
|
||||
Escrow,
|
||||
Hook,
|
||||
Offer,
|
||||
PayChannel,
|
||||
RippleState,
|
||||
SignerList,
|
||||
Ticket,
|
||||
URIToken,
|
||||
} from '../ledger'
|
||||
|
||||
import { BaseRequest, BaseResponse } from './baseMethod'
|
||||
@@ -16,12 +18,14 @@ type AccountObjectType =
|
||||
| 'check'
|
||||
| 'deposit_preauth'
|
||||
| 'escrow'
|
||||
| 'hook'
|
||||
| 'nft_offer'
|
||||
| 'offer'
|
||||
| 'payment_channel'
|
||||
| 'signer_list'
|
||||
| 'state'
|
||||
| 'ticket'
|
||||
| 'uritoken'
|
||||
|
||||
/**
|
||||
* The account_objects command returns the raw ledger format for all objects
|
||||
@@ -73,11 +77,13 @@ type AccountObject =
|
||||
| Check
|
||||
| DepositPreauth
|
||||
| Escrow
|
||||
| Hook
|
||||
| Offer
|
||||
| PayChannel
|
||||
| SignerList
|
||||
| RippleState
|
||||
| Ticket
|
||||
| URIToken
|
||||
|
||||
/**
|
||||
* Response expected from an {@link AccountObjectsRequest}.
|
||||
|
||||
@@ -9,7 +9,7 @@ import { BaseRequest, BaseResponse } from './baseMethod'
|
||||
*/
|
||||
export interface ChannelVerifyRequest extends BaseRequest {
|
||||
command: 'channel_verify'
|
||||
/** The amount of XRP, in drops, the provided signature authorizes. */
|
||||
/** The amount the provided signature authorizes. */
|
||||
amount: string
|
||||
/**
|
||||
* The Channel ID of the channel that provides the XRP. This is a
|
||||
|
||||
@@ -8,6 +8,10 @@ import {
|
||||
} from './accountCurrencies'
|
||||
import { AccountInfoRequest, AccountInfoResponse } from './accountInfo'
|
||||
import { AccountLinesRequest, AccountLinesResponse } from './accountLines'
|
||||
import {
|
||||
AccountNamespaceRequest,
|
||||
AccountNamespaceResponse,
|
||||
} from './accountNamespace'
|
||||
import { AccountNFTsRequest, AccountNFTsResponse } from './accountNFTs'
|
||||
import { AccountObjectsRequest, AccountObjectsResponse } from './accountObjects'
|
||||
import {
|
||||
@@ -83,6 +87,7 @@ type Request =
|
||||
| AccountCurrenciesRequest
|
||||
| AccountInfoRequest
|
||||
| AccountLinesRequest
|
||||
| AccountNamespaceRequest
|
||||
| AccountNFTsRequest
|
||||
| AccountObjectsRequest
|
||||
| AccountOffersRequest
|
||||
@@ -133,6 +138,7 @@ type Response =
|
||||
| AccountCurrenciesResponse
|
||||
| AccountInfoResponse
|
||||
| AccountLinesResponse
|
||||
| AccountNamespaceResponse
|
||||
| AccountNFTsResponse
|
||||
| AccountObjectsResponse
|
||||
| AccountOffersResponse
|
||||
|
||||
@@ -79,6 +79,11 @@ export interface LedgerEntryRequest extends BaseRequest {
|
||||
}
|
||||
| string
|
||||
|
||||
/**
|
||||
* The object ID of a transaction emitted by the ledger entry.
|
||||
*/
|
||||
emitted_txn?: string
|
||||
|
||||
/**
|
||||
* The Escrow object to retrieve. If a string, must be the object ID of the
|
||||
* escrow, as hexadecimal. If an object, requires owner and seq sub-fields.
|
||||
@@ -92,6 +97,47 @@ export interface LedgerEntryRequest extends BaseRequest {
|
||||
}
|
||||
| string
|
||||
|
||||
/**
|
||||
* The hash of the Hook object to retrieve.
|
||||
*/
|
||||
hook_definition?: string
|
||||
|
||||
/**
|
||||
* The Hook object to retrieve. If a string, must be the object ID of the Hook.
|
||||
* If an object, requires `account` sub-field.
|
||||
*/
|
||||
hook?:
|
||||
| {
|
||||
/** The account of the Hook object. */
|
||||
account: string
|
||||
}
|
||||
| string
|
||||
|
||||
/**
|
||||
* Object specifying the HookState object to retrieve. Requires the sub-fields
|
||||
* `account`, `key`, and `namespace_id` to uniquely specify the HookState entry
|
||||
* to retrieve.
|
||||
*/
|
||||
hook_state?: {
|
||||
/** The account of the Hook object. */
|
||||
account: string
|
||||
/** The key of the state. */
|
||||
key: string
|
||||
/** The namespace of the state. */
|
||||
namespace_id: string
|
||||
}
|
||||
|
||||
/**
|
||||
* The Import VL Sequence object to retrieve. If a string, must be the object ID of the VLSequence.
|
||||
* If an object, requires `public_key` sub-field.
|
||||
*/
|
||||
import_vlseq?:
|
||||
| {
|
||||
/** The public_key of the Import VL Sequence object. */
|
||||
public_key: string
|
||||
}
|
||||
| string
|
||||
|
||||
/**
|
||||
* The Offer object to retrieve. If a string, interpret as the unique object
|
||||
* ID to the Offer. If an object, requires the sub-fields `account` and `seq`
|
||||
@@ -137,40 +183,20 @@ export interface LedgerEntryRequest extends BaseRequest {
|
||||
ticket_sequence: number
|
||||
}
|
||||
| string
|
||||
/**
|
||||
* The object ID of a transaction emitted by the ledger entry.
|
||||
*/
|
||||
emitted_txn?: string
|
||||
|
||||
/**
|
||||
* The hash of the Hook object to retrieve.
|
||||
* The URIToken object to retrieve. If a string, must be the object ID of the
|
||||
* URIToken, as hexadecimal. If an object, the `issuer` and `uri`
|
||||
* sub-fields are required to uniquely specify the URIToken entry.
|
||||
*/
|
||||
hook_definition?: string
|
||||
|
||||
/**
|
||||
* The Hook object to retrieve. If a string, must be the object ID of the Hook.
|
||||
* If an object, requires `account` sub-field.
|
||||
*/
|
||||
hook?:
|
||||
uri_token?:
|
||||
| {
|
||||
/** The account of the Hook object. */
|
||||
account: string
|
||||
/** The issuer of the URIToken object. */
|
||||
issuer: string
|
||||
/** The URIToken uri string (ascii). */
|
||||
uri: string
|
||||
}
|
||||
| string
|
||||
|
||||
/**
|
||||
* Object specifying the HookState object to retrieve. Requires the sub-fields
|
||||
* `account`, `key`, and `namespace_id` to uniquely specify the HookState entry
|
||||
* to retrieve.
|
||||
*/
|
||||
hook_state?: {
|
||||
/** The account of the Hook object. */
|
||||
account: string
|
||||
/** The key of the state. */
|
||||
key: string
|
||||
/** The namespace of the state. */
|
||||
namespace_id: string
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -136,6 +136,10 @@ export interface ServerInfoResponse extends BaseResponse {
|
||||
* overall network's load factor.
|
||||
*/
|
||||
load_factor?: number
|
||||
/**
|
||||
* The network id of the server.
|
||||
*/
|
||||
network_id?: number
|
||||
/**
|
||||
* Current multiplier to the transaction cost based on
|
||||
* load to this server.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* eslint-disable complexity -- Necessary for validateAccountSet */
|
||||
|
||||
import { isValidClassicAddress } from 'ripple-address-codec'
|
||||
import { isValidClassicAddress } from '@transia/ripple-address-codec'
|
||||
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
@@ -48,6 +48,7 @@ export enum AccountSetAsfFlags {
|
||||
*/
|
||||
asfAuthorizedNFTokenMinter = 10,
|
||||
/** asf 11 is reserved for Hooks amendment */
|
||||
asfTshCollect = 11,
|
||||
/** Disallow other accounts from creating incoming NFTOffers */
|
||||
asfDisallowIncomingNFTokenOffer = 12,
|
||||
/** Disallow other accounts from creating incoming Checks */
|
||||
|
||||
28
packages/xrpl/src/models/transactions/claimReward.ts
Normal file
28
packages/xrpl/src/models/transactions/claimReward.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* ClaimReward is a transaction model that allows an account to claim rewards.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface ClaimReward extends BaseTransaction {
|
||||
TransactionType: 'ClaimReward'
|
||||
/** The unique address of the issuer where the reward.c hook is installed. */
|
||||
Issuer?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an ClaimReward at runtime.
|
||||
*
|
||||
* @param tx - An ClaimReward Transaction.
|
||||
* @throws When the ClaimReward is Malformed.
|
||||
*/
|
||||
export function validateClaimReward(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.Issuer !== undefined && typeof tx.Issuer !== 'string') {
|
||||
throw new ValidationError('ClaimReward: invalid Issuer')
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,17 @@
|
||||
/* eslint-disable max-lines-per-function -- Necessary for validateBaseTransaction */
|
||||
/* eslint-disable complexity -- Necessary for validateBaseTransaction */
|
||||
/* eslint-disable max-statements -- Necessary for validateBaseTransaction */
|
||||
import { TRANSACTION_TYPES } from 'ripple-binary-codec'
|
||||
import { TRANSACTION_TYPES } from '@transia/ripple-binary-codec'
|
||||
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount, IssuedCurrencyAmount, Memo, Signer } from '../common'
|
||||
import {
|
||||
Amount,
|
||||
HookParameter,
|
||||
IssuedCurrencyAmount,
|
||||
Memo,
|
||||
Signer,
|
||||
EmitDetails,
|
||||
} from '../common'
|
||||
import { onlyHasFields } from '../utils'
|
||||
|
||||
const MEMO_SIZE = 3
|
||||
@@ -159,6 +166,18 @@ export interface BaseTransaction {
|
||||
* account it says it is from.
|
||||
*/
|
||||
TxnSignature?: string
|
||||
/**
|
||||
* The network id of the transaction.
|
||||
*/
|
||||
NetworkID?: number
|
||||
/**
|
||||
* The hook parameters of the transaction.
|
||||
*/
|
||||
HookParameters?: HookParameter[]
|
||||
/**
|
||||
* The hook parameters of the transaction.
|
||||
*/
|
||||
EmitDetails?: EmitDetails
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -252,6 +271,9 @@ export function validateBaseTransaction(common: Record<string, unknown>): void {
|
||||
) {
|
||||
throw new ValidationError('BaseTransaction: invalid TxnSignature')
|
||||
}
|
||||
if (common.NetworkID !== undefined && typeof common.NetworkID !== 'number') {
|
||||
throw new ValidationError('BaseTransaction: invalid NetworkID')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,7 +3,7 @@ import { ValidationError } from '../../errors'
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Return escrowed XRP to the sender.
|
||||
* Return escrowed amount to the sender.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
@@ -15,7 +15,12 @@ export interface EscrowCancel extends BaseTransaction {
|
||||
* Transaction sequence (or Ticket number) of EscrowCreate transaction that.
|
||||
* created the escrow to cancel.
|
||||
*/
|
||||
OfferSequence: number
|
||||
OfferSequence?: number
|
||||
/**
|
||||
* The ID of the Escrow ledger object to cancel as a 64-character hexadecimal
|
||||
* string.
|
||||
*/
|
||||
EscrowID?: string
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,11 +40,17 @@ export function validateEscrowCancel(tx: Record<string, unknown>): void {
|
||||
throw new ValidationError('EscrowCancel: Owner must be a string')
|
||||
}
|
||||
|
||||
if (tx.OfferSequence === undefined) {
|
||||
throw new ValidationError('EscrowCancel: missing OfferSequence')
|
||||
if (tx.OfferSequence === undefined && tx.EscrowID === undefined) {
|
||||
throw new ValidationError(
|
||||
'EscrowCancel: must include OfferSequence or EscrowID',
|
||||
)
|
||||
}
|
||||
|
||||
if (typeof tx.OfferSequence !== 'number') {
|
||||
throw new ValidationError('EscrowCancel: OfferSequence must be a number')
|
||||
if (tx.OfferSequence !== undefined && typeof tx.OfferSequence !== 'number') {
|
||||
throw new ValidationError('EscrowCancel: invalid OfferSequence')
|
||||
}
|
||||
|
||||
if (tx.EscrowID !== undefined && typeof tx.EscrowID !== 'string') {
|
||||
throw new ValidationError('EscrowCancel: invalid EscrowID')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
/* eslint-disable complexity -- Necessary for validateEscrowCreate */
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
import { BaseTransaction, isAmount, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Sequester XRP until the escrow process either finishes or is canceled.
|
||||
* Sequester amount until the escrow process either finishes or is canceled.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface EscrowCreate extends BaseTransaction {
|
||||
TransactionType: 'EscrowCreate'
|
||||
/**
|
||||
* Amount of XRP, in drops, to deduct from the sender's balance and escrow.
|
||||
* Once escrowed, the XRP can either go to the Destination address (after the.
|
||||
* FinishAfter time) or returned to the sender (after the CancelAfter time).
|
||||
* Amount to deduct from the sender's balance and escrow. Once escrowed, the
|
||||
* amount can either go to the Destination address (after the FinishAfter time)
|
||||
* or returned to the sender (after the CancelAfter time).
|
||||
*/
|
||||
Amount: string
|
||||
/** Address to receive escrowed XRP. */
|
||||
Amount: Amount
|
||||
/** Address to receive escrowed amount. */
|
||||
Destination: string
|
||||
/**
|
||||
* The time, in seconds since the Ripple Epoch, when this escrow expires.
|
||||
@@ -25,7 +26,7 @@ export interface EscrowCreate extends BaseTransaction {
|
||||
*/
|
||||
CancelAfter?: number
|
||||
/**
|
||||
* The time, in seconds since the Ripple Epoch, when the escrowed XRP can be
|
||||
* The time, in seconds since the Ripple Epoch, when the escrowed amount can be
|
||||
* released to the recipient. This value is immutable; the funds cannot move.
|
||||
* until this time is reached.
|
||||
*/
|
||||
@@ -55,8 +56,8 @@ export function validateEscrowCreate(tx: Record<string, unknown>): void {
|
||||
throw new ValidationError('EscrowCreate: missing field Amount')
|
||||
}
|
||||
|
||||
if (typeof tx.Amount !== 'string') {
|
||||
throw new ValidationError('EscrowCreate: Amount must be a string')
|
||||
if (typeof tx.Amount !== 'string' && !isAmount(tx.Amount)) {
|
||||
throw new ValidationError('EscrowCreate: Amount must be an Amount')
|
||||
}
|
||||
|
||||
if (tx.Destination === undefined) {
|
||||
|
||||
@@ -3,7 +3,7 @@ import { ValidationError } from '../../errors'
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Deliver XRP from a held payment to the recipient.
|
||||
* Deliver amount from a held payment to the recipient.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
|
||||
38
packages/xrpl/src/models/transactions/import.ts
Normal file
38
packages/xrpl/src/models/transactions/import.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface Import extends BaseTransaction {
|
||||
TransactionType: 'Import'
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Issuer?: string
|
||||
/**
|
||||
* Hex value representing a VL Blob.
|
||||
*/
|
||||
Blob?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an Import at runtime.
|
||||
*
|
||||
* @param tx - An Import Transaction.
|
||||
* @throws When the Import is Malformed.
|
||||
*/
|
||||
export function validateImport(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.Issuer !== undefined && typeof tx.Issuer !== 'string') {
|
||||
throw new ValidationError('Import: Issuer must be a string')
|
||||
}
|
||||
|
||||
if (tx.Account === tx.Issuer) {
|
||||
throw new ValidationError('Import: Issuer and Account must not be equal')
|
||||
}
|
||||
}
|
||||
@@ -10,10 +10,12 @@ export { AccountDelete } from './accountDelete'
|
||||
export { CheckCancel } from './checkCancel'
|
||||
export { CheckCash } from './checkCash'
|
||||
export { CheckCreate } from './checkCreate'
|
||||
export { ClaimReward } from './claimReward'
|
||||
export { DepositPreauth } from './depositPreauth'
|
||||
export { EscrowCancel } from './escrowCancel'
|
||||
export { EscrowCreate } from './escrowCreate'
|
||||
export { EscrowFinish } from './escrowFinish'
|
||||
export { Import } from './import'
|
||||
export { Invoke } from './invoke'
|
||||
export { NFTokenAcceptOffer } from './NFTokenAcceptOffer'
|
||||
export { NFTokenBurn } from './NFTokenBurn'
|
||||
@@ -42,8 +44,18 @@ export {
|
||||
} from './paymentChannelClaim'
|
||||
export { PaymentChannelCreate } from './paymentChannelCreate'
|
||||
export { PaymentChannelFund } from './paymentChannelFund'
|
||||
export { Remit } from './remit'
|
||||
export { SetHookFlagsInterface, SetHookFlags, SetHook } from './setHook'
|
||||
export { SetRegularKey } from './setRegularKey'
|
||||
export { SetHook } from './setHook'
|
||||
export { SignerListSet } from './signerListSet'
|
||||
export { TicketCreate } from './ticketCreate'
|
||||
export { TrustSetFlagsInterface, TrustSetFlags, TrustSet } from './trustSet'
|
||||
export {
|
||||
URITokenMintFlagsInterface,
|
||||
URITokenMintFlags,
|
||||
URITokenMint,
|
||||
} from './uriTokenMint'
|
||||
export { URITokenBurn } from './uriTokenBurn'
|
||||
export { URITokenCreateSellOffer } from './uriTokenCreateSellOffer'
|
||||
export { URITokenBuy } from './uriTokenBuy'
|
||||
export { URITokenCancelSellOffer } from './uriTokenCancelSellOffer'
|
||||
|
||||
@@ -13,6 +13,10 @@ export interface Invoke extends BaseTransaction {
|
||||
* If present, invokes the Hook on the Destination account.
|
||||
*/
|
||||
Destination?: string
|
||||
/**
|
||||
* Hex value representing a VL Blob.
|
||||
*/
|
||||
Blob?: string
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,29 @@
|
||||
import { Amount } from '../common'
|
||||
|
||||
export interface HookExecution {
|
||||
HookExecution: {
|
||||
HookAccount: string
|
||||
HookEmitCount: number
|
||||
HookExecutionIndex: number
|
||||
HookHash: string
|
||||
HookInstructionCount: string
|
||||
HookResult: number
|
||||
HookReturnCode: string
|
||||
HookReturnString: string
|
||||
HookStateChangeCount: number
|
||||
Flags: number
|
||||
}
|
||||
}
|
||||
|
||||
export interface HookEmission {
|
||||
HookEmission: {
|
||||
EmittedTxnID: string
|
||||
HookAccount: string
|
||||
HookHash: string
|
||||
EmitNonce: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface CreatedNode {
|
||||
CreatedNode: {
|
||||
LedgerEntryType: string
|
||||
@@ -60,6 +84,8 @@ export function isDeletedNode(node: Node): node is DeletedNode {
|
||||
}
|
||||
|
||||
export interface TransactionMetadata {
|
||||
HookExecutions?: HookExecution[]
|
||||
HookEmissions?: HookEmission[]
|
||||
AffectedNodes: Node[]
|
||||
DeliveredAmount?: Amount
|
||||
// "unavailable" possible for transactions before 2014-01-20
|
||||
|
||||
@@ -15,7 +15,12 @@ export interface OfferCancel extends BaseTransaction {
|
||||
* created by that transaction. It is not considered an error if the offer.
|
||||
* specified does not exist.
|
||||
*/
|
||||
OfferSequence: number
|
||||
OfferSequence?: number
|
||||
/**
|
||||
* The ID of the Escrow ledger object to cancel as a 64-character hexadecimal
|
||||
* string.
|
||||
*/
|
||||
OfferID?: string
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -27,11 +32,17 @@ export interface OfferCancel extends BaseTransaction {
|
||||
export function validateOfferCancel(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.OfferSequence === undefined) {
|
||||
throw new ValidationError('OfferCancel: missing field OfferSequence')
|
||||
if (tx.OfferSequence === undefined && tx.OfferID === undefined) {
|
||||
throw new ValidationError(
|
||||
'OfferCancel: must include OfferSequence or OfferID',
|
||||
)
|
||||
}
|
||||
|
||||
if (typeof tx.OfferSequence !== 'number') {
|
||||
throw new ValidationError('OfferCancel: OfferSequence must be a number')
|
||||
if (tx.OfferSequence !== undefined && typeof tx.OfferSequence !== 'number') {
|
||||
throw new ValidationError('OfferCancel: invalid OfferSequence')
|
||||
}
|
||||
|
||||
if (tx.OfferID !== undefined && typeof tx.OfferID !== 'string') {
|
||||
throw new ValidationError('OfferCancel: invalid OfferID')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,6 +103,11 @@ export interface OfferCreate extends BaseTransaction {
|
||||
Expiration?: number
|
||||
/** An offer to delete first, specified in the same way as OfferCancel. */
|
||||
OfferSequence?: number
|
||||
/**
|
||||
* The ID of the Offer ledger object to cancel as a 64-character hexadecimal
|
||||
* string.
|
||||
*/
|
||||
OfferID?: string
|
||||
/** The amount and type of currency being provided by the offer creator. */
|
||||
TakerGets: Amount
|
||||
/** The amount and type of currency being requested by the offer creator. */
|
||||
@@ -141,4 +146,8 @@ export function validateOfferCreate(tx: Record<string, unknown>): void {
|
||||
if (tx.OfferSequence !== undefined && typeof tx.OfferSequence !== 'number') {
|
||||
throw new ValidationError('OfferCreate: invalid OfferSequence')
|
||||
}
|
||||
|
||||
if (tx.OfferID !== undefined && typeof tx.OfferID !== 'string') {
|
||||
throw new ValidationError('OfferCreate: invalid OfferID')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
/* eslint-disable complexity -- Necessary for validatePaymentChannelClaim */
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
|
||||
import { BaseTransaction, GlobalFlags, validateBaseTransaction } from './common'
|
||||
import {
|
||||
BaseTransaction,
|
||||
GlobalFlags,
|
||||
validateBaseTransaction,
|
||||
isAmount,
|
||||
} from './common'
|
||||
|
||||
/**
|
||||
* Enum representing values for PaymentChannelClaim transaction flags.
|
||||
@@ -18,15 +24,15 @@ export enum PaymentChannelClaimFlags {
|
||||
/**
|
||||
* Request to close the channel. Only the channel source and destination
|
||||
* addresses can use this flag. This flag closes the channel immediately if it
|
||||
* has no more XRP allocated to it after processing the current claim, or if
|
||||
* has no more funds allocated to it after processing the current claim, or if
|
||||
* the destination address uses it. If the source address uses this flag when
|
||||
* the channel still holds XRP, this schedules the channel to close after
|
||||
* the channel still holds an amount, this schedules the channel to close after
|
||||
* SettleDelay seconds have passed. (Specifically, this sets the Expiration of
|
||||
* the channel to the close time of the previous ledger plus the channel's
|
||||
* SettleDelay time, unless the channel already has an earlier Expiration
|
||||
* time.) If the destination address uses this flag when the channel still
|
||||
* holds XRP, any XRP that remains after processing the claim is returned to
|
||||
* the source address.
|
||||
* holds an amount, any amount that remains after processing the claim is
|
||||
* returned to the source address.
|
||||
*/
|
||||
tfClose = 0x00020000,
|
||||
}
|
||||
@@ -78,21 +84,21 @@ export interface PaymentChannelClaimFlagsInterface extends GlobalFlags {
|
||||
/**
|
||||
* Request to close the channel. Only the channel source and destination
|
||||
* addresses can use this flag. This flag closes the channel immediately if it
|
||||
* has no more XRP allocated to it after processing the current claim, or if
|
||||
* has no more funds allocated to it after processing the current claim, or if
|
||||
* the destination address uses it. If the source address uses this flag when
|
||||
* the channel still holds XRP, this schedules the channel to close after
|
||||
* the channel still holds an amount, this schedules the channel to close after
|
||||
* SettleDelay seconds have passed. (Specifically, this sets the Expiration of
|
||||
* the channel to the close time of the previous ledger plus the channel's
|
||||
* SettleDelay time, unless the channel already has an earlier Expiration
|
||||
* time.) If the destination address uses this flag when the channel still
|
||||
* holds XRP, any XRP that remains after processing the claim is returned to
|
||||
* the source address.
|
||||
* holds an amount, any amount that remains after processing the claim is
|
||||
* returned to the source address.
|
||||
*/
|
||||
tfClose?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Claim XRP from a payment channel, adjust the payment channel's expiration,
|
||||
* Claim amount from a payment channel, adjust the payment channel's expiration,
|
||||
* or both.
|
||||
*
|
||||
* @category Transaction Models
|
||||
@@ -103,18 +109,18 @@ export interface PaymentChannelClaim extends BaseTransaction {
|
||||
/** The unique ID of the channel as a 64-character hexadecimal string. */
|
||||
Channel: string
|
||||
/**
|
||||
* Total amount of XRP, in drops, delivered by this channel after processing
|
||||
* this claim. Required to deliver XRP. Must be more than the total amount
|
||||
* delivered by the channel so far, but not greater than the Amount of the
|
||||
* signed claim. Must be provided except when closing the channel.
|
||||
* Total amount delivered by this channel after processing this claim. Required
|
||||
* to deliver amount. Must be more than the total amount delivered by the channel
|
||||
* so far, but not greater than the Amount of the signed claim. Must be provided
|
||||
* except when closing the channel.
|
||||
*/
|
||||
Balance?: string
|
||||
Balance?: Amount
|
||||
/**
|
||||
* The amount of XRP, in drops, authorized by the Signature. This must match
|
||||
* the amount in the signed message. This is the cumulative amount of XRP that
|
||||
* can be dispensed by the channel, including XRP previously redeemed.
|
||||
* The amount authorized by the Signature. This must match the amount in the
|
||||
* signed message. This is the cumulative amount that can be dispensed by the
|
||||
* channel, including amounts previously redeemed. Required unless closing the channel.
|
||||
*/
|
||||
Amount?: string
|
||||
Amount?: Amount
|
||||
/**
|
||||
* The signature of this claim, as hexadecimal. The signed message contains
|
||||
* the channel ID and the amount of the claim. Required unless the sender of
|
||||
@@ -147,12 +153,12 @@ export function validatePaymentChannelClaim(tx: Record<string, unknown>): void {
|
||||
throw new ValidationError('PaymentChannelClaim: Channel must be a string')
|
||||
}
|
||||
|
||||
if (tx.Balance !== undefined && typeof tx.Balance !== 'string') {
|
||||
throw new ValidationError('PaymentChannelClaim: Balance must be a string')
|
||||
if (tx.Balance !== undefined && !isAmount(tx.Balance)) {
|
||||
throw new ValidationError('PaymentChannelClaim: Balance must be an Amount')
|
||||
}
|
||||
|
||||
if (tx.Amount !== undefined && typeof tx.Amount !== 'string') {
|
||||
throw new ValidationError('PaymentChannelClaim: Amount must be a string')
|
||||
if (tx.Amount !== undefined && !isAmount(tx.Amount)) {
|
||||
throw new ValidationError('PaymentChannelClaim: Amount must be an Amount')
|
||||
}
|
||||
|
||||
if (tx.Signature !== undefined && typeof tx.Signature !== 'string') {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
/* eslint-disable complexity -- Necessary for validatePaymentChannelCreate */
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
import { BaseTransaction, validateBaseTransaction, isAmount } from './common'
|
||||
|
||||
/**
|
||||
* Create a unidirectional channel and fund it with XRP. The address sending
|
||||
* Create a unidirectional channel and fund it. The address sending
|
||||
* this transaction becomes the "source address" of the payment channel.
|
||||
*
|
||||
* @category Transaction Models
|
||||
@@ -12,20 +13,20 @@ import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
export interface PaymentChannelCreate extends BaseTransaction {
|
||||
TransactionType: 'PaymentChannelCreate'
|
||||
/**
|
||||
* Amount of XRP, in drops, to deduct from the sender's balance and set aside
|
||||
* in this channel. While the channel is open, the XRP can only go to the
|
||||
* Destination address. When the channel closes, any unclaimed XRP is returned
|
||||
* to the source address's balance.
|
||||
* Amount to deduct from the sender's balance and set aside in this channel.
|
||||
* While the channel is open, the amount can only go to the Destination
|
||||
* address. When the channel closes, any unclaimed amount is returned to
|
||||
* the source address's balance.
|
||||
*/
|
||||
Amount: string
|
||||
Amount: Amount
|
||||
/**
|
||||
* Address to receive XRP claims against this channel. This is also known as
|
||||
* Address to receive claims against this channel. This is also known as
|
||||
* the "destination address" for the channel.
|
||||
*/
|
||||
Destination: string
|
||||
/**
|
||||
* Amount of time the source address must wait before closing the channel if
|
||||
* it has unclaimed XRP.
|
||||
* it has unclaimed amount.
|
||||
*/
|
||||
SettleDelay: number
|
||||
/**
|
||||
@@ -65,8 +66,8 @@ export function validatePaymentChannelCreate(
|
||||
throw new ValidationError('PaymentChannelCreate: missing Amount')
|
||||
}
|
||||
|
||||
if (typeof tx.Amount !== 'string') {
|
||||
throw new ValidationError('PaymentChannelCreate: Amount must be a string')
|
||||
if (typeof tx.Amount !== 'string' && !isAmount(tx.Amount)) {
|
||||
throw new ValidationError('PaymentChannelCreate: Amount must be an Amount')
|
||||
}
|
||||
|
||||
if (tx.Destination === undefined) {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
import { BaseTransaction, validateBaseTransaction, isAmount } from './common'
|
||||
|
||||
/**
|
||||
* Add additional XRP to an open payment channel, and optionally update the
|
||||
* Add additional amount to an open payment channel, and optionally update the
|
||||
* expiration time of the channel. Only the source address of the channel can
|
||||
* use this transaction.
|
||||
*
|
||||
@@ -17,16 +18,15 @@ export interface PaymentChannelFund extends BaseTransaction {
|
||||
*/
|
||||
Channel: string
|
||||
/**
|
||||
* Amount of XRP in drops to add to the channel. Must be a positive amount
|
||||
* of XRP.
|
||||
* Amount to add to the channel. Must be a positive amount
|
||||
*/
|
||||
Amount: string
|
||||
Amount: Amount
|
||||
/**
|
||||
* New Expiration time to set for the channel in seconds since the Ripple
|
||||
* Epoch. This must be later than either the current time plus the SettleDelay
|
||||
* of the channel, or the existing Expiration of the channel. After the
|
||||
* Expiration time, any transaction that would access the channel closes the
|
||||
* channel without taking its normal action. Any unspent XRP is returned to
|
||||
* channel without taking its normal action. Any unspent amount is returned to
|
||||
* the source address when the channel closes. (Expiration is separate from
|
||||
* the channel's immutable CancelAfter time.) For more information, see the
|
||||
* PayChannel ledger object type.
|
||||
@@ -55,8 +55,8 @@ export function validatePaymentChannelFund(tx: Record<string, unknown>): void {
|
||||
throw new ValidationError('PaymentChannelFund: missing Amount')
|
||||
}
|
||||
|
||||
if (typeof tx.Amount !== 'string') {
|
||||
throw new ValidationError('PaymentChannelFund: Amount must be a string')
|
||||
if (typeof tx.Amount !== 'string' && !isAmount(tx.Amount)) {
|
||||
throw new ValidationError('PaymentChannelFund: Amount must be an Amount')
|
||||
}
|
||||
|
||||
if (tx.Expiration !== undefined && typeof tx.Expiration !== 'number') {
|
||||
|
||||
200
packages/xrpl/src/models/transactions/remit.ts
Normal file
200
packages/xrpl/src/models/transactions/remit.ts
Normal file
@@ -0,0 +1,200 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { AmountEntry, MintURIToken } from '../common'
|
||||
import { isHex } from '../utils'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
const MAX_URI_LENGTH = 256
|
||||
const DIGEST_LENGTH = 64
|
||||
const MAX_ARRAY_LENGTH = 32
|
||||
const MAX_BLOB_LENGTH = 1024
|
||||
|
||||
/**
|
||||
* A Remit transaction represents a transfer of value from one account to
|
||||
* another.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface Remit extends BaseTransaction {
|
||||
TransactionType: 'Remit'
|
||||
/** The unique address of the account receiving the payment. */
|
||||
Destination: string
|
||||
/**
|
||||
* Arbitrary tag that identifies the reason for the payment to the
|
||||
* destination, or a hosted recipient to pay.
|
||||
*/
|
||||
DestinationTag?: number
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Amounts?: AmountEntry[]
|
||||
/**
|
||||
*
|
||||
*/
|
||||
MintURIToken?: MintURIToken
|
||||
/**
|
||||
* Arbitrary 256-bit hash representing a specific reason or identifier for
|
||||
* this payment.
|
||||
*/
|
||||
InvoiceID?: string
|
||||
/**
|
||||
* Hex value representing a VL Blob.
|
||||
*/
|
||||
Blob?: string
|
||||
/** The unique address of the account to inform */
|
||||
Inform?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of a Remit at runtime.
|
||||
*
|
||||
* @param tx - A Remit Transaction.
|
||||
* @throws When the Remit is malformed.
|
||||
*/
|
||||
// eslint-disable-next-line complexity -- ignore
|
||||
export function validateRemit(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.Amounts !== undefined) {
|
||||
checkAmounts(tx)
|
||||
}
|
||||
if (tx.URITokenIDs !== undefined) {
|
||||
checkURITokenIDs(tx)
|
||||
}
|
||||
if (tx.Destination === tx.Account) {
|
||||
throw new ValidationError(
|
||||
'Remit: Destination must not be equal to the account',
|
||||
)
|
||||
}
|
||||
if (tx.DestinationTag != null && typeof tx.DestinationTag !== 'number') {
|
||||
throw new ValidationError('Remit: DestinationTag must be a number')
|
||||
}
|
||||
if (tx.Inform === tx.Account || tx.inform === tx.Destination) {
|
||||
throw new ValidationError(
|
||||
'Remit: Inform must not be equal to the account or destination',
|
||||
)
|
||||
}
|
||||
|
||||
if (tx.MintURIToken !== undefined) {
|
||||
checkMintURIToken(tx)
|
||||
}
|
||||
|
||||
if (tx.Blob !== undefined && typeof tx.Blob !== 'string') {
|
||||
throw new ValidationError('Remit: Blob must be a string')
|
||||
}
|
||||
|
||||
if (tx.Blob !== undefined && typeof tx.Blob === 'string') {
|
||||
if (!isHex(tx.Blob)) {
|
||||
throw new ValidationError('Remit: Blob must be a hex string')
|
||||
}
|
||||
if (tx.Blob.length > MAX_BLOB_LENGTH) {
|
||||
throw new ValidationError('Remit: max size Blob')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkAmounts(tx: Record<string, unknown>): void {
|
||||
if (!Array.isArray(tx.Amounts)) {
|
||||
throw new ValidationError('Remit: Amounts must be an array')
|
||||
}
|
||||
if (tx.Amounts.length < 1) {
|
||||
throw new ValidationError('Remit: empty field Amounts')
|
||||
}
|
||||
if (tx.Amounts.length > MAX_ARRAY_LENGTH) {
|
||||
throw new ValidationError('Remit: max field Amounts')
|
||||
}
|
||||
const seen = new Set<string>()
|
||||
let seenXrp = false
|
||||
for (const amount of tx.Amounts) {
|
||||
if (
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- ignore
|
||||
amount.AmountEntry === undefined ||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- ignore
|
||||
typeof amount.AmountEntry !== 'object'
|
||||
) {
|
||||
throw new ValidationError('Remit: invalid Amounts.AmountEntry')
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- ignore
|
||||
if (typeof amount.AmountEntry.Amount === 'string') {
|
||||
// eslint-disable-next-line max-depth -- ignore
|
||||
if (seenXrp) {
|
||||
throw new ValidationError(
|
||||
'Remit: Duplicate Native amounts are not allowed',
|
||||
)
|
||||
}
|
||||
seenXrp = true
|
||||
} else {
|
||||
// eslint-disable-next-line max-len -- ignore
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access -- ignore
|
||||
const amountKey = `${amount.AmountEntry.Amount.currency}:${amount.AmountEntry.Amount.issuer}`
|
||||
// eslint-disable-next-line max-depth -- ingore
|
||||
if (seen.has(amountKey)) {
|
||||
throw new ValidationError('Remit: Duplicate amounts are not allowed')
|
||||
}
|
||||
seen.add(amountKey)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkURITokenIDs(tx: Record<string, unknown>): void {
|
||||
if (!Array.isArray(tx.URITokenIDs)) {
|
||||
throw new ValidationError('Remit: invalid field URITokenIDs')
|
||||
}
|
||||
if (tx.URITokenIDs.length < 1) {
|
||||
throw new ValidationError('Remit: empty field URITokenIDs')
|
||||
}
|
||||
if (tx.URITokenIDs.length > MAX_ARRAY_LENGTH) {
|
||||
throw new ValidationError('Remit: max field URITokenIDs')
|
||||
}
|
||||
const seen = new Set<string>()
|
||||
for (const token of tx.URITokenIDs) {
|
||||
if (typeof token !== 'string' || !isHex(token)) {
|
||||
throw new ValidationError('Remit: URITokenID must be a hex string')
|
||||
}
|
||||
if (token.length !== DIGEST_LENGTH) {
|
||||
throw new ValidationError(
|
||||
`Remit: URITokenID must be exactly ${DIGEST_LENGTH} characters`,
|
||||
)
|
||||
}
|
||||
if (seen.has(token)) {
|
||||
throw new ValidationError('Remit: Duplicate URITokens are not allowed')
|
||||
}
|
||||
seen.add(token)
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line complexity -- ignore
|
||||
function checkMintURIToken(tx: Record<string, unknown>): void {
|
||||
function isRecord(value: unknown): value is Record<string, unknown> {
|
||||
return value !== null && typeof value === 'object'
|
||||
}
|
||||
if (!isRecord(tx.MintURIToken)) {
|
||||
throw new ValidationError('Remit: invalid MintURIToken')
|
||||
}
|
||||
if (tx.MintURIToken.URI === undefined) {
|
||||
throw new ValidationError('Remit: missing field MintURIToken.URI')
|
||||
}
|
||||
if (typeof tx.MintURIToken.URI !== 'string' || !isHex(tx.MintURIToken.URI)) {
|
||||
throw new ValidationError('Remit: MintURIToken.URI must be a hex string')
|
||||
}
|
||||
if (tx.MintURIToken.URI.length > MAX_URI_LENGTH) {
|
||||
throw new ValidationError(
|
||||
`Remit: URI must be less than ${MAX_URI_LENGTH} characters`,
|
||||
)
|
||||
}
|
||||
if (
|
||||
tx.MintURIToken.Digest !== undefined &&
|
||||
typeof tx.MintURIToken.Digest !== 'string'
|
||||
) {
|
||||
throw new ValidationError(`Remit: MintURIToken.Digest must be a string`)
|
||||
}
|
||||
if (
|
||||
tx.MintURIToken.Digest !== undefined &&
|
||||
!isHex(tx.MintURIToken.Digest) &&
|
||||
tx.MintURIToken.Digest.length !== DIGEST_LENGTH
|
||||
) {
|
||||
throw new ValidationError(
|
||||
`Remit: Digest must be exactly ${DIGEST_LENGTH} characters`,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,30 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Hook } from '../common'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
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
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -14,9 +37,11 @@ export interface SetHook extends BaseTransaction {
|
||||
*
|
||||
*/
|
||||
Hooks: Hook[]
|
||||
|
||||
Flags?: number | SetHookFlagsInterface
|
||||
}
|
||||
|
||||
const MAX_HOOKS = 4
|
||||
const MAX_HOOKS = 10
|
||||
const HEX_REGEX = /^[0-9A-Fa-f]{64}$/u
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,7 +23,7 @@ export interface SignerListSet extends BaseTransaction {
|
||||
* more than 32 members. No address may appear more than once in the list, nor
|
||||
* may the Account submitting the transaction appear in the list.
|
||||
*/
|
||||
SignerEntries: SignerEntry[]
|
||||
SignerEntries?: SignerEntry[]
|
||||
}
|
||||
|
||||
const MAX_SIGNERS = 32
|
||||
@@ -36,6 +36,7 @@ const HEX_WALLET_LOCATOR_REGEX = /^[0-9A-Fa-f]{64}$/u
|
||||
* @param tx - An SignerListSet Transaction.
|
||||
* @throws When the SignerListSet is Malformed.
|
||||
*/
|
||||
// eslint-disable-next-line complexity -- validation can be complex
|
||||
export function validateSignerListSet(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
@@ -47,6 +48,10 @@ export function validateSignerListSet(tx: Record<string, unknown>): void {
|
||||
throw new ValidationError('SignerListSet: invalid SignerQuorum')
|
||||
}
|
||||
|
||||
if (tx.SignerQuorum === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
if (tx.SignerEntries === undefined) {
|
||||
throw new ValidationError('SignerListSet: missing field SignerEntries')
|
||||
}
|
||||
|
||||
@@ -9,10 +9,13 @@ import { AccountSet, validateAccountSet } from './accountSet'
|
||||
import { CheckCancel, validateCheckCancel } from './checkCancel'
|
||||
import { CheckCash, validateCheckCash } from './checkCash'
|
||||
import { CheckCreate, validateCheckCreate } from './checkCreate'
|
||||
import { ClaimReward, validateClaimReward } from './claimReward'
|
||||
import { DepositPreauth, validateDepositPreauth } from './depositPreauth'
|
||||
import { EscrowCancel, validateEscrowCancel } from './escrowCancel'
|
||||
import { EscrowCreate, validateEscrowCreate } from './escrowCreate'
|
||||
import { EscrowFinish, validateEscrowFinish } from './escrowFinish'
|
||||
import { Import, validateImport } from './import'
|
||||
import { Invoke, validateInvoke } from './invoke'
|
||||
import { TransactionMetadata } from './metadata'
|
||||
import {
|
||||
NFTokenAcceptOffer,
|
||||
@@ -43,11 +46,23 @@ import {
|
||||
PaymentChannelFund,
|
||||
validatePaymentChannelFund,
|
||||
} from './paymentChannelFund'
|
||||
import { Remit, validateRemit } from './remit'
|
||||
import { SetHook, validateSetHook } from './setHook'
|
||||
import { SetRegularKey, validateSetRegularKey } from './setRegularKey'
|
||||
import { SignerListSet, validateSignerListSet } from './signerListSet'
|
||||
import { TicketCreate, validateTicketCreate } from './ticketCreate'
|
||||
import { TrustSet, validateTrustSet } from './trustSet'
|
||||
import { URITokenBurn, validateURITokenBurn } from './uriTokenBurn'
|
||||
import { URITokenBuy, validateURITokenBuy } from './uriTokenBuy'
|
||||
import {
|
||||
URITokenCancelSellOffer,
|
||||
validateURITokenCancelSellOffer,
|
||||
} from './uriTokenCancelSellOffer'
|
||||
import {
|
||||
URITokenCreateSellOffer,
|
||||
validateURITokenCreateSellOffer,
|
||||
} from './uriTokenCreateSellOffer'
|
||||
import { URITokenMint, validateURITokenMint } from './uriTokenMint'
|
||||
|
||||
/**
|
||||
* @category Transaction Models
|
||||
@@ -58,10 +73,13 @@ export type Transaction =
|
||||
| CheckCancel
|
||||
| CheckCash
|
||||
| CheckCreate
|
||||
| ClaimReward
|
||||
| DepositPreauth
|
||||
| EscrowCancel
|
||||
| EscrowCreate
|
||||
| EscrowFinish
|
||||
| Import
|
||||
| Invoke
|
||||
| NFTokenAcceptOffer
|
||||
| NFTokenBurn
|
||||
| NFTokenCancelOffer
|
||||
@@ -73,11 +91,17 @@ export type Transaction =
|
||||
| PaymentChannelClaim
|
||||
| PaymentChannelCreate
|
||||
| PaymentChannelFund
|
||||
| Remit
|
||||
| SetHook
|
||||
| SetRegularKey
|
||||
| SignerListSet
|
||||
| TicketCreate
|
||||
| TrustSet
|
||||
| URITokenBurn
|
||||
| URITokenBuy
|
||||
| URITokenCancelSellOffer
|
||||
| URITokenMint
|
||||
| URITokenCreateSellOffer
|
||||
|
||||
/**
|
||||
* @category Transaction Models
|
||||
@@ -126,6 +150,10 @@ export function validate(transaction: Record<string, unknown>): void {
|
||||
validateCheckCreate(tx)
|
||||
break
|
||||
|
||||
case 'ClaimReward':
|
||||
validateClaimReward(tx)
|
||||
break
|
||||
|
||||
case 'DepositPreauth':
|
||||
validateDepositPreauth(tx)
|
||||
break
|
||||
@@ -142,6 +170,14 @@ export function validate(transaction: Record<string, unknown>): void {
|
||||
validateEscrowFinish(tx)
|
||||
break
|
||||
|
||||
case 'Import':
|
||||
validateImport(tx)
|
||||
break
|
||||
|
||||
case 'Invoke':
|
||||
validateInvoke(tx)
|
||||
break
|
||||
|
||||
case 'NFTokenAcceptOffer':
|
||||
validateNFTokenAcceptOffer(tx)
|
||||
break
|
||||
@@ -186,14 +222,18 @@ export function validate(transaction: Record<string, unknown>): void {
|
||||
validatePaymentChannelFund(tx)
|
||||
break
|
||||
|
||||
case 'SetRegularKey':
|
||||
validateSetRegularKey(tx)
|
||||
case 'Remit':
|
||||
validateRemit(tx)
|
||||
break
|
||||
|
||||
case 'SetHook':
|
||||
validateSetHook(tx)
|
||||
break
|
||||
|
||||
case 'SetRegularKey':
|
||||
validateSetRegularKey(tx)
|
||||
break
|
||||
|
||||
case 'SignerListSet':
|
||||
validateSignerListSet(tx)
|
||||
break
|
||||
@@ -206,6 +246,26 @@ export function validate(transaction: Record<string, unknown>): void {
|
||||
validateTrustSet(tx)
|
||||
break
|
||||
|
||||
case 'URITokenMint':
|
||||
validateURITokenMint(tx)
|
||||
break
|
||||
|
||||
case 'URITokenBurn':
|
||||
validateURITokenBurn(tx)
|
||||
break
|
||||
|
||||
case 'URITokenCreateSellOffer':
|
||||
validateURITokenCreateSellOffer(tx)
|
||||
break
|
||||
|
||||
case 'URITokenBuy':
|
||||
validateURITokenBuy(tx)
|
||||
break
|
||||
|
||||
case 'URITokenCancelSellOffer':
|
||||
validateURITokenCancelSellOffer(tx)
|
||||
break
|
||||
|
||||
default:
|
||||
throw new ValidationError(
|
||||
`Invalid field TransactionType: ${tx.TransactionType}`,
|
||||
|
||||
60
packages/xrpl/src/models/transactions/uriTokenBurn.ts
Normal file
60
packages/xrpl/src/models/transactions/uriTokenBurn.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link URITokenBurn} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: URITokenBurn = {
|
||||
* Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* TransactionType: 'URITokenBurn',
|
||||
* }
|
||||
*
|
||||
* // 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',
|
||||
* // URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* // TransactionType: 'URITokenBurn',
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
|
||||
/**
|
||||
* An URITokenBurn transaction is effectively a limit order . It defines an
|
||||
* intent to exchange currencies, and creates an Offer object if not completely.
|
||||
* Fulfilled when placed. Offers can be partially fulfilled.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface URITokenBurn extends BaseTransaction {
|
||||
TransactionType: 'URITokenBurn'
|
||||
/**
|
||||
* Identifies the URIToken object to be removed by the transaction.
|
||||
*/
|
||||
URITokenID: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an URITokenBurn at runtime.
|
||||
*
|
||||
* @param tx - An URITokenBurn Transaction.
|
||||
* @throws When the URITokenBurn is Malformed.
|
||||
*/
|
||||
export function validateURITokenBurn(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.URITokenID == null) {
|
||||
throw new ValidationError('NFTokenBurn: missing field URITokenID')
|
||||
}
|
||||
}
|
||||
83
packages/xrpl/src/models/transactions/uriTokenBuy.ts
Normal file
83
packages/xrpl/src/models/transactions/uriTokenBuy.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
|
||||
import { BaseTransaction, isAmount, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link URITokenBuy} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: URITokenBuy = {
|
||||
* Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* Amount: '1000000',
|
||||
* TransactionType: 'URITokenBuy',
|
||||
* }
|
||||
*
|
||||
* // 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',
|
||||
* // URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* // Amount: '1000000',
|
||||
* // TransactionType: 'URITokenBuy',
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
|
||||
/**
|
||||
* An URITokenBuy transaction is effectively a limit order . It defines an
|
||||
* intent to exchange currencies, and creates an Offer object if not completely.
|
||||
* Fulfilled when placed. Offers can be partially fulfilled.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface URITokenBuy extends BaseTransaction {
|
||||
TransactionType: 'URITokenBuy'
|
||||
/**
|
||||
* Identifies the URITokenID of the NFToken object that the
|
||||
* offer references.
|
||||
*/
|
||||
URITokenID: string
|
||||
/**
|
||||
* Indicates the amount expected or offered for the Token.
|
||||
*
|
||||
* The amount must be non-zero, except when this is a sell
|
||||
* offer and the asset is XRP. This would indicate that the current
|
||||
* owner of the token is giving it away free, either to anyone at all,
|
||||
* or to the account identified by the Destination field.
|
||||
*/
|
||||
Amount: Amount
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an URITokenBuy at runtime.
|
||||
*
|
||||
* @param tx - An URITokenBuy Transaction.
|
||||
* @throws When the URITokenBuy is Malformed.
|
||||
*/
|
||||
export function validateURITokenBuy(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.Account === tx.Destination) {
|
||||
throw new ValidationError(
|
||||
'URITokenBuy: Destination and Account must not be equal',
|
||||
)
|
||||
}
|
||||
|
||||
if (tx.URITokenID == null) {
|
||||
throw new ValidationError('URITokenBuy: missing field URITokenID')
|
||||
}
|
||||
|
||||
if (!isAmount(tx.Amount)) {
|
||||
throw new ValidationError('URITokenBuy: invalid Amount')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
|
||||
import { BaseTransaction, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link URITokenCancelSellOffer} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: URITokenCancelSellOffer = {
|
||||
* Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* TransactionType: 'URITokenCancelSellOffer',
|
||||
* }
|
||||
*
|
||||
* // 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',
|
||||
* // URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* // TransactionType: 'URITokenCancelSellOffer',
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
|
||||
/**
|
||||
* An URITokenCancelSellOffer transaction is effectively a limit order . It defines an
|
||||
* intent to exchange currencies, and creates an Offer object if not completely.
|
||||
* Fulfilled when placed. Offers can be partially fulfilled.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface URITokenCancelSellOffer extends BaseTransaction {
|
||||
TransactionType: 'URITokenCancelSellOffer'
|
||||
/**
|
||||
* Identifies the URITokenID of the NFToken object that the
|
||||
* offer references.
|
||||
*/
|
||||
URITokenID: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an URITokenCancelSellOffer at runtime.
|
||||
*
|
||||
* @param tx - An URITokenCancelSellOffer Transaction.
|
||||
* @throws When the URITokenCancelSellOffer is Malformed.
|
||||
*/
|
||||
export function validateURITokenCancelSellOffer(
|
||||
tx: Record<string, unknown>,
|
||||
): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.URITokenID == null) {
|
||||
throw new ValidationError(
|
||||
'URITokenCancelSellOffer: missing field URITokenID',
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
|
||||
import { BaseTransaction, isAmount, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link URITokenCreateSellOffer} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: URITokenCreateSellOffer = {
|
||||
* Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* Amount: '1000000',
|
||||
* TransactionType: 'URITokenCreateSellOffer',
|
||||
* }
|
||||
*
|
||||
* // 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',
|
||||
* // URITokenID: '7AFCE32EBA8BD310CC2D00BE10B76E2183337EA20444D4580E4DBDB396C101FB',
|
||||
* // Amount: '1000000',
|
||||
* // TransactionType: 'URITokenCreateSellOffer',
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
|
||||
/**
|
||||
* An URITokenCreateSellOffer transaction is effectively a limit order . It defines an
|
||||
* intent to exchange currencies, and creates an Offer object if not completely.
|
||||
* Fulfilled when placed. Offers can be partially fulfilled.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface URITokenCreateSellOffer extends BaseTransaction {
|
||||
TransactionType: 'URITokenCreateSellOffer'
|
||||
/**
|
||||
* Identifies the URITokenID of the NFToken object that the
|
||||
* offer references.
|
||||
*/
|
||||
URITokenID: string
|
||||
/**
|
||||
* Indicates the amount expected or offered for the Token.
|
||||
*
|
||||
* The amount must be non-zero, except when this is a sell
|
||||
* offer and the asset is XRP. This would indicate that the current
|
||||
* owner of the token is giving it away free, either to anyone at all,
|
||||
* or to the account identified by the Destination field.
|
||||
*/
|
||||
Amount: Amount
|
||||
/**
|
||||
* If present, indicates that this offer may only be
|
||||
* accepted by the specified account. Attempts by other
|
||||
* accounts to accept this offer MUST fail.
|
||||
*/
|
||||
Destination?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an URITokenCreateSellOffer at runtime.
|
||||
*
|
||||
* @param tx - An URITokenCreateSellOffer Transaction.
|
||||
* @throws When the URITokenCreateSellOffer is Malformed.
|
||||
*/
|
||||
export function validateURITokenCreateSellOffer(
|
||||
tx: Record<string, unknown>,
|
||||
): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (tx.Account === tx.Destination) {
|
||||
throw new ValidationError(
|
||||
'URITokenCreateSellOffer: Destination and Account must not be equal',
|
||||
)
|
||||
}
|
||||
|
||||
if (tx.URITokenID == null) {
|
||||
throw new ValidationError(
|
||||
'URITokenCreateSellOffer: missing field URITokenID',
|
||||
)
|
||||
}
|
||||
|
||||
if (!isAmount(tx.Amount)) {
|
||||
throw new ValidationError('URITokenCreateSellOffer: invalid Amount')
|
||||
}
|
||||
}
|
||||
110
packages/xrpl/src/models/transactions/uriTokenMint.ts
Normal file
110
packages/xrpl/src/models/transactions/uriTokenMint.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Amount } from '../common'
|
||||
import { isHex } from '../utils'
|
||||
|
||||
import { BaseTransaction, GlobalFlags, validateBaseTransaction } from './common'
|
||||
|
||||
/**
|
||||
* Transaction Flags for an URITokenMint Transaction.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*/
|
||||
export enum URITokenMintFlags {
|
||||
/**
|
||||
* If set, indicates that the minted token may be burned by the issuer even
|
||||
* if the issuer does not currently hold the token. The current holder of
|
||||
* the token may always burn it.
|
||||
*/
|
||||
tfBurnable = 0x00000001,
|
||||
}
|
||||
|
||||
/**
|
||||
* Map of flags to boolean values representing {@link URITokenMint} transaction
|
||||
* flags.
|
||||
*
|
||||
* @category Transaction Flags
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const tx: URITokenMint = {
|
||||
* Account: 'rhFcpWDHLqpBmX4ezWiA5VLSS4e1BHqhHd',
|
||||
* URI: '697066733A2F2F434944',
|
||||
* TransactionType: 'URITokenMint',
|
||||
* Flags: {
|
||||
* tfBurnable: 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',
|
||||
* // URI: '697066733A2F2F434944',
|
||||
* // TransactionType: 'URITokenMint',
|
||||
* // Flags: 0,
|
||||
* // Sequence: 21970384,
|
||||
* // Fee: '12',
|
||||
* // LastLedgerSequence: 21970404
|
||||
* // }
|
||||
* ```
|
||||
*/
|
||||
export interface URITokenMintFlagsInterface extends GlobalFlags {
|
||||
tfBurnable?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* An URITokenMint transaction is effectively a limit order . It defines an
|
||||
* intent to exchange currencies, and creates an Offer object if not completely.
|
||||
* Fulfilled when placed. Offers can be partially fulfilled.
|
||||
*
|
||||
* @category Transaction Models
|
||||
*/
|
||||
export interface URITokenMint extends BaseTransaction {
|
||||
TransactionType: 'URITokenMint'
|
||||
Flags?: number | URITokenMintFlagsInterface
|
||||
/**
|
||||
* URI that points to the data and/or metadata associated with the NFT.
|
||||
* This field need not be an HTTP or HTTPS URL; it could be an IPFS URI, a
|
||||
* magnet link, immediate data encoded as an RFC2379 "data" URL, or even an
|
||||
* opaque issuer-specific encoding. The URI is NOT checked for validity, but
|
||||
* the field is limited to a maximum length of 256 bytes.
|
||||
*
|
||||
* This field must be hex-encoded. You can use `convertStringToHex` to
|
||||
* convert this field to the proper encoding.
|
||||
*/
|
||||
URI: string
|
||||
|
||||
/**
|
||||
* Indicates the amount expected or offered for the Token.
|
||||
*
|
||||
* The amount must be non-zero, except when this is a sell
|
||||
* offer and the asset is XRP. This would indicate that the current
|
||||
* owner of the token is giving it away free, either to anyone at all,
|
||||
* or to the account identified by the Destination field.
|
||||
*/
|
||||
Amount?: Amount
|
||||
|
||||
/**
|
||||
* If present, indicates that this offer may only be
|
||||
* accepted by the specified account. Attempts by other
|
||||
* accounts to accept this offer MUST fail.
|
||||
*/
|
||||
Destination?: string
|
||||
|
||||
Digest?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the form and type of an URITokenMint at runtime.
|
||||
*
|
||||
* @param tx - An URITokenMint Transaction.
|
||||
* @throws When the URITokenMint is Malformed.
|
||||
*/
|
||||
export function validateURITokenMint(tx: Record<string, unknown>): void {
|
||||
validateBaseTransaction(tx)
|
||||
|
||||
if (typeof tx.URI === 'string' && !isHex(tx.URI)) {
|
||||
throw new ValidationError('URITokenMint: URI must be in hex format')
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
/* eslint-disable no-bitwise -- flags require bitwise operations */
|
||||
|
||||
import { ValidationError } from '../../errors'
|
||||
import { Hook } from '../common'
|
||||
import {
|
||||
AccountRootFlagsInterface,
|
||||
AccountRootFlags,
|
||||
@@ -20,6 +21,7 @@ import {
|
||||
PaymentChannelClaimFlagsInterface,
|
||||
PaymentChannelClaimFlags,
|
||||
} from '../transactions/paymentChannelClaim'
|
||||
import { SetHookFlagsInterface, SetHookFlags } from '../transactions/setHook'
|
||||
import type { Transaction } from '../transactions/transaction'
|
||||
import { TrustSetFlagsInterface, TrustSetFlags } from '../transactions/trustSet'
|
||||
|
||||
@@ -75,6 +77,15 @@ export function setTransactionFlagsToNumber(tx: Transaction): void {
|
||||
case 'TrustSet':
|
||||
tx.Flags = convertTrustSetFlagsToNumber(tx.Flags)
|
||||
return
|
||||
case 'SetHook':
|
||||
tx.Flags = convertSetHookFlagsToNumber(tx.Flags)
|
||||
tx.Hooks.forEach((hook: Hook) => {
|
||||
hook.Hook.Flags = convertSetHookFlagsToNumber(
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- idk
|
||||
hook.Hook.Flags as SetHookFlagsInterface,
|
||||
)
|
||||
})
|
||||
return
|
||||
default:
|
||||
tx.Flags = 0
|
||||
}
|
||||
@@ -108,6 +119,10 @@ function convertTrustSetFlagsToNumber(flags: TrustSetFlagsInterface): number {
|
||||
return reduceFlags(flags, TrustSetFlags)
|
||||
}
|
||||
|
||||
function convertSetHookFlagsToNumber(flags: SetHookFlagsInterface): number {
|
||||
return reduceFlags(flags, SetHookFlags)
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- added ValidationError check for flagEnum
|
||||
function reduceFlags(flags: GlobalFlags, flagEnum: any): number {
|
||||
return Object.keys(flags).reduce((resultFlags, flag) => {
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { xAddressToClassicAddress, isValidXAddress } from 'ripple-address-codec'
|
||||
import {
|
||||
xAddressToClassicAddress,
|
||||
isValidXAddress,
|
||||
} from '@transia/ripple-address-codec'
|
||||
import { encode } from '@transia/ripple-binary-codec'
|
||||
|
||||
import type { Client } from '..'
|
||||
import { ValidationError, XrplError } from '../errors'
|
||||
import { AccountInfoRequest, AccountObjectsRequest } from '../models/methods'
|
||||
import { Transaction } from '../models/transactions'
|
||||
import { setTransactionFlagsToNumber } from '../models/utils/flags'
|
||||
import { xrpToDrops } from '../utils'
|
||||
|
||||
import { getFeeXrp } from './getFeeXrp'
|
||||
import { getFeeEstimateXrp } from './getFeeXrp'
|
||||
|
||||
// Expire unconfirmed transactions after 20 ledger versions, approximately 1 minute, by default
|
||||
const LEDGER_OFFSET = 20
|
||||
const RESTRICTED_NETWORKS = 1024
|
||||
interface ClassicAccountAndTag {
|
||||
classicAccount: string
|
||||
tag: number | false | undefined
|
||||
@@ -39,22 +42,25 @@ async function autofill<T extends Transaction>(
|
||||
setValidAddresses(tx)
|
||||
|
||||
setTransactionFlagsToNumber(tx)
|
||||
|
||||
const promises: Array<Promise<void>> = []
|
||||
if (this.networkID > RESTRICTED_NETWORKS && tx.NetworkID == null) {
|
||||
tx.NetworkID = this.networkID
|
||||
}
|
||||
if (tx.Sequence == null) {
|
||||
promises.push(setNextValidSequenceNumber(this, tx))
|
||||
}
|
||||
if (tx.Fee == null) {
|
||||
promises.push(calculateFeePerTransactionType(this, tx, signersCount))
|
||||
}
|
||||
if (tx.LastLedgerSequence == null) {
|
||||
promises.push(setLatestValidatedLedgerSequence(this, tx))
|
||||
}
|
||||
if (tx.TransactionType === 'AccountDelete') {
|
||||
promises.push(checkAccountDeleteBlockers(this, tx))
|
||||
}
|
||||
await Promise.all(promises).then(() => tx)
|
||||
|
||||
return Promise.all(promises).then(() => tx)
|
||||
if (tx.Fee == null) {
|
||||
await calculateFeePerTransactionType(this, tx, signersCount)
|
||||
}
|
||||
return tx
|
||||
}
|
||||
|
||||
function setValidAddresses(tx: Transaction): void {
|
||||
@@ -140,64 +146,17 @@ async function setNextValidSequenceNumber(
|
||||
tx.Sequence = data.result.account_data.Sequence
|
||||
}
|
||||
|
||||
async function fetchAccountDeleteFee(client: Client): Promise<BigNumber> {
|
||||
const response = await client.request({ command: 'server_state' })
|
||||
const fee = response.result.state.validated_ledger?.reserve_inc
|
||||
|
||||
if (fee == null) {
|
||||
return Promise.reject(new Error('Could not fetch Owner Reserve.'))
|
||||
}
|
||||
|
||||
return new BigNumber(fee)
|
||||
}
|
||||
|
||||
async function calculateFeePerTransactionType(
|
||||
client: Client,
|
||||
tx: Transaction,
|
||||
signersCount = 0,
|
||||
): Promise<void> {
|
||||
// netFee is usually 0.00001 XRP (10 drops)
|
||||
const netFeeXRP = await getFeeXrp(client)
|
||||
const netFeeDrops = xrpToDrops(netFeeXRP)
|
||||
let baseFee = new BigNumber(netFeeDrops)
|
||||
|
||||
// EscrowFinish Transaction with Fulfillment
|
||||
if (tx.TransactionType === 'EscrowFinish' && tx.Fulfillment != null) {
|
||||
const fulfillmentBytesSize: number = Math.ceil(tx.Fulfillment.length / 2)
|
||||
// 10 drops × (33 + (Fulfillment size in bytes / 16))
|
||||
const product = new BigNumber(
|
||||
// eslint-disable-next-line @typescript-eslint/no-magic-numbers -- expected use of magic numbers
|
||||
scaleValue(netFeeDrops, 33 + fulfillmentBytesSize / 16),
|
||||
)
|
||||
baseFee = product.dp(0, BigNumber.ROUND_CEIL)
|
||||
}
|
||||
|
||||
// AccountDelete Transaction
|
||||
if (tx.TransactionType === 'AccountDelete') {
|
||||
baseFee = await fetchAccountDeleteFee(client)
|
||||
}
|
||||
|
||||
/*
|
||||
* Multi-signed Transaction
|
||||
* 10 drops × (1 + Number of Signatures Provided)
|
||||
*/
|
||||
if (signersCount > 0) {
|
||||
baseFee = BigNumber.sum(baseFee, scaleValue(netFeeDrops, 1 + signersCount))
|
||||
}
|
||||
|
||||
const maxFeeDrops = xrpToDrops(client.maxFeeXRP)
|
||||
const totalFee =
|
||||
tx.TransactionType === 'AccountDelete'
|
||||
? baseFee
|
||||
: BigNumber.min(baseFee, maxFeeDrops)
|
||||
|
||||
// Round up baseFee and return it as a string
|
||||
// eslint-disable-next-line no-param-reassign, @typescript-eslint/no-magic-numbers -- param reassign is safe, base 10 magic num
|
||||
tx.Fee = totalFee.dp(0, BigNumber.ROUND_CEIL).toString(10)
|
||||
}
|
||||
|
||||
function scaleValue(value, multiplier): string {
|
||||
return new BigNumber(value).times(multiplier).toString()
|
||||
const copyTx = { ...tx }
|
||||
copyTx.SigningPubKey = ``
|
||||
copyTx.Fee = `0`
|
||||
const tx_blob = encode(copyTx)
|
||||
// eslint-disable-next-line require-atomic-updates, no-param-reassign -- ignore
|
||||
tx.Fee = await getFeeEstimateXrp(client, tx_blob, signersCount)
|
||||
}
|
||||
|
||||
async function setLatestValidatedLedgerSequence(
|
||||
|
||||
@@ -115,7 +115,7 @@ async function getBalances(
|
||||
formatBalances(response.result.lines),
|
||||
)
|
||||
if (xrpBalance !== '') {
|
||||
balances.push({ currency: 'XRP', value: xrpBalance })
|
||||
balances.push({ currency: 'XAH', value: xrpBalance })
|
||||
}
|
||||
balances.push(...accountLinesBalance)
|
||||
},
|
||||
|
||||
@@ -50,15 +50,20 @@ export async function getFeeXrp(
|
||||
*
|
||||
* @param client - The Client used to connect to the ledger.
|
||||
* @param txBlob - The encoded transaction to estimate the fee for.
|
||||
* @param signersCount - The number of multisigners.
|
||||
* @returns The transaction fee.
|
||||
*/
|
||||
export async function getFeeEstimateXrp(
|
||||
client: Client,
|
||||
txBlob: string,
|
||||
signersCount = 0,
|
||||
): Promise<string> {
|
||||
const response = await client.request({
|
||||
command: 'fee',
|
||||
tx_blob: txBlob,
|
||||
})
|
||||
return response.result.drops.base_fee
|
||||
const openLedgerFee = response.result.drops.open_ledger_fee
|
||||
const baseFee = new BigNumber(response.result.drops.base_fee)
|
||||
const totalFee = BigNumber.sum(openLedgerFee, Number(baseFee) * signersCount)
|
||||
return new BigNumber(totalFee.toFixed(NUM_DECIMAL_PLACES)).toString(BASE_10)
|
||||
}
|
||||
|
||||
15
packages/xrpl/src/sugar/getNetworkID.ts
Normal file
15
packages/xrpl/src/sugar/getNetworkID.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import type { Client } from '..'
|
||||
// import { XrplError } from '../errors'
|
||||
|
||||
/**
|
||||
* Returns the network ID of the rippled server.
|
||||
*
|
||||
* @param this - The Client used to connect to the ledger.
|
||||
* @returns The network id.
|
||||
*/
|
||||
export default async function getNetworkID(this: Client): Promise<number> {
|
||||
const response = await this.request({
|
||||
command: 'server_info',
|
||||
})
|
||||
return response.result.info.network_id ?? 1
|
||||
}
|
||||
@@ -7,6 +7,8 @@ export { default as getLedgerIndex } from './getLedgerIndex'
|
||||
export { default as getOrderbook } from './getOrderbook'
|
||||
export { getFeeXrp, getFeeEstimateXrp } from './getFeeXrp'
|
||||
|
||||
export { default as getNetworkID } from './getNetworkID'
|
||||
|
||||
export * from './submit'
|
||||
|
||||
export * from './utils'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { decode, encode } from 'ripple-binary-codec'
|
||||
import { decode, encode } from '@transia/ripple-binary-codec'
|
||||
|
||||
import type { Client, SubmitRequest, SubmitResponse, Wallet } from '..'
|
||||
import { ValidationError, XrplError } from '../errors'
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import { xAddressToClassicAddress, isValidXAddress } from 'ripple-address-codec'
|
||||
import {
|
||||
xAddressToClassicAddress,
|
||||
isValidXAddress,
|
||||
} from '@transia/ripple-address-codec'
|
||||
|
||||
/**
|
||||
* If an address is an X-Address, converts it to a classic address.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { classicAddressToXAddress } from 'ripple-address-codec'
|
||||
import { deriveKeypair, deriveAddress } from 'ripple-keypairs'
|
||||
import { classicAddressToXAddress } from '@transia/ripple-address-codec'
|
||||
import { deriveKeypair, deriveAddress } from '@transia/ripple-keypairs'
|
||||
|
||||
/**
|
||||
* Derive an X-Address from a public key and a destination tag.
|
||||
|
||||
@@ -105,7 +105,7 @@ function getXRPQuantity(
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- okay here
|
||||
account: (node.FinalFields?.Account ?? node.NewFields?.Account) as string,
|
||||
balance: {
|
||||
currency: 'XRP',
|
||||
currency: 'XAH',
|
||||
value: dropsToXrp(value).toString(),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
/* eslint-disable no-bitwise -- this file mimics behavior in rippled. It uses
|
||||
bitwise operators for and-ing numbers with a mask and bit shifting. */
|
||||
|
||||
import { decode, encode } from '@transia/ripple-binary-codec'
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { decode, encode } from 'ripple-binary-codec'
|
||||
|
||||
import { ValidationError, XrplError } from '../../errors'
|
||||
import type { Ledger } from '../../models/ledger'
|
||||
@@ -83,7 +83,11 @@ export function hashSignedTx(tx: Transaction | string): string {
|
||||
txObject = tx
|
||||
}
|
||||
|
||||
if (txObject.TxnSignature === undefined && txObject.Signers === undefined) {
|
||||
if (
|
||||
!txObject.EmitDetails &&
|
||||
txObject.TxnSignature === undefined &&
|
||||
txObject.Signers === undefined
|
||||
) {
|
||||
throw new ValidationError('The transaction must be signed to hash it.')
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,10 @@
|
||||
/* eslint-disable no-bitwise -- this file mimics behavior in rippled. It uses
|
||||
bitwise operators for and-ing numbers with a mask and bit shifting. */
|
||||
|
||||
import { decodeAccountID } from '@transia/ripple-address-codec'
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { decodeAccountID } from 'ripple-address-codec'
|
||||
|
||||
import { convertStringToHex } from '../stringConversion'
|
||||
|
||||
import hashLedger, {
|
||||
hashLedgerHeader,
|
||||
@@ -184,4 +186,18 @@ export function hashPaymentChannel(
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the Hash of an URIToken LedgerEntry.
|
||||
*
|
||||
* @param issuer - Address of the issuer of the URIToken.
|
||||
* @param uri - string uri of the URIToken (not the hex).
|
||||
* @returns The hash of the URIToken LedgerEntry.
|
||||
* @category Utilities
|
||||
*/
|
||||
export function hashURIToken(issuer: string, uri: string): string {
|
||||
return sha512Half(
|
||||
ledgerSpaceHex('uriToken') + addressToHex(issuer) + convertStringToHex(uri),
|
||||
)
|
||||
}
|
||||
|
||||
export { hashLedgerHeader, hashSignedTx, hashLedger, hashStateTree, hashTxTree }
|
||||
|
||||
@@ -28,6 +28,7 @@ const ledgerSpaces = {
|
||||
signerList: 'S',
|
||||
paychan: 'x',
|
||||
check: 'C',
|
||||
uriToken: 'U',
|
||||
depositPreauth: 'p',
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,11 @@
|
||||
* This module contains the transaction types and the function to calculate the hook on
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports -- Required
|
||||
import createHash = require('create-hash')
|
||||
import { TRANSACTION_TYPES, TRANSACTION_TYPE_MAP } from 'ripple-binary-codec'
|
||||
import {
|
||||
TRANSACTION_TYPES,
|
||||
TRANSACTION_TYPE_MAP,
|
||||
} from '@transia/ripple-binary-codec'
|
||||
// import createHash = require('create-hash')
|
||||
|
||||
import { XrplError } from '../errors'
|
||||
import { HookParameter } from '../models/common'
|
||||
@@ -42,7 +44,7 @@ export function calculateHookOn(arr: Array<keyof TTS>): string {
|
||||
`invalid transaction type '${String(nth)}' in HookOn array`,
|
||||
)
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Required
|
||||
|
||||
const tts: Record<string, number> = TRANSACTION_TYPE_MAP
|
||||
let value = BigInt(hash)
|
||||
// eslint-disable-next-line no-bitwise -- Required
|
||||
@@ -56,32 +58,12 @@ export function calculateHookOn(arr: Array<keyof TTS>): string {
|
||||
return hash.toUpperCase()
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the sha256 of a string
|
||||
*
|
||||
* @param string - the string to calculate the sha256
|
||||
* @returns the sha256
|
||||
*/
|
||||
export async function sha256(string: string): Promise<string> {
|
||||
const hash = createHash('sha256')
|
||||
hash.update(string)
|
||||
const hashBuffer = hash.digest()
|
||||
const hashArray = Array.from(new Uint8Array(hashBuffer))
|
||||
const hashHex = hashArray
|
||||
// eslint-disable-next-line @typescript-eslint/no-magic-numbers -- Required
|
||||
.map((bytes) => bytes.toString(16).padStart(2, '0'))
|
||||
.join('')
|
||||
return hashHex
|
||||
function isHex(value: string): boolean {
|
||||
return /^[0-9A-F]+$/iu.test(value)
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the hex of a namespace
|
||||
*
|
||||
* @param namespace - the namespace to calculate the hex
|
||||
* @returns the hex
|
||||
*/
|
||||
export async function hexNamespace(namespace: string): Promise<string> {
|
||||
return (await sha256(namespace)).toUpperCase()
|
||||
function hexValue(value: string): string {
|
||||
return Buffer.from(value, 'utf8').toString('hex').toUpperCase()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,20 +75,21 @@ export async function hexNamespace(namespace: string): Promise<string> {
|
||||
export function hexHookParameters(data: HookParameter[]): HookParameter[] {
|
||||
const hookParameters: HookParameter[] = []
|
||||
for (const parameter of data) {
|
||||
let hookPName = parameter.HookParameter.HookParameterName
|
||||
let hookPValue = parameter.HookParameter.HookParameterValue
|
||||
|
||||
if (!isHex(hookPName)) {
|
||||
hookPName = hexValue(hookPName)
|
||||
}
|
||||
|
||||
if (!isHex(hookPValue)) {
|
||||
hookPValue = hexValue(hookPValue)
|
||||
}
|
||||
|
||||
hookParameters.push({
|
||||
HookParameter: {
|
||||
HookParameterName: Buffer.from(
|
||||
parameter.HookParameter.HookParameterName,
|
||||
'utf8',
|
||||
)
|
||||
.toString('hex')
|
||||
.toUpperCase(),
|
||||
HookParameterValue: Buffer.from(
|
||||
parameter.HookParameter.HookParameterValue,
|
||||
'utf8',
|
||||
)
|
||||
.toString('hex')
|
||||
.toUpperCase(),
|
||||
HookParameterName: hookPName,
|
||||
HookParameterValue: hookPValue,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@ import {
|
||||
isValidClassicAddress,
|
||||
isValidXAddress,
|
||||
xAddressToClassicAddress,
|
||||
} from 'ripple-address-codec'
|
||||
import * as rbc from 'ripple-binary-codec'
|
||||
import { verify as verifyKeypairSignature } from 'ripple-keypairs'
|
||||
} from '@transia/ripple-address-codec'
|
||||
import * as rbc from '@transia/ripple-binary-codec'
|
||||
import { verify as verifyKeypairSignature } from '@transia/ripple-keypairs'
|
||||
|
||||
import { LedgerEntry } from '../models/ledger'
|
||||
import { Response } from '../models/methods'
|
||||
@@ -39,8 +39,9 @@ import {
|
||||
hashLedgerHeader,
|
||||
hashEscrow,
|
||||
hashPaymentChannel,
|
||||
hashURIToken,
|
||||
} from './hashes'
|
||||
import { calculateHookOn, hexNamespace, hexHookParameters, TTS } from './hooks'
|
||||
import { calculateHookOn, hexHookParameters, TTS } from './hooks'
|
||||
import parseNFTokenID from './parseNFTokenID'
|
||||
import {
|
||||
percentToTransferRate,
|
||||
@@ -173,6 +174,7 @@ const hashes = {
|
||||
hashLedgerHeader,
|
||||
hashEscrow,
|
||||
hashPaymentChannel,
|
||||
hashURIToken,
|
||||
}
|
||||
|
||||
export {
|
||||
@@ -224,7 +226,6 @@ export {
|
||||
createCrossChainPayment,
|
||||
parseNFTokenID,
|
||||
calculateHookOn,
|
||||
hexNamespace,
|
||||
hexHookParameters,
|
||||
TTS,
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* eslint-disable @typescript-eslint/no-magic-numbers -- Doing hex string parsing. */
|
||||
import { encodeAccountID } from '@transia/ripple-address-codec'
|
||||
import BigNumber from 'bignumber.js'
|
||||
import { encodeAccountID } from 'ripple-address-codec'
|
||||
|
||||
import { XrplError } from '../errors'
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { encodeForSigningClaim } from 'ripple-binary-codec'
|
||||
import { sign } from 'ripple-keypairs'
|
||||
import { encodeForSigningClaim } from '@transia/ripple-binary-codec'
|
||||
import { sign } from '@transia/ripple-keypairs'
|
||||
|
||||
import { xrpToDrops } from './xrpConversion'
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { encodeForSigningClaim } from 'ripple-binary-codec'
|
||||
import { verify } from 'ripple-keypairs'
|
||||
import { encodeForSigningClaim } from '@transia/ripple-binary-codec'
|
||||
import { verify } from '@transia/ripple-keypairs'
|
||||
|
||||
import { xrpToDrops } from './xrpConversion'
|
||||
|
||||
|
||||
@@ -4,6 +4,6 @@
|
||||
"issuer": "rp8rJYTpodf8qbSCHVTNacf8nSW8mRakFw"
|
||||
},
|
||||
"takerGets": {
|
||||
"currency": "XRP"
|
||||
"currency": "XAH"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"value": "922.913243",
|
||||
"currency": "XRP"
|
||||
"currency": "XAH"
|
||||
},
|
||||
{
|
||||
"value": "0",
|
||||
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user