ripple-binary-codec 0.2.7 → 1.0.0-mpt-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -2
- package/dist/binary.d.ts +90 -0
- package/dist/binary.js +128 -0
- package/dist/binary.js.map +1 -0
- package/dist/coretypes.d.ts +9 -0
- package/dist/coretypes.js +48 -0
- package/dist/coretypes.js.map +1 -0
- package/dist/enums/bytes.d.ts +25 -0
- package/dist/enums/bytes.js +63 -0
- package/dist/enums/bytes.js.map +1 -0
- package/dist/enums/constants.d.ts +4 -0
- package/dist/enums/constants.js +8 -0
- package/dist/enums/constants.js.map +1 -0
- package/dist/enums/definitions.json +2956 -0
- package/dist/enums/field.d.ts +28 -0
- package/dist/enums/field.js +58 -0
- package/dist/enums/field.js.map +1 -0
- package/dist/enums/index.d.ts +12 -0
- package/dist/enums/index.js +31 -0
- package/dist/enums/index.js.map +1 -0
- package/{distrib/npm → dist/enums/src}/enums/definitions.json +1709 -438
- package/dist/enums/utils-renumber.d.ts +101 -0
- package/dist/enums/utils-renumber.js +127 -0
- package/dist/enums/utils-renumber.js.map +1 -0
- package/dist/enums/xrpl-definitions-base.d.ts +44 -0
- package/dist/enums/xrpl-definitions-base.js +59 -0
- package/dist/enums/xrpl-definitions-base.js.map +1 -0
- package/dist/enums/xrpl-definitions.d.ts +21 -0
- package/dist/enums/xrpl-definitions.js +29 -0
- package/dist/enums/xrpl-definitions.js.map +1 -0
- package/dist/hash-prefixes.d.ts +5 -0
- package/dist/hash-prefixes.js +41 -0
- package/dist/hash-prefixes.js.map +1 -0
- package/dist/hashes.d.ts +50 -0
- package/dist/hashes.js +76 -0
- package/dist/hashes.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger-hashes.d.ts +48 -0
- package/dist/ledger-hashes.js +141 -0
- package/dist/ledger-hashes.js.map +1 -0
- package/dist/quality.d.ts +21 -0
- package/dist/quality.js +42 -0
- package/dist/quality.js.map +1 -0
- package/dist/serdes/binary-parser.d.ts +100 -0
- package/dist/serdes/binary-parser.js +194 -0
- package/dist/serdes/binary-parser.js.map +1 -0
- package/dist/serdes/binary-serializer.d.ts +81 -0
- package/dist/serdes/binary-serializer.js +149 -0
- package/dist/serdes/binary-serializer.js.map +1 -0
- package/dist/shamap.d.ts +102 -0
- package/dist/shamap.js +172 -0
- package/dist/shamap.js.map +1 -0
- package/dist/src/binary.d.ts +90 -0
- package/dist/src/binary.js +128 -0
- package/dist/src/binary.js.map +1 -0
- package/dist/src/coretypes.d.ts +9 -0
- package/dist/src/coretypes.js +48 -0
- package/dist/src/coretypes.js.map +1 -0
- package/dist/src/enums/bytes.d.ts +25 -0
- package/dist/src/enums/bytes.js +63 -0
- package/dist/src/enums/bytes.js.map +1 -0
- package/dist/src/enums/constants.d.ts +4 -0
- package/dist/src/enums/constants.js +8 -0
- package/dist/src/enums/constants.js.map +1 -0
- package/dist/src/enums/definitions.json +2956 -0
- package/dist/src/enums/field.d.ts +28 -0
- package/dist/src/enums/field.js +58 -0
- package/dist/src/enums/field.js.map +1 -0
- package/dist/src/enums/index.d.ts +12 -0
- package/dist/src/enums/index.js +31 -0
- package/dist/src/enums/index.js.map +1 -0
- package/dist/src/enums/utils-renumber.d.ts +101 -0
- package/dist/src/enums/utils-renumber.js +127 -0
- package/dist/src/enums/utils-renumber.js.map +1 -0
- package/dist/src/enums/xrpl-definitions-base.d.ts +44 -0
- package/dist/src/enums/xrpl-definitions-base.js +59 -0
- package/dist/src/enums/xrpl-definitions-base.js.map +1 -0
- package/dist/src/enums/xrpl-definitions.d.ts +21 -0
- package/dist/src/enums/xrpl-definitions.js +29 -0
- package/dist/src/enums/xrpl-definitions.js.map +1 -0
- package/dist/src/hash-prefixes.d.ts +5 -0
- package/dist/src/hash-prefixes.js +41 -0
- package/dist/src/hash-prefixes.js.map +1 -0
- package/dist/src/hashes.d.ts +50 -0
- package/dist/src/hashes.js +76 -0
- package/dist/src/hashes.js.map +1 -0
- package/dist/src/index.d.ts +64 -0
- package/dist/src/index.js +123 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ledger-hashes.d.ts +48 -0
- package/dist/src/ledger-hashes.js +141 -0
- package/dist/src/ledger-hashes.js.map +1 -0
- package/dist/src/quality.d.ts +21 -0
- package/dist/src/quality.js +42 -0
- package/dist/src/quality.js.map +1 -0
- package/dist/src/serdes/binary-parser.d.ts +100 -0
- package/dist/src/serdes/binary-parser.js +194 -0
- package/dist/src/serdes/binary-parser.js.map +1 -0
- package/dist/src/serdes/binary-serializer.d.ts +81 -0
- package/dist/src/serdes/binary-serializer.js +149 -0
- package/dist/src/serdes/binary-serializer.js.map +1 -0
- package/dist/src/shamap.d.ts +102 -0
- package/dist/src/shamap.js +172 -0
- package/dist/src/shamap.js.map +1 -0
- package/dist/src/types/account-id.d.ts +35 -0
- package/dist/src/types/account-id.js +69 -0
- package/dist/src/types/account-id.js.map +1 -0
- package/dist/src/types/amount.d.ts +91 -0
- package/dist/src/types/amount.js +289 -0
- package/dist/src/types/amount.js.map +1 -0
- package/dist/src/types/blob.d.ts +24 -0
- package/dist/src/types/blob.js +40 -0
- package/dist/src/types/blob.js.map +1 -0
- package/dist/src/types/currency.d.ts +28 -0
- package/dist/src/types/currency.js +127 -0
- package/dist/src/types/currency.js.map +1 -0
- package/dist/src/types/hash-128.d.ts +16 -0
- package/dist/src/types/hash-128.js +32 -0
- package/dist/src/types/hash-128.js.map +1 -0
- package/dist/src/types/hash-160.d.ts +10 -0
- package/dist/src/types/hash-160.js +19 -0
- package/dist/src/types/hash-160.js.map +1 -0
- package/dist/src/types/hash-192.d.ts +10 -0
- package/dist/src/types/hash-192.js +19 -0
- package/dist/src/types/hash-192.js.map +1 -0
- package/dist/src/types/hash-256.d.ts +10 -0
- package/dist/src/types/hash-256.js +16 -0
- package/dist/src/types/hash-256.js.map +1 -0
- package/dist/src/types/hash.d.ts +40 -0
- package/dist/src/types/hash.js +73 -0
- package/dist/src/types/hash.js.map +1 -0
- package/dist/src/types/index.d.ts +19 -0
- package/dist/src/types/index.js +64 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/issue.d.ts +38 -0
- package/dist/src/types/issue.js +81 -0
- package/dist/src/types/issue.js.map +1 -0
- package/dist/src/types/path-set.d.ts +36 -0
- package/dist/src/types/path-set.js +233 -0
- package/dist/src/types/path-set.js.map +1 -0
- package/dist/src/types/serialized-type.d.ts +70 -0
- package/dist/src/types/serialized-type.js +105 -0
- package/dist/src/types/serialized-type.js.map +1 -0
- package/dist/src/types/st-array.d.ts +31 -0
- package/dist/src/types/st-array.js +83 -0
- package/dist/src/types/st-array.js.map +1 -0
- package/dist/src/types/st-object.d.ts +32 -0
- package/dist/src/types/st-object.js +155 -0
- package/dist/src/types/st-object.js.map +1 -0
- package/dist/src/types/uint-16.d.ts +24 -0
- package/dist/src/types/uint-16.js +45 -0
- package/dist/src/types/uint-16.js.map +1 -0
- package/dist/src/types/uint-32.d.ts +24 -0
- package/dist/src/types/uint-32.js +50 -0
- package/dist/src/types/uint-32.js.map +1 -0
- package/dist/src/types/uint-64.d.ts +37 -0
- package/dist/src/types/uint-64.js +86 -0
- package/dist/src/types/uint-64.js.map +1 -0
- package/dist/src/types/uint-8.d.ts +24 -0
- package/dist/src/types/uint-8.js +46 -0
- package/dist/src/types/uint-8.js.map +1 -0
- package/dist/src/types/uint.d.ts +29 -0
- package/dist/src/types/uint.js +47 -0
- package/dist/src/types/uint.js.map +1 -0
- package/dist/src/types/vector-256.d.ts +30 -0
- package/dist/src/types/vector-256.js +73 -0
- package/dist/src/types/vector-256.js.map +1 -0
- package/dist/src/types/xchain-bridge.d.ts +44 -0
- package/dist/src/types/xchain-bridge.js +102 -0
- package/dist/src/types/xchain-bridge.js.map +1 -0
- package/dist/src/utils.d.ts +47 -0
- package/dist/src/utils.js +137 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/account-id.d.ts +35 -0
- package/dist/types/account-id.js +69 -0
- package/dist/types/account-id.js.map +1 -0
- package/dist/types/amount.d.ts +91 -0
- package/dist/types/amount.js +289 -0
- package/dist/types/amount.js.map +1 -0
- package/dist/types/blob.d.ts +24 -0
- package/dist/types/blob.js +40 -0
- package/dist/types/blob.js.map +1 -0
- package/dist/types/currency.d.ts +28 -0
- package/dist/types/currency.js +127 -0
- package/dist/types/currency.js.map +1 -0
- package/dist/types/hash-128.d.ts +16 -0
- package/dist/types/hash-128.js +32 -0
- package/dist/types/hash-128.js.map +1 -0
- package/dist/types/hash-160.d.ts +10 -0
- package/dist/types/hash-160.js +19 -0
- package/dist/types/hash-160.js.map +1 -0
- package/dist/types/hash-192.d.ts +10 -0
- package/dist/types/hash-192.js +19 -0
- package/dist/types/hash-192.js.map +1 -0
- package/dist/types/hash-256.d.ts +10 -0
- package/dist/types/hash-256.js +16 -0
- package/dist/types/hash-256.js.map +1 -0
- package/dist/types/hash.d.ts +40 -0
- package/dist/types/hash.js +73 -0
- package/dist/types/hash.js.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.js +64 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/issue.d.ts +38 -0
- package/dist/types/issue.js +81 -0
- package/dist/types/issue.js.map +1 -0
- package/dist/types/path-set.d.ts +36 -0
- package/dist/types/path-set.js +233 -0
- package/dist/types/path-set.js.map +1 -0
- package/dist/types/serialized-type.d.ts +70 -0
- package/dist/types/serialized-type.js +105 -0
- package/dist/types/serialized-type.js.map +1 -0
- package/dist/types/st-array.d.ts +31 -0
- package/dist/types/st-array.js +83 -0
- package/dist/types/st-array.js.map +1 -0
- package/dist/types/st-object.d.ts +32 -0
- package/dist/types/st-object.js +155 -0
- package/dist/types/st-object.js.map +1 -0
- package/dist/types/uint-16.d.ts +24 -0
- package/dist/types/uint-16.js +45 -0
- package/dist/types/uint-16.js.map +1 -0
- package/dist/types/uint-32.d.ts +24 -0
- package/dist/types/uint-32.js +50 -0
- package/dist/types/uint-32.js.map +1 -0
- package/dist/types/uint-64.d.ts +37 -0
- package/dist/types/uint-64.js +86 -0
- package/dist/types/uint-64.js.map +1 -0
- package/dist/types/uint-8.d.ts +24 -0
- package/dist/types/uint-8.js +46 -0
- package/dist/types/uint-8.js.map +1 -0
- package/dist/types/uint.d.ts +29 -0
- package/dist/types/uint.js +47 -0
- package/dist/types/uint.js.map +1 -0
- package/dist/types/vector-256.d.ts +30 -0
- package/dist/types/vector-256.js +73 -0
- package/dist/types/vector-256.js.map +1 -0
- package/dist/types/xchain-bridge.d.ts +44 -0
- package/dist/types/xchain-bridge.js +102 -0
- package/dist/types/xchain-bridge.js.map +1 -0
- package/dist/utils.d.ts +47 -0
- package/dist/utils.js +137 -0
- package/dist/utils.js.map +1 -0
- package/package.json +28 -33
- package/src/README.md +5 -0
- package/src/binary.ts +194 -0
- package/src/coretypes.ts +31 -0
- package/src/enums/README.md +144 -0
- package/src/enums/bytes.ts +74 -0
- package/src/enums/constants.ts +4 -0
- package/src/enums/definitions.json +2961 -0
- package/src/enums/field.ts +84 -0
- package/src/enums/index.ts +34 -0
- package/src/enums/utils-renumber.ts +134 -0
- package/src/enums/xrpl-definitions-base.ts +111 -0
- package/src/enums/xrpl-definitions.ts +32 -0
- package/src/hash-prefixes.ts +40 -0
- package/src/hashes.ts +75 -0
- package/src/index.ts +153 -0
- package/src/ledger-hashes.ts +191 -0
- package/src/quality.ts +38 -0
- package/src/serdes/binary-parser.ts +224 -0
- package/src/serdes/binary-serializer.ts +166 -0
- package/src/shamap.ts +186 -0
- package/src/types/account-id.ts +86 -0
- package/src/types/amount.ts +362 -0
- package/src/types/blob.ts +43 -0
- package/src/types/currency.ts +140 -0
- package/src/types/hash-128.ts +33 -0
- package/src/types/hash-160.ts +19 -0
- package/src/types/hash-192.ts +19 -0
- package/src/types/hash-256.ts +15 -0
- package/src/types/hash.ts +83 -0
- package/src/types/index.ts +66 -0
- package/src/types/issue.ts +96 -0
- package/src/types/path-set.ts +290 -0
- package/src/types/serialized-type.ts +122 -0
- package/src/types/st-array.ts +107 -0
- package/src/types/st-object.ts +192 -0
- package/src/types/uint-16.ts +53 -0
- package/src/types/uint-32.ts +59 -0
- package/src/types/uint-64.ts +104 -0
- package/src/types/uint-8.ts +52 -0
- package/src/types/uint.ts +60 -0
- package/src/types/vector-256.ts +79 -0
- package/src/types/xchain-bridge.ts +128 -0
- package/src/utils.ts +152 -0
- package/HISTORY.md +0 -66
- package/distrib/npm/binary.js +0 -68
- package/distrib/npm/coretypes.js +0 -22
- package/distrib/npm/enums/index.js +0 -125
- package/distrib/npm/enums/utils-renumber.js +0 -134
- package/distrib/npm/hash-prefixes.js +0 -30
- package/distrib/npm/hashes.js +0 -42
- package/distrib/npm/index.js +0 -72
- package/distrib/npm/ledger-hashes.js +0 -71
- package/distrib/npm/quality.js +0 -20
- package/distrib/npm/serdes/binary-parser.js +0 -98
- package/distrib/npm/serdes/binary-serializer.js +0 -106
- package/distrib/npm/shamap.js +0 -107
- package/distrib/npm/types/account-id.js +0 -41
- package/distrib/npm/types/amount.js +0 -215
- package/distrib/npm/types/blob.js +0 -28
- package/distrib/npm/types/currency.js +0 -91
- package/distrib/npm/types/hash-128.js +0 -10
- package/distrib/npm/types/hash-160.js +0 -10
- package/distrib/npm/types/hash-256.js +0 -15
- package/distrib/npm/types/hash.js +0 -45
- package/distrib/npm/types/index.js +0 -45
- package/distrib/npm/types/path-set.js +0 -112
- package/distrib/npm/types/serialized-type.js +0 -63
- package/distrib/npm/types/st-array.js +0 -37
- package/distrib/npm/types/st-object.js +0 -65
- package/distrib/npm/types/uint-16.js +0 -10
- package/distrib/npm/types/uint-32.js +0 -10
- package/distrib/npm/types/uint-64.js +0 -49
- package/distrib/npm/types/uint-8.js +0 -10
- package/distrib/npm/types/uint.js +0 -60
- package/distrib/npm/types/vector-256.js +0 -31
- package/distrib/npm/utils/bytes-utils.js +0 -112
- package/distrib/npm/utils/make-class.js +0 -83
- package/test/amount-test.js +0 -43
- package/test/binary-json-test.js +0 -43
- package/test/binary-parser-test.js +0 -341
- package/test/binary-serializer-test.js +0 -194
- package/test/bytes-utils-test.js +0 -72
- package/test/fixtures/account-tx-transactions.db +0 -0
- package/test/fixtures/codec-fixtures.json +0 -4466
- package/test/fixtures/data-driven-tests.json +0 -3721
- package/test/fixtures/delivermin-tx-binary.json +0 -1
- package/test/fixtures/delivermin-tx.json +0 -98
- package/test/fixtures/deposit-preauth-tx-binary.json +0 -1
- package/test/fixtures/deposit-preauth-tx-meta-binary.json +0 -1
- package/test/fixtures/deposit-preauth-tx.json +0 -58
- package/test/fixtures/escrow-cancel-binary.json +0 -1
- package/test/fixtures/escrow-cancel-tx.json +0 -6
- package/test/fixtures/escrow-create-binary.json +0 -1
- package/test/fixtures/escrow-create-tx.json +0 -10
- package/test/fixtures/escrow-finish-binary.json +0 -1
- package/test/fixtures/escrow-finish-meta-binary.json +0 -1
- package/test/fixtures/escrow-finish-tx.json +0 -95
- package/test/fixtures/ledger-full-38129.json +0 -1
- package/test/fixtures/ledger-full-40000.json +0 -1
- package/test/fixtures/payment-channel-claim-binary.json +0 -1
- package/test/fixtures/payment-channel-claim-tx.json +0 -8
- package/test/fixtures/payment-channel-create-binary.json +0 -1
- package/test/fixtures/payment-channel-create-tx.json +0 -11
- package/test/fixtures/payment-channel-fund-binary.json +0 -1
- package/test/fixtures/payment-channel-fund-tx.json +0 -7
- package/test/fixtures/signerlistset-tx-binary.json +0 -1
- package/test/fixtures/signerlistset-tx-meta-binary.json +0 -1
- package/test/fixtures/signerlistset-tx.json +0 -94
- package/test/hash-test.js +0 -58
- package/test/ledger-test.js +0 -26
- package/test/mocha.opts +0 -1
- package/test/quality-test.js +0 -16
- package/test/shamap-test.js +0 -88
- package/test/signing-data-encoding-test.js +0 -120
- package/test/tx-encode-decode-test.js +0 -124
- package/test/types-test.js +0 -38
- package/test/uint-test.js +0 -38
- package/test/utils.js +0 -93
package/src/shamap.ts
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { coreTypes } from './types'
|
|
2
|
+
import { HashPrefix } from './hash-prefixes'
|
|
3
|
+
import { Sha512Half } from './hashes'
|
|
4
|
+
import { Hash256 } from './types/hash-256'
|
|
5
|
+
import { BytesList } from './serdes/binary-serializer'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Abstract class describing a SHAMapNode
|
|
9
|
+
*/
|
|
10
|
+
abstract class ShaMapNode {
|
|
11
|
+
abstract hashPrefix(): Uint8Array
|
|
12
|
+
abstract isLeaf(): boolean
|
|
13
|
+
abstract isInner(): boolean
|
|
14
|
+
abstract toBytesSink(list: BytesList): void
|
|
15
|
+
abstract hash(): Hash256
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Class describing a Leaf of SHAMap
|
|
20
|
+
*/
|
|
21
|
+
class ShaMapLeaf extends ShaMapNode {
|
|
22
|
+
constructor(public index: Hash256, public item?: ShaMapNode) {
|
|
23
|
+
super()
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @returns true as ShaMapLeaf is a leaf node
|
|
28
|
+
*/
|
|
29
|
+
isLeaf(): boolean {
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @returns false as ShaMapLeaf is not an inner node
|
|
35
|
+
*/
|
|
36
|
+
isInner(): boolean {
|
|
37
|
+
return false
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the prefix of the this.item
|
|
42
|
+
*
|
|
43
|
+
* @returns The hash prefix, unless this.item is undefined, then it returns an empty Uint8Array
|
|
44
|
+
*/
|
|
45
|
+
hashPrefix(): Uint8Array {
|
|
46
|
+
return this.item === undefined ? new Uint8Array(0) : this.item.hashPrefix()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Hash the bytes representation of this
|
|
51
|
+
*
|
|
52
|
+
* @returns hash of this.item concatenated with this.index
|
|
53
|
+
*/
|
|
54
|
+
hash(): Hash256 {
|
|
55
|
+
const hash = Sha512Half.put(this.hashPrefix())
|
|
56
|
+
this.toBytesSink(hash)
|
|
57
|
+
return hash.finish()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Write the bytes representation of this to a BytesList
|
|
62
|
+
* @param list BytesList to write bytes to
|
|
63
|
+
*/
|
|
64
|
+
toBytesSink(list: BytesList): void {
|
|
65
|
+
if (this.item !== undefined) {
|
|
66
|
+
this.item.toBytesSink(list)
|
|
67
|
+
}
|
|
68
|
+
this.index.toBytesSink(list)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Class defining an Inner Node of a SHAMap
|
|
74
|
+
*/
|
|
75
|
+
class ShaMapInner extends ShaMapNode {
|
|
76
|
+
private slotBits = 0
|
|
77
|
+
private branches: Array<ShaMapNode> = Array(16)
|
|
78
|
+
|
|
79
|
+
constructor(private depth: number = 0) {
|
|
80
|
+
super()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @returns true as ShaMapInner is an inner node
|
|
85
|
+
*/
|
|
86
|
+
isInner(): boolean {
|
|
87
|
+
return true
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @returns false as ShaMapInner is not a leaf node
|
|
92
|
+
*/
|
|
93
|
+
isLeaf(): boolean {
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get the hash prefix for this node
|
|
99
|
+
*
|
|
100
|
+
* @returns hash prefix describing an inner node
|
|
101
|
+
*/
|
|
102
|
+
hashPrefix(): Uint8Array {
|
|
103
|
+
return HashPrefix.innerNode
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Set a branch of this node to be another node
|
|
108
|
+
*
|
|
109
|
+
* @param slot Slot to add branch to this.branches
|
|
110
|
+
* @param branch Branch to add
|
|
111
|
+
*/
|
|
112
|
+
setBranch(slot: number, branch: ShaMapNode): void {
|
|
113
|
+
this.slotBits = this.slotBits | (1 << slot)
|
|
114
|
+
this.branches[slot] = branch
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @returns true if node is empty
|
|
119
|
+
*/
|
|
120
|
+
empty(): boolean {
|
|
121
|
+
return this.slotBits === 0
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Compute the hash of this node
|
|
126
|
+
*
|
|
127
|
+
* @returns The hash of this node
|
|
128
|
+
*/
|
|
129
|
+
hash(): Hash256 {
|
|
130
|
+
if (this.empty()) {
|
|
131
|
+
return (coreTypes.Hash256 as typeof Hash256).ZERO_256
|
|
132
|
+
}
|
|
133
|
+
const hash = Sha512Half.put(this.hashPrefix())
|
|
134
|
+
this.toBytesSink(hash)
|
|
135
|
+
return hash.finish()
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Writes the bytes representation of this node to a BytesList
|
|
140
|
+
*
|
|
141
|
+
* @param list BytesList to write bytes to
|
|
142
|
+
*/
|
|
143
|
+
toBytesSink(list: BytesList): void {
|
|
144
|
+
for (let i = 0; i < this.branches.length; i++) {
|
|
145
|
+
const branch = this.branches[i]
|
|
146
|
+
const hash = branch
|
|
147
|
+
? branch.hash()
|
|
148
|
+
: (coreTypes.Hash256 as typeof Hash256).ZERO_256
|
|
149
|
+
hash.toBytesSink(list)
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Add item to the SHAMap
|
|
155
|
+
*
|
|
156
|
+
* @param index Hash of the index of the item being inserted
|
|
157
|
+
* @param item Item to insert in the map
|
|
158
|
+
* @param leaf Leaf node to insert when branch doesn't exist
|
|
159
|
+
*/
|
|
160
|
+
addItem(index?: Hash256, item?: ShaMapNode, leaf?: ShaMapLeaf): void {
|
|
161
|
+
if (index === undefined) {
|
|
162
|
+
throw new Error()
|
|
163
|
+
}
|
|
164
|
+
if (index !== undefined) {
|
|
165
|
+
const nibble = index.nibblet(this.depth)
|
|
166
|
+
const existing = this.branches[nibble]
|
|
167
|
+
|
|
168
|
+
if (existing === undefined) {
|
|
169
|
+
this.setBranch(nibble, leaf || new ShaMapLeaf(index, item))
|
|
170
|
+
} else if (existing instanceof ShaMapLeaf) {
|
|
171
|
+
const newInner = new ShaMapInner(this.depth + 1)
|
|
172
|
+
newInner.addItem(existing.index, undefined, existing)
|
|
173
|
+
newInner.addItem(index, item, leaf)
|
|
174
|
+
this.setBranch(nibble, newInner)
|
|
175
|
+
} else if (existing instanceof ShaMapInner) {
|
|
176
|
+
existing.addItem(index, item, leaf)
|
|
177
|
+
} else {
|
|
178
|
+
throw new Error('invalid ShaMap.addItem call')
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
class ShaMap extends ShaMapInner {}
|
|
185
|
+
|
|
186
|
+
export { ShaMap, ShaMapNode, ShaMapLeaf }
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decodeAccountID,
|
|
3
|
+
encodeAccountID,
|
|
4
|
+
isValidXAddress,
|
|
5
|
+
xAddressToClassicAddress,
|
|
6
|
+
} from 'ripple-address-codec'
|
|
7
|
+
import { Hash160 } from './hash-160'
|
|
8
|
+
import { hexToBytes } from '@xrplf/isomorphic/utils'
|
|
9
|
+
|
|
10
|
+
const HEX_REGEX = /^[A-F0-9]{40}$/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Class defining how to encode and decode an AccountID
|
|
14
|
+
*/
|
|
15
|
+
class AccountID extends Hash160 {
|
|
16
|
+
static readonly defaultAccountID: AccountID = new AccountID(
|
|
17
|
+
new Uint8Array(20),
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
constructor(bytes?: Uint8Array) {
|
|
21
|
+
super(bytes ?? AccountID.defaultAccountID.bytes)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Defines how to construct an AccountID
|
|
26
|
+
*
|
|
27
|
+
* @param value either an existing AccountID, a hex-string, or a base58 r-Address
|
|
28
|
+
* @returns an AccountID object
|
|
29
|
+
*/
|
|
30
|
+
static from<T extends Hash160 | string>(value: T): AccountID {
|
|
31
|
+
if (value instanceof AccountID) {
|
|
32
|
+
return value
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (typeof value === 'string') {
|
|
36
|
+
if (value === '') {
|
|
37
|
+
return new AccountID()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return HEX_REGEX.test(value)
|
|
41
|
+
? new AccountID(hexToBytes(value))
|
|
42
|
+
: this.fromBase58(value)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
throw new Error('Cannot construct AccountID from value given')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Defines how to build an AccountID from a base58 r-Address
|
|
50
|
+
*
|
|
51
|
+
* @param value a base58 r-Address
|
|
52
|
+
* @returns an AccountID object
|
|
53
|
+
*/
|
|
54
|
+
static fromBase58(value: string): AccountID {
|
|
55
|
+
if (isValidXAddress(value)) {
|
|
56
|
+
const classic = xAddressToClassicAddress(value)
|
|
57
|
+
|
|
58
|
+
if (classic.tag !== false)
|
|
59
|
+
throw new Error('Only allowed to have tag on Account or Destination')
|
|
60
|
+
|
|
61
|
+
value = classic.classicAddress
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return new AccountID(Uint8Array.from(decodeAccountID(value)))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Overload of toJSON
|
|
69
|
+
*
|
|
70
|
+
* @returns the base58 string for this AccountID
|
|
71
|
+
*/
|
|
72
|
+
toJSON(): string {
|
|
73
|
+
return this.toBase58()
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Defines how to encode AccountID into a base58 address
|
|
78
|
+
*
|
|
79
|
+
* @returns the base58 string defined by this.bytes
|
|
80
|
+
*/
|
|
81
|
+
toBase58(): string {
|
|
82
|
+
return encodeAccountID(this.bytes)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export { AccountID }
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { BinaryParser } from '../serdes/binary-parser'
|
|
2
|
+
|
|
3
|
+
import { AccountID } from './account-id'
|
|
4
|
+
import { Currency } from './currency'
|
|
5
|
+
import { JsonObject, SerializedType } from './serialized-type'
|
|
6
|
+
import BigNumber from 'bignumber.js'
|
|
7
|
+
import { bytesToHex, concat, hexToBytes } from '@xrplf/isomorphic/utils'
|
|
8
|
+
import { readUInt32BE, writeUInt32BE } from '../utils'
|
|
9
|
+
import { Hash192 } from './hash-192'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Constants for validating amounts
|
|
13
|
+
*/
|
|
14
|
+
const MIN_IOU_EXPONENT = -96
|
|
15
|
+
const MAX_IOU_EXPONENT = 80
|
|
16
|
+
const MAX_IOU_PRECISION = 16
|
|
17
|
+
const MAX_DROPS = new BigNumber('1e17')
|
|
18
|
+
const MIN_XRP = new BigNumber('1e-6')
|
|
19
|
+
const mask = BigInt(0x00000000ffffffff)
|
|
20
|
+
const mptMask = BigInt(0x8000000000000000)
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* BigNumber configuration for Amount IOUs
|
|
24
|
+
*/
|
|
25
|
+
BigNumber.config({
|
|
26
|
+
EXPONENTIAL_AT: [
|
|
27
|
+
MIN_IOU_EXPONENT - MAX_IOU_PRECISION,
|
|
28
|
+
MAX_IOU_EXPONENT + MAX_IOU_PRECISION,
|
|
29
|
+
],
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
interface AmountObjectIOU extends JsonObject {
|
|
33
|
+
value: string
|
|
34
|
+
currency: string
|
|
35
|
+
issuer: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface AmountObjectMPT extends JsonObject {
|
|
39
|
+
value: string
|
|
40
|
+
mpt_issuance_id: string
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Interface for JSON objects that represent amounts
|
|
45
|
+
*/
|
|
46
|
+
type AmountObject = AmountObjectIOU | AmountObjectMPT
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Type guard for AmountObjectIOU
|
|
50
|
+
*/
|
|
51
|
+
function isAmountObjectIOU(arg): arg is AmountObjectIOU {
|
|
52
|
+
const keys = Object.keys(arg).sort()
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
keys.length === 3 &&
|
|
56
|
+
keys[0] === 'currency' &&
|
|
57
|
+
keys[1] === 'issuer' &&
|
|
58
|
+
keys[2] === 'value'
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Type guard for AmountObjectMPT
|
|
64
|
+
*/
|
|
65
|
+
function isAmountObjectMPT(arg): arg is AmountObjectMPT {
|
|
66
|
+
const keys = Object.keys(arg).sort()
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
keys.length === 2 && keys[0] === 'mpt_issuance_id' && keys[1] === 'value'
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Class for serializing/Deserializing Amounts
|
|
75
|
+
*/
|
|
76
|
+
class Amount extends SerializedType {
|
|
77
|
+
static defaultAmount: Amount = new Amount(hexToBytes('4000000000000000'))
|
|
78
|
+
|
|
79
|
+
constructor(bytes: Uint8Array) {
|
|
80
|
+
super(bytes ?? Amount.defaultAmount.bytes)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Construct an amount from an IOU, MPT or string amount
|
|
85
|
+
*
|
|
86
|
+
* @param value An Amount, object representing an IOU, or a string
|
|
87
|
+
* representing an integer amount
|
|
88
|
+
* @returns An Amount object
|
|
89
|
+
*/
|
|
90
|
+
static from<T extends Amount | AmountObject | string>(value: T): Amount {
|
|
91
|
+
if (value instanceof Amount) {
|
|
92
|
+
return value
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let amount = new Uint8Array(8)
|
|
96
|
+
if (typeof value === 'string') {
|
|
97
|
+
Amount.assertXrpIsValid(value)
|
|
98
|
+
|
|
99
|
+
const number = BigInt(value)
|
|
100
|
+
|
|
101
|
+
const intBuf = [new Uint8Array(4), new Uint8Array(4)]
|
|
102
|
+
writeUInt32BE(intBuf[0], Number(number >> BigInt(32)), 0)
|
|
103
|
+
writeUInt32BE(intBuf[1], Number(number & BigInt(mask)), 0)
|
|
104
|
+
|
|
105
|
+
amount = concat(intBuf)
|
|
106
|
+
|
|
107
|
+
amount[0] |= 0x40
|
|
108
|
+
|
|
109
|
+
return new Amount(amount)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (isAmountObjectIOU(value)) {
|
|
113
|
+
const number = new BigNumber(value.value)
|
|
114
|
+
Amount.assertIouIsValid(number)
|
|
115
|
+
|
|
116
|
+
if (number.isZero()) {
|
|
117
|
+
amount[0] |= 0x80
|
|
118
|
+
} else {
|
|
119
|
+
const integerNumberString = number
|
|
120
|
+
.times(`1e${-((number.e || 0) - 15)}`)
|
|
121
|
+
.abs()
|
|
122
|
+
.toString()
|
|
123
|
+
|
|
124
|
+
const num = BigInt(integerNumberString)
|
|
125
|
+
const intBuf = [new Uint8Array(4), new Uint8Array(4)]
|
|
126
|
+
writeUInt32BE(intBuf[0], Number(num >> BigInt(32)), 0)
|
|
127
|
+
writeUInt32BE(intBuf[1], Number(num & BigInt(mask)), 0)
|
|
128
|
+
|
|
129
|
+
amount = concat(intBuf)
|
|
130
|
+
|
|
131
|
+
amount[0] |= 0x80
|
|
132
|
+
|
|
133
|
+
if (number.gt(new BigNumber(0))) {
|
|
134
|
+
amount[0] |= 0x40
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const exponent = (number.e || 0) - 15
|
|
138
|
+
const exponentByte = 97 + exponent
|
|
139
|
+
amount[0] |= exponentByte >>> 2
|
|
140
|
+
amount[1] |= (exponentByte & 0x03) << 6
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const currency = Currency.from(value.currency).toBytes()
|
|
144
|
+
const issuer = AccountID.from(value.issuer).toBytes()
|
|
145
|
+
return new Amount(concat([amount, currency, issuer]))
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (isAmountObjectMPT(value)) {
|
|
149
|
+
Amount.assertMptIsValid(value.value)
|
|
150
|
+
|
|
151
|
+
let leadingByte = new Uint8Array(1)
|
|
152
|
+
leadingByte[0] |= 0x60
|
|
153
|
+
|
|
154
|
+
const num = BigInt(value.value)
|
|
155
|
+
|
|
156
|
+
const intBuf = [new Uint8Array(4), new Uint8Array(4)]
|
|
157
|
+
writeUInt32BE(intBuf[0], Number(num >> BigInt(32)), 0)
|
|
158
|
+
writeUInt32BE(intBuf[1], Number(num & BigInt(mask)), 0)
|
|
159
|
+
|
|
160
|
+
amount = concat(intBuf)
|
|
161
|
+
|
|
162
|
+
const mptIssuanceID = Hash192.from(value.mpt_issuance_id).toBytes()
|
|
163
|
+
return new Amount(concat([leadingByte, amount, mptIssuanceID]))
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
throw new Error('Invalid type to construct an Amount')
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Read an amount from a BinaryParser
|
|
171
|
+
*
|
|
172
|
+
* @param parser BinaryParser to read the Amount from
|
|
173
|
+
* @returns An Amount object
|
|
174
|
+
*/
|
|
175
|
+
static fromParser(parser: BinaryParser): Amount {
|
|
176
|
+
const isIOU = parser.peek() & 0x80
|
|
177
|
+
if (isIOU) return new Amount(parser.read(48))
|
|
178
|
+
|
|
179
|
+
// the amount can be either MPT or XRP at this point
|
|
180
|
+
const isMPT = parser.peek() & 0x20
|
|
181
|
+
const numBytes = isMPT ? 33 : 8
|
|
182
|
+
return new Amount(parser.read(numBytes))
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Get the JSON representation of this Amount
|
|
187
|
+
*
|
|
188
|
+
* @returns the JSON interpretation of this.bytes
|
|
189
|
+
*/
|
|
190
|
+
toJSON(): AmountObject | string {
|
|
191
|
+
if (this.isNative()) {
|
|
192
|
+
const bytes = this.bytes
|
|
193
|
+
const isPositive = bytes[0] & 0x40
|
|
194
|
+
const sign = isPositive ? '' : '-'
|
|
195
|
+
bytes[0] &= 0x3f
|
|
196
|
+
|
|
197
|
+
const msb = BigInt(readUInt32BE(bytes.slice(0, 4), 0))
|
|
198
|
+
const lsb = BigInt(readUInt32BE(bytes.slice(4), 0))
|
|
199
|
+
const num = (msb << BigInt(32)) | lsb
|
|
200
|
+
|
|
201
|
+
return `${sign}${num.toString()}`
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (this.isIOU()) {
|
|
205
|
+
const parser = new BinaryParser(this.toString())
|
|
206
|
+
const mantissa = parser.read(8)
|
|
207
|
+
const currency = Currency.fromParser(parser) as Currency
|
|
208
|
+
const issuer = AccountID.fromParser(parser) as AccountID
|
|
209
|
+
|
|
210
|
+
const b1 = mantissa[0]
|
|
211
|
+
const b2 = mantissa[1]
|
|
212
|
+
|
|
213
|
+
const isPositive = b1 & 0x40
|
|
214
|
+
const sign = isPositive ? '' : '-'
|
|
215
|
+
const exponent = ((b1 & 0x3f) << 2) + ((b2 & 0xff) >> 6) - 97
|
|
216
|
+
|
|
217
|
+
mantissa[0] = 0
|
|
218
|
+
mantissa[1] &= 0x3f
|
|
219
|
+
const value = new BigNumber(`${sign}0x${bytesToHex(mantissa)}`).times(
|
|
220
|
+
`1e${exponent}`,
|
|
221
|
+
)
|
|
222
|
+
Amount.assertIouIsValid(value)
|
|
223
|
+
|
|
224
|
+
return {
|
|
225
|
+
value: value.toString(),
|
|
226
|
+
currency: currency.toJSON(),
|
|
227
|
+
issuer: issuer.toJSON(),
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (this.isMPT()) {
|
|
232
|
+
const parser = new BinaryParser(this.toString())
|
|
233
|
+
const leadingByte = parser.read(1)
|
|
234
|
+
const amount = parser.read(8)
|
|
235
|
+
const mptID = Hash192.fromParser(parser) as Hash192
|
|
236
|
+
|
|
237
|
+
const isPositive = leadingByte[0] & 0x40
|
|
238
|
+
const sign = isPositive ? '' : '-'
|
|
239
|
+
|
|
240
|
+
const msb = BigInt(readUInt32BE(amount.slice(0, 4), 0))
|
|
241
|
+
const lsb = BigInt(readUInt32BE(amount.slice(4), 0))
|
|
242
|
+
const num = (msb << BigInt(32)) | lsb
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
value: `${sign}${num.toString()}`,
|
|
246
|
+
mpt_issuance_id: mptID.toString(),
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
throw new Error('Invalid amount to construct JSON')
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Validate XRP amount
|
|
255
|
+
*
|
|
256
|
+
* @param amount String representing XRP amount
|
|
257
|
+
* @returns void, but will throw if invalid amount
|
|
258
|
+
*/
|
|
259
|
+
private static assertXrpIsValid(amount: string): void {
|
|
260
|
+
if (amount.indexOf('.') !== -1) {
|
|
261
|
+
throw new Error(`${amount.toString()} is an illegal amount`)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const decimal = new BigNumber(amount)
|
|
265
|
+
if (!decimal.isZero()) {
|
|
266
|
+
if (decimal.lt(MIN_XRP) || decimal.gt(MAX_DROPS)) {
|
|
267
|
+
throw new Error(`${amount.toString()} is an illegal amount`)
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Validate IOU.value amount
|
|
274
|
+
*
|
|
275
|
+
* @param decimal BigNumber object representing IOU.value
|
|
276
|
+
* @returns void, but will throw if invalid amount
|
|
277
|
+
*/
|
|
278
|
+
private static assertIouIsValid(decimal: BigNumber): void {
|
|
279
|
+
if (!decimal.isZero()) {
|
|
280
|
+
const p = decimal.precision()
|
|
281
|
+
const e = (decimal.e || 0) - 15
|
|
282
|
+
if (
|
|
283
|
+
p > MAX_IOU_PRECISION ||
|
|
284
|
+
e > MAX_IOU_EXPONENT ||
|
|
285
|
+
e < MIN_IOU_EXPONENT
|
|
286
|
+
) {
|
|
287
|
+
throw new Error('Decimal precision out of range')
|
|
288
|
+
}
|
|
289
|
+
this.verifyNoDecimal(decimal)
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Validate MPT.value amount
|
|
295
|
+
*
|
|
296
|
+
* @param decimal BigNumber object representing MPT.value
|
|
297
|
+
* @returns void, but will throw if invalid amount
|
|
298
|
+
*/
|
|
299
|
+
private static assertMptIsValid(amount: string): void {
|
|
300
|
+
if (amount.indexOf('.') !== -1) {
|
|
301
|
+
throw new Error(`${amount.toString()} is an illegal amount`)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const decimal = new BigNumber(amount)
|
|
305
|
+
if (!decimal.isZero()) {
|
|
306
|
+
if (decimal < BigNumber(0)) {
|
|
307
|
+
throw new Error(`${amount.toString()} is an illegal amount`)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (Number(BigInt(amount) & BigInt(mptMask)) != 0) {
|
|
311
|
+
throw new Error(`${amount.toString()} is an illegal amount`)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Ensure that the value after being multiplied by the exponent does not
|
|
318
|
+
* contain a decimal.
|
|
319
|
+
*
|
|
320
|
+
* @param decimal a Decimal object
|
|
321
|
+
* @returns a string of the object without a decimal
|
|
322
|
+
*/
|
|
323
|
+
private static verifyNoDecimal(decimal: BigNumber): void {
|
|
324
|
+
const integerNumberString = decimal
|
|
325
|
+
.times(`1e${-((decimal.e || 0) - 15)}`)
|
|
326
|
+
.abs()
|
|
327
|
+
.toString()
|
|
328
|
+
|
|
329
|
+
if (integerNumberString.indexOf('.') !== -1) {
|
|
330
|
+
throw new Error('Decimal place found in integerNumberString')
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Test if this amount is in units of Native Currency(XRP)
|
|
336
|
+
*
|
|
337
|
+
* @returns true if Native (XRP)
|
|
338
|
+
*/
|
|
339
|
+
private isNative(): boolean {
|
|
340
|
+
return (this.bytes[0] & 0x80) === 0 && (this.bytes[0] & 0x20) === 0
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Test if this amount is in units of MPT
|
|
345
|
+
*
|
|
346
|
+
* @returns true if MPT
|
|
347
|
+
*/
|
|
348
|
+
private isMPT(): boolean {
|
|
349
|
+
return (this.bytes[0] & 0x80) === 0 && (this.bytes[0] & 0x20) !== 0
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Test if this amount is in units of IOU
|
|
354
|
+
*
|
|
355
|
+
* @returns true if IOU
|
|
356
|
+
*/
|
|
357
|
+
private isIOU(): boolean {
|
|
358
|
+
return (this.bytes[0] & 0x80) !== 0
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export { Amount, AmountObject }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SerializedType } from './serialized-type'
|
|
2
|
+
import { BinaryParser } from '../serdes/binary-parser'
|
|
3
|
+
import { hexToBytes } from '@xrplf/isomorphic/utils'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Variable length encoded type
|
|
7
|
+
*/
|
|
8
|
+
class Blob extends SerializedType {
|
|
9
|
+
constructor(bytes: Uint8Array) {
|
|
10
|
+
super(bytes)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Defines how to read a Blob from a BinaryParser
|
|
15
|
+
*
|
|
16
|
+
* @param parser The binary parser to read the Blob from
|
|
17
|
+
* @param hint The length of the blob, computed by readVariableLengthLength() and passed in
|
|
18
|
+
* @returns A Blob object
|
|
19
|
+
*/
|
|
20
|
+
static fromParser(parser: BinaryParser, hint: number): Blob {
|
|
21
|
+
return new Blob(parser.read(hint))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a Blob object from a hex-string
|
|
26
|
+
*
|
|
27
|
+
* @param value existing Blob object or a hex-string
|
|
28
|
+
* @returns A Blob object
|
|
29
|
+
*/
|
|
30
|
+
static from<T extends Blob | string>(value: T): Blob {
|
|
31
|
+
if (value instanceof Blob) {
|
|
32
|
+
return value
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (typeof value === 'string') {
|
|
36
|
+
return new Blob(hexToBytes(value))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new Error('Cannot construct Blob from value given')
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { Blob }
|