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