@transia/ripple-binary-codec 1.4.6-alpha.8 → 2.5.1
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/dist/binary.d.ts +30 -16
- package/dist/binary.js +36 -16
- package/dist/binary.js.map +1 -1
- package/dist/enums/bytes.d.ts +1 -2
- package/dist/enums/bytes.js +3 -2
- package/dist/enums/bytes.js.map +1 -1
- package/dist/enums/constants.d.ts +1 -0
- package/dist/enums/constants.js +6 -5
- package/dist/enums/constants.js.map +1 -1
- package/dist/enums/definitions.json +1650 -964
- package/dist/enums/field.d.ts +1 -2
- package/dist/enums/field.js +1 -2
- package/dist/enums/field.js.map +1 -1
- package/dist/enums/index.d.ts +1 -2
- package/dist/enums/index.js +5 -27
- package/dist/enums/index.js.map +1 -1
- package/dist/enums/src/enums/definitions.json +1652 -966
- package/dist/enums/xrpl-definitions-base.d.ts +5 -3
- package/dist/enums/xrpl-definitions-base.js +26 -6
- package/dist/enums/xrpl-definitions-base.js.map +1 -1
- package/dist/enums/xrpl-definitions.d.ts +2 -1
- package/dist/enums/xrpl-definitions.js +2 -1
- package/dist/enums/xrpl-definitions.js.map +1 -1
- package/dist/hash-prefixes.d.ts +1 -2
- package/dist/hash-prefixes.js +8 -6
- package/dist/hash-prefixes.js.map +1 -1
- package/dist/hashes.d.ts +6 -7
- package/dist/hashes.js +6 -7
- package/dist/hashes.js.map +1 -1
- package/dist/index.d.ts +16 -11
- package/dist/index.js +53 -58
- package/dist/index.js.map +1 -1
- package/dist/ledger-hashes.d.ts +1 -2
- package/dist/ledger-hashes.js +11 -30
- package/dist/ledger-hashes.js.map +1 -1
- package/dist/quality.d.ts +3 -4
- package/dist/quality.js +10 -8
- package/dist/quality.js.map +1 -1
- package/dist/serdes/binary-parser.d.ts +2 -3
- package/dist/serdes/binary-parser.js +16 -32
- package/dist/serdes/binary-parser.js.map +1 -1
- package/dist/serdes/binary-serializer.d.ts +7 -8
- package/dist/serdes/binary-serializer.js +14 -37
- package/dist/serdes/binary-serializer.js.map +1 -1
- package/dist/shamap.d.ts +4 -5
- package/dist/shamap.js +5 -5
- package/dist/shamap.js.map +1 -1
- package/dist/src/binary.d.ts +106 -0
- package/dist/src/binary.js +154 -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 +65 -0
- package/dist/src/enums/bytes.js.map +1 -0
- package/dist/src/enums/constants.d.ts +5 -0
- package/dist/src/enums/constants.js +9 -0
- package/dist/src/enums/constants.js.map +1 -0
- package/dist/src/enums/definitions.json +3404 -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 +47 -0
- package/dist/src/enums/xrpl-definitions-base.js +83 -0
- package/dist/src/enums/xrpl-definitions-base.js.map +1 -0
- package/dist/src/enums/xrpl-definitions.d.ts +22 -0
- package/dist/src/enums/xrpl-definitions.js +30 -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 +43 -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 +69 -0
- package/dist/src/index.js +134 -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 +37 -0
- package/dist/src/types/account-id.js +73 -0
- package/dist/src/types/account-id.js.map +1 -0
- package/dist/src/types/amount.d.ts +92 -0
- package/dist/src/types/amount.js +292 -0
- package/dist/src/types/amount.js.map +1 -0
- package/dist/src/types/blob.d.ts +25 -0
- package/dist/src/types/blob.js +46 -0
- package/dist/src/types/blob.js.map +1 -0
- package/dist/src/types/currency.d.ts +30 -0
- package/dist/src/types/currency.js +131 -0
- package/dist/src/types/currency.js.map +1 -0
- package/dist/src/types/data.d.ts +104 -0
- package/dist/src/types/data.js +387 -0
- package/dist/src/types/data.js.map +1 -0
- package/dist/src/types/dataType.d.ts +94 -0
- package/dist/src/types/dataType.js +145 -0
- package/dist/src/types/dataType.js.map +1 -0
- package/dist/src/types/hash-128.d.ts +18 -0
- package/dist/src/types/hash-128.js +36 -0
- package/dist/src/types/hash-128.js.map +1 -0
- package/dist/src/types/hash-160.d.ts +12 -0
- package/dist/src/types/hash-160.js +23 -0
- package/dist/src/types/hash-160.js.map +1 -0
- package/dist/src/types/hash-192.d.ts +12 -0
- package/dist/src/types/hash-192.js +23 -0
- package/dist/src/types/hash-192.js.map +1 -0
- package/dist/src/types/hash-256.d.ts +12 -0
- package/dist/src/types/hash-256.js +20 -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 +76 -0
- package/dist/src/types/hash.js.map +1 -0
- package/dist/src/types/index.d.ts +21 -0
- package/dist/src/types/index.js +72 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/issue.d.ts +49 -0
- package/dist/src/types/issue.js +107 -0
- package/dist/src/types/issue.js.map +1 -0
- package/dist/src/types/json.d.ts +169 -0
- package/dist/src/types/json.js +529 -0
- package/dist/src/types/json.js.map +1 -0
- package/dist/src/types/path-set.d.ts +37 -0
- package/dist/src/types/path-set.js +236 -0
- package/dist/src/types/path-set.js.map +1 -0
- package/dist/src/types/serialized-type.d.ts +117 -0
- package/dist/src/types/serialized-type.js +242 -0
- package/dist/src/types/serialized-type.js.map +1 -0
- package/dist/src/types/st-array.d.ts +32 -0
- package/dist/src/types/st-array.js +89 -0
- package/dist/src/types/st-array.js.map +1 -0
- package/dist/src/types/st-number.d.ts +55 -0
- package/dist/src/types/st-number.js +212 -0
- package/dist/src/types/st-number.js.map +1 -0
- package/dist/src/types/st-object.d.ts +33 -0
- package/dist/src/types/st-object.js +176 -0
- package/dist/src/types/st-object.js.map +1 -0
- package/dist/src/types/uint-16.d.ts +26 -0
- package/dist/src/types/uint-16.js +49 -0
- package/dist/src/types/uint-16.js.map +1 -0
- package/dist/src/types/uint-32.d.ts +26 -0
- package/dist/src/types/uint-32.js +54 -0
- package/dist/src/types/uint-32.js.map +1 -0
- package/dist/src/types/uint-64.d.ts +40 -0
- package/dist/src/types/uint-64.js +112 -0
- package/dist/src/types/uint-64.js.map +1 -0
- package/dist/src/types/uint-8.d.ts +26 -0
- package/dist/src/types/uint-8.js +50 -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 +31 -0
- package/dist/src/types/vector-256.js +76 -0
- package/dist/src/types/vector-256.js.map +1 -0
- package/dist/src/types/xchain-bridge.d.ts +45 -0
- package/dist/src/types/xchain-bridge.js +105 -0
- package/dist/src/types/xchain-bridge.js.map +1 -0
- package/dist/src/utils.d.ts +79 -0
- package/dist/src/utils.js +181 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/account-id.d.ts +3 -2
- package/dist/types/account-id.js +8 -6
- package/dist/types/account-id.js.map +1 -1
- package/dist/types/amount.d.ts +33 -9
- package/dist/types/amount.js +128 -43
- package/dist/types/amount.js.map +1 -1
- package/dist/types/blob.d.ts +3 -3
- package/dist/types/blob.js +8 -2
- package/dist/types/blob.js.map +1 -1
- package/dist/types/currency.d.ts +3 -2
- package/dist/types/currency.js +17 -13
- package/dist/types/currency.js.map +1 -1
- package/dist/types/data.d.ts +104 -0
- package/dist/types/data.js +387 -0
- package/dist/types/data.js.map +1 -0
- package/dist/types/dataType.d.ts +94 -0
- package/dist/types/dataType.js +145 -0
- package/dist/types/dataType.js.map +1 -0
- package/dist/types/hash-128.d.ts +3 -2
- package/dist/types/hash-128.js +7 -3
- package/dist/types/hash-128.js.map +1 -1
- package/dist/types/hash-160.d.ts +3 -2
- package/dist/types/hash-160.js +5 -2
- package/dist/types/hash-160.js.map +1 -1
- package/dist/types/hash-192.d.ts +12 -0
- package/dist/types/hash-192.js +23 -0
- package/dist/types/hash-192.js.map +1 -0
- package/dist/types/hash-256.d.ts +3 -2
- package/dist/types/hash-256.js +5 -2
- package/dist/types/hash-256.js.map +1 -1
- package/dist/types/hash.d.ts +2 -3
- package/dist/types/hash.js +8 -4
- package/dist/types/hash.js.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.js +17 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/issue.d.ts +49 -0
- package/dist/types/issue.js +107 -0
- package/dist/types/issue.js.map +1 -0
- package/dist/types/json.d.ts +169 -0
- package/dist/types/json.js +529 -0
- package/dist/types/json.js.map +1 -0
- package/dist/types/path-set.d.ts +2 -1
- package/dist/types/path-set.js +15 -12
- package/dist/types/path-set.js.map +1 -1
- package/dist/types/serialized-type.d.ts +70 -16
- package/dist/types/serialized-type.js +153 -8
- package/dist/types/serialized-type.js.map +1 -1
- package/dist/types/st-array.d.ts +7 -3
- package/dist/types/st-array.js +20 -11
- package/dist/types/st-array.js.map +1 -1
- package/dist/types/st-number.d.ts +55 -0
- package/dist/types/st-number.js +212 -0
- package/dist/types/st-number.js.map +1 -0
- package/dist/types/st-object.d.ts +2 -1
- package/dist/types/st-object.js +35 -8
- package/dist/types/st-object.js.map +1 -1
- package/dist/types/uint-16.d.ts +3 -2
- package/dist/types/uint-16.js +10 -5
- package/dist/types/uint-16.js.map +1 -1
- package/dist/types/uint-32.d.ts +3 -2
- package/dist/types/uint-32.js +11 -6
- package/dist/types/uint-32.js.map +1 -1
- package/dist/types/uint-64.d.ts +8 -7
- package/dist/types/uint-64.js +49 -24
- package/dist/types/uint-64.js.map +1 -1
- package/dist/types/uint-8.d.ts +3 -2
- package/dist/types/uint-8.js +11 -5
- package/dist/types/uint-8.js.map +1 -1
- package/dist/types/uint.d.ts +5 -6
- package/dist/types/uint.js +5 -0
- package/dist/types/uint.js.map +1 -1
- package/dist/types/vector-256.d.ts +3 -3
- package/dist/types/vector-256.js +5 -4
- package/dist/types/vector-256.js.map +1 -1
- package/dist/types/xchain-bridge.d.ts +45 -0
- package/dist/types/xchain-bridge.js +105 -0
- package/dist/types/xchain-bridge.js.map +1 -0
- package/dist/utils.d.ts +79 -0
- package/dist/utils.js +181 -0
- package/dist/utils.js.map +1 -0
- package/package.json +21 -17
- package/src/README.md +5 -0
- package/src/binary.ts +235 -0
- package/src/coretypes.ts +31 -0
- package/src/enums/README.md +144 -0
- package/src/enums/bytes.ts +80 -0
- package/src/enums/constants.ts +5 -0
- package/src/enums/definitions.json +3409 -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 +150 -0
- package/src/enums/xrpl-definitions.ts +33 -0
- package/src/hash-prefixes.ts +42 -0
- package/src/hashes.ts +75 -0
- package/src/index.ts +166 -0
- package/src/ledger-hashes.ts +191 -0
- package/src/quality.ts +38 -0
- package/src/serdes/binary-parser.ts +228 -0
- package/src/serdes/binary-serializer.ts +166 -0
- package/src/shamap.ts +189 -0
- package/src/types/account-id.ts +91 -0
- package/src/types/amount.ts +366 -0
- package/src/types/blob.ts +50 -0
- package/src/types/currency.ts +145 -0
- package/src/types/data.ts +496 -0
- package/src/types/dataType.ts +178 -0
- package/src/types/hash-128.ts +38 -0
- package/src/types/hash-160.ts +24 -0
- package/src/types/hash-192.ts +24 -0
- package/src/types/hash-256.ts +20 -0
- package/src/types/hash.ts +86 -0
- package/src/types/index.ts +74 -0
- package/src/types/issue.ts +140 -0
- package/src/types/json.ts +641 -0
- package/src/types/path-set.ts +294 -0
- package/src/types/serialized-type.ts +271 -0
- package/src/types/st-array.ts +117 -0
- package/src/types/st-number.ts +238 -0
- package/src/types/st-object.ts +219 -0
- package/src/types/uint-16.ts +58 -0
- package/src/types/uint-32.ts +64 -0
- package/src/types/uint-64.ts +141 -0
- package/src/types/uint-8.ts +57 -0
- package/src/types/uint.ts +60 -0
- package/src/types/vector-256.ts +83 -0
- package/src/types/xchain-bridge.ts +132 -0
- package/src/utils.ts +220 -0
- package/test/amount.test.js +0 -43
- package/test/binary-json.test.js +0 -45
- package/test/binary-parser.test.js +0 -396
- package/test/binary-serializer.test.js +0 -307
- package/test/definitions.test.js +0 -100
- 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 -2919
- 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/negative-unl.json +0 -12
- package/test/fixtures/nf-token.json +0 -547
- 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/fixtures/ticket-create-binary.json +0 -1
- package/test/fixtures/ticket-create-tx.json +0 -7
- package/test/fixtures/unl-report-binary.json +0 -1
- package/test/fixtures/unl-report-meta-binary.json +0 -1
- package/test/fixtures/unl-report.json +0 -89
- package/test/fixtures/x-codec-fixtures.json +0 -188
- package/test/hash.test.js +0 -135
- package/test/ledger.test.js +0 -29
- package/test/lower-case-hex.test.js +0 -46
- package/test/pseudo-transaction.test.js +0 -38
- package/test/quality.test.js +0 -15
- package/test/shamap.test.js +0 -89
- package/test/signing-data-encoding.test.js +0 -213
- package/test/tx-encode-decode.test.js +0 -119
- package/test/types.test.js +0 -34
- package/test/uint.test.js +0 -148
- package/test/utils.js +0 -30
- package/test/x-address.test.js +0 -181
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { FieldInstance } from '../enums'
|
|
2
|
+
import { type SerializedType } from '../types/serialized-type'
|
|
3
|
+
import { bytesToHex, concat } from '@transia/isomorphic/utils'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Bytes list is a collection of Uint8Array objects
|
|
7
|
+
*/
|
|
8
|
+
class BytesList {
|
|
9
|
+
private bytesArray: Array<Uint8Array> = []
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get the total number of bytes in the BytesList
|
|
13
|
+
*
|
|
14
|
+
* @return the number of bytes
|
|
15
|
+
*/
|
|
16
|
+
public getLength(): number {
|
|
17
|
+
return concat(this.bytesArray).byteLength
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Put bytes in the BytesList
|
|
22
|
+
*
|
|
23
|
+
* @param bytesArg A Uint8Array
|
|
24
|
+
* @return this BytesList
|
|
25
|
+
*/
|
|
26
|
+
public put(bytesArg: Uint8Array): BytesList {
|
|
27
|
+
const bytes = Uint8Array.from(bytesArg) // Temporary, to catch instances of Uint8Array being passed in
|
|
28
|
+
this.bytesArray.push(bytes)
|
|
29
|
+
return this
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Write this BytesList to the back of another bytes list
|
|
34
|
+
*
|
|
35
|
+
* @param list The BytesList to write to
|
|
36
|
+
*/
|
|
37
|
+
public toBytesSink(list: BytesList): void {
|
|
38
|
+
list.put(this.toBytes())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public toBytes(): Uint8Array {
|
|
42
|
+
return concat(this.bytesArray)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
toHex(): string {
|
|
46
|
+
return bytesToHex(this.toBytes())
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* BinarySerializer is used to write fields and values to Uint8Arrays
|
|
52
|
+
*/
|
|
53
|
+
class BinarySerializer {
|
|
54
|
+
private sink: BytesList = new BytesList()
|
|
55
|
+
|
|
56
|
+
constructor(sink: BytesList) {
|
|
57
|
+
this.sink = sink
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Write a value to this BinarySerializer
|
|
62
|
+
*
|
|
63
|
+
* @param value a SerializedType value
|
|
64
|
+
*/
|
|
65
|
+
write(value: SerializedType): void {
|
|
66
|
+
value.toBytesSink(this.sink)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Write bytes to this BinarySerializer
|
|
71
|
+
*
|
|
72
|
+
* @param bytes the bytes to write
|
|
73
|
+
*/
|
|
74
|
+
put(bytes: Uint8Array): void {
|
|
75
|
+
this.sink.put(bytes)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Write a value of a given type to this BinarySerializer
|
|
80
|
+
*
|
|
81
|
+
* @param type the type to write
|
|
82
|
+
* @param value a value of that type
|
|
83
|
+
*/
|
|
84
|
+
writeType(type: typeof SerializedType, value: SerializedType): void {
|
|
85
|
+
this.write(type.from(value))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Write BytesList to this BinarySerializer
|
|
90
|
+
*
|
|
91
|
+
* @param bl BytesList to write to BinarySerializer
|
|
92
|
+
*/
|
|
93
|
+
writeBytesList(bl: BytesList): void {
|
|
94
|
+
bl.toBytesSink(this.sink)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Calculate the header of Variable Length encoded bytes
|
|
99
|
+
*
|
|
100
|
+
* @param length the length of the bytes
|
|
101
|
+
*/
|
|
102
|
+
static encodeVariableLength(length: number): Uint8Array {
|
|
103
|
+
const lenBytes = new Uint8Array(3)
|
|
104
|
+
if (length <= 192) {
|
|
105
|
+
lenBytes[0] = length
|
|
106
|
+
return lenBytes.slice(0, 1)
|
|
107
|
+
} else if (length <= 12480) {
|
|
108
|
+
length -= 193
|
|
109
|
+
lenBytes[0] = 193 + (length >>> 8)
|
|
110
|
+
lenBytes[1] = length & 0xff
|
|
111
|
+
return lenBytes.slice(0, 2)
|
|
112
|
+
} else if (length <= 918744) {
|
|
113
|
+
length -= 12481
|
|
114
|
+
lenBytes[0] = 241 + (length >>> 16)
|
|
115
|
+
lenBytes[1] = (length >> 8) & 0xff
|
|
116
|
+
lenBytes[2] = length & 0xff
|
|
117
|
+
return lenBytes.slice(0, 3)
|
|
118
|
+
}
|
|
119
|
+
throw new Error('Overflow error')
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Write field and value to BinarySerializer
|
|
124
|
+
*
|
|
125
|
+
* @param field field to write to BinarySerializer
|
|
126
|
+
* @param value value to write to BinarySerializer
|
|
127
|
+
*/
|
|
128
|
+
writeFieldAndValue(
|
|
129
|
+
field: FieldInstance,
|
|
130
|
+
value: SerializedType,
|
|
131
|
+
isUnlModifyWorkaround = false,
|
|
132
|
+
): void {
|
|
133
|
+
const associatedValue = field.associatedType.from(value)
|
|
134
|
+
if (associatedValue.toBytesSink === undefined || field.name === undefined) {
|
|
135
|
+
throw new Error()
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
this.sink.put(field.header)
|
|
139
|
+
|
|
140
|
+
if (field.isVariableLengthEncoded) {
|
|
141
|
+
this.writeLengthEncoded(associatedValue, isUnlModifyWorkaround)
|
|
142
|
+
} else {
|
|
143
|
+
associatedValue.toBytesSink(this.sink)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Write a variable length encoded value to the BinarySerializer
|
|
149
|
+
*
|
|
150
|
+
* @param value length encoded value to write to BytesList
|
|
151
|
+
*/
|
|
152
|
+
public writeLengthEncoded(
|
|
153
|
+
value: SerializedType,
|
|
154
|
+
isUnlModifyWorkaround = false,
|
|
155
|
+
): void {
|
|
156
|
+
const bytes = new BytesList()
|
|
157
|
+
if (!isUnlModifyWorkaround) {
|
|
158
|
+
// this part doesn't happen for the Account field in a UNLModify transaction
|
|
159
|
+
value.toBytesSink(bytes)
|
|
160
|
+
}
|
|
161
|
+
this.put(BinarySerializer.encodeVariableLength(bytes.getLength()))
|
|
162
|
+
this.writeBytesList(bytes)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export { BytesList, BinarySerializer }
|
package/src/shamap.ts
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
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(
|
|
23
|
+
public index: Hash256,
|
|
24
|
+
public item?: ShaMapNode,
|
|
25
|
+
) {
|
|
26
|
+
super()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @returns true as ShaMapLeaf is a leaf node
|
|
31
|
+
*/
|
|
32
|
+
isLeaf(): boolean {
|
|
33
|
+
return true
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @returns false as ShaMapLeaf is not an inner node
|
|
38
|
+
*/
|
|
39
|
+
isInner(): boolean {
|
|
40
|
+
return false
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get the prefix of the this.item
|
|
45
|
+
*
|
|
46
|
+
* @returns The hash prefix, unless this.item is undefined, then it returns an empty Uint8Array
|
|
47
|
+
*/
|
|
48
|
+
hashPrefix(): Uint8Array {
|
|
49
|
+
return this.item === undefined ? new Uint8Array(0) : this.item.hashPrefix()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Hash the bytes representation of this
|
|
54
|
+
*
|
|
55
|
+
* @returns hash of this.item concatenated with this.index
|
|
56
|
+
*/
|
|
57
|
+
hash(): Hash256 {
|
|
58
|
+
const hash = Sha512Half.put(this.hashPrefix())
|
|
59
|
+
this.toBytesSink(hash)
|
|
60
|
+
return hash.finish()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Write the bytes representation of this to a BytesList
|
|
65
|
+
* @param list BytesList to write bytes to
|
|
66
|
+
*/
|
|
67
|
+
toBytesSink(list: BytesList): void {
|
|
68
|
+
if (this.item !== undefined) {
|
|
69
|
+
this.item.toBytesSink(list)
|
|
70
|
+
}
|
|
71
|
+
this.index.toBytesSink(list)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Class defining an Inner Node of a SHAMap
|
|
77
|
+
*/
|
|
78
|
+
class ShaMapInner extends ShaMapNode {
|
|
79
|
+
private slotBits = 0
|
|
80
|
+
private branches: Array<ShaMapNode> = Array(16)
|
|
81
|
+
|
|
82
|
+
constructor(private depth = 0) {
|
|
83
|
+
super()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @returns true as ShaMapInner is an inner node
|
|
88
|
+
*/
|
|
89
|
+
isInner(): boolean {
|
|
90
|
+
return true
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @returns false as ShaMapInner is not a leaf node
|
|
95
|
+
*/
|
|
96
|
+
isLeaf(): boolean {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Get the hash prefix for this node
|
|
102
|
+
*
|
|
103
|
+
* @returns hash prefix describing an inner node
|
|
104
|
+
*/
|
|
105
|
+
hashPrefix(): Uint8Array {
|
|
106
|
+
return HashPrefix.innerNode
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Set a branch of this node to be another node
|
|
111
|
+
*
|
|
112
|
+
* @param slot Slot to add branch to this.branches
|
|
113
|
+
* @param branch Branch to add
|
|
114
|
+
*/
|
|
115
|
+
setBranch(slot: number, branch: ShaMapNode): void {
|
|
116
|
+
this.slotBits = this.slotBits | (1 << slot)
|
|
117
|
+
this.branches[slot] = branch
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @returns true if node is empty
|
|
122
|
+
*/
|
|
123
|
+
empty(): boolean {
|
|
124
|
+
return this.slotBits === 0
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Compute the hash of this node
|
|
129
|
+
*
|
|
130
|
+
* @returns The hash of this node
|
|
131
|
+
*/
|
|
132
|
+
hash(): Hash256 {
|
|
133
|
+
if (this.empty()) {
|
|
134
|
+
return (coreTypes.Hash256 as typeof Hash256).ZERO_256
|
|
135
|
+
}
|
|
136
|
+
const hash = Sha512Half.put(this.hashPrefix())
|
|
137
|
+
this.toBytesSink(hash)
|
|
138
|
+
return hash.finish()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Writes the bytes representation of this node to a BytesList
|
|
143
|
+
*
|
|
144
|
+
* @param list BytesList to write bytes to
|
|
145
|
+
*/
|
|
146
|
+
toBytesSink(list: BytesList): void {
|
|
147
|
+
for (let i = 0; i < this.branches.length; i++) {
|
|
148
|
+
const branch = this.branches[i]
|
|
149
|
+
const hash = branch
|
|
150
|
+
? branch.hash()
|
|
151
|
+
: (coreTypes.Hash256 as typeof Hash256).ZERO_256
|
|
152
|
+
hash.toBytesSink(list)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Add item to the SHAMap
|
|
158
|
+
*
|
|
159
|
+
* @param index Hash of the index of the item being inserted
|
|
160
|
+
* @param item Item to insert in the map
|
|
161
|
+
* @param leaf Leaf node to insert when branch doesn't exist
|
|
162
|
+
*/
|
|
163
|
+
addItem(index?: Hash256, item?: ShaMapNode, leaf?: ShaMapLeaf): void {
|
|
164
|
+
if (index === undefined) {
|
|
165
|
+
throw new Error()
|
|
166
|
+
}
|
|
167
|
+
if (index !== undefined) {
|
|
168
|
+
const nibble = index.nibblet(this.depth)
|
|
169
|
+
const existing = this.branches[nibble]
|
|
170
|
+
|
|
171
|
+
if (existing === undefined) {
|
|
172
|
+
this.setBranch(nibble, leaf || new ShaMapLeaf(index, item))
|
|
173
|
+
} else if (existing instanceof ShaMapLeaf) {
|
|
174
|
+
const newInner = new ShaMapInner(this.depth + 1)
|
|
175
|
+
newInner.addItem(existing.index, undefined, existing)
|
|
176
|
+
newInner.addItem(index, item, leaf)
|
|
177
|
+
this.setBranch(nibble, newInner)
|
|
178
|
+
} else if (existing instanceof ShaMapInner) {
|
|
179
|
+
existing.addItem(index, item, leaf)
|
|
180
|
+
} else {
|
|
181
|
+
throw new Error('invalid ShaMap.addItem call')
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
class ShaMap extends ShaMapInner {}
|
|
188
|
+
|
|
189
|
+
export { ShaMap, ShaMapNode, ShaMapLeaf }
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decodeAccountID,
|
|
3
|
+
encodeAccountID,
|
|
4
|
+
isValidXAddress,
|
|
5
|
+
xAddressToClassicAddress,
|
|
6
|
+
} from '@transia/ripple-address-codec'
|
|
7
|
+
import { Hash160 } from './hash-160'
|
|
8
|
+
import { hexToBytes } from '@transia/isomorphic/utils'
|
|
9
|
+
import { SerializedTypeID } from './serialized-type'
|
|
10
|
+
|
|
11
|
+
const HEX_REGEX = /^[A-F0-9]{40}$/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Class defining how to encode and decode an AccountID
|
|
15
|
+
*/
|
|
16
|
+
class AccountID extends Hash160 {
|
|
17
|
+
static readonly defaultAccountID: AccountID = new AccountID(
|
|
18
|
+
new Uint8Array(20),
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
constructor(bytes?: Uint8Array) {
|
|
22
|
+
super(bytes ?? AccountID.defaultAccountID.bytes)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Defines how to construct an AccountID
|
|
27
|
+
*
|
|
28
|
+
* @param value either an existing AccountID, a hex-string, or a base58 r-Address
|
|
29
|
+
* @returns an AccountID object
|
|
30
|
+
*/
|
|
31
|
+
static from<T extends Hash160 | string>(value: T): AccountID {
|
|
32
|
+
if (value instanceof AccountID) {
|
|
33
|
+
return value
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (typeof value === 'string') {
|
|
37
|
+
if (value === '') {
|
|
38
|
+
return new AccountID()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return HEX_REGEX.test(value)
|
|
42
|
+
? new AccountID(hexToBytes(value))
|
|
43
|
+
: this.fromBase58(value)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
throw new Error('Cannot construct AccountID from value given')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Defines how to build an AccountID from a base58 r-Address
|
|
51
|
+
*
|
|
52
|
+
* @param value a base58 r-Address
|
|
53
|
+
* @returns an AccountID object
|
|
54
|
+
*/
|
|
55
|
+
static fromBase58(value: string): AccountID {
|
|
56
|
+
if (isValidXAddress(value)) {
|
|
57
|
+
const classic = xAddressToClassicAddress(value)
|
|
58
|
+
|
|
59
|
+
if (classic.tag !== false)
|
|
60
|
+
throw new Error('Only allowed to have tag on Account or Destination')
|
|
61
|
+
|
|
62
|
+
value = classic.classicAddress
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return new AccountID(Uint8Array.from(decodeAccountID(value)))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Overload of toJSON
|
|
70
|
+
*
|
|
71
|
+
* @returns the base58 string for this AccountID
|
|
72
|
+
*/
|
|
73
|
+
toJSON(): string {
|
|
74
|
+
return this.toBase58()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Defines how to encode AccountID into a base58 address
|
|
79
|
+
*
|
|
80
|
+
* @returns the base58 string defined by this.bytes
|
|
81
|
+
*/
|
|
82
|
+
toBase58(): string {
|
|
83
|
+
return encodeAccountID(this.bytes)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
getSType(): SerializedTypeID {
|
|
87
|
+
return SerializedTypeID.STI_ACCOUNT
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export { AccountID }
|