@transia/ripple-binary-codec 1.4.6-alpha.9 → 2.5.1-quantum.0

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.
Files changed (340) hide show
  1. package/dist/binary.d.ts +30 -16
  2. package/dist/binary.js +36 -16
  3. package/dist/binary.js.map +1 -1
  4. package/dist/enums/bytes.d.ts +1 -2
  5. package/dist/enums/bytes.js +1 -2
  6. package/dist/enums/bytes.js.map +1 -1
  7. package/dist/enums/constants.d.ts +1 -0
  8. package/dist/enums/constants.js +6 -5
  9. package/dist/enums/constants.js.map +1 -1
  10. package/dist/enums/definitions.json +1535 -919
  11. package/dist/enums/field.d.ts +1 -2
  12. package/dist/enums/field.js +1 -2
  13. package/dist/enums/field.js.map +1 -1
  14. package/dist/enums/index.d.ts +1 -2
  15. package/dist/enums/index.js +5 -27
  16. package/dist/enums/index.js.map +1 -1
  17. package/dist/enums/src/enums/definitions.json +1537 -921
  18. package/dist/enums/xrpl-definitions-base.d.ts +5 -3
  19. package/dist/enums/xrpl-definitions-base.js +26 -6
  20. package/dist/enums/xrpl-definitions-base.js.map +1 -1
  21. package/dist/enums/xrpl-definitions.d.ts +2 -1
  22. package/dist/enums/xrpl-definitions.js +2 -1
  23. package/dist/enums/xrpl-definitions.js.map +1 -1
  24. package/dist/hash-prefixes.d.ts +1 -2
  25. package/dist/hash-prefixes.js +8 -6
  26. package/dist/hash-prefixes.js.map +1 -1
  27. package/dist/hashes.d.ts +6 -7
  28. package/dist/hashes.js +6 -7
  29. package/dist/hashes.js.map +1 -1
  30. package/dist/index.d.ts +16 -11
  31. package/dist/index.js +53 -58
  32. package/dist/index.js.map +1 -1
  33. package/dist/ledger-hashes.d.ts +1 -2
  34. package/dist/ledger-hashes.js +11 -30
  35. package/dist/ledger-hashes.js.map +1 -1
  36. package/dist/quality.d.ts +3 -4
  37. package/dist/quality.js +10 -8
  38. package/dist/quality.js.map +1 -1
  39. package/dist/serdes/binary-parser.d.ts +2 -3
  40. package/dist/serdes/binary-parser.js +16 -32
  41. package/dist/serdes/binary-parser.js.map +1 -1
  42. package/dist/serdes/binary-serializer.d.ts +6 -7
  43. package/dist/serdes/binary-serializer.js +12 -35
  44. package/dist/serdes/binary-serializer.js.map +1 -1
  45. package/dist/shamap.d.ts +4 -5
  46. package/dist/shamap.js +5 -5
  47. package/dist/shamap.js.map +1 -1
  48. package/dist/src/binary.d.ts +106 -0
  49. package/dist/src/binary.js +154 -0
  50. package/dist/src/binary.js.map +1 -0
  51. package/dist/src/coretypes.d.ts +9 -0
  52. package/dist/src/coretypes.js +48 -0
  53. package/dist/src/coretypes.js.map +1 -0
  54. package/dist/src/enums/bytes.d.ts +25 -0
  55. package/dist/src/enums/bytes.js +63 -0
  56. package/dist/src/enums/bytes.js.map +1 -0
  57. package/dist/src/enums/constants.d.ts +5 -0
  58. package/dist/src/enums/constants.js +9 -0
  59. package/dist/src/enums/constants.js.map +1 -0
  60. package/dist/src/enums/definitions.json +3385 -0
  61. package/dist/src/enums/field.d.ts +28 -0
  62. package/dist/src/enums/field.js +58 -0
  63. package/dist/src/enums/field.js.map +1 -0
  64. package/dist/src/enums/index.d.ts +12 -0
  65. package/dist/src/enums/index.js +31 -0
  66. package/dist/src/enums/index.js.map +1 -0
  67. package/dist/src/enums/utils-renumber.d.ts +101 -0
  68. package/dist/src/enums/utils-renumber.js +127 -0
  69. package/dist/src/enums/utils-renumber.js.map +1 -0
  70. package/dist/src/enums/xrpl-definitions-base.d.ts +47 -0
  71. package/dist/src/enums/xrpl-definitions-base.js +83 -0
  72. package/dist/src/enums/xrpl-definitions-base.js.map +1 -0
  73. package/dist/src/enums/xrpl-definitions.d.ts +22 -0
  74. package/dist/src/enums/xrpl-definitions.js +30 -0
  75. package/dist/src/enums/xrpl-definitions.js.map +1 -0
  76. package/dist/src/hash-prefixes.d.ts +5 -0
  77. package/dist/src/hash-prefixes.js +43 -0
  78. package/dist/src/hash-prefixes.js.map +1 -0
  79. package/dist/src/hashes.d.ts +50 -0
  80. package/dist/src/hashes.js +76 -0
  81. package/dist/src/hashes.js.map +1 -0
  82. package/dist/src/index.d.ts +69 -0
  83. package/dist/src/index.js +134 -0
  84. package/dist/src/index.js.map +1 -0
  85. package/dist/src/ledger-hashes.d.ts +48 -0
  86. package/dist/src/ledger-hashes.js +141 -0
  87. package/dist/src/ledger-hashes.js.map +1 -0
  88. package/dist/src/quality.d.ts +21 -0
  89. package/dist/src/quality.js +42 -0
  90. package/dist/src/quality.js.map +1 -0
  91. package/dist/src/serdes/binary-parser.d.ts +100 -0
  92. package/dist/src/serdes/binary-parser.js +194 -0
  93. package/dist/src/serdes/binary-parser.js.map +1 -0
  94. package/dist/src/serdes/binary-serializer.d.ts +81 -0
  95. package/dist/src/serdes/binary-serializer.js +149 -0
  96. package/dist/src/serdes/binary-serializer.js.map +1 -0
  97. package/dist/src/shamap.d.ts +102 -0
  98. package/dist/src/shamap.js +172 -0
  99. package/dist/src/shamap.js.map +1 -0
  100. package/dist/src/types/account-id.d.ts +35 -0
  101. package/dist/src/types/account-id.js +69 -0
  102. package/dist/src/types/account-id.js.map +1 -0
  103. package/dist/src/types/amount.d.ts +91 -0
  104. package/dist/src/types/amount.js +289 -0
  105. package/dist/src/types/amount.js.map +1 -0
  106. package/dist/src/types/blob.d.ts +24 -0
  107. package/dist/src/types/blob.js +43 -0
  108. package/dist/src/types/blob.js.map +1 -0
  109. package/dist/src/types/currency.d.ts +28 -0
  110. package/dist/src/types/currency.js +127 -0
  111. package/dist/src/types/currency.js.map +1 -0
  112. package/dist/src/types/hash-128.d.ts +16 -0
  113. package/dist/src/types/hash-128.js +32 -0
  114. package/dist/src/types/hash-128.js.map +1 -0
  115. package/dist/src/types/hash-160.d.ts +10 -0
  116. package/dist/src/types/hash-160.js +19 -0
  117. package/dist/src/types/hash-160.js.map +1 -0
  118. package/dist/src/types/hash-192.d.ts +10 -0
  119. package/dist/src/types/hash-192.js +19 -0
  120. package/dist/src/types/hash-192.js.map +1 -0
  121. package/dist/src/types/hash-256.d.ts +10 -0
  122. package/dist/src/types/hash-256.js +16 -0
  123. package/dist/src/types/hash-256.js.map +1 -0
  124. package/dist/src/types/hash.d.ts +40 -0
  125. package/dist/src/types/hash.js +76 -0
  126. package/dist/src/types/hash.js.map +1 -0
  127. package/dist/src/types/index.d.ts +19 -0
  128. package/dist/src/types/index.js +66 -0
  129. package/dist/src/types/index.js.map +1 -0
  130. package/dist/src/types/issue.d.ts +48 -0
  131. package/dist/src/types/issue.js +104 -0
  132. package/dist/src/types/issue.js.map +1 -0
  133. package/dist/src/types/path-set.d.ts +36 -0
  134. package/dist/src/types/path-set.js +233 -0
  135. package/dist/src/types/path-set.js.map +1 -0
  136. package/dist/src/types/serialized-type.d.ts +70 -0
  137. package/dist/src/types/serialized-type.js +105 -0
  138. package/dist/src/types/serialized-type.js.map +1 -0
  139. package/dist/src/types/st-array.d.ts +31 -0
  140. package/dist/src/types/st-array.js +86 -0
  141. package/dist/src/types/st-array.js.map +1 -0
  142. package/dist/src/types/st-number.d.ts +54 -0
  143. package/dist/src/types/st-number.js +208 -0
  144. package/dist/src/types/st-number.js.map +1 -0
  145. package/dist/src/types/st-object.d.ts +32 -0
  146. package/dist/src/types/st-object.js +173 -0
  147. package/dist/src/types/st-object.js.map +1 -0
  148. package/dist/src/types/uint-16.d.ts +24 -0
  149. package/dist/src/types/uint-16.js +45 -0
  150. package/dist/src/types/uint-16.js.map +1 -0
  151. package/dist/src/types/uint-32.d.ts +24 -0
  152. package/dist/src/types/uint-32.js +50 -0
  153. package/dist/src/types/uint-32.js.map +1 -0
  154. package/dist/src/types/uint-64.d.ts +38 -0
  155. package/dist/src/types/uint-64.js +107 -0
  156. package/dist/src/types/uint-64.js.map +1 -0
  157. package/dist/src/types/uint-8.d.ts +24 -0
  158. package/dist/src/types/uint-8.js +46 -0
  159. package/dist/src/types/uint-8.js.map +1 -0
  160. package/dist/src/types/uint.d.ts +29 -0
  161. package/dist/src/types/uint.js +47 -0
  162. package/dist/src/types/uint.js.map +1 -0
  163. package/dist/src/types/vector-256.d.ts +30 -0
  164. package/dist/src/types/vector-256.js +73 -0
  165. package/dist/src/types/vector-256.js.map +1 -0
  166. package/dist/src/types/xchain-bridge.d.ts +44 -0
  167. package/dist/src/types/xchain-bridge.js +102 -0
  168. package/dist/src/types/xchain-bridge.js.map +1 -0
  169. package/dist/src/utils.d.ts +79 -0
  170. package/dist/src/utils.js +181 -0
  171. package/dist/src/utils.js.map +1 -0
  172. package/dist/tsconfig.tsbuildinfo +1 -0
  173. package/dist/types/account-id.d.ts +1 -2
  174. package/dist/types/account-id.js +4 -6
  175. package/dist/types/account-id.js.map +1 -1
  176. package/dist/types/amount.d.ts +31 -8
  177. package/dist/types/amount.js +125 -43
  178. package/dist/types/amount.js.map +1 -1
  179. package/dist/types/blob.d.ts +1 -2
  180. package/dist/types/blob.js +5 -2
  181. package/dist/types/blob.js.map +1 -1
  182. package/dist/types/currency.d.ts +1 -2
  183. package/dist/types/currency.js +13 -13
  184. package/dist/types/currency.js.map +1 -1
  185. package/dist/types/hash-128.d.ts +1 -2
  186. package/dist/types/hash-128.js +3 -3
  187. package/dist/types/hash-128.js.map +1 -1
  188. package/dist/types/hash-160.d.ts +1 -2
  189. package/dist/types/hash-160.js +1 -2
  190. package/dist/types/hash-160.js.map +1 -1
  191. package/dist/types/hash-192.d.ts +10 -0
  192. package/dist/types/hash-192.js +19 -0
  193. package/dist/types/hash-192.js.map +1 -0
  194. package/dist/types/hash-256.d.ts +1 -2
  195. package/dist/types/hash-256.js +1 -2
  196. package/dist/types/hash-256.js.map +1 -1
  197. package/dist/types/hash.d.ts +2 -3
  198. package/dist/types/hash.js +8 -4
  199. package/dist/types/hash.js.map +1 -1
  200. package/dist/types/index.d.ts +2 -1
  201. package/dist/types/index.js +11 -2
  202. package/dist/types/index.js.map +1 -1
  203. package/dist/types/issue.d.ts +48 -0
  204. package/dist/types/issue.js +104 -0
  205. package/dist/types/issue.js.map +1 -0
  206. package/dist/types/path-set.js +12 -12
  207. package/dist/types/path-set.js.map +1 -1
  208. package/dist/types/serialized-type.d.ts +23 -16
  209. package/dist/types/serialized-type.js +15 -7
  210. package/dist/types/serialized-type.js.map +1 -1
  211. package/dist/types/st-array.d.ts +5 -2
  212. package/dist/types/st-array.js +17 -11
  213. package/dist/types/st-array.js.map +1 -1
  214. package/dist/types/st-number.d.ts +54 -0
  215. package/dist/types/st-number.js +208 -0
  216. package/dist/types/st-number.js.map +1 -0
  217. package/dist/types/st-object.js +32 -8
  218. package/dist/types/st-object.js.map +1 -1
  219. package/dist/types/uint-16.d.ts +1 -2
  220. package/dist/types/uint-16.js +6 -5
  221. package/dist/types/uint-16.js.map +1 -1
  222. package/dist/types/uint-32.d.ts +1 -2
  223. package/dist/types/uint-32.js +7 -6
  224. package/dist/types/uint-32.js.map +1 -1
  225. package/dist/types/uint-64.d.ts +6 -7
  226. package/dist/types/uint-64.js +44 -24
  227. package/dist/types/uint-64.js.map +1 -1
  228. package/dist/types/uint-8.d.ts +1 -2
  229. package/dist/types/uint-8.js +7 -5
  230. package/dist/types/uint-8.js.map +1 -1
  231. package/dist/types/uint.d.ts +5 -6
  232. package/dist/types/uint.js +5 -0
  233. package/dist/types/uint.js.map +1 -1
  234. package/dist/types/vector-256.d.ts +1 -2
  235. package/dist/types/vector-256.js +2 -4
  236. package/dist/types/vector-256.js.map +1 -1
  237. package/dist/types/xchain-bridge.d.ts +44 -0
  238. package/dist/types/xchain-bridge.js +102 -0
  239. package/dist/types/xchain-bridge.js.map +1 -0
  240. package/dist/utils.d.ts +79 -0
  241. package/dist/utils.js +181 -0
  242. package/dist/utils.js.map +1 -0
  243. package/package.json +21 -17
  244. package/src/README.md +5 -0
  245. package/src/binary.ts +235 -0
  246. package/src/coretypes.ts +31 -0
  247. package/src/enums/README.md +144 -0
  248. package/src/enums/bytes.ts +74 -0
  249. package/src/enums/constants.ts +5 -0
  250. package/src/enums/definitions.json +3390 -0
  251. package/src/enums/field.ts +84 -0
  252. package/src/enums/index.ts +34 -0
  253. package/src/enums/utils-renumber.ts +134 -0
  254. package/src/enums/xrpl-definitions-base.ts +150 -0
  255. package/src/enums/xrpl-definitions.ts +33 -0
  256. package/src/hash-prefixes.ts +42 -0
  257. package/src/hashes.ts +75 -0
  258. package/src/index.ts +166 -0
  259. package/src/ledger-hashes.ts +191 -0
  260. package/src/quality.ts +38 -0
  261. package/src/serdes/binary-parser.ts +228 -0
  262. package/src/serdes/binary-serializer.ts +166 -0
  263. package/src/shamap.ts +186 -0
  264. package/src/types/account-id.ts +86 -0
  265. package/src/types/amount.ts +362 -0
  266. package/src/types/blob.ts +46 -0
  267. package/src/types/currency.ts +140 -0
  268. package/src/types/hash-128.ts +33 -0
  269. package/src/types/hash-160.ts +19 -0
  270. package/src/types/hash-192.ts +19 -0
  271. package/src/types/hash-256.ts +15 -0
  272. package/src/types/hash.ts +86 -0
  273. package/src/types/index.ts +68 -0
  274. package/src/types/issue.ts +136 -0
  275. package/src/types/path-set.ts +290 -0
  276. package/src/types/serialized-type.ts +122 -0
  277. package/src/types/st-array.ts +113 -0
  278. package/src/types/st-number.ts +233 -0
  279. package/src/types/st-object.ts +215 -0
  280. package/src/types/uint-16.ts +53 -0
  281. package/src/types/uint-32.ts +59 -0
  282. package/src/types/uint-64.ts +135 -0
  283. package/src/types/uint-8.ts +52 -0
  284. package/src/types/uint.ts +60 -0
  285. package/src/types/vector-256.ts +79 -0
  286. package/src/types/xchain-bridge.ts +128 -0
  287. package/src/utils.ts +220 -0
  288. package/test/amount.test.js +0 -43
  289. package/test/binary-json.test.js +0 -45
  290. package/test/binary-parser.test.js +0 -396
  291. package/test/binary-serializer.test.js +0 -319
  292. package/test/definitions.test.js +0 -100
  293. package/test/fixtures/account-tx-transactions.db +0 -0
  294. package/test/fixtures/codec-fixtures.json +0 -4466
  295. package/test/fixtures/data-driven-tests.json +0 -2919
  296. package/test/fixtures/delivermin-tx-binary.json +0 -1
  297. package/test/fixtures/delivermin-tx.json +0 -98
  298. package/test/fixtures/deposit-preauth-tx-binary.json +0 -1
  299. package/test/fixtures/deposit-preauth-tx-meta-binary.json +0 -1
  300. package/test/fixtures/deposit-preauth-tx.json +0 -58
  301. package/test/fixtures/escrow-cancel-binary.json +0 -1
  302. package/test/fixtures/escrow-cancel-tx.json +0 -6
  303. package/test/fixtures/escrow-create-binary.json +0 -1
  304. package/test/fixtures/escrow-create-tx.json +0 -10
  305. package/test/fixtures/escrow-finish-binary.json +0 -1
  306. package/test/fixtures/escrow-finish-meta-binary.json +0 -1
  307. package/test/fixtures/escrow-finish-tx.json +0 -95
  308. package/test/fixtures/ledger-full-38129.json +0 -1
  309. package/test/fixtures/ledger-full-40000.json +0 -1
  310. package/test/fixtures/negative-unl.json +0 -12
  311. package/test/fixtures/nf-token.json +0 -547
  312. package/test/fixtures/payment-channel-claim-binary.json +0 -1
  313. package/test/fixtures/payment-channel-claim-tx.json +0 -8
  314. package/test/fixtures/payment-channel-create-binary.json +0 -1
  315. package/test/fixtures/payment-channel-create-tx.json +0 -11
  316. package/test/fixtures/payment-channel-fund-binary.json +0 -1
  317. package/test/fixtures/payment-channel-fund-tx.json +0 -7
  318. package/test/fixtures/remit-binary.json +0 -1
  319. package/test/fixtures/remit-tx.json +0 -39
  320. package/test/fixtures/signerlistset-tx-binary.json +0 -1
  321. package/test/fixtures/signerlistset-tx-meta-binary.json +0 -1
  322. package/test/fixtures/signerlistset-tx.json +0 -94
  323. package/test/fixtures/ticket-create-binary.json +0 -1
  324. package/test/fixtures/ticket-create-tx.json +0 -7
  325. package/test/fixtures/unl-report-binary.json +0 -1
  326. package/test/fixtures/unl-report-meta-binary.json +0 -1
  327. package/test/fixtures/unl-report.json +0 -89
  328. package/test/fixtures/x-codec-fixtures.json +0 -188
  329. package/test/hash.test.js +0 -135
  330. package/test/ledger.test.js +0 -29
  331. package/test/lower-case-hex.test.js +0 -46
  332. package/test/pseudo-transaction.test.js +0 -38
  333. package/test/quality.test.js +0 -15
  334. package/test/shamap.test.js +0 -89
  335. package/test/signing-data-encoding.test.js +0 -213
  336. package/test/tx-encode-decode.test.js +0 -119
  337. package/test/types.test.js +0 -34
  338. package/test/uint.test.js +0 -148
  339. package/test/utils.js +0 -30
  340. package/test/x-address.test.js +0 -181
@@ -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 '@transia/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,46 @@
1
+ import { SerializedType } from './serialized-type'
2
+ import { BinaryParser } from '../serdes/binary-parser'
3
+ import { hexToBytes } from '@transia/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
+ if (!/^[A-F0-9]*$/iu.test(value)) {
37
+ throw new Error('Cannot construct Blob from a non-hex string')
38
+ }
39
+ return new Blob(hexToBytes(value))
40
+ }
41
+
42
+ throw new Error('Cannot construct Blob from value given')
43
+ }
44
+ }
45
+
46
+ export { Blob }
@@ -0,0 +1,140 @@
1
+ import { Hash160 } from './hash-160'
2
+ import { bytesToHex, hexToBytes, hexToString } from '@transia/isomorphic/utils'
3
+
4
+ const XRP_HEX_REGEX = /^0{40}$/
5
+ const ISO_REGEX = /^[A-Z0-9a-z?!@#$%^&*(){}[\]|]{3}$/
6
+ const HEX_REGEX = /^[A-F0-9]{40}$/
7
+ // eslint-disable-next-line no-control-regex
8
+ const STANDARD_FORMAT_HEX_REGEX = /^0{24}[\x00-\x7F]{6}0{10}$/
9
+
10
+ /**
11
+ * Convert an ISO code to a currency bytes representation
12
+ */
13
+ function isoToBytes(iso: string): Uint8Array {
14
+ const bytes = new Uint8Array(20)
15
+ if (iso !== 'XRP') {
16
+ const isoBytes = iso.split('').map((c) => c.charCodeAt(0))
17
+ bytes.set(isoBytes, 12)
18
+ }
19
+ return bytes
20
+ }
21
+
22
+ /**
23
+ * Tests if ISO is a valid iso code
24
+ */
25
+ function isIsoCode(iso: string): boolean {
26
+ return ISO_REGEX.test(iso)
27
+ }
28
+
29
+ function isoCodeFromHex(code: Uint8Array): string | null {
30
+ const iso = hexToString(bytesToHex(code))
31
+ if (iso === 'XRP') {
32
+ return null
33
+ }
34
+ if (isIsoCode(iso)) {
35
+ return iso
36
+ }
37
+ return null
38
+ }
39
+
40
+ /**
41
+ * Tests if hex is a valid hex-string
42
+ */
43
+ function isHex(hex: string): boolean {
44
+ return HEX_REGEX.test(hex)
45
+ }
46
+
47
+ /**
48
+ * Tests if a string is a valid representation of a currency
49
+ */
50
+ function isStringRepresentation(input: string): boolean {
51
+ return input.length === 3 || isHex(input)
52
+ }
53
+
54
+ /**
55
+ * Tests if a Uint8Array is a valid representation of a currency
56
+ */
57
+ function isBytesArray(bytes: Uint8Array): boolean {
58
+ return bytes.byteLength === 20
59
+ }
60
+
61
+ /**
62
+ * Ensures that a value is a valid representation of a currency
63
+ */
64
+ function isValidRepresentation(input: Uint8Array | string): boolean {
65
+ return input instanceof Uint8Array
66
+ ? isBytesArray(input)
67
+ : isStringRepresentation(input)
68
+ }
69
+
70
+ /**
71
+ * Generate bytes from a string or UInt8Array representation of a currency
72
+ */
73
+ function bytesFromRepresentation(input: string): Uint8Array {
74
+ if (!isValidRepresentation(input)) {
75
+ throw new Error(`Unsupported Currency representation: ${input}`)
76
+ }
77
+ return input.length === 3 ? isoToBytes(input) : hexToBytes(input)
78
+ }
79
+
80
+ /**
81
+ * Class defining how to encode and decode Currencies
82
+ */
83
+ class Currency extends Hash160 {
84
+ static readonly XRP = new Currency(new Uint8Array(20))
85
+ private readonly _iso: string | null
86
+
87
+ constructor(byteBuf: Uint8Array) {
88
+ super(byteBuf ?? Currency.XRP.bytes)
89
+ const hex = bytesToHex(this.bytes)
90
+
91
+ if (XRP_HEX_REGEX.test(hex)) {
92
+ this._iso = 'XRP'
93
+ } else if (STANDARD_FORMAT_HEX_REGEX.test(hex)) {
94
+ this._iso = isoCodeFromHex(this.bytes.slice(12, 15))
95
+ } else {
96
+ this._iso = null
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Return the ISO code of this currency
102
+ *
103
+ * @returns ISO code if it exists, else null
104
+ */
105
+ iso(): string | null {
106
+ return this._iso
107
+ }
108
+
109
+ /**
110
+ * Constructs a Currency object
111
+ *
112
+ * @param val Currency object or a string representation of a currency
113
+ */
114
+ static from<T extends Hash160 | string>(value: T): Currency {
115
+ if (value instanceof Currency) {
116
+ return value
117
+ }
118
+
119
+ if (typeof value === 'string') {
120
+ return new Currency(bytesFromRepresentation(value))
121
+ }
122
+
123
+ throw new Error('Cannot construct Currency from value given')
124
+ }
125
+
126
+ /**
127
+ * Gets the JSON representation of a currency
128
+ *
129
+ * @returns JSON representation
130
+ */
131
+ toJSON(): string {
132
+ const iso = this.iso()
133
+ if (iso !== null) {
134
+ return iso
135
+ }
136
+ return bytesToHex(this.bytes)
137
+ }
138
+ }
139
+
140
+ export { Currency }
@@ -0,0 +1,33 @@
1
+ import { Hash } from './hash'
2
+ import { bytesToHex } from '@transia/isomorphic/utils'
3
+
4
+ /**
5
+ * Hash with a width of 128 bits
6
+ */
7
+ class Hash128 extends Hash {
8
+ static readonly width = 16
9
+ static readonly ZERO_128: Hash128 = new Hash128(new Uint8Array(Hash128.width))
10
+
11
+ constructor(bytes: Uint8Array) {
12
+ if (bytes && bytes.byteLength === 0) {
13
+ bytes = Hash128.ZERO_128.bytes
14
+ }
15
+
16
+ super(bytes ?? Hash128.ZERO_128.bytes)
17
+ }
18
+
19
+ /**
20
+ * Get the hex representation of a hash-128 bytes, allowing unset
21
+ *
22
+ * @returns hex String of this.bytes
23
+ */
24
+ toHex(): string {
25
+ const hex = bytesToHex(this.toBytes())
26
+ if (/^0+$/.exec(hex)) {
27
+ return ''
28
+ }
29
+ return hex
30
+ }
31
+ }
32
+
33
+ export { Hash128 }
@@ -0,0 +1,19 @@
1
+ import { Hash } from './hash'
2
+
3
+ /**
4
+ * Hash with a width of 160 bits
5
+ */
6
+ class Hash160 extends Hash {
7
+ static readonly width = 20
8
+ static readonly ZERO_160: Hash160 = new Hash160(new Uint8Array(Hash160.width))
9
+
10
+ constructor(bytes?: Uint8Array) {
11
+ if (bytes && bytes.byteLength === 0) {
12
+ bytes = Hash160.ZERO_160.bytes
13
+ }
14
+
15
+ super(bytes ?? Hash160.ZERO_160.bytes)
16
+ }
17
+ }
18
+
19
+ export { Hash160 }
@@ -0,0 +1,19 @@
1
+ import { Hash } from './hash'
2
+
3
+ /**
4
+ * Hash with a width of 192 bits
5
+ */
6
+ class Hash192 extends Hash {
7
+ static readonly width = 24
8
+ static readonly ZERO_192: Hash192 = new Hash192(new Uint8Array(Hash192.width))
9
+
10
+ constructor(bytes?: Uint8Array) {
11
+ if (bytes && bytes.byteLength === 0) {
12
+ bytes = Hash192.ZERO_192.bytes
13
+ }
14
+
15
+ super(bytes ?? Hash192.ZERO_192.bytes)
16
+ }
17
+ }
18
+
19
+ export { Hash192 }
@@ -0,0 +1,15 @@
1
+ import { Hash } from './hash'
2
+
3
+ /**
4
+ * Hash with a width of 256 bits
5
+ */
6
+ class Hash256 extends Hash {
7
+ static readonly width = 32
8
+ static readonly ZERO_256 = new Hash256(new Uint8Array(Hash256.width))
9
+
10
+ constructor(bytes: Uint8Array) {
11
+ super(bytes ?? Hash256.ZERO_256.bytes)
12
+ }
13
+ }
14
+
15
+ export { Hash256 }