@ledgerhq/live-common 34.36.0 → 34.37.0-next.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 (323) hide show
  1. package/lib/__tests__/test-helpers/bridge.d.ts.map +1 -1
  2. package/lib/__tests__/test-helpers/bridge.js +4 -4
  3. package/lib/__tests__/test-helpers/bridge.js.map +1 -1
  4. package/lib/apps/config.d.ts.map +1 -1
  5. package/lib/apps/config.js +6 -0
  6. package/lib/apps/config.js.map +1 -1
  7. package/lib/bridge/generic-alpaca/accountBridge.d.ts +3 -0
  8. package/lib/bridge/generic-alpaca/accountBridge.d.ts.map +1 -0
  9. package/lib/bridge/generic-alpaca/accountBridge.js +34 -0
  10. package/lib/bridge/generic-alpaca/accountBridge.js.map +1 -0
  11. package/lib/bridge/generic-alpaca/alpaca/index.d.ts +3 -0
  12. package/lib/bridge/generic-alpaca/alpaca/index.d.ts.map +1 -0
  13. package/lib/bridge/generic-alpaca/alpaca/index.js +20 -0
  14. package/lib/bridge/generic-alpaca/alpaca/index.js.map +1 -0
  15. package/lib/bridge/generic-alpaca/alpaca/network/network-alpaca.d.ts +16 -0
  16. package/lib/bridge/generic-alpaca/alpaca/network/network-alpaca.d.ts.map +1 -0
  17. package/lib/bridge/generic-alpaca/alpaca/network/network-alpaca.js +123 -0
  18. package/lib/bridge/generic-alpaca/alpaca/network/network-alpaca.js.map +1 -0
  19. package/lib/bridge/generic-alpaca/broadcast.d.ts +3 -0
  20. package/lib/bridge/generic-alpaca/broadcast.d.ts.map +1 -0
  21. package/lib/bridge/generic-alpaca/broadcast.js +11 -0
  22. package/lib/bridge/generic-alpaca/broadcast.js.map +1 -0
  23. package/lib/bridge/generic-alpaca/createTransaction.d.ts +16 -0
  24. package/lib/bridge/generic-alpaca/createTransaction.d.ts.map +1 -0
  25. package/lib/bridge/generic-alpaca/createTransaction.js +20 -0
  26. package/lib/bridge/generic-alpaca/createTransaction.js.map +1 -0
  27. package/lib/bridge/generic-alpaca/currencyBridge.d.ts +3 -0
  28. package/lib/bridge/generic-alpaca/currencyBridge.d.ts.map +1 -0
  29. package/lib/bridge/generic-alpaca/currencyBridge.js +20 -0
  30. package/lib/bridge/generic-alpaca/currencyBridge.js.map +1 -0
  31. package/lib/bridge/generic-alpaca/estimateMaxSpendable.d.ts +3 -0
  32. package/lib/bridge/generic-alpaca/estimateMaxSpendable.d.ts.map +1 -0
  33. package/lib/bridge/generic-alpaca/estimateMaxSpendable.js +26 -0
  34. package/lib/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -0
  35. package/lib/bridge/generic-alpaca/getAccountShape.d.ts +3 -0
  36. package/lib/bridge/generic-alpaca/getAccountShape.d.ts.map +1 -0
  37. package/lib/bridge/generic-alpaca/getAccountShape.js +58 -0
  38. package/lib/bridge/generic-alpaca/getAccountShape.js.map +1 -0
  39. package/lib/bridge/generic-alpaca/getTransactionStatus.d.ts +3 -0
  40. package/lib/bridge/generic-alpaca/getTransactionStatus.d.ts.map +1 -0
  41. package/lib/bridge/generic-alpaca/getTransactionStatus.js +36 -0
  42. package/lib/bridge/generic-alpaca/getTransactionStatus.js.map +1 -0
  43. package/lib/bridge/generic-alpaca/prepareTransaction.d.ts +3 -0
  44. package/lib/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -0
  45. package/lib/bridge/generic-alpaca/prepareTransaction.js +21 -0
  46. package/lib/bridge/generic-alpaca/prepareTransaction.js.map +1 -0
  47. package/lib/bridge/generic-alpaca/signOperation.d.ts +7 -0
  48. package/lib/bridge/generic-alpaca/signOperation.d.ts.map +1 -0
  49. package/lib/bridge/generic-alpaca/signOperation.js +49 -0
  50. package/lib/bridge/generic-alpaca/signOperation.js.map +1 -0
  51. package/lib/bridge/generic-alpaca/signer/index.d.ts +11 -0
  52. package/lib/bridge/generic-alpaca/signer/index.d.ts.map +1 -0
  53. package/lib/bridge/generic-alpaca/signer/index.js +28 -0
  54. package/lib/bridge/generic-alpaca/signer/index.js.map +1 -0
  55. package/lib/bridge/generic-alpaca/signer/signTransaction.d.ts +5 -0
  56. package/lib/bridge/generic-alpaca/signer/signTransaction.d.ts.map +1 -0
  57. package/lib/bridge/generic-alpaca/signer/signTransaction.js +11 -0
  58. package/lib/bridge/generic-alpaca/signer/signTransaction.js.map +1 -0
  59. package/lib/bridge/generic-alpaca/signer/types.d.ts +5 -0
  60. package/lib/bridge/generic-alpaca/signer/types.d.ts.map +1 -0
  61. package/lib/bridge/generic-alpaca/signer/types.js +3 -0
  62. package/lib/bridge/generic-alpaca/signer/types.js.map +1 -0
  63. package/lib/bridge/generic-alpaca/tests/estimateMaxSpendable.test.d.ts +2 -0
  64. package/lib/bridge/generic-alpaca/tests/estimateMaxSpendable.test.d.ts.map +1 -0
  65. package/lib/bridge/generic-alpaca/tests/estimateMaxSpendable.test.js +90 -0
  66. package/lib/bridge/generic-alpaca/tests/estimateMaxSpendable.test.js.map +1 -0
  67. package/lib/bridge/generic-alpaca/tests/prepareTransaction.test.d.ts +2 -0
  68. package/lib/bridge/generic-alpaca/tests/prepareTransaction.test.d.ts.map +1 -0
  69. package/lib/bridge/generic-alpaca/tests/prepareTransaction.test.js +53 -0
  70. package/lib/bridge/generic-alpaca/tests/prepareTransaction.test.js.map +1 -0
  71. package/lib/bridge/generic-alpaca/tests/signOperation.test.d.ts +2 -0
  72. package/lib/bridge/generic-alpaca/tests/signOperation.test.d.ts.map +1 -0
  73. package/lib/bridge/generic-alpaca/tests/signOperation.test.js +79 -0
  74. package/lib/bridge/generic-alpaca/tests/signOperation.test.js.map +1 -0
  75. package/lib/bridge/generic-alpaca/utils.d.ts +6 -0
  76. package/lib/bridge/generic-alpaca/utils.d.ts.map +1 -0
  77. package/lib/bridge/generic-alpaca/utils.js +55 -0
  78. package/lib/bridge/generic-alpaca/utils.js.map +1 -0
  79. package/lib/bridge/impl.d.ts.map +1 -1
  80. package/lib/bridge/impl.js +59 -3
  81. package/lib/bridge/impl.js.map +1 -1
  82. package/lib/config/index.d.ts +3 -2
  83. package/lib/config/index.d.ts.map +1 -1
  84. package/lib/config/index.js +9 -1
  85. package/lib/config/index.js.map +1 -1
  86. package/lib/config/sharedConfig.d.ts.map +1 -1
  87. package/lib/config/sharedConfig.js +7 -0
  88. package/lib/config/sharedConfig.js.map +1 -1
  89. package/lib/e2e/enum/OperationType.d.ts +5 -0
  90. package/lib/e2e/enum/OperationType.d.ts.map +1 -0
  91. package/lib/e2e/enum/OperationType.js +9 -0
  92. package/lib/e2e/enum/OperationType.js.map +1 -0
  93. package/lib/e2e/enum/{Swap.d.ts → Provider.d.ts} +2 -1
  94. package/lib/e2e/enum/Provider.d.ts.map +1 -0
  95. package/lib/e2e/enum/{Swap.js → Provider.js} +2 -1
  96. package/lib/e2e/enum/Provider.js.map +1 -0
  97. package/lib/e2e/index.d.ts +4 -2
  98. package/lib/e2e/index.d.ts.map +1 -1
  99. package/lib/e2e/models/BuySell.d.ts +2 -0
  100. package/lib/e2e/models/BuySell.d.ts.map +1 -1
  101. package/lib/env.react.d.ts +1 -1
  102. package/lib/env.react.d.ts.map +1 -1
  103. package/lib/families/casper/bridge.integration.test.js +2 -2
  104. package/lib/families/casper/bridge.integration.test.js.map +1 -1
  105. package/lib/families/casper/config.d.ts +2 -2
  106. package/lib/families/casper/config.d.ts.map +1 -1
  107. package/lib/families/casper/config.js +4 -0
  108. package/lib/families/casper/config.js.map +1 -1
  109. package/lib/families/casper/setup.d.ts +1 -1
  110. package/lib/families/casper/setup.d.ts.map +1 -1
  111. package/lib/families/casper/setup.js +7 -4
  112. package/lib/families/casper/setup.js.map +1 -1
  113. package/lib/families/casper/types.d.ts +1 -1
  114. package/lib/families/casper/types.d.ts.map +1 -1
  115. package/lib/families/casper/types.js +1 -1
  116. package/lib/families/casper/types.js.map +1 -1
  117. package/lib/families/xrp/setup.d.ts +3 -6
  118. package/lib/families/xrp/setup.d.ts.map +1 -1
  119. package/lib/families/xrp/setup.js +1 -7
  120. package/lib/families/xrp/setup.js.map +1 -1
  121. package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
  122. package/lib/featureFlags/defaultFeatures.js +2 -0
  123. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  124. package/lib/featureFlags/useFeature.d.ts +1 -1
  125. package/lib/featureFlags/useFeature.d.ts.map +1 -1
  126. package/lib/generated/bridge/js.d.ts +0 -1
  127. package/lib/generated/bridge/js.d.ts.map +1 -1
  128. package/lib/generated/bridge/js.js +4 -6
  129. package/lib/generated/bridge/js.js.map +1 -1
  130. package/lib/hooks/useOFACGeoBlockCheck.d.ts +8 -0
  131. package/lib/hooks/useOFACGeoBlockCheck.d.ts.map +1 -0
  132. package/lib/hooks/useOFACGeoBlockCheck.js +32 -0
  133. package/lib/hooks/useOFACGeoBlockCheck.js.map +1 -0
  134. package/lib/sanction/errors.d.ts +13 -0
  135. package/lib/sanction/errors.d.ts.map +1 -0
  136. package/lib/sanction/errors.js +36 -0
  137. package/lib/sanction/errors.js.map +1 -0
  138. package/lib/sanction/index.d.ts +3 -0
  139. package/lib/sanction/index.d.ts.map +1 -0
  140. package/lib/sanction/index.js +51 -0
  141. package/lib/sanction/index.js.map +1 -0
  142. package/lib-es/__tests__/test-helpers/bridge.d.ts.map +1 -1
  143. package/lib-es/__tests__/test-helpers/bridge.js +4 -4
  144. package/lib-es/__tests__/test-helpers/bridge.js.map +1 -1
  145. package/lib-es/apps/config.d.ts.map +1 -1
  146. package/lib-es/apps/config.js +6 -0
  147. package/lib-es/apps/config.js.map +1 -1
  148. package/lib-es/bridge/generic-alpaca/accountBridge.d.ts +3 -0
  149. package/lib-es/bridge/generic-alpaca/accountBridge.d.ts.map +1 -0
  150. package/lib-es/bridge/generic-alpaca/accountBridge.js +27 -0
  151. package/lib-es/bridge/generic-alpaca/accountBridge.js.map +1 -0
  152. package/lib-es/bridge/generic-alpaca/alpaca/index.d.ts +3 -0
  153. package/lib-es/bridge/generic-alpaca/alpaca/index.d.ts.map +1 -0
  154. package/lib-es/bridge/generic-alpaca/alpaca/index.js +16 -0
  155. package/lib-es/bridge/generic-alpaca/alpaca/index.js.map +1 -0
  156. package/lib-es/bridge/generic-alpaca/alpaca/network/network-alpaca.d.ts +16 -0
  157. package/lib-es/bridge/generic-alpaca/alpaca/network/network-alpaca.d.ts.map +1 -0
  158. package/lib-es/bridge/generic-alpaca/alpaca/network/network-alpaca.js +116 -0
  159. package/lib-es/bridge/generic-alpaca/alpaca/network/network-alpaca.js.map +1 -0
  160. package/lib-es/bridge/generic-alpaca/broadcast.d.ts +3 -0
  161. package/lib-es/bridge/generic-alpaca/broadcast.d.ts.map +1 -0
  162. package/lib-es/bridge/generic-alpaca/broadcast.js +7 -0
  163. package/lib-es/bridge/generic-alpaca/broadcast.js.map +1 -0
  164. package/lib-es/bridge/generic-alpaca/createTransaction.d.ts +16 -0
  165. package/lib-es/bridge/generic-alpaca/createTransaction.d.ts.map +1 -0
  166. package/lib-es/bridge/generic-alpaca/createTransaction.js +13 -0
  167. package/lib-es/bridge/generic-alpaca/createTransaction.js.map +1 -0
  168. package/lib-es/bridge/generic-alpaca/currencyBridge.d.ts +3 -0
  169. package/lib-es/bridge/generic-alpaca/currencyBridge.d.ts.map +1 -0
  170. package/lib-es/bridge/generic-alpaca/currencyBridge.js +16 -0
  171. package/lib-es/bridge/generic-alpaca/currencyBridge.js.map +1 -0
  172. package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.d.ts +3 -0
  173. package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.d.ts.map +1 -0
  174. package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js +19 -0
  175. package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -0
  176. package/lib-es/bridge/generic-alpaca/getAccountShape.d.ts +3 -0
  177. package/lib-es/bridge/generic-alpaca/getAccountShape.d.ts.map +1 -0
  178. package/lib-es/bridge/generic-alpaca/getAccountShape.js +51 -0
  179. package/lib-es/bridge/generic-alpaca/getAccountShape.js.map +1 -0
  180. package/lib-es/bridge/generic-alpaca/getTransactionStatus.d.ts +3 -0
  181. package/lib-es/bridge/generic-alpaca/getTransactionStatus.d.ts.map +1 -0
  182. package/lib-es/bridge/generic-alpaca/getTransactionStatus.js +29 -0
  183. package/lib-es/bridge/generic-alpaca/getTransactionStatus.js.map +1 -0
  184. package/lib-es/bridge/generic-alpaca/prepareTransaction.d.ts +3 -0
  185. package/lib-es/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -0
  186. package/lib-es/bridge/generic-alpaca/prepareTransaction.js +14 -0
  187. package/lib-es/bridge/generic-alpaca/prepareTransaction.js.map +1 -0
  188. package/lib-es/bridge/generic-alpaca/signOperation.d.ts +7 -0
  189. package/lib-es/bridge/generic-alpaca/signOperation.d.ts.map +1 -0
  190. package/lib-es/bridge/generic-alpaca/signOperation.js +45 -0
  191. package/lib-es/bridge/generic-alpaca/signOperation.js.map +1 -0
  192. package/lib-es/bridge/generic-alpaca/signer/index.d.ts +11 -0
  193. package/lib-es/bridge/generic-alpaca/signer/index.d.ts.map +1 -0
  194. package/lib-es/bridge/generic-alpaca/signer/index.js +21 -0
  195. package/lib-es/bridge/generic-alpaca/signer/index.js.map +1 -0
  196. package/lib-es/bridge/generic-alpaca/signer/signTransaction.d.ts +5 -0
  197. package/lib-es/bridge/generic-alpaca/signer/signTransaction.d.ts.map +1 -0
  198. package/lib-es/bridge/generic-alpaca/signer/signTransaction.js +7 -0
  199. package/lib-es/bridge/generic-alpaca/signer/signTransaction.js.map +1 -0
  200. package/lib-es/bridge/generic-alpaca/signer/types.d.ts +5 -0
  201. package/lib-es/bridge/generic-alpaca/signer/types.d.ts.map +1 -0
  202. package/lib-es/bridge/generic-alpaca/signer/types.js +2 -0
  203. package/lib-es/bridge/generic-alpaca/signer/types.js.map +1 -0
  204. package/lib-es/bridge/generic-alpaca/tests/estimateMaxSpendable.test.d.ts +2 -0
  205. package/lib-es/bridge/generic-alpaca/tests/estimateMaxSpendable.test.d.ts.map +1 -0
  206. package/lib-es/bridge/generic-alpaca/tests/estimateMaxSpendable.test.js +62 -0
  207. package/lib-es/bridge/generic-alpaca/tests/estimateMaxSpendable.test.js.map +1 -0
  208. package/lib-es/bridge/generic-alpaca/tests/prepareTransaction.test.d.ts +2 -0
  209. package/lib-es/bridge/generic-alpaca/tests/prepareTransaction.test.d.ts.map +1 -0
  210. package/lib-es/bridge/generic-alpaca/tests/prepareTransaction.test.js +48 -0
  211. package/lib-es/bridge/generic-alpaca/tests/prepareTransaction.test.js.map +1 -0
  212. package/lib-es/bridge/generic-alpaca/tests/signOperation.test.d.ts +2 -0
  213. package/lib-es/bridge/generic-alpaca/tests/signOperation.test.d.ts.map +1 -0
  214. package/lib-es/bridge/generic-alpaca/tests/signOperation.test.js +77 -0
  215. package/lib-es/bridge/generic-alpaca/tests/signOperation.test.js.map +1 -0
  216. package/lib-es/bridge/generic-alpaca/utils.d.ts +6 -0
  217. package/lib-es/bridge/generic-alpaca/utils.d.ts.map +1 -0
  218. package/lib-es/bridge/generic-alpaca/utils.js +46 -0
  219. package/lib-es/bridge/generic-alpaca/utils.js.map +1 -0
  220. package/lib-es/bridge/impl.d.ts.map +1 -1
  221. package/lib-es/bridge/impl.js +59 -3
  222. package/lib-es/bridge/impl.js.map +1 -1
  223. package/lib-es/config/index.d.ts +3 -2
  224. package/lib-es/config/index.d.ts.map +1 -1
  225. package/lib-es/config/index.js +8 -1
  226. package/lib-es/config/index.js.map +1 -1
  227. package/lib-es/config/sharedConfig.d.ts.map +1 -1
  228. package/lib-es/config/sharedConfig.js +7 -0
  229. package/lib-es/config/sharedConfig.js.map +1 -1
  230. package/lib-es/e2e/enum/OperationType.d.ts +5 -0
  231. package/lib-es/e2e/enum/OperationType.d.ts.map +1 -0
  232. package/lib-es/e2e/enum/OperationType.js +6 -0
  233. package/lib-es/e2e/enum/OperationType.js.map +1 -0
  234. package/lib-es/e2e/enum/{Swap.d.ts → Provider.d.ts} +2 -1
  235. package/lib-es/e2e/enum/Provider.d.ts.map +1 -0
  236. package/lib-es/e2e/enum/{Swap.js → Provider.js} +2 -1
  237. package/lib-es/e2e/enum/Provider.js.map +1 -0
  238. package/lib-es/e2e/index.d.ts +4 -2
  239. package/lib-es/e2e/index.d.ts.map +1 -1
  240. package/lib-es/e2e/models/BuySell.d.ts +2 -0
  241. package/lib-es/e2e/models/BuySell.d.ts.map +1 -1
  242. package/lib-es/env.react.d.ts +1 -1
  243. package/lib-es/env.react.d.ts.map +1 -1
  244. package/lib-es/families/casper/bridge.integration.test.js +1 -1
  245. package/lib-es/families/casper/bridge.integration.test.js.map +1 -1
  246. package/lib-es/families/casper/config.d.ts +2 -2
  247. package/lib-es/families/casper/config.d.ts.map +1 -1
  248. package/lib-es/families/casper/config.js +4 -0
  249. package/lib-es/families/casper/config.js.map +1 -1
  250. package/lib-es/families/casper/setup.d.ts +1 -1
  251. package/lib-es/families/casper/setup.d.ts.map +1 -1
  252. package/lib-es/families/casper/setup.js +6 -3
  253. package/lib-es/families/casper/setup.js.map +1 -1
  254. package/lib-es/families/casper/types.d.ts +1 -1
  255. package/lib-es/families/casper/types.d.ts.map +1 -1
  256. package/lib-es/families/casper/types.js +1 -1
  257. package/lib-es/families/casper/types.js.map +1 -1
  258. package/lib-es/families/xrp/setup.d.ts +3 -6
  259. package/lib-es/families/xrp/setup.d.ts.map +1 -1
  260. package/lib-es/families/xrp/setup.js +2 -7
  261. package/lib-es/families/xrp/setup.js.map +1 -1
  262. package/lib-es/featureFlags/defaultFeatures.d.ts.map +1 -1
  263. package/lib-es/featureFlags/defaultFeatures.js +2 -0
  264. package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
  265. package/lib-es/featureFlags/useFeature.d.ts +1 -1
  266. package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
  267. package/lib-es/generated/bridge/js.d.ts +0 -1
  268. package/lib-es/generated/bridge/js.d.ts.map +1 -1
  269. package/lib-es/generated/bridge/js.js +0 -2
  270. package/lib-es/generated/bridge/js.js.map +1 -1
  271. package/lib-es/hooks/useOFACGeoBlockCheck.d.ts +8 -0
  272. package/lib-es/hooks/useOFACGeoBlockCheck.d.ts.map +1 -0
  273. package/lib-es/hooks/useOFACGeoBlockCheck.js +28 -0
  274. package/lib-es/hooks/useOFACGeoBlockCheck.js.map +1 -0
  275. package/lib-es/sanction/errors.d.ts +13 -0
  276. package/lib-es/sanction/errors.d.ts.map +1 -0
  277. package/lib-es/sanction/errors.js +29 -0
  278. package/lib-es/sanction/errors.js.map +1 -0
  279. package/lib-es/sanction/index.d.ts +3 -0
  280. package/lib-es/sanction/index.d.ts.map +1 -0
  281. package/lib-es/sanction/index.js +44 -0
  282. package/lib-es/sanction/index.js.map +1 -0
  283. package/package.json +47 -46
  284. package/src/__tests__/test-helpers/bridge.ts +2 -4
  285. package/src/apps/config.ts +6 -0
  286. package/src/bridge/generic-alpaca/accountBridge.ts +32 -0
  287. package/src/bridge/generic-alpaca/alpaca/index.ts +20 -0
  288. package/src/bridge/generic-alpaca/alpaca/network/network-alpaca.ts +182 -0
  289. package/src/bridge/generic-alpaca/broadcast.ts +11 -0
  290. package/src/bridge/generic-alpaca/createTransaction.ts +27 -0
  291. package/src/bridge/generic-alpaca/currencyBridge.ts +17 -0
  292. package/src/bridge/generic-alpaca/estimateMaxSpendable.ts +27 -0
  293. package/src/bridge/generic-alpaca/getAccountShape.ts +62 -0
  294. package/src/bridge/generic-alpaca/getTransactionStatus.ts +38 -0
  295. package/src/bridge/generic-alpaca/prepareTransaction.ts +22 -0
  296. package/src/bridge/generic-alpaca/signOperation.ts +83 -0
  297. package/src/bridge/generic-alpaca/signer/index.ts +33 -0
  298. package/src/bridge/generic-alpaca/signer/signTransaction.ts +13 -0
  299. package/src/bridge/generic-alpaca/signer/types.ts +4 -0
  300. package/src/bridge/generic-alpaca/tests/estimateMaxSpendable.test.ts +76 -0
  301. package/src/bridge/generic-alpaca/tests/prepareTransaction.test.ts +66 -0
  302. package/src/bridge/generic-alpaca/tests/signOperation.test.ts +96 -0
  303. package/src/bridge/generic-alpaca/utils.ts +63 -0
  304. package/src/bridge/impl.ts +87 -5
  305. package/src/config/index.ts +11 -2
  306. package/src/config/sharedConfig.ts +8 -0
  307. package/src/e2e/enum/OperationType.ts +4 -0
  308. package/src/e2e/enum/{Swap.ts → Provider.ts} +1 -0
  309. package/src/e2e/models/BuySell.ts +2 -0
  310. package/src/families/casper/bridge.integration.test.ts +1 -1
  311. package/src/families/casper/config.ts +6 -2
  312. package/src/families/casper/setup.ts +10 -3
  313. package/src/families/casper/types.ts +1 -1
  314. package/src/families/xrp/setup.ts +2 -15
  315. package/src/featureFlags/defaultFeatures.ts +2 -0
  316. package/src/generated/bridge/js.ts +0 -2
  317. package/src/hooks/useOFACGeoBlockCheck.ts +37 -0
  318. package/src/sanction/errors.ts +31 -0
  319. package/src/sanction/index.ts +59 -0
  320. package/lib/e2e/enum/Swap.d.ts.map +0 -1
  321. package/lib/e2e/enum/Swap.js.map +0 -1
  322. package/lib-es/e2e/enum/Swap.d.ts.map +0 -1
  323. package/lib-es/e2e/enum/Swap.js.map +0 -1
@@ -68,6 +68,12 @@ const appConfig: Record<string, ConfigInfo> = {
68
68
  minVersion: "2.4.5",
69
69
  },
70
70
  },
71
+ config_nanoapp_casper: {
72
+ type: "object",
73
+ default: {
74
+ minVersion: "3.0.7",
75
+ },
76
+ },
71
77
  };
72
78
 
73
79
  export { appConfig };
@@ -0,0 +1,32 @@
1
+ import { AccountBridge } from "@ledgerhq/types-live";
2
+ import { makeSync } from "../jsHelpers";
3
+ import { genericGetAccountShape } from "./getAccountShape";
4
+ import {
5
+ getSerializedAddressParameters,
6
+ makeAccountBridgeReceive,
7
+ updateTransaction,
8
+ } from "@ledgerhq/coin-framework/bridge/jsHelpers";
9
+ import getAddressWrapper from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
10
+ import { getSigner } from "./signer";
11
+ import { genericPrepareTransaction } from "./prepareTransaction";
12
+ import { genericGetTransactionStatus } from "./getTransactionStatus";
13
+ import { genericEstimateMaxSpendable } from "./estimateMaxSpendable";
14
+ import { createTransaction } from "./createTransaction";
15
+ import { genericBroadcast } from "./broadcast";
16
+ import { genericSignOperation } from "./signOperation";
17
+
18
+ export function getAlpacaAccountBridge(network: string, kind: string): AccountBridge<any> {
19
+ const signer = getSigner(network);
20
+ return {
21
+ sync: makeSync({ getAccountShape: genericGetAccountShape(network, kind) }),
22
+ receive: makeAccountBridgeReceive(getAddressWrapper(signer.getAddress)),
23
+ createTransaction: createTransaction,
24
+ updateTransaction: updateTransaction<any>,
25
+ prepareTransaction: genericPrepareTransaction(network, kind),
26
+ getTransactionStatus: genericGetTransactionStatus(network, kind),
27
+ estimateMaxSpendable: genericEstimateMaxSpendable(network, kind),
28
+ broadcast: genericBroadcast(network, kind),
29
+ signOperation: genericSignOperation(network, kind)(signer.context),
30
+ getSerializedAddressParameters, // NOTE: check wether it should be exposed by coin-module's api instead?
31
+ } satisfies Partial<AccountBridge<any>> as AccountBridge<any>;
32
+ }
@@ -0,0 +1,20 @@
1
+ import { createApi as createXrpApi } from "@ledgerhq/coin-xrp/api/index";
2
+ import { getCurrencyConfiguration } from "../../../config";
3
+ import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
4
+ import { getNetworkAlpacaApi } from "./network/network-alpaca";
5
+ import { Api } from "@ledgerhq/coin-framework/api/types";
6
+ import { XrpCoinConfig } from "@ledgerhq/coin-xrp/config";
7
+
8
+ export function getAlpacaApi(network: string, kind: "local" | "remote"): Api<any, any> {
9
+ if (kind === "local") {
10
+ switch (network) {
11
+ case "ripple":
12
+ case "xrp":
13
+ return createXrpApi(
14
+ getCurrencyConfiguration<XrpCoinConfig>(getCryptoCurrencyById("ripple")),
15
+ ) as Api<any, any>;
16
+ // as unknown as Api<any>; // FIXME: createXrpApi returns a strongly typed Api<XrpSender>, fix Api<any> to allow it
17
+ }
18
+ }
19
+ return getNetworkAlpacaApi(network) satisfies Partial<Api<any, any>> as Api<any, any>;
20
+ }
@@ -0,0 +1,182 @@
1
+ import type {
2
+ // Api,
3
+ Account,
4
+ Balance,
5
+ BlockInfo,
6
+ Operation,
7
+ FeeEstimation,
8
+ Pagination,
9
+ TransactionIntent,
10
+ Transaction,
11
+ TransactionValidation,
12
+ Api,
13
+ } from "@ledgerhq/coin-framework/api/index";
14
+ import network from "@ledgerhq/live-network";
15
+
16
+ function adaptOp(backendOp: any): Operation<any> {
17
+ const { date } = backendOp.tx;
18
+ const newDate = new Date(date);
19
+
20
+ return {
21
+ ...backendOp,
22
+ value: BigInt(backendOp.value),
23
+ tx: { ...backendOp.tx, fees: BigInt(backendOp.tx.fees), date: newDate },
24
+ };
25
+ }
26
+
27
+ const ALPACA_URL = "https://localhost:3000";
28
+
29
+ const buildBroadcast = networkFamily =>
30
+ async function broadcast(signedOperation: string): Promise<string> {
31
+ const { data } = await network<
32
+ {
33
+ transactionIdentifier: string;
34
+ },
35
+ {
36
+ rawTransaction: string;
37
+ }
38
+ >({
39
+ method: "POST",
40
+ url: `${ALPACA_URL}/${networkFamily}/transaction/broadcast`,
41
+ data: {
42
+ rawTransaction: signedOperation,
43
+ },
44
+ });
45
+ return data.transactionIdentifier;
46
+ };
47
+
48
+ const buildCombine = networkFamily =>
49
+ async function combine(tx: string, signature: string, pubKey?: string): Promise<string> {
50
+ const { data } = await network<
51
+ {
52
+ signedTransaction: string;
53
+ },
54
+ unknown
55
+ >({
56
+ method: "POST",
57
+ url: `${ALPACA_URL}/${networkFamily}/transaction/combine`,
58
+ data: {
59
+ raw_transaction: tx,
60
+ signature: signature,
61
+ pubkey: pubKey,
62
+ },
63
+ });
64
+ return data.signedTransaction;
65
+ };
66
+
67
+ const buildEstimateFees = networkFamily =>
68
+ async function estimateFees(intent: TransactionIntent<any>): Promise<FeeEstimation> {
69
+ const { data } = await network<{ fee: string }, unknown>({
70
+ method: "POST",
71
+ url: `${ALPACA_URL}/${networkFamily}/transaction/estimate`,
72
+ data: {
73
+ intent: {
74
+ ...intent,
75
+ amount: intent.amount.toString(10),
76
+ },
77
+ },
78
+ });
79
+ return {
80
+ value: BigInt(data.fee),
81
+ };
82
+ };
83
+
84
+ const buildValidateIntent = networkFamily =>
85
+ async function validateIntent(
86
+ account: Account,
87
+ transaction: Transaction,
88
+ ): Promise<TransactionValidation> {
89
+ const { data } = await network<
90
+ {
91
+ errors: Record<string, Error>;
92
+ warnings: Record<string, Error>;
93
+ estimatedFees: bigint;
94
+ amount: bigint;
95
+ totalSpent: bigint;
96
+ },
97
+ unknown
98
+ >({
99
+ method: "POST",
100
+ url: `${ALPACA_URL}/${networkFamily}/transaction/validate`,
101
+ data: {
102
+ transaction,
103
+ account,
104
+ },
105
+ });
106
+ return data;
107
+ };
108
+
109
+ // FIXME: shouldn't hardcode
110
+ type AssetInfo = {
111
+ type: "native"; // or "token" if applicable
112
+ };
113
+
114
+ const buildGetBalance = (networkFamily: string) =>
115
+ async function getBalance(address: string): Promise<Balance<AssetInfo>[]> {
116
+ const { data } = await network<Balance<AssetInfo>, unknown>({
117
+ method: "GET",
118
+ url: `${ALPACA_URL}/${networkFamily}/account/${address}/balance`,
119
+ });
120
+
121
+ return [
122
+ {
123
+ value: BigInt(data.value),
124
+ asset: data.asset,
125
+ },
126
+ ];
127
+ };
128
+
129
+ const buildListOperations = networkFamily =>
130
+ async function listOperations(
131
+ address: string,
132
+ pagination: Pagination,
133
+ ): Promise<[Operation<any>[], string]> {
134
+ const { data } = await network<{ operations: Operation<any>[] }, unknown>({
135
+ method: "GET",
136
+ url: `${ALPACA_URL}/${networkFamily}/account/${address}/operations`,
137
+ data: {
138
+ from: pagination.minHeight,
139
+ },
140
+ });
141
+ return [data.operations.map(op => adaptOp(op)), ""];
142
+ };
143
+
144
+ const buildLastBlock = networkFamily =>
145
+ async function lastBlock(): Promise<BlockInfo> {
146
+ const { data } = await network<any, unknown>({
147
+ method: "GET",
148
+ url: `${ALPACA_URL}/${networkFamily}/lastblock`,
149
+ });
150
+ return {
151
+ height: data.height,
152
+ time: new Date(data.time),
153
+ hash: data.hash,
154
+ };
155
+ };
156
+
157
+ const buildCraftTransaction = networkFamily =>
158
+ async function craftTransaction(intent: TransactionIntent<any>): Promise<string> {
159
+ const { data } = await network<any, unknown>({
160
+ method: "POST",
161
+ url: `${ALPACA_URL}/${networkFamily}/transaction/encode`,
162
+ data: {
163
+ intent: {
164
+ ...intent,
165
+ amount: intent.amount.toString(10),
166
+ },
167
+ },
168
+ });
169
+ return data.rawTransaction;
170
+ };
171
+
172
+ export const getNetworkAlpacaApi = (networkFamily: string) =>
173
+ ({
174
+ broadcast: buildBroadcast(networkFamily),
175
+ combine: buildCombine(networkFamily),
176
+ validateIntent: buildValidateIntent(networkFamily),
177
+ estimateFees: buildEstimateFees(networkFamily),
178
+ getBalance: buildGetBalance(networkFamily),
179
+ listOperations: buildListOperations(networkFamily),
180
+ lastBlock: buildLastBlock(networkFamily),
181
+ craftTransaction: buildCraftTransaction(networkFamily),
182
+ }) satisfies Api<any>;
@@ -0,0 +1,11 @@
1
+ import { AccountBridge, TransactionCommon } from "@ledgerhq/types-live";
2
+ import { patchOperationWithHash } from "../../operation";
3
+ import { getAlpacaApi } from "./alpaca";
4
+
5
+ export const genericBroadcast: (network, kind) => AccountBridge<TransactionCommon>["broadcast"] =
6
+ (network, kind) =>
7
+ async ({ signedOperation: { signature, operation } }) => {
8
+ const hash = await getAlpacaApi(network, kind).broadcast(signature);
9
+
10
+ return patchOperationWithHash(operation, hash);
11
+ };
@@ -0,0 +1,27 @@
1
+ import { Account, TransactionCommon } from "@ledgerhq/types-live";
2
+ import BigNumber from "bignumber.js";
3
+ import type { Unit } from "@ledgerhq/types-cryptoassets";
4
+
5
+ export type NetworkInfo = {
6
+ family: "xrp";
7
+ serverFee: BigNumber;
8
+ baseReserve: BigNumber;
9
+ };
10
+
11
+ export function createTransaction(account: Account): TransactionCommon & {
12
+ family: string;
13
+ fee: BigNumber | null | undefined;
14
+ networkInfo: NetworkInfo | null | undefined;
15
+ tag: number | null | undefined;
16
+ feeCustomUnit: Unit | null | undefined;
17
+ } {
18
+ return {
19
+ family: account.currency.family,
20
+ amount: BigNumber(0),
21
+ recipient: "",
22
+ fee: null,
23
+ tag: undefined,
24
+ networkInfo: null,
25
+ feeCustomUnit: null,
26
+ };
27
+ }
@@ -0,0 +1,17 @@
1
+ import { makeScanAccounts } from "@ledgerhq/coin-framework/bridge/jsHelpers";
2
+ import { CurrencyBridge } from "@ledgerhq/types-live";
3
+ import { genericGetAccountShape } from "./getAccountShape";
4
+ import { getSigner } from "./signer";
5
+
6
+ export function getAlpacaCurrencyBridge(network: string, kind: string): CurrencyBridge {
7
+ return {
8
+ preload: () => Promise.resolve({}),
9
+ hydrate: () => {
10
+ return;
11
+ },
12
+ scanAccounts: makeScanAccounts({
13
+ getAccountShape: genericGetAccountShape(network, kind),
14
+ getAddressFn: getSigner(network).getAddress,
15
+ }),
16
+ };
17
+ }
@@ -0,0 +1,27 @@
1
+ import { AccountBridge } from "@ledgerhq/types-live";
2
+ import { getMainAccount } from "../../account";
3
+ import { getAlpacaApi } from "./alpaca";
4
+ import { createTransaction } from "./createTransaction";
5
+ import { transactionToIntent } from "./utils";
6
+ import BigNumber from "bignumber.js";
7
+
8
+ export function genericEstimateMaxSpendable(
9
+ network,
10
+ kind,
11
+ ): AccountBridge<any>["estimateMaxSpendable"] {
12
+ return async ({ account, parentAccount, transaction }) => {
13
+ const mainAccount = getMainAccount(account, parentAccount);
14
+
15
+ const draftTransaction = {
16
+ ...createTransaction(account as any),
17
+ ...transaction,
18
+ amount: mainAccount.spendableBalance,
19
+ };
20
+ const fees = await getAlpacaApi(network, kind).estimateFees(
21
+ transactionToIntent(mainAccount, draftTransaction),
22
+ );
23
+
24
+ const bnFee = BigNumber(fees.value.toString());
25
+ return BigNumber.max(0, account.spendableBalance.minus(bnFee));
26
+ };
27
+ }
@@ -0,0 +1,62 @@
1
+ import { encodeAccountId } from "@ledgerhq/coin-framework/account/index";
2
+ import { GetAccountShape, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
3
+ import BigNumber from "bignumber.js";
4
+ import { getAlpacaApi } from "./alpaca";
5
+ import { adaptCoreOperationToLiveOperation } from "./utils";
6
+
7
+ export function genericGetAccountShape(network, kind): GetAccountShape {
8
+ return async info => {
9
+ try {
10
+ const { address, initialAccount, currency, derivationMode } = info;
11
+ const accountId = encodeAccountId({
12
+ type: "js",
13
+ version: "2",
14
+ currencyId: currency.id,
15
+ xpubOrAddress: address,
16
+ derivationMode,
17
+ });
18
+
19
+ const blockInfo = await getAlpacaApi(network, kind).lastBlock();
20
+
21
+ const balanceRes = await getAlpacaApi(network, kind).getBalance(address);
22
+ // FIXME: fix type Balance -> check "native" balance
23
+ // is balance[0] always the native ?
24
+ const balance = BigNumber(balanceRes[0].value.toString());
25
+
26
+ let spendableBalance: BigNumber;
27
+ if (balanceRes[0]?.locked) {
28
+ spendableBalance = BigNumber.max(
29
+ balance.minus(BigNumber(balanceRes[0].locked.toString())),
30
+ BigNumber(0),
31
+ );
32
+ } else {
33
+ spendableBalance = initialAccount?.spendableBalance || balance;
34
+ }
35
+ const oldOperations = initialAccount?.operations || [];
36
+
37
+ const blockHeight = oldOperations.length ? (oldOperations[0].blockHeight ?? 0) + 1 : 0;
38
+
39
+ const [newOperations, _] = await getAlpacaApi(network, kind).listOperations(address, {
40
+ minHeight: blockHeight,
41
+ });
42
+
43
+ const operations = mergeOps(
44
+ oldOperations,
45
+ newOperations.map(op => adaptCoreOperationToLiveOperation(accountId, op)),
46
+ );
47
+
48
+ return {
49
+ id: accountId,
50
+ xpub: address,
51
+ blockHeight: initialAccount?.blockHeight || blockInfo.height,
52
+ balance,
53
+ spendableBalance,
54
+ operations,
55
+ operationsCount: operations.length,
56
+ };
57
+ } catch (e) {
58
+ console.error("Error in getAccountShape", e);
59
+ throw e;
60
+ }
61
+ };
62
+ }
@@ -0,0 +1,38 @@
1
+ import { AccountBridge, TransactionCommon } from "@ledgerhq/types-live";
2
+ import BigNumber from "bignumber.js";
3
+ import { getAlpacaApi } from "./alpaca";
4
+
5
+ // => alpaca validateIntent
6
+ export function genericGetTransactionStatus(
7
+ network,
8
+ kind,
9
+ ): AccountBridge<any>["getTransactionStatus"] {
10
+ return async (account, transaction: TransactionCommon & { fees: BigNumber }) => {
11
+ const { freshAddress, balance, currency } = account;
12
+ const alpacaApi = getAlpacaApi(network, kind);
13
+ const { errors, warnings } = await alpacaApi.validateIntent(
14
+ {
15
+ currencyName: currency.name,
16
+ address: freshAddress,
17
+ balance: BigInt(balance.toString()),
18
+ currencyUnit: currency.units[0],
19
+ },
20
+ {
21
+ type: "PAYMENT", // NOTE: assuming payment by default here
22
+ recipient: transaction.recipient,
23
+ amount: BigInt(transaction.amount?.toString() ?? "0"),
24
+ fee: BigInt(transaction.fees?.toString() ?? "0"),
25
+ },
26
+ );
27
+
28
+ const estimatedFees = transaction.fees || new BigNumber(0);
29
+
30
+ return Promise.resolve({
31
+ errors,
32
+ warnings,
33
+ estimatedFees,
34
+ amount: transaction.amount,
35
+ totalSpent: transaction.amount.plus(transaction.fees),
36
+ });
37
+ };
38
+ }
@@ -0,0 +1,22 @@
1
+ import { Account, AccountBridge, TransactionCommon } from "@ledgerhq/types-live";
2
+ import { getAlpacaApi } from "./alpaca";
3
+ import { transactionToIntent } from "./utils";
4
+ import BigNumber from "bignumber.js";
5
+
6
+ export function genericPrepareTransaction(
7
+ network,
8
+ kind,
9
+ ): AccountBridge<TransactionCommon, Account, any, any>["prepareTransaction"] {
10
+ return async (_account, transaction: TransactionCommon & { fees: BigNumber }) => {
11
+ const fees = await getAlpacaApi(network, kind).estimateFees(
12
+ transactionToIntent(_account, transaction),
13
+ );
14
+ const bnFee = BigNumber(fees.value.toString());
15
+
16
+ if (transaction.fees !== bnFee) {
17
+ return { ...transaction, fees: bnFee };
18
+ }
19
+
20
+ return transaction;
21
+ };
22
+ }
@@ -0,0 +1,83 @@
1
+ import { Observable } from "rxjs";
2
+ import { SignerContext } from "@ledgerhq/coin-framework/signer";
3
+ import type {
4
+ Account,
5
+ DeviceId,
6
+ SignOperationEvent,
7
+ AccountBridge,
8
+ TransactionCommon,
9
+ } from "@ledgerhq/types-live";
10
+ import { getAlpacaApi } from "./alpaca";
11
+ import { buildOptimisticOperation, transactionToIntent } from "./utils";
12
+ import { FeeNotLoaded } from "@ledgerhq/errors";
13
+ import { Result } from "@ledgerhq/coin-framework/derivation";
14
+ import { MapMemo, TransactionIntent } from "@ledgerhq/coin-framework/api/types";
15
+
16
+ /**
17
+ * Sign Transaction with Ledger hardware
18
+ */
19
+ export const genericSignOperation =
20
+ (network, kind) =>
21
+ (signerContext: SignerContext<any>): AccountBridge<TransactionCommon>["signOperation"] =>
22
+ ({
23
+ account,
24
+ transaction,
25
+ deviceId,
26
+ }: {
27
+ account: Account;
28
+ transaction: TransactionCommon;
29
+ deviceId: DeviceId;
30
+ }): Observable<SignOperationEvent> =>
31
+ new Observable(o => {
32
+ async function main() {
33
+ if (!transaction["fees"]) throw new FeeNotLoaded();
34
+ o.next({ type: "device-signature-requested" });
35
+
36
+ const { publicKey } = (await signerContext(deviceId, signer =>
37
+ signer.getAddress(account.freshAddressPath),
38
+ )) as Result;
39
+
40
+ const transactionIntent = transactionToIntent(account, transaction);
41
+ transactionIntent.senderPublicKey = publicKey;
42
+ // NOTE: is setting the memo here instead of transactionToIntent sensible?
43
+ const txWithMemo = transactionIntent as TransactionIntent<any, MapMemo<string, string>>;
44
+ if (transaction["tag"]) {
45
+ const txMemo = String(transaction["tag"]);
46
+ txWithMemo.memo = {
47
+ type: "map",
48
+ memos: new Map(),
49
+ };
50
+ txWithMemo.memo.memos.set("destinationTag", txMemo);
51
+ }
52
+
53
+ const unsigned = await getAlpacaApi(network, kind).craftTransaction({
54
+ ...txWithMemo,
55
+ });
56
+ const transactionSignature: string = await signerContext(deviceId, signer =>
57
+ signer.signTransaction(account.freshAddressPath, unsigned),
58
+ );
59
+ o.next({ type: "device-signature-granted" });
60
+
61
+ const signed = await getAlpacaApi(network, kind).combine(
62
+ unsigned,
63
+ transactionSignature,
64
+ publicKey,
65
+ );
66
+
67
+ const operation = buildOptimisticOperation(account, transaction);
68
+ // NOTE: we set the transactionSequenceNumber before on the operation
69
+ // now that we create it in craftTransaction, we might need to return it back from craftTransaction also
70
+ o.next({
71
+ type: "signed",
72
+ signedOperation: {
73
+ operation,
74
+ signature: signed,
75
+ },
76
+ });
77
+ }
78
+
79
+ main().then(
80
+ () => o.complete(),
81
+ e => o.error(e),
82
+ );
83
+ });
@@ -0,0 +1,33 @@
1
+ import { GetAddressFn } from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
2
+ import xrpGetAddress from "@ledgerhq/coin-xrp/signer/getAddress";
3
+ import { CreateSigner, executeWithSigner } from "../../setup";
4
+ import Xrp from "@ledgerhq/hw-app-xrp";
5
+
6
+ import Transport from "@ledgerhq/hw-transport";
7
+ import { signTransaction } from "./signTransaction";
8
+ import { SignerContext } from "@ledgerhq/coin-framework/signer";
9
+ import { SignTransactionOptions } from "./types";
10
+
11
+ export type AlpacaSigner = {
12
+ getAddress: GetAddressFn;
13
+ signTransaction?: (deviceId: string, opts: SignTransactionOptions) => Promise<string>;
14
+ signMessage?: (message: string) => Promise<string>;
15
+ context: SignerContext<any>;
16
+ };
17
+
18
+ export function getSigner(network): AlpacaSigner {
19
+ switch (network) {
20
+ case "ripple":
21
+ case "xrp": {
22
+ const createSigner: CreateSigner<Xrp> = (transport: Transport) => {
23
+ return new Xrp(transport);
24
+ };
25
+ return {
26
+ getAddress: xrpGetAddress(executeWithSigner(createSigner)),
27
+ signTransaction: signTransaction(executeWithSigner(createSigner)),
28
+ context: executeWithSigner(createSigner),
29
+ };
30
+ }
31
+ }
32
+ throw new Error(`signer for ${network} not implemented`);
33
+ }
@@ -0,0 +1,13 @@
1
+ import { SignerContext } from "@ledgerhq/coin-framework/signer";
2
+ import { XrpSigner } from "@ledgerhq/coin-xrp/index";
3
+ import { SignTransactionOptions } from "./types";
4
+
5
+ export const signTransaction = (signerContext: SignerContext<XrpSigner>) => {
6
+ return async (deviceId: string, { path, rawTxHex }: SignTransactionOptions) => {
7
+ const signedTx = await signerContext(deviceId, signer =>
8
+ signer.signTransaction(path, rawTxHex),
9
+ );
10
+
11
+ return signedTx;
12
+ };
13
+ };
@@ -0,0 +1,4 @@
1
+ export type SignTransactionOptions = {
2
+ rawTxHex: string;
3
+ path: string;
4
+ };
@@ -0,0 +1,76 @@
1
+ import BigNumber from "bignumber.js";
2
+ import { genericEstimateMaxSpendable } from "../estimateMaxSpendable";
3
+ import * as alpaca from "../alpaca";
4
+ import { Account } from "@ledgerhq/types-live";
5
+
6
+ // Mock the alpaca API
7
+ jest.mock("../alpaca", () => ({
8
+ getAlpacaApi: jest.fn(),
9
+ }));
10
+
11
+ const mockedGetAlpacaApi = alpaca.getAlpacaApi as jest.Mock;
12
+
13
+ // Dummy data
14
+ const dummyAccount = {
15
+ id: "js:2:ripple:r123:",
16
+ type: "Account", // <-- this is mandatory for getMainAccount to work
17
+ spendableBalance: new BigNumber(50000000),
18
+ currency: { id: "ripple", name: "XRP", units: [{ name: "XRP", magnitude: 6 }] },
19
+ freshAddress: "r123",
20
+ } as unknown as Account;
21
+
22
+ describe("genericEstimateMaxSpendable", () => {
23
+ afterEach(() => {
24
+ jest.clearAllMocks();
25
+ });
26
+
27
+ it("subtracts estimated fee from spendable balance", async () => {
28
+ mockedGetAlpacaApi.mockReturnValue({
29
+ estimateFees: jest.fn().mockResolvedValue({ value: 10000n }), // 0.01 XRP
30
+ });
31
+
32
+ const estimate = genericEstimateMaxSpendable("xrp", "local");
33
+ const result = await estimate({
34
+ account: dummyAccount,
35
+ parentAccount: null,
36
+ transaction: {},
37
+ });
38
+
39
+ expect(result.toString()).toBe("49990000"); // 50_000_000 - 10_000
40
+ });
41
+
42
+ it("returns 0 if fee is higher than spendable", async () => {
43
+ const poorAccount = {
44
+ ...dummyAccount,
45
+ spendableBalance: new BigNumber(5000), // very low
46
+ };
47
+
48
+ mockedGetAlpacaApi.mockReturnValue({
49
+ estimateFees: jest.fn().mockResolvedValue({ value: 10000n }),
50
+ });
51
+
52
+ const estimate = genericEstimateMaxSpendable("xrp", "local");
53
+ const result = await estimate({
54
+ account: poorAccount,
55
+ parentAccount: null,
56
+ transaction: {},
57
+ });
58
+
59
+ expect(result.toString()).toBe("0");
60
+ });
61
+
62
+ it("returns full spendable balance if fee is 0", async () => {
63
+ mockedGetAlpacaApi.mockReturnValue({
64
+ estimateFees: jest.fn().mockResolvedValue({ value: 0n }),
65
+ });
66
+
67
+ const estimate = genericEstimateMaxSpendable("xrp", "local");
68
+ const result = await estimate({
69
+ account: dummyAccount,
70
+ parentAccount: null,
71
+ transaction: {},
72
+ });
73
+
74
+ expect(result.toString()).toBe("50000000");
75
+ });
76
+ });