xrpl 2.9.1 → 2.11.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 (325) hide show
  1. package/build/xrpl-latest-min.js +1 -1
  2. package/build/xrpl-latest-min.js.map +1 -1
  3. package/build/xrpl-latest.js +2680 -481
  4. package/build/xrpl-latest.js.map +1 -1
  5. package/dist/npm/Wallet/walletFromSecretNumbers.d.ts +7 -0
  6. package/dist/npm/Wallet/walletFromSecretNumbers.d.ts.map +1 -0
  7. package/dist/npm/Wallet/walletFromSecretNumbers.js +27 -0
  8. package/dist/npm/Wallet/walletFromSecretNumbers.js.map +1 -0
  9. package/dist/npm/client/index.d.ts +2 -1
  10. package/dist/npm/client/index.d.ts.map +1 -1
  11. package/dist/npm/client/index.js.map +1 -1
  12. package/dist/npm/index.d.ts +1 -0
  13. package/dist/npm/index.d.ts.map +1 -1
  14. package/dist/npm/index.js +3 -1
  15. package/dist/npm/index.js.map +1 -1
  16. package/dist/npm/models/common/index.d.ts +5 -0
  17. package/dist/npm/models/common/index.d.ts.map +1 -1
  18. package/dist/npm/models/ledger/AMM.d.ts +27 -0
  19. package/dist/npm/models/ledger/AMM.d.ts.map +1 -0
  20. package/dist/npm/models/ledger/AMM.js +3 -0
  21. package/dist/npm/models/ledger/AMM.js.map +1 -0
  22. package/dist/npm/models/ledger/AccountRoot.d.ts +5 -1
  23. package/dist/npm/models/ledger/AccountRoot.d.ts.map +1 -1
  24. package/dist/npm/models/ledger/AccountRoot.js +2 -0
  25. package/dist/npm/models/ledger/AccountRoot.js.map +1 -1
  26. package/dist/npm/models/ledger/LedgerEntry.d.ts +2 -1
  27. package/dist/npm/models/ledger/LedgerEntry.d.ts.map +1 -1
  28. package/dist/npm/models/methods/accountInfo.d.ts +1 -0
  29. package/dist/npm/models/methods/accountInfo.d.ts.map +1 -1
  30. package/dist/npm/models/methods/ammInfo.d.ts +39 -0
  31. package/dist/npm/models/methods/ammInfo.d.ts.map +1 -0
  32. package/dist/npm/models/methods/ammInfo.js +3 -0
  33. package/dist/npm/models/methods/ammInfo.js.map +1 -0
  34. package/dist/npm/models/methods/index.d.ts +4 -3
  35. package/dist/npm/models/methods/index.d.ts.map +1 -1
  36. package/dist/npm/models/methods/ledgerEntry.d.ts +10 -0
  37. package/dist/npm/models/methods/ledgerEntry.d.ts.map +1 -1
  38. package/dist/npm/models/transactions/AMMBid.d.ts +12 -0
  39. package/dist/npm/models/transactions/AMMBid.d.ts.map +1 -0
  40. package/dist/npm/models/transactions/AMMBid.js +56 -0
  41. package/dist/npm/models/transactions/AMMBid.js.map +1 -0
  42. package/dist/npm/models/transactions/AMMCreate.d.ts +11 -0
  43. package/dist/npm/models/transactions/AMMCreate.d.ts.map +1 -0
  44. package/dist/npm/models/transactions/AMMCreate.js +32 -0
  45. package/dist/npm/models/transactions/AMMCreate.js.map +1 -0
  46. package/dist/npm/models/transactions/AMMDelete.d.ts +9 -0
  47. package/dist/npm/models/transactions/AMMDelete.d.ts.map +1 -0
  48. package/dist/npm/models/transactions/AMMDelete.js +22 -0
  49. package/dist/npm/models/transactions/AMMDelete.js.map +1 -0
  50. package/dist/npm/models/transactions/AMMDeposit.d.ts +27 -0
  51. package/dist/npm/models/transactions/AMMDeposit.d.ts.map +1 -0
  52. package/dist/npm/models/transactions/AMMDeposit.js +51 -0
  53. package/dist/npm/models/transactions/AMMDeposit.js.map +1 -0
  54. package/dist/npm/models/transactions/AMMVote.d.ts +10 -0
  55. package/dist/npm/models/transactions/AMMVote.d.ts.map +1 -0
  56. package/dist/npm/models/transactions/AMMVote.js +32 -0
  57. package/dist/npm/models/transactions/AMMVote.js.map +1 -0
  58. package/dist/npm/models/transactions/AMMWithdraw.d.ts +31 -0
  59. package/dist/npm/models/transactions/AMMWithdraw.d.ts.map +1 -0
  60. package/dist/npm/models/transactions/AMMWithdraw.js +50 -0
  61. package/dist/npm/models/transactions/AMMWithdraw.js.map +1 -0
  62. package/dist/npm/models/transactions/accountSet.d.ts +2 -1
  63. package/dist/npm/models/transactions/accountSet.d.ts.map +1 -1
  64. package/dist/npm/models/transactions/accountSet.js +1 -0
  65. package/dist/npm/models/transactions/accountSet.js.map +1 -1
  66. package/dist/npm/models/transactions/clawback.d.ts +9 -0
  67. package/dist/npm/models/transactions/clawback.d.ts.map +1 -0
  68. package/dist/npm/models/transactions/clawback.js +19 -0
  69. package/dist/npm/models/transactions/clawback.js.map +1 -0
  70. package/dist/npm/models/transactions/common.d.ts +2 -1
  71. package/dist/npm/models/transactions/common.d.ts.map +1 -1
  72. package/dist/npm/models/transactions/common.js +12 -1
  73. package/dist/npm/models/transactions/common.js.map +1 -1
  74. package/dist/npm/models/transactions/index.d.ts +7 -0
  75. package/dist/npm/models/transactions/index.d.ts.map +1 -1
  76. package/dist/npm/models/transactions/index.js +5 -1
  77. package/dist/npm/models/transactions/index.js.map +1 -1
  78. package/dist/npm/models/transactions/transaction.d.ts +8 -1
  79. package/dist/npm/models/transactions/transaction.d.ts.map +1 -1
  80. package/dist/npm/models/transactions/transaction.js +28 -0
  81. package/dist/npm/models/transactions/transaction.js.map +1 -1
  82. package/dist/npm/models/utils/flags.d.ts.map +1 -1
  83. package/dist/npm/models/utils/flags.js +17 -23
  84. package/dist/npm/models/utils/flags.js.map +1 -1
  85. package/dist/npm/models/utils/index.js +1 -1
  86. package/dist/npm/models/utils/index.js.map +1 -1
  87. package/dist/npm/snippets/tsconfig.tsbuildinfo +1 -1
  88. package/dist/npm/src/Wallet/walletFromSecretNumbers.d.ts +7 -0
  89. package/dist/npm/src/Wallet/walletFromSecretNumbers.d.ts.map +1 -0
  90. package/dist/npm/src/Wallet/walletFromSecretNumbers.js +27 -0
  91. package/dist/npm/src/Wallet/walletFromSecretNumbers.js.map +1 -0
  92. package/dist/npm/src/client/index.d.ts +2 -1
  93. package/dist/npm/src/client/index.d.ts.map +1 -1
  94. package/dist/npm/src/client/index.js.map +1 -1
  95. package/dist/npm/src/index.d.ts +1 -0
  96. package/dist/npm/src/index.d.ts.map +1 -1
  97. package/dist/npm/src/index.js +3 -1
  98. package/dist/npm/src/index.js.map +1 -1
  99. package/dist/npm/src/models/common/index.d.ts +5 -0
  100. package/dist/npm/src/models/common/index.d.ts.map +1 -1
  101. package/dist/npm/src/models/ledger/AMM.d.ts +27 -0
  102. package/dist/npm/src/models/ledger/AMM.d.ts.map +1 -0
  103. package/dist/npm/src/models/ledger/AMM.js +3 -0
  104. package/dist/npm/src/models/ledger/AMM.js.map +1 -0
  105. package/dist/npm/src/models/ledger/AccountRoot.d.ts +5 -1
  106. package/dist/npm/src/models/ledger/AccountRoot.d.ts.map +1 -1
  107. package/dist/npm/src/models/ledger/AccountRoot.js +2 -0
  108. package/dist/npm/src/models/ledger/AccountRoot.js.map +1 -1
  109. package/dist/npm/src/models/ledger/LedgerEntry.d.ts +2 -1
  110. package/dist/npm/src/models/ledger/LedgerEntry.d.ts.map +1 -1
  111. package/dist/npm/src/models/methods/accountInfo.d.ts +1 -0
  112. package/dist/npm/src/models/methods/accountInfo.d.ts.map +1 -1
  113. package/dist/npm/src/models/methods/ammInfo.d.ts +39 -0
  114. package/dist/npm/src/models/methods/ammInfo.d.ts.map +1 -0
  115. package/dist/npm/src/models/methods/ammInfo.js +3 -0
  116. package/dist/npm/src/models/methods/ammInfo.js.map +1 -0
  117. package/dist/npm/src/models/methods/index.d.ts +4 -3
  118. package/dist/npm/src/models/methods/index.d.ts.map +1 -1
  119. package/dist/npm/src/models/methods/ledgerEntry.d.ts +10 -0
  120. package/dist/npm/src/models/methods/ledgerEntry.d.ts.map +1 -1
  121. package/dist/npm/src/models/transactions/AMMBid.d.ts +12 -0
  122. package/dist/npm/src/models/transactions/AMMBid.d.ts.map +1 -0
  123. package/dist/npm/src/models/transactions/AMMBid.js +56 -0
  124. package/dist/npm/src/models/transactions/AMMBid.js.map +1 -0
  125. package/dist/npm/src/models/transactions/AMMCreate.d.ts +11 -0
  126. package/dist/npm/src/models/transactions/AMMCreate.d.ts.map +1 -0
  127. package/dist/npm/src/models/transactions/AMMCreate.js +32 -0
  128. package/dist/npm/src/models/transactions/AMMCreate.js.map +1 -0
  129. package/dist/npm/src/models/transactions/AMMDelete.d.ts +9 -0
  130. package/dist/npm/src/models/transactions/AMMDelete.d.ts.map +1 -0
  131. package/dist/npm/src/models/transactions/AMMDelete.js +22 -0
  132. package/dist/npm/src/models/transactions/AMMDelete.js.map +1 -0
  133. package/dist/npm/src/models/transactions/AMMDeposit.d.ts +27 -0
  134. package/dist/npm/src/models/transactions/AMMDeposit.d.ts.map +1 -0
  135. package/dist/npm/src/models/transactions/AMMDeposit.js +51 -0
  136. package/dist/npm/src/models/transactions/AMMDeposit.js.map +1 -0
  137. package/dist/npm/src/models/transactions/AMMVote.d.ts +10 -0
  138. package/dist/npm/src/models/transactions/AMMVote.d.ts.map +1 -0
  139. package/dist/npm/src/models/transactions/AMMVote.js +32 -0
  140. package/dist/npm/src/models/transactions/AMMVote.js.map +1 -0
  141. package/dist/npm/src/models/transactions/AMMWithdraw.d.ts +31 -0
  142. package/dist/npm/src/models/transactions/AMMWithdraw.d.ts.map +1 -0
  143. package/dist/npm/src/models/transactions/AMMWithdraw.js +50 -0
  144. package/dist/npm/src/models/transactions/AMMWithdraw.js.map +1 -0
  145. package/dist/npm/src/models/transactions/accountSet.d.ts +2 -1
  146. package/dist/npm/src/models/transactions/accountSet.d.ts.map +1 -1
  147. package/dist/npm/src/models/transactions/accountSet.js +1 -0
  148. package/dist/npm/src/models/transactions/accountSet.js.map +1 -1
  149. package/dist/npm/src/models/transactions/clawback.d.ts +9 -0
  150. package/dist/npm/src/models/transactions/clawback.d.ts.map +1 -0
  151. package/dist/npm/src/models/transactions/clawback.js +19 -0
  152. package/dist/npm/src/models/transactions/clawback.js.map +1 -0
  153. package/dist/npm/src/models/transactions/common.d.ts +2 -1
  154. package/dist/npm/src/models/transactions/common.d.ts.map +1 -1
  155. package/dist/npm/src/models/transactions/common.js +12 -1
  156. package/dist/npm/src/models/transactions/common.js.map +1 -1
  157. package/dist/npm/src/models/transactions/index.d.ts +7 -0
  158. package/dist/npm/src/models/transactions/index.d.ts.map +1 -1
  159. package/dist/npm/src/models/transactions/index.js +5 -1
  160. package/dist/npm/src/models/transactions/index.js.map +1 -1
  161. package/dist/npm/src/models/transactions/transaction.d.ts +8 -1
  162. package/dist/npm/src/models/transactions/transaction.d.ts.map +1 -1
  163. package/dist/npm/src/models/transactions/transaction.js +28 -0
  164. package/dist/npm/src/models/transactions/transaction.js.map +1 -1
  165. package/dist/npm/src/models/utils/flags.d.ts.map +1 -1
  166. package/dist/npm/src/models/utils/flags.js +17 -23
  167. package/dist/npm/src/models/utils/flags.js.map +1 -1
  168. package/dist/npm/src/models/utils/index.js +1 -1
  169. package/dist/npm/src/models/utils/index.js.map +1 -1
  170. package/dist/npm/src/sugar/autofill.d.ts.map +1 -1
  171. package/dist/npm/src/sugar/autofill.js +4 -3
  172. package/dist/npm/src/sugar/autofill.js.map +1 -1
  173. package/dist/npm/sugar/autofill.d.ts.map +1 -1
  174. package/dist/npm/sugar/autofill.js +4 -3
  175. package/dist/npm/sugar/autofill.js.map +1 -1
  176. package/package.json +8 -6
  177. package/src/ECDSA.ts +6 -0
  178. package/src/Wallet/defaultFaucets.ts +82 -0
  179. package/src/Wallet/fundWallet.ts +344 -0
  180. package/src/Wallet/index.ts +504 -0
  181. package/src/Wallet/rfc1751.ts +190 -0
  182. package/src/Wallet/rfc1751Words.json +243 -0
  183. package/src/Wallet/signer.ts +173 -0
  184. package/src/Wallet/walletFromSecretNumbers.ts +37 -0
  185. package/src/client/BroadcastClient.ts +84 -0
  186. package/src/client/ConnectionManager.ts +40 -0
  187. package/src/client/ExponentialBackoff.ts +71 -0
  188. package/src/client/RequestManager.ts +194 -0
  189. package/src/client/WSWrapper.ts +106 -0
  190. package/src/client/connection.ts +593 -0
  191. package/src/client/index.ts +712 -0
  192. package/src/client/partialPayment.ts +153 -0
  193. package/src/errors.ts +161 -0
  194. package/src/index.ts +20 -0
  195. package/src/models/common/index.ts +149 -0
  196. package/src/models/index.ts +16 -0
  197. package/src/models/ledger/AMM.ts +78 -0
  198. package/src/models/ledger/AccountRoot.ts +217 -0
  199. package/src/models/ledger/Amendments.ts +45 -0
  200. package/src/models/ledger/BaseLedgerEntry.ts +3 -0
  201. package/src/models/ledger/Check.ts +70 -0
  202. package/src/models/ledger/DepositPreauth.ts +35 -0
  203. package/src/models/ledger/DirectoryNode.ts +46 -0
  204. package/src/models/ledger/Escrow.ts +74 -0
  205. package/src/models/ledger/FeeSettings.ts +52 -0
  206. package/src/models/ledger/Ledger.ts +65 -0
  207. package/src/models/ledger/LedgerEntry.ts +34 -0
  208. package/src/models/ledger/LedgerHashes.ts +24 -0
  209. package/src/models/ledger/NFTokenOffer.ts +16 -0
  210. package/src/models/ledger/NFTokenPage.ts +20 -0
  211. package/src/models/ledger/NegativeUNL.ts +34 -0
  212. package/src/models/ledger/Offer.ts +52 -0
  213. package/src/models/ledger/PayChannel.ts +107 -0
  214. package/src/models/ledger/RippleState.ts +88 -0
  215. package/src/models/ledger/SignerList.ts +56 -0
  216. package/src/models/ledger/Ticket.ts +36 -0
  217. package/src/models/ledger/index.ts +58 -0
  218. package/src/models/methods/accountChannels.ts +93 -0
  219. package/src/models/methods/accountCurrencies.ts +45 -0
  220. package/src/models/methods/accountInfo.ts +182 -0
  221. package/src/models/methods/accountLines.ts +137 -0
  222. package/src/models/methods/accountNFTs.ts +72 -0
  223. package/src/models/methods/accountObjects.ts +120 -0
  224. package/src/models/methods/accountOffers.ts +100 -0
  225. package/src/models/methods/accountTx.ts +109 -0
  226. package/src/models/methods/ammInfo.ts +145 -0
  227. package/src/models/methods/baseMethod.ts +58 -0
  228. package/src/models/methods/bookOffers.ts +96 -0
  229. package/src/models/methods/channelVerify.ts +41 -0
  230. package/src/models/methods/depositAuthorized.ts +56 -0
  231. package/src/models/methods/fee.ts +91 -0
  232. package/src/models/methods/gatewayBalances.ts +85 -0
  233. package/src/models/methods/index.ts +391 -0
  234. package/src/models/methods/ledger.ts +125 -0
  235. package/src/models/methods/ledgerClosed.ts +32 -0
  236. package/src/models/methods/ledgerCurrent.ts +31 -0
  237. package/src/models/methods/ledgerData.ts +78 -0
  238. package/src/models/methods/ledgerEntry.ts +177 -0
  239. package/src/models/methods/manifest.ts +54 -0
  240. package/src/models/methods/nftBuyOffers.ts +37 -0
  241. package/src/models/methods/nftHistory.ts +113 -0
  242. package/src/models/methods/nftInfo.ts +25 -0
  243. package/src/models/methods/nftSellOffers.ts +37 -0
  244. package/src/models/methods/norippleCheck.ts +82 -0
  245. package/src/models/methods/pathFind.ts +116 -0
  246. package/src/models/methods/ping.ts +21 -0
  247. package/src/models/methods/random.ts +23 -0
  248. package/src/models/methods/ripplePathFind.ts +81 -0
  249. package/src/models/methods/serverInfo.ts +257 -0
  250. package/src/models/methods/serverState.ts +77 -0
  251. package/src/models/methods/submit.ts +94 -0
  252. package/src/models/methods/submitMultisigned.ts +51 -0
  253. package/src/models/methods/subscribe.ts +435 -0
  254. package/src/models/methods/transactionEntry.ts +47 -0
  255. package/src/models/methods/tx.ts +69 -0
  256. package/src/models/methods/unsubscribe.ts +49 -0
  257. package/src/models/transactions/AMMBid.ts +140 -0
  258. package/src/models/transactions/AMMCreate.ts +80 -0
  259. package/src/models/transactions/AMMDelete.ts +55 -0
  260. package/src/models/transactions/AMMDeposit.ts +130 -0
  261. package/src/models/transactions/AMMVote.ts +71 -0
  262. package/src/models/transactions/AMMWithdraw.ts +126 -0
  263. package/src/models/transactions/NFTokenAcceptOffer.ts +104 -0
  264. package/src/models/transactions/NFTokenBurn.ts +48 -0
  265. package/src/models/transactions/NFTokenCancelOffer.ts +45 -0
  266. package/src/models/transactions/NFTokenCreateOffer.ts +145 -0
  267. package/src/models/transactions/NFTokenMint.ts +123 -0
  268. package/src/models/transactions/UNLModify.ts +20 -0
  269. package/src/models/transactions/accountDelete.ts +50 -0
  270. package/src/models/transactions/accountSet.ts +228 -0
  271. package/src/models/transactions/checkCancel.ts +34 -0
  272. package/src/models/transactions/checkCash.ts +73 -0
  273. package/src/models/transactions/checkCreate.ts +90 -0
  274. package/src/models/transactions/clawback.ts +49 -0
  275. package/src/models/transactions/common.ts +295 -0
  276. package/src/models/transactions/depositPreauth.ts +68 -0
  277. package/src/models/transactions/enableAmendment.ts +26 -0
  278. package/src/models/transactions/escrowCancel.ts +45 -0
  279. package/src/models/transactions/escrowCreate.ts +100 -0
  280. package/src/models/transactions/escrowFinish.ts +63 -0
  281. package/src/models/transactions/index.ts +66 -0
  282. package/src/models/transactions/metadata.ts +69 -0
  283. package/src/models/transactions/offerCancel.ts +37 -0
  284. package/src/models/transactions/offerCreate.ts +144 -0
  285. package/src/models/transactions/payment.ts +278 -0
  286. package/src/models/transactions/paymentChannelClaim.ts +165 -0
  287. package/src/models/transactions/paymentChannelCreate.ts +116 -0
  288. package/src/models/transactions/paymentChannelFund.ts +65 -0
  289. package/src/models/transactions/setFee.ts +48 -0
  290. package/src/models/transactions/setRegularKey.ts +33 -0
  291. package/src/models/transactions/signerListSet.ts +89 -0
  292. package/src/models/transactions/ticketCreate.ts +50 -0
  293. package/src/models/transactions/transaction.ts +303 -0
  294. package/src/models/transactions/trustSet.ts +146 -0
  295. package/src/models/utils/flags.ts +98 -0
  296. package/src/models/utils/index.ts +37 -0
  297. package/src/sugar/autofill.ts +373 -0
  298. package/src/sugar/balances.ts +123 -0
  299. package/src/sugar/getFeeXrp.ts +45 -0
  300. package/src/sugar/getLedgerIndex.ts +15 -0
  301. package/src/sugar/getOrderbook.ts +152 -0
  302. package/src/sugar/index.ts +11 -0
  303. package/src/sugar/submit.ts +305 -0
  304. package/src/sugar/utils.ts +29 -0
  305. package/src/utils/derive.ts +23 -0
  306. package/src/utils/getBalanceChanges.ts +186 -0
  307. package/src/utils/getNFTokenID.ts +97 -0
  308. package/src/utils/hashes/HashPrefix.ts +40 -0
  309. package/src/utils/hashes/README.md +65 -0
  310. package/src/utils/hashes/SHAMap/InnerNode.ts +124 -0
  311. package/src/utils/hashes/SHAMap/LeafNode.ts +69 -0
  312. package/src/utils/hashes/SHAMap/index.ts +41 -0
  313. package/src/utils/hashes/SHAMap/node.ts +14 -0
  314. package/src/utils/hashes/hashLedger.ts +236 -0
  315. package/src/utils/hashes/index.ts +187 -0
  316. package/src/utils/hashes/ledgerSpaces.ts +34 -0
  317. package/src/utils/hashes/sha512Half.ts +19 -0
  318. package/src/utils/index.ts +223 -0
  319. package/src/utils/parseNFTokenID.ts +84 -0
  320. package/src/utils/quality.ts +169 -0
  321. package/src/utils/signPaymentChannelClaim.ts +27 -0
  322. package/src/utils/stringConversion.ts +27 -0
  323. package/src/utils/timeConversion.ts +53 -0
  324. package/src/utils/verifyPaymentChannelClaim.ts +30 -0
  325. package/src/utils/xrpConversion.ts +104 -0
@@ -0,0 +1,23 @@
1
+ import { classicAddressToXAddress } from 'ripple-address-codec'
2
+ import { deriveKeypair, deriveAddress } from 'ripple-keypairs'
3
+
4
+ /**
5
+ * Derive an X-Address from a public key and a destination tag.
6
+ *
7
+ * @param options - Public key and destination tag to encode as an X-Address.
8
+ * @param options.publicKey - The public key corresponding to an address.
9
+ * @param options.tag - A destination tag to encode into an X-address. False indicates no destination tag.
10
+ * @param options.test - Whether this address is for use in Testnet.
11
+ * @returns X-Address.
12
+ * @category Utilities
13
+ */
14
+ function deriveXAddress(options: {
15
+ publicKey: string
16
+ tag: number | false
17
+ test: boolean
18
+ }): string {
19
+ const classicAddress = deriveAddress(options.publicKey)
20
+ return classicAddressToXAddress(classicAddress, options.tag, options.test)
21
+ }
22
+
23
+ export { deriveKeypair, deriveAddress, deriveXAddress }
@@ -0,0 +1,186 @@
1
+ import BigNumber from 'bignumber.js'
2
+ import flatten from 'lodash/flatten'
3
+ import groupBy from 'lodash/groupBy'
4
+
5
+ import {
6
+ Amount,
7
+ Balance,
8
+ IssuedCurrencyAmount,
9
+ TransactionMetadata,
10
+ Node,
11
+ } from '../models'
12
+
13
+ import { dropsToXrp } from './xrpConversion'
14
+
15
+ interface BalanceChange {
16
+ account: string
17
+ balance: Balance
18
+ }
19
+ interface Fields {
20
+ Account?: string
21
+ Balance?: Amount
22
+ LowLimit?: IssuedCurrencyAmount
23
+ HighLimit?: IssuedCurrencyAmount
24
+ // eslint-disable-next-line @typescript-eslint/member-ordering -- okay here, just some of the fields are typed to make it easier
25
+ [field: string]: unknown
26
+ }
27
+
28
+ interface NormalizedNode {
29
+ // 'CreatedNode' | 'ModifiedNode' | 'DeletedNode'
30
+ NodeType: string
31
+ LedgerEntryType: string
32
+ LedgerIndex: string
33
+ NewFields?: Fields
34
+ FinalFields?: Fields
35
+ PreviousFields?: Fields
36
+ PreviousTxnID?: string
37
+ PreviousTxnLgrSeq?: number
38
+ }
39
+
40
+ function normalizeNode(affectedNode: Node): NormalizedNode {
41
+ const diffType = Object.keys(affectedNode)[0]
42
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- not quite right, but close enough
43
+ const node = affectedNode[diffType] as NormalizedNode
44
+ return {
45
+ ...node,
46
+ NodeType: diffType,
47
+ LedgerEntryType: node.LedgerEntryType,
48
+ LedgerIndex: node.LedgerIndex,
49
+ NewFields: node.NewFields,
50
+ FinalFields: node.FinalFields,
51
+ PreviousFields: node.PreviousFields,
52
+ }
53
+ }
54
+
55
+ function normalizeNodes(metadata: TransactionMetadata): NormalizedNode[] {
56
+ if (metadata.AffectedNodes.length === 0) {
57
+ return []
58
+ }
59
+ return metadata.AffectedNodes.map(normalizeNode)
60
+ }
61
+
62
+ function groupByAccount(balanceChanges: BalanceChange[]): Array<{
63
+ account: string
64
+ balances: Balance[]
65
+ }> {
66
+ const grouped = groupBy(balanceChanges, (node) => node.account)
67
+ return Object.entries(grouped).map(([account, items]) => {
68
+ return { account, balances: items.map((item) => item.balance) }
69
+ })
70
+ }
71
+
72
+ function getValue(balance: Amount): BigNumber {
73
+ if (typeof balance === 'string') {
74
+ return new BigNumber(balance)
75
+ }
76
+ return new BigNumber(balance.value)
77
+ }
78
+
79
+ function computeBalanceChange(node: NormalizedNode): BigNumber | null {
80
+ let value: BigNumber | null = null
81
+ if (node.NewFields?.Balance) {
82
+ value = getValue(node.NewFields.Balance)
83
+ } else if (node.PreviousFields?.Balance && node.FinalFields?.Balance) {
84
+ value = getValue(node.FinalFields.Balance).minus(
85
+ getValue(node.PreviousFields.Balance),
86
+ )
87
+ }
88
+ if (value === null || value.isZero()) {
89
+ return null
90
+ }
91
+ return value
92
+ }
93
+
94
+ function getXRPQuantity(
95
+ node: NormalizedNode,
96
+ ): { account: string; balance: Balance } | null {
97
+ const value = computeBalanceChange(node)
98
+
99
+ if (value === null) {
100
+ return null
101
+ }
102
+
103
+ return {
104
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- okay here
105
+ account: (node.FinalFields?.Account ?? node.NewFields?.Account) as string,
106
+ balance: {
107
+ currency: 'XRP',
108
+ value: dropsToXrp(value).toString(),
109
+ },
110
+ }
111
+ }
112
+
113
+ function flipTrustlinePerspective(balanceChange: BalanceChange): BalanceChange {
114
+ const negatedBalance = new BigNumber(balanceChange.balance.value).negated()
115
+ return {
116
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- we know this is true
117
+ account: balanceChange.balance.issuer as string,
118
+ balance: {
119
+ issuer: balanceChange.account,
120
+ currency: balanceChange.balance.currency,
121
+ value: negatedBalance.toString(),
122
+ },
123
+ }
124
+ }
125
+
126
+ function getTrustlineQuantity(node: NormalizedNode): BalanceChange[] | null {
127
+ const value = computeBalanceChange(node)
128
+
129
+ if (value === null) {
130
+ return null
131
+ }
132
+
133
+ /*
134
+ * A trustline can be created with a non-zero starting balance.
135
+ * If an offer is placed to acquire an asset with no existing trustline,
136
+ * the trustline can be created when the offer is taken.
137
+ */
138
+ const fields = node.NewFields == null ? node.FinalFields : node.NewFields
139
+
140
+ // the balance is always from low node's perspective
141
+ const result = {
142
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- we know that this is true
143
+ account: fields?.LowLimit?.issuer as string,
144
+ balance: {
145
+ issuer: fields?.HighLimit?.issuer,
146
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- we know that this is true
147
+ currency: (fields?.Balance as IssuedCurrencyAmount).currency,
148
+ value: value.toString(),
149
+ },
150
+ }
151
+ return [result, flipTrustlinePerspective(result)]
152
+ }
153
+
154
+ /**
155
+ * Computes the complete list of every balance that changed in the ledger
156
+ * as a result of the given transaction.
157
+ *
158
+ * @param metadata - Transaction metadata.
159
+ * @returns Parsed balance changes.
160
+ * @category Utilities
161
+ */
162
+ export default function getBalanceChanges(
163
+ metadata: TransactionMetadata,
164
+ ): Array<{
165
+ account: string
166
+ balances: Balance[]
167
+ }> {
168
+ const quantities = normalizeNodes(metadata).map((node) => {
169
+ if (node.LedgerEntryType === 'AccountRoot') {
170
+ const xrpQuantity = getXRPQuantity(node)
171
+ if (xrpQuantity == null) {
172
+ return []
173
+ }
174
+ return [xrpQuantity]
175
+ }
176
+ if (node.LedgerEntryType === 'RippleState') {
177
+ const trustlineQuantity = getTrustlineQuantity(node)
178
+ if (trustlineQuantity == null) {
179
+ return []
180
+ }
181
+ return trustlineQuantity
182
+ }
183
+ return []
184
+ })
185
+ return groupByAccount(flatten(quantities))
186
+ }
@@ -0,0 +1,97 @@
1
+ import flatMap from 'lodash/flatMap'
2
+ import { decode } from 'ripple-binary-codec'
3
+
4
+ import { NFToken } from '../models/ledger/NFTokenPage'
5
+ import {
6
+ CreatedNode,
7
+ isCreatedNode,
8
+ isModifiedNode,
9
+ ModifiedNode,
10
+ TransactionMetadata,
11
+ } from '../models/transactions/metadata'
12
+
13
+ /**
14
+ * Ensures that the metadata is in a deserialized format to parse.
15
+ *
16
+ * @param meta - the metadata from a `tx` method call. Can be in json format or binary format.
17
+ * @returns the metadata in a deserialized format.
18
+ */
19
+ function ensureDecodedMeta(
20
+ meta: TransactionMetadata | string,
21
+ ): TransactionMetadata {
22
+ if (typeof meta === 'string') {
23
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Meta is either metadata or serialized metadata.
24
+ return decode(meta) as unknown as TransactionMetadata
25
+ }
26
+ return meta
27
+ }
28
+
29
+ /**
30
+ * Gets the NFTokenID for an NFT recently minted with NFTokenMint.
31
+ *
32
+ * @param meta - Metadata from the response to submitting and waiting for an NFTokenMint transaction or from a `tx` method call.
33
+ * @returns The NFTokenID for the minted NFT.
34
+ * @throws if meta is not TransactionMetadata.
35
+ */
36
+ export default function getNFTokenID(
37
+ meta: TransactionMetadata | string | undefined,
38
+ ): string | undefined {
39
+ if (typeof meta !== 'string' && meta?.AffectedNodes === undefined) {
40
+ throw new TypeError(`Unable to parse the parameter given to getNFTokenID.
41
+ 'meta' must be the metadata from an NFTokenMint transaction. Received ${JSON.stringify(
42
+ meta,
43
+ )} instead.`)
44
+ }
45
+
46
+ const decodedMeta = ensureDecodedMeta(meta)
47
+
48
+ /*
49
+ * When a mint results in splitting an existing page,
50
+ * it results in a created page and a modified node. Sometimes,
51
+ * the created node needs to be linked to a third page, resulting
52
+ * in modifying that third page's PreviousPageMin or NextPageMin
53
+ * field changing, but no NFTs within that page changing. In this
54
+ * case, there will be no previous NFTs and we need to skip.
55
+ * However, there will always be NFTs listed in the final fields,
56
+ * as rippled outputs all fields in final fields even if they were
57
+ * not changed. Thus why we add the additional condition to check
58
+ * if the PreviousFields contains NFTokens
59
+ */
60
+
61
+ const affectedNodes = decodedMeta.AffectedNodes.filter((node) => {
62
+ if (isCreatedNode(node)) {
63
+ return node.CreatedNode.LedgerEntryType === 'NFTokenPage'
64
+ }
65
+ if (isModifiedNode(node)) {
66
+ return (
67
+ node.ModifiedNode.LedgerEntryType === 'NFTokenPage' &&
68
+ Boolean(node.ModifiedNode.PreviousFields?.NFTokens)
69
+ )
70
+ }
71
+ return false
72
+ })
73
+ /* eslint-disable @typescript-eslint/consistent-type-assertions -- Necessary for parsing metadata */
74
+ const previousTokenIDSet = new Set(
75
+ flatMap(affectedNodes, (node) => {
76
+ const nftokens = isModifiedNode(node)
77
+ ? (node.ModifiedNode.PreviousFields?.NFTokens as NFToken[])
78
+ : []
79
+ return nftokens.map((token) => token.NFToken.NFTokenID)
80
+ }).filter((id) => Boolean(id)),
81
+ )
82
+
83
+ /* eslint-disable @typescript-eslint/no-unnecessary-condition -- Cleaner to read */
84
+ const finalTokenIDs = flatMap(affectedNodes, (node) =>
85
+ (
86
+ (((node as ModifiedNode).ModifiedNode?.FinalFields?.NFTokens ??
87
+ (node as CreatedNode).CreatedNode?.NewFields?.NFTokens) as NFToken[]) ??
88
+ []
89
+ ).map((token) => token.NFToken.NFTokenID),
90
+ ).filter((nftokenID) => Boolean(nftokenID))
91
+ /* eslint-enable @typescript-eslint/consistent-type-assertions -- Necessary for parsing metadata */
92
+ /* eslint-enable @typescript-eslint/no-unnecessary-condition -- Cleaner to read */
93
+
94
+ const nftokenID = finalTokenIDs.find((id) => !previousTokenIDSet.has(id))
95
+
96
+ return nftokenID
97
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Prefix for hashing functions.
3
+ *
4
+ * These prefixes are inserted before the source material used to
5
+ * generate various hashes. This is done to put each hash in its own
6
+ * "space." This way, two different types of objects with the
7
+ * same binary data will produce different hashes.
8
+ *
9
+ * Each prefix is a 4-byte value with the last byte set to zero
10
+ * and the first three bytes formed from the ASCII equivalent of
11
+ * some arbitrary string. For example "TXN".
12
+ */
13
+
14
+ enum HashPrefix {
15
+ // transaction plus signature to give transaction ID 'TXN'
16
+ TRANSACTION_ID = 0x54584e00,
17
+
18
+ // transaction plus metadata 'TND'
19
+ TRANSACTION_NODE = 0x534e4400,
20
+
21
+ // inner node in tree 'MIN'
22
+ INNER_NODE = 0x4d494e00,
23
+
24
+ // leaf node in tree 'MLN'
25
+ LEAF_NODE = 0x4d4c4e00,
26
+
27
+ // inner transaction to sign 'STX'
28
+ TRANSACTION_SIGN = 0x53545800,
29
+
30
+ // inner transaction to sign (TESTNET) 'stx'
31
+ TRANSACTION_SIGN_TESTNET = 0x73747800,
32
+
33
+ // inner transaction to multisign 'SMT'
34
+ TRANSACTION_MULTISIGN = 0x534d5400,
35
+
36
+ // ledger 'LWR'
37
+ LEDGER = 0x4c575200,
38
+ }
39
+
40
+ export default HashPrefix
@@ -0,0 +1,65 @@
1
+ # XRP Ledger Hashes
2
+
3
+ Methods to hash XRP Ledger objects
4
+
5
+ ## Computing a transaction hash (ID)
6
+
7
+ ### computeBinaryTransactionHash = (txBlobHex: string): string
8
+
9
+ Compute the hash of a binary transaction blob.
10
+
11
+ ### computeTransactionHash = (txJSON: any): string
12
+
13
+ Compute the hash of a transaction in txJSON format.
14
+
15
+ ## [Hash Prefixes](https://xrpl.org/basic-data-types.html#hash-prefixes)
16
+
17
+ In many cases, the XRP Ledger prefixes an object's binary data with a 4-byte code before calculating its hash, so that objects of different types have different hashes even if the binary data is the same. The existing 4-byte codes are structured as 3 alphabetic characters, encoded as ASCII, followed by a zero byte.
18
+
19
+ Some types of hashes appear in API requests and responses. Others are only calculated as the first step of signing a certain type of data, or calculating a higher-level hash. Some of following methods internally use some of the 4-byte hash prefixes in order to calculate the appropriate hash.
20
+
21
+ ### hashTx = (txBlobHex: string): string
22
+
23
+ In order to single-sign a transaction, you must perform these steps:
24
+
25
+ 1. Assuming the transaction is in JSON format (txJSON), `encode` the transaction in the XRP Ledger's binary format.
26
+ 2. Hash the data with the appropriate prefix (`0x53545800` if single-signing, or `0x534D5400` if multi-signing).
27
+ 3. After signing, you must re-serialize the transaction with the `TxnSignature` field included.
28
+
29
+ The `hashTx` helps with step 2, automatically using the `0x53545800` prefix needed for single-signing a transaction.
30
+
31
+ For details, see [Serialization Format](https://xrpl.org/serialization.html).
32
+
33
+ _Removed:_ `computeTransactionSigningHash`, which took txJSON as a parameter. It was part of the deprecated ripple-hashes library. If you have txJSON, `encode` it with [ripple-binary-codec](https://github.com/ripple/ripple-binary-codec) first. Example: `return hashTx(encode(txJSON))`
34
+
35
+ ### computeAccountLedgerObjectID = (address: string): string
36
+
37
+ Compute the hash of an account, given the account's classic address (starting with `r`).
38
+
39
+ ### computeSignerListLedgerObjectID = (address: string): string
40
+
41
+ Compute the hash of an account's SignerList.
42
+
43
+ ### computeOfferID = (address: string, sequence: number): string
44
+
45
+ Compute the hash of an order, given the owner's classic address (starting with `r`) and the account sequence number of the `OfferCreate` order transaction.
46
+
47
+ ### hashTrustline = (address1: string, address2: string, currency: string): string
48
+
49
+ Compute the hash of a trustline, given the two parties' classic addresses (starting with `r`) and the currency code.
50
+
51
+ ### hashTxTree = (transactions: any[]): string
52
+
53
+ ### hashStateTree = (entries: any[]): string
54
+
55
+ ### hashLedger = (ledgerHeader): string
56
+
57
+ Compute the hash of a ledger.
58
+
59
+ ### hashEscrow = (address, sequence): string
60
+
61
+ Compute the hash of an escrow, given the owner's classic address (starting with `r`) and the account sequence number of the `EscrowCreate` escrow transaction.
62
+
63
+ ### hashPaymentChannel = (address, dstAddress, sequence): string
64
+
65
+ Compute the hash of a payment channel, given the owner's classic address (starting with `r`), the classic address of the destination, and the account sequence number of the `PaymentChannelCreate` payment channel transaction.
@@ -0,0 +1,124 @@
1
+ import { XrplError } from '../../../errors'
2
+ import HashPrefix from '../HashPrefix'
3
+ import sha512Half from '../sha512Half'
4
+
5
+ import LeafNode from './LeafNode'
6
+ import { NodeType, Node } from './node'
7
+
8
+ const HEX_ZERO =
9
+ '0000000000000000000000000000000000000000000000000000000000000000'
10
+
11
+ const SLOT_MAX = 15
12
+ const HEX = 16
13
+
14
+ /**
15
+ * Class for SHAMap InnerNode.
16
+ */
17
+ class InnerNode extends Node {
18
+ public leaves: { [slot: number]: Node | undefined }
19
+ public type: NodeType
20
+ public depth: number
21
+ public empty: boolean
22
+
23
+ /**
24
+ * Define an Inner (non-leaf) node in a SHAMap tree.
25
+ *
26
+ * @param depth - I.e. How many parent inner nodes.
27
+ */
28
+ public constructor(depth = 0) {
29
+ super()
30
+ this.leaves = {}
31
+ this.type = NodeType.INNER
32
+ this.depth = depth
33
+ this.empty = true
34
+ }
35
+
36
+ /**
37
+ * Get the hash of a LeafNode.
38
+ *
39
+ * @returns Hash of the LeafNode.
40
+ */
41
+ public get hash(): string {
42
+ if (this.empty) {
43
+ return HEX_ZERO
44
+ }
45
+ let hex = ''
46
+ for (let iter = 0; iter <= SLOT_MAX; iter++) {
47
+ const child = this.leaves[iter]
48
+ const hash: string = child == null ? HEX_ZERO : child.hash
49
+ hex += hash
50
+ }
51
+
52
+ const prefix = HashPrefix.INNER_NODE.toString(HEX)
53
+ return sha512Half(prefix + hex)
54
+ }
55
+
56
+ /**
57
+ * Adds an item to the InnerNode.
58
+ *
59
+ * @param tag - Equates to a ledger entry `index`.
60
+ * @param node - Node to add.
61
+ * @throws If there is a index collision.
62
+ */
63
+ public addItem(tag: string, node: Node): void {
64
+ const existingNode = this.getNode(parseInt(tag[this.depth], HEX))
65
+
66
+ if (existingNode === undefined) {
67
+ this.setNode(parseInt(tag[this.depth], HEX), node)
68
+ return
69
+ }
70
+
71
+ // A node already exists in this slot
72
+ if (existingNode instanceof InnerNode) {
73
+ // There is an inner node, so we need to go deeper
74
+ existingNode.addItem(tag, node)
75
+ } else if (existingNode instanceof LeafNode) {
76
+ if (existingNode.tag === tag) {
77
+ // Collision
78
+ throw new XrplError(
79
+ 'Tried to add a node to a SHAMap that was already in there.',
80
+ )
81
+ } else {
82
+ const newInnerNode = new InnerNode(this.depth + 1)
83
+
84
+ // Parent new and existing node
85
+ newInnerNode.addItem(existingNode.tag, existingNode)
86
+ newInnerNode.addItem(tag, node)
87
+
88
+ // And place the newly created inner node in the slot
89
+ this.setNode(parseInt(tag[this.depth], HEX), newInnerNode)
90
+ }
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Overwrite the node that is currently in a given slot.
96
+ *
97
+ * @param slot - A number 0-15.
98
+ * @param node - To place.
99
+ * @throws If slot is out of range.
100
+ */
101
+ public setNode(slot: number, node: Node): void {
102
+ if (slot < 0 || slot > SLOT_MAX) {
103
+ throw new XrplError('Invalid slot: slot must be between 0-15.')
104
+ }
105
+ this.leaves[slot] = node
106
+ this.empty = false
107
+ }
108
+
109
+ /**
110
+ * Get the node that is currently in a given slot.
111
+ *
112
+ * @param slot - A number 0-15.
113
+ * @returns Node currently in a slot.
114
+ * @throws If slot is out of range.
115
+ */
116
+ public getNode(slot: number): Node | undefined {
117
+ if (slot < 0 || slot > SLOT_MAX) {
118
+ throw new XrplError('Invalid slot: slot must be between 0-15.')
119
+ }
120
+ return this.leaves[slot]
121
+ }
122
+ }
123
+
124
+ export default InnerNode
@@ -0,0 +1,69 @@
1
+ import { XrplError } from '../../../errors'
2
+ import HashPrefix from '../HashPrefix'
3
+ import sha512Half from '../sha512Half'
4
+
5
+ import { NodeType, Node } from './node'
6
+
7
+ const HEX = 16
8
+
9
+ /**
10
+ * Class for SHAMap Leaf Node.
11
+ */
12
+ class LeafNode extends Node {
13
+ public tag: string
14
+ public type: NodeType
15
+ public data: string
16
+
17
+ /**
18
+ * Leaf node in a SHAMap tree.
19
+ *
20
+ * @param tag - Equates to a ledger entry `index`.
21
+ * @param data - Hex of account state, transaction etc.
22
+ * @param type - One of TYPE_ACCOUNT_STATE, TYPE_TRANSACTION_MD etc.
23
+ */
24
+ public constructor(tag: string, data: string, type: NodeType) {
25
+ super()
26
+ this.tag = tag
27
+ this.type = type
28
+ this.data = data
29
+ }
30
+
31
+ /**
32
+ * Get the hash of a LeafNode.
33
+ *
34
+ * @returns Hash or undefined.
35
+ * @throws If node is of unknown type.
36
+ */
37
+ public get hash(): string {
38
+ switch (this.type) {
39
+ case NodeType.ACCOUNT_STATE: {
40
+ const leafPrefix = HashPrefix.LEAF_NODE.toString(HEX)
41
+ return sha512Half(leafPrefix + this.data + this.tag)
42
+ }
43
+ case NodeType.TRANSACTION_NO_METADATA: {
44
+ const txIDPrefix = HashPrefix.TRANSACTION_ID.toString(HEX)
45
+ return sha512Half(txIDPrefix + this.data)
46
+ }
47
+ case NodeType.TRANSACTION_METADATA: {
48
+ const txNodePrefix = HashPrefix.TRANSACTION_NODE.toString(HEX)
49
+ return sha512Half(txNodePrefix + this.data + this.tag)
50
+ }
51
+ default:
52
+ throw new XrplError('Tried to hash a SHAMap node of unknown type.')
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Add item to Leaf.
58
+ *
59
+ * @param tag - Index of the Node.
60
+ * @param node - Node to insert.
61
+ * @throws When called, because LeafNodes cannot addItem.
62
+ */
63
+ public addItem(tag: string, node: Node): void {
64
+ throw new XrplError('Cannot call addItem on a LeafNode')
65
+ this.addItem(tag, node)
66
+ }
67
+ }
68
+
69
+ export default LeafNode
@@ -0,0 +1,41 @@
1
+ import InnerNode from './InnerNode'
2
+ import LeafNode from './LeafNode'
3
+ import { NodeType } from './node'
4
+
5
+ /**
6
+ * SHAMap is the hash structure used to model ledgers.
7
+ * If the root hash is equivalent, that means all nodes should be equivalent as well.
8
+ */
9
+ class SHAMap {
10
+ public root: InnerNode
11
+
12
+ /**
13
+ * SHAMap tree constructor.
14
+ */
15
+ public constructor() {
16
+ this.root = new InnerNode(0)
17
+ }
18
+
19
+ /**
20
+ * Get the hash of the SHAMap.
21
+ *
22
+ * @returns The hash of the root of the SHAMap.
23
+ */
24
+ public get hash(): string {
25
+ return this.root.hash
26
+ }
27
+
28
+ /**
29
+ * Add an item to the SHAMap.
30
+ *
31
+ * @param tag - Index of the Node to add.
32
+ * @param data - Data to insert into the tree.
33
+ * @param type - Type of the node to add.
34
+ */
35
+ public addItem(tag: string, data: string, type: NodeType): void {
36
+ this.root.addItem(tag, new LeafNode(tag, data, type))
37
+ }
38
+ }
39
+
40
+ export * from './node'
41
+ export default SHAMap
@@ -0,0 +1,14 @@
1
+ export enum NodeType {
2
+ INNER = 1,
3
+ TRANSACTION_NO_METADATA = 2,
4
+ TRANSACTION_METADATA = 3,
5
+ ACCOUNT_STATE = 4,
6
+ }
7
+
8
+ /**
9
+ * Abstract base class for SHAMapNode.
10
+ */
11
+ export abstract class Node {
12
+ public abstract get hash(): string
13
+ public abstract addItem(_tag: string, _node: Node): void
14
+ }