@ledgerhq/coin-xrp 6.1.3 → 6.1.4-nightly.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 (190) hide show
  1. package/.unimportedrc.json +3 -1
  2. package/CHANGELOG.md +8 -0
  3. package/jest.config.js +2 -5
  4. package/lib/api/index.d.ts +2 -11
  5. package/lib/api/index.d.ts.map +1 -1
  6. package/lib/api/index.integ.test.js +24 -7
  7. package/lib/api/index.integ.test.js.map +1 -1
  8. package/lib/api/index.js +15 -5
  9. package/lib/api/index.js.map +1 -1
  10. package/lib/api/index.test.js +18 -9
  11. package/lib/api/index.test.js.map +1 -1
  12. package/lib/index.d.ts +0 -1
  13. package/lib/index.d.ts.map +1 -1
  14. package/lib/index.js +0 -3
  15. package/lib/index.js.map +1 -1
  16. package/lib/logic/combine.d.ts.map +1 -1
  17. package/lib/logic/combine.js +8 -3
  18. package/lib/logic/combine.js.map +1 -1
  19. package/lib/logic/getBalance.d.ts.map +1 -1
  20. package/lib/logic/getBalance.js +13 -1
  21. package/lib/logic/getBalance.js.map +1 -1
  22. package/lib/logic/getBalance.test.js +14 -1
  23. package/lib/logic/getBalance.test.js.map +1 -1
  24. package/lib/logic/getTransactionStatus.d.ts +3 -0
  25. package/lib/logic/getTransactionStatus.d.ts.map +1 -0
  26. package/lib/{bridge → logic}/getTransactionStatus.js +15 -19
  27. package/lib/logic/getTransactionStatus.js.map +1 -0
  28. package/lib/logic/getTransactionStatus.test.d.ts +2 -0
  29. package/lib/logic/getTransactionStatus.test.d.ts.map +1 -0
  30. package/lib/logic/getTransactionStatus.test.js +184 -0
  31. package/lib/logic/getTransactionStatus.test.js.map +1 -0
  32. package/lib/logic/index.d.ts +2 -1
  33. package/lib/logic/index.d.ts.map +1 -1
  34. package/lib/logic/index.js +3 -2
  35. package/lib/logic/index.js.map +1 -1
  36. package/lib/logic/utils.d.ts +0 -1
  37. package/lib/logic/utils.d.ts.map +1 -1
  38. package/lib/logic/utils.js +14 -10
  39. package/lib/logic/utils.js.map +1 -1
  40. package/lib/test/bridgeDatasetTest.d.ts.map +1 -1
  41. package/lib/test/bridgeDatasetTest.js +7 -7
  42. package/lib/test/bridgeDatasetTest.js.map +1 -1
  43. package/lib/{bridge/transaction.d.ts → transaction.d.ts} +1 -1
  44. package/lib/transaction.d.ts.map +1 -0
  45. package/lib/transaction.js.map +1 -0
  46. package/lib/types/model.d.ts +7 -0
  47. package/lib/types/model.d.ts.map +1 -1
  48. package/lib-es/api/index.d.ts +2 -11
  49. package/lib-es/api/index.d.ts.map +1 -1
  50. package/lib-es/api/index.integ.test.js +24 -7
  51. package/lib-es/api/index.integ.test.js.map +1 -1
  52. package/lib-es/api/index.js +16 -6
  53. package/lib-es/api/index.js.map +1 -1
  54. package/lib-es/api/index.test.js +18 -9
  55. package/lib-es/api/index.test.js.map +1 -1
  56. package/lib-es/index.d.ts +0 -1
  57. package/lib-es/index.d.ts.map +1 -1
  58. package/lib-es/index.js +0 -1
  59. package/lib-es/index.js.map +1 -1
  60. package/lib-es/logic/combine.d.ts.map +1 -1
  61. package/lib-es/logic/combine.js +8 -3
  62. package/lib-es/logic/combine.js.map +1 -1
  63. package/lib-es/logic/getBalance.d.ts.map +1 -1
  64. package/lib-es/logic/getBalance.js +14 -2
  65. package/lib-es/logic/getBalance.js.map +1 -1
  66. package/lib-es/logic/getBalance.test.js +14 -1
  67. package/lib-es/logic/getBalance.test.js.map +1 -1
  68. package/lib-es/logic/getTransactionStatus.d.ts +3 -0
  69. package/lib-es/logic/getTransactionStatus.d.ts.map +1 -0
  70. package/lib-es/{bridge → logic}/getTransactionStatus.js +13 -14
  71. package/lib-es/logic/getTransactionStatus.js.map +1 -0
  72. package/lib-es/logic/getTransactionStatus.test.d.ts +2 -0
  73. package/lib-es/logic/getTransactionStatus.test.d.ts.map +1 -0
  74. package/lib-es/logic/getTransactionStatus.test.js +159 -0
  75. package/lib-es/logic/getTransactionStatus.test.js.map +1 -0
  76. package/lib-es/logic/index.d.ts +2 -1
  77. package/lib-es/logic/index.d.ts.map +1 -1
  78. package/lib-es/logic/index.js +2 -1
  79. package/lib-es/logic/index.js.map +1 -1
  80. package/lib-es/logic/utils.d.ts +0 -1
  81. package/lib-es/logic/utils.d.ts.map +1 -1
  82. package/lib-es/logic/utils.js +13 -8
  83. package/lib-es/logic/utils.js.map +1 -1
  84. package/lib-es/test/bridgeDatasetTest.d.ts.map +1 -1
  85. package/lib-es/test/bridgeDatasetTest.js +7 -7
  86. package/lib-es/test/bridgeDatasetTest.js.map +1 -1
  87. package/lib-es/{bridge/transaction.d.ts → transaction.d.ts} +1 -1
  88. package/lib-es/transaction.d.ts.map +1 -0
  89. package/lib-es/transaction.js.map +1 -0
  90. package/lib-es/types/model.d.ts +7 -0
  91. package/lib-es/types/model.d.ts.map +1 -1
  92. package/package.json +7 -8
  93. package/src/api/index.integ.test.ts +24 -8
  94. package/src/api/index.test.ts +23 -22
  95. package/src/api/index.ts +28 -19
  96. package/src/index.ts +0 -1
  97. package/src/logic/combine.ts +10 -3
  98. package/src/logic/getBalance.test.ts +14 -1
  99. package/src/logic/getBalance.ts +18 -2
  100. package/src/logic/getTransactionStatus.test.ts +215 -0
  101. package/src/{bridge → logic}/getTransactionStatus.ts +18 -21
  102. package/src/logic/index.ts +2 -6
  103. package/src/logic/utils.ts +24 -8
  104. package/src/test/bridgeDatasetTest.ts +8 -7
  105. package/src/{bridge/transaction.ts → transaction.ts} +1 -1
  106. package/src/types/model.ts +11 -0
  107. package/lib/bridge/broadcast.d.ts +0 -4
  108. package/lib/bridge/broadcast.d.ts.map +0 -1
  109. package/lib/bridge/broadcast.js +0 -11
  110. package/lib/bridge/broadcast.js.map +0 -1
  111. package/lib/bridge/createTransaction.d.ts +0 -4
  112. package/lib/bridge/createTransaction.d.ts.map +0 -1
  113. package/lib/bridge/createTransaction.js +0 -18
  114. package/lib/bridge/createTransaction.js.map +0 -1
  115. package/lib/bridge/estimateMaxSpendable.d.ts +0 -4
  116. package/lib/bridge/estimateMaxSpendable.d.ts.map +0 -1
  117. package/lib/bridge/estimateMaxSpendable.js +0 -26
  118. package/lib/bridge/estimateMaxSpendable.js.map +0 -1
  119. package/lib/bridge/getTransactionStatus.d.ts +0 -4
  120. package/lib/bridge/getTransactionStatus.d.ts.map +0 -1
  121. package/lib/bridge/getTransactionStatus.js.map +0 -1
  122. package/lib/bridge/index.d.ts +0 -11
  123. package/lib/bridge/index.d.ts.map +0 -1
  124. package/lib/bridge/index.js +0 -47
  125. package/lib/bridge/index.js.map +0 -1
  126. package/lib/bridge/prepareTransaction.d.ts +0 -4
  127. package/lib/bridge/prepareTransaction.d.ts.map +0 -1
  128. package/lib/bridge/prepareTransaction.js +0 -14
  129. package/lib/bridge/prepareTransaction.js.map +0 -1
  130. package/lib/bridge/signOperation.d.ts +0 -5
  131. package/lib/bridge/signOperation.d.ts.map +0 -1
  132. package/lib/bridge/signOperation.js +0 -76
  133. package/lib/bridge/signOperation.js.map +0 -1
  134. package/lib/bridge/synchronization.d.ts +0 -3
  135. package/lib/bridge/synchronization.d.ts.map +0 -1
  136. package/lib/bridge/synchronization.js +0 -85
  137. package/lib/bridge/synchronization.js.map +0 -1
  138. package/lib/bridge/synchronization.test.d.ts +0 -2
  139. package/lib/bridge/synchronization.test.d.ts.map +0 -1
  140. package/lib/bridge/synchronization.test.js +0 -140
  141. package/lib/bridge/synchronization.test.js.map +0 -1
  142. package/lib/bridge/transaction.d.ts.map +0 -1
  143. package/lib/bridge/transaction.js.map +0 -1
  144. package/lib-es/bridge/broadcast.d.ts +0 -4
  145. package/lib-es/bridge/broadcast.d.ts.map +0 -1
  146. package/lib-es/bridge/broadcast.js +0 -7
  147. package/lib-es/bridge/broadcast.js.map +0 -1
  148. package/lib-es/bridge/createTransaction.d.ts +0 -4
  149. package/lib-es/bridge/createTransaction.d.ts.map +0 -1
  150. package/lib-es/bridge/createTransaction.js +0 -11
  151. package/lib-es/bridge/createTransaction.js.map +0 -1
  152. package/lib-es/bridge/estimateMaxSpendable.d.ts +0 -4
  153. package/lib-es/bridge/estimateMaxSpendable.d.ts.map +0 -1
  154. package/lib-es/bridge/estimateMaxSpendable.js +0 -19
  155. package/lib-es/bridge/estimateMaxSpendable.js.map +0 -1
  156. package/lib-es/bridge/getTransactionStatus.d.ts +0 -4
  157. package/lib-es/bridge/getTransactionStatus.d.ts.map +0 -1
  158. package/lib-es/bridge/getTransactionStatus.js.map +0 -1
  159. package/lib-es/bridge/index.d.ts +0 -11
  160. package/lib-es/bridge/index.d.ts.map +0 -1
  161. package/lib-es/bridge/index.js +0 -41
  162. package/lib-es/bridge/index.js.map +0 -1
  163. package/lib-es/bridge/prepareTransaction.d.ts +0 -4
  164. package/lib-es/bridge/prepareTransaction.d.ts.map +0 -1
  165. package/lib-es/bridge/prepareTransaction.js +0 -10
  166. package/lib-es/bridge/prepareTransaction.js.map +0 -1
  167. package/lib-es/bridge/signOperation.d.ts +0 -5
  168. package/lib-es/bridge/signOperation.d.ts.map +0 -1
  169. package/lib-es/bridge/signOperation.js +0 -72
  170. package/lib-es/bridge/signOperation.js.map +0 -1
  171. package/lib-es/bridge/synchronization.d.ts +0 -3
  172. package/lib-es/bridge/synchronization.d.ts.map +0 -1
  173. package/lib-es/bridge/synchronization.js +0 -78
  174. package/lib-es/bridge/synchronization.js.map +0 -1
  175. package/lib-es/bridge/synchronization.test.d.ts +0 -2
  176. package/lib-es/bridge/synchronization.test.d.ts.map +0 -1
  177. package/lib-es/bridge/synchronization.test.js +0 -135
  178. package/lib-es/bridge/synchronization.test.js.map +0 -1
  179. package/lib-es/bridge/transaction.d.ts.map +0 -1
  180. package/lib-es/bridge/transaction.js.map +0 -1
  181. package/src/bridge/broadcast.ts +0 -11
  182. package/src/bridge/createTransaction.ts +0 -13
  183. package/src/bridge/estimateMaxSpendable.ts +0 -25
  184. package/src/bridge/index.ts +0 -59
  185. package/src/bridge/prepareTransaction.ts +0 -18
  186. package/src/bridge/signOperation.ts +0 -100
  187. package/src/bridge/synchronization.test.ts +0 -153
  188. package/src/bridge/synchronization.ts +0 -108
  189. /package/lib/{bridge/transaction.js → transaction.js} +0 -0
  190. /package/lib-es/{bridge/transaction.js → transaction.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import BigNumber from "bignumber.js";
2
2
  import { InvalidAddressBecauseDestinationIsAlsoSource } from "@ledgerhq/errors";
3
- import { fromTransactionRaw } from "../bridge/transaction";
3
+ import { fromTransactionRaw } from "../transaction";
4
4
  export const newAddress1 = "rZvBc5e2YR1A9otS3r9DyGh3NDP8XLLp4";
5
5
  export const dataset = {
6
6
  implementations: ["mock", "ripplejs"],
@@ -91,18 +91,18 @@ export const dataset = {
91
91
  recipient: "rageXHB6Q4VbvvWdTzKANwjeCT4HXFCKX7",
92
92
  amount: "10000000",
93
93
  tag: null,
94
- fee: "1",
94
+ fee: "10", // NOTE: fee is not customizable, this field is ignored
95
95
  feeCustomUnit: null,
96
96
  networkInfo: null,
97
97
  }),
98
98
  expectedStatus: {
99
99
  amount: new BigNumber("10000000"),
100
- estimatedFees: new BigNumber("1"),
100
+ estimatedFees: new BigNumber("10"), // NOTE: hardcoded fee
101
101
  errors: {
102
102
  recipient: new InvalidAddressBecauseDestinationIsAlsoSource(),
103
103
  },
104
104
  warnings: {},
105
- totalSpent: new BigNumber("10000001"),
105
+ totalSpent: new BigNumber("10000010"), // NOTE: amount + hardcoded fee
106
106
  },
107
107
  },
108
108
  {
@@ -112,16 +112,16 @@ export const dataset = {
112
112
  recipient: "rB6pwovsyrFWhPYUsjj9V3CHck985QjiXi",
113
113
  amount: "10000000",
114
114
  tag: 12345,
115
- fee: "1",
115
+ fee: "10", // NOTE: fee is not customizable, this field is ignored
116
116
  feeCustomUnit: null,
117
117
  networkInfo: null,
118
118
  }),
119
119
  expectedStatus: {
120
120
  amount: new BigNumber("10000000"),
121
- estimatedFees: new BigNumber("1"),
121
+ estimatedFees: new BigNumber("10"), // NOTE: hardcoded fee
122
122
  errors: {},
123
123
  warnings: {},
124
- totalSpent: new BigNumber("10000001"),
124
+ totalSpent: new BigNumber("10000010"), // NOTE: amount + hardcoded fee
125
125
  },
126
126
  },
127
127
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"bridgeDatasetTest.js","sourceRoot":"","sources":["../../src/test/bridgeDatasetTest.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,4CAA4C,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,MAAM,CAAC,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAE/D,MAAM,CAAC,MAAM,OAAO,GAA6B;IAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;IACrC,UAAU,EAAE;QACV,MAAM,EAAE;YACN,YAAY,EAAE;gBACZ;oBACE,IAAI,EAAE,eAAe;oBACrB,gBAAgB,EAAE,IAAI;oBACtB,oCAAoC;oBACpC,KAAK,EAAE;;;;;;;;;WASN;iBACF;aACF;YACD,QAAQ,EAAE;gBACR;oBACE,YAAY,EAAE;wBACZ,QAAQ;wBAER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAgCF;wBACE,QAAQ;wBAER;;;;;;;;;;;;;;;;;;;;;;sBAsBF;wBACE;4BACE,IAAI,EAAE,2CAA2C;4BACjD,WAAW,EAAE,kBAAkB,CAAC;gCAC9B,MAAM,EAAE,KAAK;gCACb,SAAS,EAAE,oCAAoC;gCAC/C,MAAM,EAAE,UAAU;gCAClB,GAAG,EAAE,IAAI;gCACT,GAAG,EAAE,GAAG;gCACR,aAAa,EAAE,IAAI;gCACnB,WAAW,EAAE,IAAI;6BAClB,CAAC;4BACF,cAAc,EAAE;gCACd,MAAM,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;gCACjC,aAAa,EAAE,IAAI,SAAS,CAAC,GAAG,CAAC;gCACjC,MAAM,EAAE;oCACN,SAAS,EAAE,IAAI,4CAA4C,EAAE;iCAC9D;gCACD,QAAQ,EAAE,EAAE;gCACZ,UAAU,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;6BACtC;yBACF;wBACD;4BACE,IAAI,EAAE,4BAA4B;4BAClC,WAAW,EAAE,kBAAkB,CAAC;gCAC9B,MAAM,EAAE,KAAK;gCACb,SAAS,EAAE,oCAAoC;gCAC/C,MAAM,EAAE,UAAU;gCAClB,GAAG,EAAE,KAAK;gCACV,GAAG,EAAE,GAAG;gCACR,aAAa,EAAE,IAAI;gCACnB,WAAW,EAAE,IAAI;6BAClB,CAAC;4BACF,cAAc,EAAE;gCACd,MAAM,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;gCACjC,aAAa,EAAE,IAAI,SAAS,CAAC,GAAG,CAAC;gCACjC,MAAM,EAAE,EAAE;gCACV,QAAQ,EAAE,EAAE;gCACZ,UAAU,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;6BACtC;yBACF;qBACF;oBACD,GAAG,EAAE;wBACH,EAAE,EAAE,uDAAuD;wBAC3D,cAAc,EAAE,oCAAoC;wBACpD,IAAI,EAAE,OAAO;wBACb,cAAc,EAAE,EAAE;wBAClB,KAAK,EAAE,CAAC;wBACR,YAAY,EAAE,oCAAoC;wBAClD,gBAAgB,EAAE,iBAAiB;wBACnC,WAAW,EAAE,CAAC;wBACd,UAAU,EAAE,EAAE;wBACd,iBAAiB,EAAE,EAAE;wBACrB,UAAU,EAAE,QAAQ;wBACpB,YAAY,EAAE,EAAE;wBAChB,OAAO,EAAE,UAAU;qBACpB;iBACF;aACF;SACF;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"bridgeDatasetTest.js","sourceRoot":"","sources":["../../src/test/bridgeDatasetTest.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,4CAA4C,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,MAAM,CAAC,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAE/D,MAAM,CAAC,MAAM,OAAO,GAA6B;IAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;IACrC,UAAU,EAAE;QACV,MAAM,EAAE;YACN,YAAY,EAAE;gBACZ;oBACE,IAAI,EAAE,eAAe;oBACrB,gBAAgB,EAAE,IAAI;oBACtB,oCAAoC;oBACpC,KAAK,EAAE;;;;;;;;;WASN;iBACF;aACF;YACD,QAAQ,EAAE;gBACR;oBACE,YAAY,EAAE;wBACZ,QAAQ;wBAER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAgCF;wBACE,QAAQ;wBAER;;;;;;;;;;;;;;;;;;;;;;sBAsBF;wBACE;4BACE,IAAI,EAAE,2CAA2C;4BACjD,WAAW,EAAE,kBAAkB,CAAC;gCAC9B,MAAM,EAAE,KAAK;gCACb,SAAS,EAAE,oCAAoC;gCAC/C,MAAM,EAAE,UAAU;gCAClB,GAAG,EAAE,IAAI;gCACT,GAAG,EAAE,IAAI,EAAE,uDAAuD;gCAClE,aAAa,EAAE,IAAI;gCACnB,WAAW,EAAE,IAAI;6BAClB,CAAC;4BACF,cAAc,EAAE;gCACd,MAAM,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;gCACjC,aAAa,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,sBAAsB;gCAE1D,MAAM,EAAE;oCACN,SAAS,EAAE,IAAI,4CAA4C,EAAE;iCAC9D;gCACD,QAAQ,EAAE,EAAE;gCACZ,UAAU,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,+BAA+B;6BACvE;yBACF;wBACD;4BACE,IAAI,EAAE,4BAA4B;4BAClC,WAAW,EAAE,kBAAkB,CAAC;gCAC9B,MAAM,EAAE,KAAK;gCACb,SAAS,EAAE,oCAAoC;gCAC/C,MAAM,EAAE,UAAU;gCAClB,GAAG,EAAE,KAAK;gCACV,GAAG,EAAE,IAAI,EAAE,uDAAuD;gCAClE,aAAa,EAAE,IAAI;gCACnB,WAAW,EAAE,IAAI;6BAClB,CAAC;4BACF,cAAc,EAAE;gCACd,MAAM,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;gCACjC,aAAa,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,sBAAsB;gCAC1D,MAAM,EAAE,EAAE;gCACV,QAAQ,EAAE,EAAE;gCACZ,UAAU,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,+BAA+B;6BACvE;yBACF;qBACF;oBACD,GAAG,EAAE;wBACH,EAAE,EAAE,uDAAuD;wBAC3D,cAAc,EAAE,oCAAoC;wBACpD,IAAI,EAAE,OAAO;wBACb,cAAc,EAAE,EAAE;wBAClB,KAAK,EAAE,CAAC;wBACR,YAAY,EAAE,oCAAoC;wBAClD,gBAAgB,EAAE,iBAAiB;wBACnC,WAAW,EAAE,CAAC;wBACd,UAAU,EAAE,EAAE;wBACd,iBAAiB,EAAE,EAAE;wBACrB,UAAU,EAAE,QAAQ;wBACpB,YAAY,EAAE,EAAE;wBAChB,OAAO,EAAE,UAAU;qBACpB;iBACF;aACF;SACF;KACF;CACF,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Transaction, TransactionRaw } from "../types";
1
+ import type { Transaction, TransactionRaw } from "./types";
2
2
  import type { Account } from "@ledgerhq/types-live";
3
3
  export declare const formatTransaction: ({ amount, recipient, fee, tag, useAllAmount }: Transaction, account: Account) => string;
4
4
  export declare const fromTransactionRaw: (tr: TransactionRaw) => Transaction;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQ3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIpD,eAAO,MAAM,iBAAiB,kDACmB,WAAW,WACjD,OAAO,KACf,MAiB6B,CAAC;AAEjC,eAAO,MAAM,kBAAkB,OAAQ,cAAc,KAAG,WAgBvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,MAAO,WAAW,KAAG,cAgBjD,CAAC;;uEAvD+C,WAAW,WACjD,OAAO,KACf,MAAM;6BAmB8B,cAAc,KAAG,WAAW;0BAkB/B,WAAW,KAAG,cAAc;;;;;AAkBhE,wBAOE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { TypedMapMemo } from "@ledgerhq/coin-framework/api/types";
1
2
  export type AccountInfo = {
2
3
  isNewAccount: boolean;
3
4
  balance: string;
@@ -9,6 +10,12 @@ export type XrpMemo = {
9
10
  format?: string;
10
11
  type?: string;
11
12
  };
13
+ export type XrpMemoKind = "destinationTag" | "memo";
14
+ export type XrpMemoValueMap = {
15
+ destinationTag: string;
16
+ memos: string[];
17
+ };
18
+ export type XrpMapMemo = TypedMapMemo<XrpMemoValueMap>;
12
19
  type Order = "asc" | "desc";
13
20
  export type ListOperationsOptions = {
14
21
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAC5B,MAAM,MAAM,qBAAqB,GAAG;IAElC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAEvD,KAAK,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,qBAAqB,GAAG;IAElC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-xrp",
3
- "version": "6.1.3",
3
+ "version": "6.1.4-nightly.0",
4
4
  "description": "Ledger XRP Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -41,7 +41,7 @@
41
41
  "lib/test/bot-specs"
42
42
  ],
43
43
  "transaction": [
44
- "lib/bridge/transaction"
44
+ "lib/transaction"
45
45
  ],
46
46
  "types": [
47
47
  "lib/types/index"
@@ -80,8 +80,8 @@
80
80
  "default": "./lib-es/test/bot-specs.js"
81
81
  },
82
82
  "./transaction": {
83
- "require": "./lib/bridge/transaction.js",
84
- "default": "./lib-es/bridge/transaction.js"
83
+ "require": "./lib/transaction.js",
84
+ "default": "./lib-es/transaction.js"
85
85
  },
86
86
  "./types": {
87
87
  "require": "./lib/types/index.js",
@@ -104,12 +104,12 @@
104
104
  "ripple-address-codec": "^5.0.0",
105
105
  "ripple-binary-codec": "^1.3.0",
106
106
  "rxjs": "^7.8.1",
107
- "@ledgerhq/coin-framework": "^5.2.0",
108
- "@ledgerhq/cryptoassets": "^13.18.0",
107
+ "@ledgerhq/cryptoassets": "^13.18.1-nightly.0",
108
+ "@ledgerhq/coin-framework": "^5.2.1-nightly.0",
109
109
  "@ledgerhq/devices": "8.4.6",
110
110
  "@ledgerhq/errors": "^6.21.0",
111
111
  "@ledgerhq/live-network": "^2.0.9",
112
- "@ledgerhq/types-live": "^6.72.0",
112
+ "@ledgerhq/types-live": "^6.73.0-nightly.0",
113
113
  "@ledgerhq/logs": "^6.13.0"
114
114
  },
115
115
  "devDependencies": {
@@ -121,7 +121,6 @@
121
121
  "jest": "^29.7.0",
122
122
  "ripple-keypairs": "^2.0.0",
123
123
  "ts-jest": "^29.1.1",
124
- "jest-sonar": "0.2.16",
125
124
  "typescript": "^5.4.5",
126
125
  "@ledgerhq/disable-network-setup": "^0.0.0",
127
126
  "@ledgerhq/types-cryptoassets": "^7.23.0"
@@ -4,7 +4,7 @@ import { createApi } from ".";
4
4
  //import { sign } from "ripple-keypairs";
5
5
 
6
6
  describe("Xrp Api", () => {
7
- const SENDER = { address: "rh1HPuRVsYYvThxG2Bs1MfjmrVC73S16Fb" };
7
+ const SENDER = "rh1HPuRVsYYvThxG2Bs1MfjmrVC73S16Fb";
8
8
  const api = createApi({ node: "https://s.altnet.rippletest.net:51234" });
9
9
 
10
10
  describe("estimateFees", () => {
@@ -19,6 +19,10 @@ describe("Xrp Api", () => {
19
19
  sender: SENDER,
20
20
  amount,
21
21
  recipient: "rKtXXTVno77jhu6tto1MAXjepyuaKaLcqB",
22
+ memo: {
23
+ type: "map",
24
+ memos: new Map(),
25
+ },
22
26
  });
23
27
 
24
28
  // Then
@@ -29,15 +33,14 @@ describe("Xrp Api", () => {
29
33
  describe("listOperations", () => {
30
34
  it.skip("returns a list regarding address parameter", async () => {
31
35
  // When
32
- const [tx, _] = await api.listOperations(SENDER.address, { minHeight: 200 });
36
+ const [tx, _] = await api.listOperations(SENDER, { minHeight: 200 });
33
37
 
34
38
  // https://blockexplorer.one/xrp/testnet/address/rh1HPuRVsYYvThxG2Bs1MfjmrVC73S16Fb
35
39
  // as of 2025-03-18, the address has 287 transactions
36
40
  expect(tx.length).toBeGreaterThanOrEqual(287);
37
41
  tx.forEach(operation => {
38
42
  const isSenderOrReceipt =
39
- operation.senders.includes(SENDER.address) ||
40
- operation.recipients.includes(SENDER.address);
43
+ operation.senders.includes(SENDER) || operation.recipients.includes(SENDER);
41
44
  expect(isSenderOrReceipt).toBeTruthy();
42
45
  });
43
46
  });
@@ -81,7 +84,7 @@ describe("Xrp Api", () => {
81
84
 
82
85
  it("returns an amount above 0 when address has transactions", async () => {
83
86
  // When
84
- const result = await api.getBalance(SENDER.address);
87
+ const result = await api.getBalance(SENDER);
85
88
 
86
89
  // Then
87
90
  expect(result[0].asset).toEqual({ type: "native" });
@@ -93,7 +96,9 @@ describe("Xrp Api", () => {
93
96
  const result = await api.getBalance(SENDER_WITH_NO_TRANSACTION);
94
97
 
95
98
  // Then
96
- expect(result).toEqual([{ value: BigInt(0), asset: { type: "native" } }]);
99
+ expect(result).toEqual([
100
+ { locked: BigInt(1000000n), value: BigInt(0), asset: { type: "native" } },
101
+ ]);
97
102
  });
98
103
  });
99
104
 
@@ -108,10 +113,13 @@ describe("Xrp Api", () => {
108
113
  sender: SENDER,
109
114
  recipient: RECIPIENT,
110
115
  amount: BigInt(10),
116
+ memo: {
117
+ type: "map",
118
+ memos: new Map([["memos", ["testdata"]]]),
119
+ },
111
120
  });
112
-
113
121
  // Then
114
- expect(result.length).toEqual(162);
122
+ expect(result.length).toEqual(178);
115
123
  });
116
124
 
117
125
  it("should use default fees when user does not provide them for crafting a transaction", async () => {
@@ -121,6 +129,10 @@ describe("Xrp Api", () => {
121
129
  sender: SENDER,
122
130
  recipient: RECIPIENT,
123
131
  amount: BigInt(10),
132
+ memo: {
133
+ type: "map",
134
+ memos: new Map(),
135
+ },
124
136
  });
125
137
 
126
138
  const decodedTransaction = decode(result) as { Fee: string };
@@ -136,6 +148,10 @@ describe("Xrp Api", () => {
136
148
  sender: SENDER,
137
149
  recipient: RECIPIENT,
138
150
  amount: BigInt(10),
151
+ memo: {
152
+ type: "map",
153
+ memos: new Map(),
154
+ },
139
155
  },
140
156
  customFees,
141
157
  );
@@ -1,8 +1,8 @@
1
1
  import { Operation, TransactionIntent } from "@ledgerhq/coin-framework/api/types";
2
2
  import * as LogicFunctions from "../logic";
3
3
  import { GetTransactionsOptions } from "../network";
4
- import { NetworkInfo, XrpAsset } from "../types";
5
- import { createApi, TransactionIntentExtra, XrpSender } from "./index";
4
+ import { NetworkInfo, XrpAsset, XrpMapMemo } from "../types";
5
+ import { createApi } from "./index";
6
6
 
7
7
  const mockGetServerInfos = jest.fn().mockResolvedValue({
8
8
  info: {
@@ -285,11 +285,7 @@ describe("Testing craftTransaction function", () => {
285
285
  it("should use custom user fees when user provides it for crafting a transaction", async () => {
286
286
  const customFees = 99n;
287
287
  await api.craftTransaction(
288
- { sender: { address: "foo" } } as TransactionIntent<
289
- XrpAsset,
290
- TransactionIntentExtra,
291
- XrpSender
292
- >,
288
+ { sender: "foo" } as TransactionIntent<XrpAsset, XrpMapMemo>,
293
289
  customFees,
294
290
  );
295
291
 
@@ -303,11 +299,7 @@ describe("Testing craftTransaction function", () => {
303
299
  });
304
300
 
305
301
  it("should use default fees when user does not provide them for crafting a transaction", async () => {
306
- await api.craftTransaction({ sender: { address: "foo" } } as TransactionIntent<
307
- XrpAsset,
308
- TransactionIntentExtra,
309
- XrpSender
310
- >);
302
+ await api.craftTransaction({ sender: "foo" } as TransactionIntent<XrpAsset, XrpMapMemo>);
311
303
 
312
304
  expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
313
305
  expect.any(Object),
@@ -320,8 +312,9 @@ describe("Testing craftTransaction function", () => {
320
312
 
321
313
  it("should pass signing pub key when user provides it for crafting a transaction", async () => {
322
314
  await api.craftTransaction({
323
- sender: { address: "foo", publicKey: "bar" },
324
- } as TransactionIntent<XrpAsset, TransactionIntentExtra, XrpSender>);
315
+ sender: "foo",
316
+ senderPublicKey: "bar",
317
+ } as TransactionIntent<XrpAsset, XrpMapMemo>);
325
318
 
326
319
  expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
327
320
  expect.any(Object),
@@ -332,14 +325,19 @@ describe("Testing craftTransaction function", () => {
332
325
 
333
326
  it("should pass memos when user provides it for crafting a transaction", async () => {
334
327
  await api.craftTransaction({
335
- sender: { address: "foo" },
336
- memos: [{ data: "testdata", format: "testformat", type: "testtype" }],
337
- } as TransactionIntent<XrpAsset, TransactionIntentExtra, XrpSender>);
328
+ sender: "foo",
329
+ memo: {
330
+ type: "map",
331
+ memos: new Map([["memos", ["testdata"]]]),
332
+ },
333
+ } as TransactionIntent<XrpAsset, XrpMapMemo>);
338
334
 
339
335
  expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
340
336
  expect.any(Object),
341
337
  expect.objectContaining({
342
- memos: [{ data: "testdata", format: "testformat", type: "testtype" }],
338
+ // NOTE: before
339
+ // memos: [{ data: "testdata", format: "testformat", type: "testtype" }],
340
+ memos: [{ data: "testdata", type: "memo" }],
343
341
  }),
344
342
  undefined,
345
343
  );
@@ -347,14 +345,17 @@ describe("Testing craftTransaction function", () => {
347
345
 
348
346
  it("should pass destination tag when user provides it for crafting a transaction", async () => {
349
347
  await api.craftTransaction({
350
- sender: { address: "foo" },
351
- destinationTag: 1337,
352
- } as TransactionIntent<XrpAsset, TransactionIntentExtra, XrpSender>);
348
+ sender: "foo",
349
+ memo: {
350
+ type: "map",
351
+ memos: new Map([["destinationTag", "1337"]]),
352
+ },
353
+ } as TransactionIntent<XrpAsset, XrpMapMemo>);
353
354
 
354
355
  expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
355
356
  expect.any(Object),
356
357
  expect.objectContaining({
357
- destinationTag: 1337,
358
+ destinationTag: 1337, // logic should convert `value: string` -> `number`
358
359
  }),
359
360
  undefined,
360
361
  );
package/src/api/index.ts CHANGED
@@ -16,11 +16,11 @@ import {
16
16
  getNextValidSequence,
17
17
  lastBlock,
18
18
  listOperations,
19
- MemoInput,
19
+ getTransactionStatus,
20
20
  } from "../logic";
21
- import { ListOperationsOptions, XrpAsset } from "../types";
21
+ import { ListOperationsOptions, XrpAsset, XrpMapMemo } from "../types";
22
22
 
23
- export function createApi(config: XrpConfig): Api<XrpAsset, TransactionIntentExtra, XrpSender> {
23
+ export function createApi(config: XrpConfig): Api<XrpAsset, XrpMapMemo> {
24
24
  coinConfig.setCoinConfig(() => ({ ...config, status: { type: "active" } }));
25
25
 
26
26
  return {
@@ -31,36 +31,45 @@ export function createApi(config: XrpConfig): Api<XrpAsset, TransactionIntentExt
31
31
  getBalance,
32
32
  lastBlock,
33
33
  listOperations: operations,
34
+ validateIntent: getTransactionStatus,
34
35
  };
35
36
  }
36
37
 
37
- export type TransactionIntentExtra = {
38
- destinationTag?: number | null | undefined;
39
- memos?: MemoInput[];
40
- };
41
-
42
- export type XrpSender = {
43
- address: string;
44
- publicKey?: string;
45
- };
46
-
47
38
  async function craft(
48
- transactionIntent: TransactionIntent<XrpAsset, TransactionIntentExtra, XrpSender>,
39
+ transactionIntent: TransactionIntent<XrpAsset, XrpMapMemo>,
49
40
  customFees?: bigint,
50
41
  ): Promise<string> {
51
- const nextSequenceNumber = await getNextValidSequence(transactionIntent.sender.address);
42
+ const nextSequenceNumber = await getNextValidSequence(transactionIntent.sender);
52
43
  const estimatedFees = customFees !== undefined ? customFees : (await estimateFees()).fee;
44
+
45
+ const memosMap =
46
+ transactionIntent.memo?.type === "map" ? transactionIntent.memo.memos : new Map();
47
+
48
+ const destinationTagValue = memosMap.get("destinationTag");
49
+ const destinationTag =
50
+ typeof destinationTagValue === "string" ? Number(destinationTagValue) : undefined;
51
+
52
+ const memoStrings = memosMap.get("memos") as string[] | undefined;
53
+
54
+ let memoEntries: { type: string; data: string }[] = [];
55
+
56
+ if (Array.isArray(memoStrings) && memoStrings.length > 0) {
57
+ memoEntries = memoStrings.map(value => ({ type: "memo", data: value }));
58
+ }
59
+
53
60
  const tx = await craftTransaction(
54
- { address: transactionIntent.sender.address, nextSequenceNumber },
61
+ { address: transactionIntent.sender, nextSequenceNumber },
55
62
  {
56
63
  recipient: transactionIntent.recipient,
57
64
  amount: transactionIntent.amount,
58
65
  fee: estimatedFees,
59
- destinationTag: transactionIntent.destinationTag,
60
- memos: transactionIntent.memos,
66
+ destinationTag,
67
+ // NOTE: double check before/after here
68
+ memos: memoEntries,
61
69
  },
62
- transactionIntent.sender.publicKey,
70
+ transactionIntent.senderPublicKey,
63
71
  );
72
+
64
73
  return tx.serializedTransaction;
65
74
  }
66
75
 
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  export * from "./types";
2
2
 
3
- export { createBridges } from "./bridge/index";
4
3
  export type { XrpCoinConfig } from "./config";
@@ -8,11 +8,18 @@ type XRPTransaction = JsonObject & {
8
8
 
9
9
  export function combine(transaction: string, signature: string, publicKey?: string): string {
10
10
  const xrplTransaction: JsonObject = decode(transaction);
11
- let transactionWithSignature: XRPTransaction = { ...xrplTransaction, TxnSignature: signature };
11
+
12
+ let transactionWithSignature: XRPTransaction = { ...xrplTransaction } as any;
12
13
 
13
14
  if (publicKey) {
14
- transactionWithSignature = { ...transactionWithSignature, SigningPubKey: publicKey };
15
+ transactionWithSignature = {
16
+ ...transactionWithSignature,
17
+ SigningPubKey: publicKey,
18
+ };
15
19
  }
16
20
 
17
- return encode(transactionWithSignature);
21
+ transactionWithSignature = { ...transactionWithSignature, TxnSignature: signature };
22
+
23
+ const encoded = encode(transactionWithSignature).toUpperCase();
24
+ return encoded;
18
25
  }
@@ -2,21 +2,33 @@ import { faker } from "@faker-js/faker";
2
2
  import { getBalance } from "./getBalance";
3
3
 
4
4
  const mockGetAccountInfo = jest.fn();
5
+ const mockGetServerInfos = jest.fn();
5
6
  jest.mock("../network", () => ({
6
7
  getAccountInfo: (address: string) => mockGetAccountInfo(address),
8
+ getServerInfos: () => mockGetServerInfos(),
7
9
  }));
8
10
 
9
11
  describe("getBalance", () => {
10
12
  afterEach(() => {
11
13
  mockGetAccountInfo.mockClear();
14
+ mockGetServerInfos.mockClear();
12
15
  });
13
16
 
14
17
  it("returns the balance from Explorer", async () => {
18
+ mockGetServerInfos.mockResolvedValue({
19
+ info: {
20
+ validated_ledger: {
21
+ reserve_base_xrp: 23,
22
+ reserve_inc_xrp: 5,
23
+ },
24
+ },
25
+ });
15
26
  // Given
16
27
  const balance = faker.number.bigInt(100_000_000);
17
28
  const address = "ACCOUNT_ADDRESS";
18
29
  mockGetAccountInfo.mockResolvedValue({
19
30
  balance,
31
+ ownerCount: 0,
20
32
  });
21
33
 
22
34
  // When
@@ -24,7 +36,8 @@ describe("getBalance", () => {
24
36
 
25
37
  // Then
26
38
  expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
39
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
27
40
  expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
28
- expect(result).toEqual([{ value: balance, asset: { type: "native" } }]);
41
+ expect(result).toEqual([{ value: balance, asset: { type: "native" }, locked: 23000000n }]);
29
42
  });
30
43
  });
@@ -1,8 +1,24 @@
1
1
  import { Balance } from "@ledgerhq/coin-framework/api/types";
2
- import { getAccountInfo } from "../network";
2
+ import { getAccountInfo, getServerInfos } from "../network";
3
3
  import { XrpAsset } from "../types";
4
+ import { parseAPIValue } from "./common";
4
5
 
5
6
  export async function getBalance(address: string): Promise<Balance<XrpAsset>[]> {
6
7
  const accountInfo = await getAccountInfo(address);
7
- return [{ value: BigInt(accountInfo.balance), asset: { type: "native" } }];
8
+ const serverInfo = await getServerInfos();
9
+
10
+ const reserveMinXRP = parseAPIValue(serverInfo.info.validated_ledger.reserve_base_xrp.toString());
11
+ const reservePerTrustline = parseAPIValue(
12
+ serverInfo.info.validated_ledger.reserve_inc_xrp.toString(),
13
+ );
14
+ const trustlines = accountInfo.ownerCount;
15
+
16
+ const locked = reserveMinXRP.plus(reservePerTrustline.times(trustlines));
17
+ return [
18
+ {
19
+ value: BigInt(accountInfo.balance),
20
+ asset: { type: "native" },
21
+ locked: BigInt(locked.toString()),
22
+ },
23
+ ];
8
24
  }