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.
Files changed (364) hide show
  1. package/README.md +104 -2
  2. package/dist/binary.d.ts +90 -0
  3. package/dist/binary.js +128 -0
  4. package/dist/binary.js.map +1 -0
  5. package/dist/coretypes.d.ts +9 -0
  6. package/dist/coretypes.js +48 -0
  7. package/dist/coretypes.js.map +1 -0
  8. package/dist/enums/bytes.d.ts +25 -0
  9. package/dist/enums/bytes.js +63 -0
  10. package/dist/enums/bytes.js.map +1 -0
  11. package/dist/enums/constants.d.ts +4 -0
  12. package/dist/enums/constants.js +8 -0
  13. package/dist/enums/constants.js.map +1 -0
  14. package/dist/enums/definitions.json +2956 -0
  15. package/dist/enums/field.d.ts +28 -0
  16. package/dist/enums/field.js +58 -0
  17. package/dist/enums/field.js.map +1 -0
  18. package/dist/enums/index.d.ts +12 -0
  19. package/dist/enums/index.js +31 -0
  20. package/dist/enums/index.js.map +1 -0
  21. package/{distrib/npm → dist/enums/src}/enums/definitions.json +1709 -438
  22. package/dist/enums/utils-renumber.d.ts +101 -0
  23. package/dist/enums/utils-renumber.js +127 -0
  24. package/dist/enums/utils-renumber.js.map +1 -0
  25. package/dist/enums/xrpl-definitions-base.d.ts +44 -0
  26. package/dist/enums/xrpl-definitions-base.js +59 -0
  27. package/dist/enums/xrpl-definitions-base.js.map +1 -0
  28. package/dist/enums/xrpl-definitions.d.ts +21 -0
  29. package/dist/enums/xrpl-definitions.js +29 -0
  30. package/dist/enums/xrpl-definitions.js.map +1 -0
  31. package/dist/hash-prefixes.d.ts +5 -0
  32. package/dist/hash-prefixes.js +41 -0
  33. package/dist/hash-prefixes.js.map +1 -0
  34. package/dist/hashes.d.ts +50 -0
  35. package/dist/hashes.js +76 -0
  36. package/dist/hashes.js.map +1 -0
  37. package/dist/index.d.ts +64 -0
  38. package/dist/index.js +123 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/ledger-hashes.d.ts +48 -0
  41. package/dist/ledger-hashes.js +141 -0
  42. package/dist/ledger-hashes.js.map +1 -0
  43. package/dist/quality.d.ts +21 -0
  44. package/dist/quality.js +42 -0
  45. package/dist/quality.js.map +1 -0
  46. package/dist/serdes/binary-parser.d.ts +100 -0
  47. package/dist/serdes/binary-parser.js +194 -0
  48. package/dist/serdes/binary-parser.js.map +1 -0
  49. package/dist/serdes/binary-serializer.d.ts +81 -0
  50. package/dist/serdes/binary-serializer.js +149 -0
  51. package/dist/serdes/binary-serializer.js.map +1 -0
  52. package/dist/shamap.d.ts +102 -0
  53. package/dist/shamap.js +172 -0
  54. package/dist/shamap.js.map +1 -0
  55. package/dist/src/binary.d.ts +90 -0
  56. package/dist/src/binary.js +128 -0
  57. package/dist/src/binary.js.map +1 -0
  58. package/dist/src/coretypes.d.ts +9 -0
  59. package/dist/src/coretypes.js +48 -0
  60. package/dist/src/coretypes.js.map +1 -0
  61. package/dist/src/enums/bytes.d.ts +25 -0
  62. package/dist/src/enums/bytes.js +63 -0
  63. package/dist/src/enums/bytes.js.map +1 -0
  64. package/dist/src/enums/constants.d.ts +4 -0
  65. package/dist/src/enums/constants.js +8 -0
  66. package/dist/src/enums/constants.js.map +1 -0
  67. package/dist/src/enums/definitions.json +2956 -0
  68. package/dist/src/enums/field.d.ts +28 -0
  69. package/dist/src/enums/field.js +58 -0
  70. package/dist/src/enums/field.js.map +1 -0
  71. package/dist/src/enums/index.d.ts +12 -0
  72. package/dist/src/enums/index.js +31 -0
  73. package/dist/src/enums/index.js.map +1 -0
  74. package/dist/src/enums/utils-renumber.d.ts +101 -0
  75. package/dist/src/enums/utils-renumber.js +127 -0
  76. package/dist/src/enums/utils-renumber.js.map +1 -0
  77. package/dist/src/enums/xrpl-definitions-base.d.ts +44 -0
  78. package/dist/src/enums/xrpl-definitions-base.js +59 -0
  79. package/dist/src/enums/xrpl-definitions-base.js.map +1 -0
  80. package/dist/src/enums/xrpl-definitions.d.ts +21 -0
  81. package/dist/src/enums/xrpl-definitions.js +29 -0
  82. package/dist/src/enums/xrpl-definitions.js.map +1 -0
  83. package/dist/src/hash-prefixes.d.ts +5 -0
  84. package/dist/src/hash-prefixes.js +41 -0
  85. package/dist/src/hash-prefixes.js.map +1 -0
  86. package/dist/src/hashes.d.ts +50 -0
  87. package/dist/src/hashes.js +76 -0
  88. package/dist/src/hashes.js.map +1 -0
  89. package/dist/src/index.d.ts +64 -0
  90. package/dist/src/index.js +123 -0
  91. package/dist/src/index.js.map +1 -0
  92. package/dist/src/ledger-hashes.d.ts +48 -0
  93. package/dist/src/ledger-hashes.js +141 -0
  94. package/dist/src/ledger-hashes.js.map +1 -0
  95. package/dist/src/quality.d.ts +21 -0
  96. package/dist/src/quality.js +42 -0
  97. package/dist/src/quality.js.map +1 -0
  98. package/dist/src/serdes/binary-parser.d.ts +100 -0
  99. package/dist/src/serdes/binary-parser.js +194 -0
  100. package/dist/src/serdes/binary-parser.js.map +1 -0
  101. package/dist/src/serdes/binary-serializer.d.ts +81 -0
  102. package/dist/src/serdes/binary-serializer.js +149 -0
  103. package/dist/src/serdes/binary-serializer.js.map +1 -0
  104. package/dist/src/shamap.d.ts +102 -0
  105. package/dist/src/shamap.js +172 -0
  106. package/dist/src/shamap.js.map +1 -0
  107. package/dist/src/types/account-id.d.ts +35 -0
  108. package/dist/src/types/account-id.js +69 -0
  109. package/dist/src/types/account-id.js.map +1 -0
  110. package/dist/src/types/amount.d.ts +91 -0
  111. package/dist/src/types/amount.js +289 -0
  112. package/dist/src/types/amount.js.map +1 -0
  113. package/dist/src/types/blob.d.ts +24 -0
  114. package/dist/src/types/blob.js +40 -0
  115. package/dist/src/types/blob.js.map +1 -0
  116. package/dist/src/types/currency.d.ts +28 -0
  117. package/dist/src/types/currency.js +127 -0
  118. package/dist/src/types/currency.js.map +1 -0
  119. package/dist/src/types/hash-128.d.ts +16 -0
  120. package/dist/src/types/hash-128.js +32 -0
  121. package/dist/src/types/hash-128.js.map +1 -0
  122. package/dist/src/types/hash-160.d.ts +10 -0
  123. package/dist/src/types/hash-160.js +19 -0
  124. package/dist/src/types/hash-160.js.map +1 -0
  125. package/dist/src/types/hash-192.d.ts +10 -0
  126. package/dist/src/types/hash-192.js +19 -0
  127. package/dist/src/types/hash-192.js.map +1 -0
  128. package/dist/src/types/hash-256.d.ts +10 -0
  129. package/dist/src/types/hash-256.js +16 -0
  130. package/dist/src/types/hash-256.js.map +1 -0
  131. package/dist/src/types/hash.d.ts +40 -0
  132. package/dist/src/types/hash.js +73 -0
  133. package/dist/src/types/hash.js.map +1 -0
  134. package/dist/src/types/index.d.ts +19 -0
  135. package/dist/src/types/index.js +64 -0
  136. package/dist/src/types/index.js.map +1 -0
  137. package/dist/src/types/issue.d.ts +38 -0
  138. package/dist/src/types/issue.js +81 -0
  139. package/dist/src/types/issue.js.map +1 -0
  140. package/dist/src/types/path-set.d.ts +36 -0
  141. package/dist/src/types/path-set.js +233 -0
  142. package/dist/src/types/path-set.js.map +1 -0
  143. package/dist/src/types/serialized-type.d.ts +70 -0
  144. package/dist/src/types/serialized-type.js +105 -0
  145. package/dist/src/types/serialized-type.js.map +1 -0
  146. package/dist/src/types/st-array.d.ts +31 -0
  147. package/dist/src/types/st-array.js +83 -0
  148. package/dist/src/types/st-array.js.map +1 -0
  149. package/dist/src/types/st-object.d.ts +32 -0
  150. package/dist/src/types/st-object.js +155 -0
  151. package/dist/src/types/st-object.js.map +1 -0
  152. package/dist/src/types/uint-16.d.ts +24 -0
  153. package/dist/src/types/uint-16.js +45 -0
  154. package/dist/src/types/uint-16.js.map +1 -0
  155. package/dist/src/types/uint-32.d.ts +24 -0
  156. package/dist/src/types/uint-32.js +50 -0
  157. package/dist/src/types/uint-32.js.map +1 -0
  158. package/dist/src/types/uint-64.d.ts +37 -0
  159. package/dist/src/types/uint-64.js +86 -0
  160. package/dist/src/types/uint-64.js.map +1 -0
  161. package/dist/src/types/uint-8.d.ts +24 -0
  162. package/dist/src/types/uint-8.js +46 -0
  163. package/dist/src/types/uint-8.js.map +1 -0
  164. package/dist/src/types/uint.d.ts +29 -0
  165. package/dist/src/types/uint.js +47 -0
  166. package/dist/src/types/uint.js.map +1 -0
  167. package/dist/src/types/vector-256.d.ts +30 -0
  168. package/dist/src/types/vector-256.js +73 -0
  169. package/dist/src/types/vector-256.js.map +1 -0
  170. package/dist/src/types/xchain-bridge.d.ts +44 -0
  171. package/dist/src/types/xchain-bridge.js +102 -0
  172. package/dist/src/types/xchain-bridge.js.map +1 -0
  173. package/dist/src/utils.d.ts +47 -0
  174. package/dist/src/utils.js +137 -0
  175. package/dist/src/utils.js.map +1 -0
  176. package/dist/tsconfig.tsbuildinfo +1 -0
  177. package/dist/types/account-id.d.ts +35 -0
  178. package/dist/types/account-id.js +69 -0
  179. package/dist/types/account-id.js.map +1 -0
  180. package/dist/types/amount.d.ts +91 -0
  181. package/dist/types/amount.js +289 -0
  182. package/dist/types/amount.js.map +1 -0
  183. package/dist/types/blob.d.ts +24 -0
  184. package/dist/types/blob.js +40 -0
  185. package/dist/types/blob.js.map +1 -0
  186. package/dist/types/currency.d.ts +28 -0
  187. package/dist/types/currency.js +127 -0
  188. package/dist/types/currency.js.map +1 -0
  189. package/dist/types/hash-128.d.ts +16 -0
  190. package/dist/types/hash-128.js +32 -0
  191. package/dist/types/hash-128.js.map +1 -0
  192. package/dist/types/hash-160.d.ts +10 -0
  193. package/dist/types/hash-160.js +19 -0
  194. package/dist/types/hash-160.js.map +1 -0
  195. package/dist/types/hash-192.d.ts +10 -0
  196. package/dist/types/hash-192.js +19 -0
  197. package/dist/types/hash-192.js.map +1 -0
  198. package/dist/types/hash-256.d.ts +10 -0
  199. package/dist/types/hash-256.js +16 -0
  200. package/dist/types/hash-256.js.map +1 -0
  201. package/dist/types/hash.d.ts +40 -0
  202. package/dist/types/hash.js +73 -0
  203. package/dist/types/hash.js.map +1 -0
  204. package/dist/types/index.d.ts +19 -0
  205. package/dist/types/index.js +64 -0
  206. package/dist/types/index.js.map +1 -0
  207. package/dist/types/issue.d.ts +38 -0
  208. package/dist/types/issue.js +81 -0
  209. package/dist/types/issue.js.map +1 -0
  210. package/dist/types/path-set.d.ts +36 -0
  211. package/dist/types/path-set.js +233 -0
  212. package/dist/types/path-set.js.map +1 -0
  213. package/dist/types/serialized-type.d.ts +70 -0
  214. package/dist/types/serialized-type.js +105 -0
  215. package/dist/types/serialized-type.js.map +1 -0
  216. package/dist/types/st-array.d.ts +31 -0
  217. package/dist/types/st-array.js +83 -0
  218. package/dist/types/st-array.js.map +1 -0
  219. package/dist/types/st-object.d.ts +32 -0
  220. package/dist/types/st-object.js +155 -0
  221. package/dist/types/st-object.js.map +1 -0
  222. package/dist/types/uint-16.d.ts +24 -0
  223. package/dist/types/uint-16.js +45 -0
  224. package/dist/types/uint-16.js.map +1 -0
  225. package/dist/types/uint-32.d.ts +24 -0
  226. package/dist/types/uint-32.js +50 -0
  227. package/dist/types/uint-32.js.map +1 -0
  228. package/dist/types/uint-64.d.ts +37 -0
  229. package/dist/types/uint-64.js +86 -0
  230. package/dist/types/uint-64.js.map +1 -0
  231. package/dist/types/uint-8.d.ts +24 -0
  232. package/dist/types/uint-8.js +46 -0
  233. package/dist/types/uint-8.js.map +1 -0
  234. package/dist/types/uint.d.ts +29 -0
  235. package/dist/types/uint.js +47 -0
  236. package/dist/types/uint.js.map +1 -0
  237. package/dist/types/vector-256.d.ts +30 -0
  238. package/dist/types/vector-256.js +73 -0
  239. package/dist/types/vector-256.js.map +1 -0
  240. package/dist/types/xchain-bridge.d.ts +44 -0
  241. package/dist/types/xchain-bridge.js +102 -0
  242. package/dist/types/xchain-bridge.js.map +1 -0
  243. package/dist/utils.d.ts +47 -0
  244. package/dist/utils.js +137 -0
  245. package/dist/utils.js.map +1 -0
  246. package/package.json +28 -33
  247. package/src/README.md +5 -0
  248. package/src/binary.ts +194 -0
  249. package/src/coretypes.ts +31 -0
  250. package/src/enums/README.md +144 -0
  251. package/src/enums/bytes.ts +74 -0
  252. package/src/enums/constants.ts +4 -0
  253. package/src/enums/definitions.json +2961 -0
  254. package/src/enums/field.ts +84 -0
  255. package/src/enums/index.ts +34 -0
  256. package/src/enums/utils-renumber.ts +134 -0
  257. package/src/enums/xrpl-definitions-base.ts +111 -0
  258. package/src/enums/xrpl-definitions.ts +32 -0
  259. package/src/hash-prefixes.ts +40 -0
  260. package/src/hashes.ts +75 -0
  261. package/src/index.ts +153 -0
  262. package/src/ledger-hashes.ts +191 -0
  263. package/src/quality.ts +38 -0
  264. package/src/serdes/binary-parser.ts +224 -0
  265. package/src/serdes/binary-serializer.ts +166 -0
  266. package/src/shamap.ts +186 -0
  267. package/src/types/account-id.ts +86 -0
  268. package/src/types/amount.ts +362 -0
  269. package/src/types/blob.ts +43 -0
  270. package/src/types/currency.ts +140 -0
  271. package/src/types/hash-128.ts +33 -0
  272. package/src/types/hash-160.ts +19 -0
  273. package/src/types/hash-192.ts +19 -0
  274. package/src/types/hash-256.ts +15 -0
  275. package/src/types/hash.ts +83 -0
  276. package/src/types/index.ts +66 -0
  277. package/src/types/issue.ts +96 -0
  278. package/src/types/path-set.ts +290 -0
  279. package/src/types/serialized-type.ts +122 -0
  280. package/src/types/st-array.ts +107 -0
  281. package/src/types/st-object.ts +192 -0
  282. package/src/types/uint-16.ts +53 -0
  283. package/src/types/uint-32.ts +59 -0
  284. package/src/types/uint-64.ts +104 -0
  285. package/src/types/uint-8.ts +52 -0
  286. package/src/types/uint.ts +60 -0
  287. package/src/types/vector-256.ts +79 -0
  288. package/src/types/xchain-bridge.ts +128 -0
  289. package/src/utils.ts +152 -0
  290. package/HISTORY.md +0 -66
  291. package/distrib/npm/binary.js +0 -68
  292. package/distrib/npm/coretypes.js +0 -22
  293. package/distrib/npm/enums/index.js +0 -125
  294. package/distrib/npm/enums/utils-renumber.js +0 -134
  295. package/distrib/npm/hash-prefixes.js +0 -30
  296. package/distrib/npm/hashes.js +0 -42
  297. package/distrib/npm/index.js +0 -72
  298. package/distrib/npm/ledger-hashes.js +0 -71
  299. package/distrib/npm/quality.js +0 -20
  300. package/distrib/npm/serdes/binary-parser.js +0 -98
  301. package/distrib/npm/serdes/binary-serializer.js +0 -106
  302. package/distrib/npm/shamap.js +0 -107
  303. package/distrib/npm/types/account-id.js +0 -41
  304. package/distrib/npm/types/amount.js +0 -215
  305. package/distrib/npm/types/blob.js +0 -28
  306. package/distrib/npm/types/currency.js +0 -91
  307. package/distrib/npm/types/hash-128.js +0 -10
  308. package/distrib/npm/types/hash-160.js +0 -10
  309. package/distrib/npm/types/hash-256.js +0 -15
  310. package/distrib/npm/types/hash.js +0 -45
  311. package/distrib/npm/types/index.js +0 -45
  312. package/distrib/npm/types/path-set.js +0 -112
  313. package/distrib/npm/types/serialized-type.js +0 -63
  314. package/distrib/npm/types/st-array.js +0 -37
  315. package/distrib/npm/types/st-object.js +0 -65
  316. package/distrib/npm/types/uint-16.js +0 -10
  317. package/distrib/npm/types/uint-32.js +0 -10
  318. package/distrib/npm/types/uint-64.js +0 -49
  319. package/distrib/npm/types/uint-8.js +0 -10
  320. package/distrib/npm/types/uint.js +0 -60
  321. package/distrib/npm/types/vector-256.js +0 -31
  322. package/distrib/npm/utils/bytes-utils.js +0 -112
  323. package/distrib/npm/utils/make-class.js +0 -83
  324. package/test/amount-test.js +0 -43
  325. package/test/binary-json-test.js +0 -43
  326. package/test/binary-parser-test.js +0 -341
  327. package/test/binary-serializer-test.js +0 -194
  328. package/test/bytes-utils-test.js +0 -72
  329. package/test/fixtures/account-tx-transactions.db +0 -0
  330. package/test/fixtures/codec-fixtures.json +0 -4466
  331. package/test/fixtures/data-driven-tests.json +0 -3721
  332. package/test/fixtures/delivermin-tx-binary.json +0 -1
  333. package/test/fixtures/delivermin-tx.json +0 -98
  334. package/test/fixtures/deposit-preauth-tx-binary.json +0 -1
  335. package/test/fixtures/deposit-preauth-tx-meta-binary.json +0 -1
  336. package/test/fixtures/deposit-preauth-tx.json +0 -58
  337. package/test/fixtures/escrow-cancel-binary.json +0 -1
  338. package/test/fixtures/escrow-cancel-tx.json +0 -6
  339. package/test/fixtures/escrow-create-binary.json +0 -1
  340. package/test/fixtures/escrow-create-tx.json +0 -10
  341. package/test/fixtures/escrow-finish-binary.json +0 -1
  342. package/test/fixtures/escrow-finish-meta-binary.json +0 -1
  343. package/test/fixtures/escrow-finish-tx.json +0 -95
  344. package/test/fixtures/ledger-full-38129.json +0 -1
  345. package/test/fixtures/ledger-full-40000.json +0 -1
  346. package/test/fixtures/payment-channel-claim-binary.json +0 -1
  347. package/test/fixtures/payment-channel-claim-tx.json +0 -8
  348. package/test/fixtures/payment-channel-create-binary.json +0 -1
  349. package/test/fixtures/payment-channel-create-tx.json +0 -11
  350. package/test/fixtures/payment-channel-fund-binary.json +0 -1
  351. package/test/fixtures/payment-channel-fund-tx.json +0 -7
  352. package/test/fixtures/signerlistset-tx-binary.json +0 -1
  353. package/test/fixtures/signerlistset-tx-meta-binary.json +0 -1
  354. package/test/fixtures/signerlistset-tx.json +0 -94
  355. package/test/hash-test.js +0 -58
  356. package/test/ledger-test.js +0 -26
  357. package/test/mocha.opts +0 -1
  358. package/test/quality-test.js +0 -16
  359. package/test/shamap-test.js +0 -88
  360. package/test/signing-data-encoding-test.js +0 -120
  361. package/test/tx-encode-decode-test.js +0 -124
  362. package/test/types-test.js +0 -38
  363. package/test/uint-test.js +0 -38
  364. 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 }