@ledgerhq/live-common 21.20.0 → 21.21.0-rc.2

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 (428) hide show
  1. package/lib/__tests__/families/bitcoin/wallet-btc/utils.test.js +4 -0
  2. package/lib/__tests__/families/bitcoin/wallet-btc/utils.test.js.map +1 -1
  3. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.js +12 -0
  4. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.js.map +1 -1
  5. package/lib/__tests__/test-helpers/setup.js +1 -0
  6. package/lib/__tests__/test-helpers/setup.js.map +1 -1
  7. package/lib/account/pending.d.ts +1 -1
  8. package/lib/api/Ledger.d.ts.map +1 -1
  9. package/lib/api/Ledger.js +12 -2
  10. package/lib/api/Ledger.js.map +1 -1
  11. package/lib/api/explorerConfig/index.d.ts.map +1 -1
  12. package/lib/api/explorerConfig/index.js +5 -1
  13. package/lib/api/explorerConfig/index.js.map +1 -1
  14. package/lib/data/icons/react/cro.d.ts +8 -0
  15. package/lib/data/icons/react/cro.d.ts.map +1 -0
  16. package/lib/data/icons/react/cro.js +33 -0
  17. package/lib/data/icons/react/cro.js.map +1 -0
  18. package/lib/data/icons/react/index.d.ts +2 -0
  19. package/lib/data/icons/react/index.d.ts.map +1 -1
  20. package/lib/data/icons/react/index.js +12 -8
  21. package/lib/data/icons/react/index.js.map +1 -1
  22. package/lib/data/icons/react/sol.d.ts +8 -0
  23. package/lib/data/icons/react/sol.d.ts.map +1 -0
  24. package/lib/data/icons/react/sol.js +30 -0
  25. package/lib/data/icons/react/sol.js.map +1 -0
  26. package/lib/data/icons/reactNative/cro.d.ts +8 -0
  27. package/lib/data/icons/reactNative/cro.d.ts.map +1 -0
  28. package/lib/data/icons/reactNative/cro.js +34 -0
  29. package/lib/data/icons/reactNative/cro.js.map +1 -0
  30. package/lib/data/icons/reactNative/index.d.ts +2 -0
  31. package/lib/data/icons/reactNative/index.d.ts.map +1 -1
  32. package/lib/data/icons/reactNative/index.js +12 -8
  33. package/lib/data/icons/reactNative/index.js.map +1 -1
  34. package/lib/data/icons/reactNative/sol.d.ts +8 -0
  35. package/lib/data/icons/reactNative/sol.d.ts.map +1 -0
  36. package/lib/data/icons/reactNative/sol.js +31 -0
  37. package/lib/data/icons/reactNative/sol.js.map +1 -0
  38. package/lib/derivation.d.ts +7 -0
  39. package/lib/derivation.d.ts.map +1 -1
  40. package/lib/derivation.js +16 -1
  41. package/lib/derivation.js.map +1 -1
  42. package/lib/errors.d.ts +1 -0
  43. package/lib/errors.d.ts.map +1 -1
  44. package/lib/errors.js +1 -0
  45. package/lib/errors.js.map +1 -1
  46. package/lib/families/bitcoin/exchange.d.ts +1 -1
  47. package/lib/families/bitcoin/getAccountNetworkInfo.d.ts.map +1 -1
  48. package/lib/families/bitcoin/getAccountNetworkInfo.js +3 -2
  49. package/lib/families/bitcoin/getAccountNetworkInfo.js.map +1 -1
  50. package/lib/families/bitcoin/js-signOperation.d.ts.map +1 -1
  51. package/lib/families/bitcoin/js-signOperation.js +7 -2
  52. package/lib/families/bitcoin/js-signOperation.js.map +1 -1
  53. package/lib/families/bitcoin/js-synchronisation.d.ts +2 -2
  54. package/lib/families/bitcoin/specs.d.ts +1 -0
  55. package/lib/families/bitcoin/specs.d.ts.map +1 -1
  56. package/lib/families/bitcoin/specs.js +14 -1
  57. package/lib/families/bitcoin/specs.js.map +1 -1
  58. package/lib/families/bitcoin/wallet-btc/crypto/base.d.ts +1 -1
  59. package/lib/families/bitcoin/wallet-btc/crypto/base.d.ts.map +1 -1
  60. package/lib/families/bitcoin/wallet-btc/crypto/base.js.map +1 -1
  61. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.d.ts.map +1 -1
  62. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js +8 -1
  63. package/lib/families/bitcoin/wallet-btc/crypto/bitcoincash.js.map +1 -1
  64. package/lib/families/bitcoin/wallet-btc/crypto/decred.d.ts +16 -0
  65. package/lib/families/bitcoin/wallet-btc/crypto/decred.d.ts.map +1 -0
  66. package/lib/families/bitcoin/wallet-btc/crypto/decred.js +248 -0
  67. package/lib/families/bitcoin/wallet-btc/crypto/decred.js.map +1 -0
  68. package/lib/families/bitcoin/wallet-btc/crypto/factory.d.ts.map +1 -1
  69. package/lib/families/bitcoin/wallet-btc/crypto/factory.js +5 -0
  70. package/lib/families/bitcoin/wallet-btc/crypto/factory.js.map +1 -1
  71. package/lib/families/bitcoin/wallet-btc/crypto/index.d.ts +1 -0
  72. package/lib/families/bitcoin/wallet-btc/crypto/index.d.ts.map +1 -1
  73. package/lib/families/bitcoin/wallet-btc/crypto/index.js +3 -1
  74. package/lib/families/bitcoin/wallet-btc/crypto/index.js.map +1 -1
  75. package/lib/families/bitcoin/wallet-btc/crypto/litecoin.d.ts.map +1 -1
  76. package/lib/families/bitcoin/wallet-btc/crypto/litecoin.js +13 -3
  77. package/lib/families/bitcoin/wallet-btc/crypto/litecoin.js.map +1 -1
  78. package/lib/families/bitcoin/wallet-btc/crypto/types.d.ts +1 -1
  79. package/lib/families/bitcoin/wallet-btc/crypto/types.d.ts.map +1 -1
  80. package/lib/families/bitcoin/wallet-btc/crypto/zec.d.ts.map +1 -1
  81. package/lib/families/bitcoin/wallet-btc/crypto/zec.js +8 -1
  82. package/lib/families/bitcoin/wallet-btc/crypto/zec.js.map +1 -1
  83. package/lib/families/bitcoin/wallet-btc/crypto/zen.d.ts.map +1 -1
  84. package/lib/families/bitcoin/wallet-btc/crypto/zen.js +8 -1
  85. package/lib/families/bitcoin/wallet-btc/crypto/zen.js.map +1 -1
  86. package/lib/families/bitcoin/wallet-btc/utils.d.ts.map +1 -1
  87. package/lib/families/bitcoin/wallet-btc/utils.js +6 -1
  88. package/lib/families/bitcoin/wallet-btc/utils.js.map +1 -1
  89. package/lib/families/bitcoin/wallet-btc/wallet.d.ts +2 -0
  90. package/lib/families/bitcoin/wallet-btc/wallet.d.ts.map +1 -1
  91. package/lib/families/bitcoin/wallet-btc/wallet.js +15 -7
  92. package/lib/families/bitcoin/wallet-btc/wallet.js.map +1 -1
  93. package/lib/families/crypto_org/js-synchronisation.d.ts +2 -2
  94. package/lib/families/elrond/js-synchronisation.d.ts +2 -2
  95. package/lib/families/ethereum/synchronisation.d.ts.map +1 -1
  96. package/lib/families/ethereum/synchronisation.js +2 -2
  97. package/lib/families/ethereum/synchronisation.js.map +1 -1
  98. package/lib/families/polkadot/api/sidecar.js +4 -2
  99. package/lib/families/polkadot/api/sidecar.js.map +1 -1
  100. package/lib/families/polkadot/js-synchronisation.d.ts +2 -2
  101. package/lib/families/solana/api/cached.d.ts +5 -0
  102. package/lib/families/solana/api/cached.d.ts.map +1 -0
  103. package/lib/families/solana/api/cached.js +80 -0
  104. package/lib/families/solana/api/cached.js.map +1 -0
  105. package/lib/families/solana/api/chain/account/index.d.ts +2 -0
  106. package/lib/families/solana/api/chain/account/index.d.ts.map +1 -0
  107. package/lib/families/solana/api/chain/account/index.js +14 -0
  108. package/lib/families/solana/api/chain/account/index.js.map +1 -0
  109. package/lib/families/solana/api/chain/account/parser.d.ts +5 -0
  110. package/lib/families/solana/api/chain/account/parser.d.ts.map +1 -0
  111. package/lib/families/solana/api/chain/account/parser.js +33 -0
  112. package/lib/families/solana/api/chain/account/parser.js.map +1 -0
  113. package/lib/families/solana/api/chain/account/stake.d.ts +237 -0
  114. package/lib/families/solana/api/chain/account/stake.d.ts.map +1 -0
  115. package/lib/families/solana/api/chain/account/stake.js +43 -0
  116. package/lib/families/solana/api/chain/account/stake.js.map +1 -0
  117. package/lib/families/solana/api/chain/account/token.d.ts +116 -0
  118. package/lib/families/solana/api/chain/account/token.d.ts.map +1 -0
  119. package/lib/families/solana/api/chain/account/token.js +42 -0
  120. package/lib/families/solana/api/chain/account/token.js.map +1 -0
  121. package/lib/families/solana/api/chain/index.d.ts +22 -0
  122. package/lib/families/solana/api/chain/index.d.ts.map +1 -0
  123. package/lib/families/solana/api/chain/index.js +54 -0
  124. package/lib/families/solana/api/chain/index.js.map +1 -0
  125. package/lib/families/solana/api/chain/instruction/associated-token-account/index.d.ts +15 -0
  126. package/lib/families/solana/api/chain/instruction/associated-token-account/index.d.ts.map +1 -0
  127. package/lib/families/solana/api/chain/instruction/associated-token-account/index.js +21 -0
  128. package/lib/families/solana/api/chain/instruction/associated-token-account/index.js.map +1 -0
  129. package/lib/families/solana/api/chain/instruction/associated-token-account/types.d.ts +30 -0
  130. package/lib/families/solana/api/chain/instruction/associated-token-account/types.d.ts.map +1 -0
  131. package/lib/families/solana/api/chain/instruction/associated-token-account/types.js +19 -0
  132. package/lib/families/solana/api/chain/instruction/associated-token-account/types.js.map +1 -0
  133. package/lib/families/solana/api/chain/instruction/memo/index.d.ts +15 -0
  134. package/lib/families/solana/api/chain/instruction/memo/index.d.ts.map +1 -0
  135. package/lib/families/solana/api/chain/instruction/memo/index.js +14 -0
  136. package/lib/families/solana/api/chain/instruction/memo/index.js.map +1 -0
  137. package/lib/families/solana/api/chain/instruction/memo/types.d.ts +21 -0
  138. package/lib/families/solana/api/chain/instruction/memo/types.d.ts.map +1 -0
  139. package/lib/families/solana/api/chain/instruction/memo/types.js +16 -0
  140. package/lib/families/solana/api/chain/instruction/memo/types.js.map +1 -0
  141. package/lib/families/solana/api/chain/instruction/stake/index.d.ts +15 -0
  142. package/lib/families/solana/api/chain/instruction/stake/index.d.ts.map +1 -0
  143. package/lib/families/solana/api/chain/instruction/stake/index.js +20 -0
  144. package/lib/families/solana/api/chain/instruction/stake/index.js.map +1 -0
  145. package/lib/families/solana/api/chain/instruction/stake/types.d.ts +215 -0
  146. package/lib/families/solana/api/chain/instruction/stake/types.d.ts.map +1 -0
  147. package/lib/families/solana/api/chain/instruction/stake/types.js +80 -0
  148. package/lib/families/solana/api/chain/instruction/stake/types.js.map +1 -0
  149. package/lib/families/solana/api/chain/instruction/token/index.d.ts +15 -0
  150. package/lib/families/solana/api/chain/instruction/token/index.d.ts.map +1 -0
  151. package/lib/families/solana/api/chain/instruction/token/index.js +20 -0
  152. package/lib/families/solana/api/chain/instruction/token/index.js.map +1 -0
  153. package/lib/families/solana/api/chain/instruction/token/types.d.ts +497 -0
  154. package/lib/families/solana/api/chain/instruction/token/types.d.ts.map +1 -0
  155. package/lib/families/solana/api/chain/instruction/token/types.js +205 -0
  156. package/lib/families/solana/api/chain/instruction/token/types.js.map +1 -0
  157. package/lib/families/solana/api/chain/program/constants.d.ts +11 -0
  158. package/lib/families/solana/api/chain/program/constants.d.ts.map +1 -0
  159. package/lib/families/solana/api/chain/program/constants.js +14 -0
  160. package/lib/families/solana/api/chain/program/constants.js.map +1 -0
  161. package/lib/families/solana/api/chain/program/index.d.ts +2 -0
  162. package/lib/families/solana/api/chain/program/index.d.ts.map +1 -0
  163. package/lib/families/solana/api/chain/program/index.js +14 -0
  164. package/lib/families/solana/api/chain/program/index.js.map +1 -0
  165. package/lib/families/solana/api/chain/program/parser.d.ts +30 -0
  166. package/lib/families/solana/api/chain/program/parser.d.ts.map +1 -0
  167. package/lib/families/solana/api/chain/program/parser.js +70 -0
  168. package/lib/families/solana/api/chain/program/parser.js.map +1 -0
  169. package/lib/families/solana/api/chain/validators/bignum.d.ts +3 -0
  170. package/lib/families/solana/api/chain/validators/bignum.d.ts.map +1 -0
  171. package/lib/families/solana/api/chain/validators/bignum.js +11 -0
  172. package/lib/families/solana/api/chain/validators/bignum.js.map +1 -0
  173. package/lib/families/solana/api/chain/validators/index.d.ts +10 -0
  174. package/lib/families/solana/api/chain/validators/index.d.ts.map +1 -0
  175. package/lib/families/solana/api/chain/validators/index.js +10 -0
  176. package/lib/families/solana/api/chain/validators/index.js.map +1 -0
  177. package/lib/families/solana/api/chain/validators/pubkey.d.ts +3 -0
  178. package/lib/families/solana/api/chain/validators/pubkey.d.ts.map +1 -0
  179. package/lib/families/solana/api/chain/validators/pubkey.js +7 -0
  180. package/lib/families/solana/api/chain/validators/pubkey.js.map +1 -0
  181. package/lib/families/solana/api/chain/web3.d.ts +29 -0
  182. package/lib/families/solana/api/chain/web3.d.ts.map +1 -0
  183. package/lib/families/solana/api/chain/web3.js +287 -0
  184. package/lib/families/solana/api/chain/web3.js.map +1 -0
  185. package/lib/families/solana/api/index.d.ts +5 -0
  186. package/lib/families/solana/api/index.d.ts.map +1 -0
  187. package/lib/families/solana/api/index.js +21 -0
  188. package/lib/families/solana/api/index.js.map +1 -0
  189. package/lib/families/solana/api/logged.d.ts +3 -0
  190. package/lib/families/solana/api/logged.d.ts.map +1 -0
  191. package/lib/families/solana/api/logged.js +53 -0
  192. package/lib/families/solana/api/logged.js.map +1 -0
  193. package/lib/families/solana/api/queued.d.ts +3 -0
  194. package/lib/families/solana/api/queued.d.ts.map +1 -0
  195. package/lib/families/solana/api/queued.js +31 -0
  196. package/lib/families/solana/api/queued.js.map +1 -0
  197. package/lib/families/solana/bridge/bridge.d.ts +12 -0
  198. package/lib/families/solana/bridge/bridge.d.ts.map +1 -0
  199. package/lib/families/solana/bridge/bridge.js +218 -0
  200. package/lib/families/solana/bridge/bridge.js.map +1 -0
  201. package/lib/families/solana/bridge/js.d.ts +6 -0
  202. package/lib/families/solana/bridge/js.d.ts.map +1 -0
  203. package/lib/families/solana/bridge/js.js +15 -0
  204. package/lib/families/solana/bridge/js.js.map +1 -0
  205. package/lib/families/solana/bridge/mock-data.d.ts +186 -0
  206. package/lib/families/solana/bridge/mock-data.d.ts.map +1 -0
  207. package/lib/families/solana/bridge/mock-data.js +23 -0
  208. package/lib/families/solana/bridge/mock-data.js.map +1 -0
  209. package/lib/families/solana/bridge/mock.d.ts +6 -0
  210. package/lib/families/solana/bridge/mock.d.ts.map +1 -0
  211. package/lib/families/solana/bridge/mock.js +75 -0
  212. package/lib/families/solana/bridge/mock.js.map +1 -0
  213. package/lib/families/solana/cli-transaction.d.ts +14 -0
  214. package/lib/families/solana/cli-transaction.d.ts.map +1 -0
  215. package/lib/families/solana/cli-transaction.js +137 -0
  216. package/lib/families/solana/cli-transaction.js.map +1 -0
  217. package/lib/families/solana/datasets/solana.scanAccounts.1.d.ts +6 -0
  218. package/lib/families/solana/datasets/solana.scanAccounts.1.d.ts.map +1 -0
  219. package/lib/families/solana/datasets/solana.scanAccounts.1.js +7 -0
  220. package/lib/families/solana/datasets/solana.scanAccounts.1.js.map +1 -0
  221. package/lib/families/solana/deviceTransactionConfig.d.ts +10 -0
  222. package/lib/families/solana/deviceTransactionConfig.d.ts.map +1 -0
  223. package/lib/families/solana/deviceTransactionConfig.js +121 -0
  224. package/lib/families/solana/deviceTransactionConfig.js.map +1 -0
  225. package/lib/families/solana/errors.d.ts +25 -0
  226. package/lib/families/solana/errors.d.ts.map +1 -0
  227. package/lib/families/solana/errors.js +13 -0
  228. package/lib/families/solana/errors.js.map +1 -0
  229. package/lib/families/solana/hw-getAddress.d.ts +4 -0
  230. package/lib/families/solana/hw-getAddress.d.ts.map +1 -0
  231. package/lib/families/solana/hw-getAddress.js +66 -0
  232. package/lib/families/solana/hw-getAddress.js.map +1 -0
  233. package/lib/families/solana/js-broadcast.d.ts +7 -0
  234. package/lib/families/solana/js-broadcast.d.ts.map +1 -0
  235. package/lib/families/solana/js-broadcast.js +59 -0
  236. package/lib/families/solana/js-broadcast.js.map +1 -0
  237. package/lib/families/solana/js-buildTransaction.d.ts +6 -0
  238. package/lib/families/solana/js-buildTransaction.d.ts.map +1 -0
  239. package/lib/families/solana/js-buildTransaction.js +123 -0
  240. package/lib/families/solana/js-buildTransaction.js.map +1 -0
  241. package/lib/families/solana/js-createTransaction.d.ts +6 -0
  242. package/lib/families/solana/js-createTransaction.d.ts.map +1 -0
  243. package/lib/families/solana/js-createTransaction.js +35 -0
  244. package/lib/families/solana/js-createTransaction.js.map +1 -0
  245. package/lib/families/solana/js-estimateMaxSpendable.d.ts +7 -0
  246. package/lib/families/solana/js-estimateMaxSpendable.d.ts.map +1 -0
  247. package/lib/families/solana/js-estimateMaxSpendable.js +72 -0
  248. package/lib/families/solana/js-estimateMaxSpendable.js.map +1 -0
  249. package/lib/families/solana/js-getTransactionStatus.d.ts +5 -0
  250. package/lib/families/solana/js-getTransactionStatus.d.ts.map +1 -0
  251. package/lib/families/solana/js-getTransactionStatus.js +106 -0
  252. package/lib/families/solana/js-getTransactionStatus.js.map +1 -0
  253. package/lib/families/solana/js-prepareTransaction.d.ts +6 -0
  254. package/lib/families/solana/js-prepareTransaction.d.ts.map +1 -0
  255. package/lib/families/solana/js-prepareTransaction.js +380 -0
  256. package/lib/families/solana/js-prepareTransaction.js.map +1 -0
  257. package/lib/families/solana/js-signOperation.d.ts +10 -0
  258. package/lib/families/solana/js-signOperation.d.ts.map +1 -0
  259. package/lib/families/solana/js-signOperation.js +193 -0
  260. package/lib/families/solana/js-signOperation.js.map +1 -0
  261. package/lib/families/solana/js-synchronization.d.ts +5 -0
  262. package/lib/families/solana/js-synchronization.d.ts.map +1 -0
  263. package/lib/families/solana/js-synchronization.js +464 -0
  264. package/lib/families/solana/js-synchronization.js.map +1 -0
  265. package/lib/families/solana/logic.d.ts +15 -0
  266. package/lib/families/solana/logic.d.ts.map +1 -0
  267. package/lib/families/solana/logic.js +49 -0
  268. package/lib/families/solana/logic.js.map +1 -0
  269. package/lib/families/solana/specs.d.ts +7 -0
  270. package/lib/families/solana/specs.d.ts.map +1 -0
  271. package/lib/families/solana/specs.js +100 -0
  272. package/lib/families/solana/specs.js.map +1 -0
  273. package/lib/families/solana/speculos-deviceActions.d.ts +8 -0
  274. package/lib/families/solana/speculos-deviceActions.d.ts.map +1 -0
  275. package/lib/families/solana/speculos-deviceActions.js +60 -0
  276. package/lib/families/solana/speculos-deviceActions.js.map +1 -0
  277. package/lib/families/solana/test-dataset.d.ts +5 -0
  278. package/lib/families/solana/test-dataset.d.ts.map +1 -0
  279. package/lib/families/solana/test-dataset.js +396 -0
  280. package/lib/families/solana/test-dataset.js.map +1 -0
  281. package/lib/families/solana/transaction.d.ts +12 -0
  282. package/lib/families/solana/transaction.d.ts.map +1 -0
  283. package/lib/families/solana/transaction.js +109 -0
  284. package/lib/families/solana/transaction.js.map +1 -0
  285. package/lib/families/solana/types.d.ts +84 -0
  286. package/lib/families/solana/types.d.ts.map +1 -0
  287. package/lib/families/solana/types.js +6 -0
  288. package/lib/families/solana/types.js.map +1 -0
  289. package/lib/families/solana/utils.d.ts +10 -0
  290. package/lib/families/solana/utils.d.ts.map +1 -0
  291. package/lib/families/solana/utils.js +194 -0
  292. package/lib/families/solana/utils.js.map +1 -0
  293. package/lib/families/stellar/js-synchronization.d.ts +2 -2
  294. package/lib/generated/bridge/js.d.ts +4 -0
  295. package/lib/generated/bridge/js.d.ts.map +1 -1
  296. package/lib/generated/bridge/js.js +8 -6
  297. package/lib/generated/bridge/js.js.map +1 -1
  298. package/lib/generated/bridge/mock.d.ts +4 -0
  299. package/lib/generated/bridge/mock.d.ts.map +1 -1
  300. package/lib/generated/bridge/mock.js +6 -4
  301. package/lib/generated/bridge/mock.js.map +1 -1
  302. package/lib/generated/cli-transaction.d.ts +9 -0
  303. package/lib/generated/cli-transaction.d.ts.map +1 -1
  304. package/lib/generated/cli-transaction.js +8 -6
  305. package/lib/generated/cli-transaction.js.map +1 -1
  306. package/lib/generated/deviceTransactionConfig.d.ts +2 -0
  307. package/lib/generated/deviceTransactionConfig.d.ts.map +1 -1
  308. package/lib/generated/deviceTransactionConfig.js +8 -6
  309. package/lib/generated/deviceTransactionConfig.js.map +1 -1
  310. package/lib/generated/exchange.d.ts +1 -1
  311. package/lib/generated/hw-getAddress.d.ts +1 -0
  312. package/lib/generated/hw-getAddress.d.ts.map +1 -1
  313. package/lib/generated/hw-getAddress.js +8 -6
  314. package/lib/generated/hw-getAddress.js.map +1 -1
  315. package/lib/generated/specs.d.ts +4 -0
  316. package/lib/generated/specs.d.ts.map +1 -1
  317. package/lib/generated/specs.js +8 -6
  318. package/lib/generated/specs.js.map +1 -1
  319. package/lib/generated/speculos-deviceActions.d.ts +3 -0
  320. package/lib/generated/speculos-deviceActions.d.ts.map +1 -1
  321. package/lib/generated/speculos-deviceActions.js +8 -6
  322. package/lib/generated/speculos-deviceActions.js.map +1 -1
  323. package/lib/generated/test-dataset.d.ts +1 -0
  324. package/lib/generated/test-dataset.d.ts.map +1 -1
  325. package/lib/generated/test-dataset.js +8 -6
  326. package/lib/generated/test-dataset.js.map +1 -1
  327. package/lib/generated/transaction.d.ts +5 -0
  328. package/lib/generated/transaction.d.ts.map +1 -1
  329. package/lib/generated/transaction.js +8 -6
  330. package/lib/generated/transaction.js.map +1 -1
  331. package/lib/generated/types.d.ts +12 -6
  332. package/lib/generated/types.d.ts.map +1 -1
  333. package/lib/generated/types.js +5 -3
  334. package/lib/generated/types.js.map +1 -1
  335. package/lib/nft/helpers.js +1 -1
  336. package/lib/nft/helpers.js.map +1 -1
  337. package/package.json +8 -4
  338. package/src/__tests__/__snapshots__/all.libcore.ts.snap +113 -0
  339. package/src/__tests__/families/bitcoin/wallet-btc/utils.test.ts +4 -0
  340. package/src/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.ts +12 -0
  341. package/src/__tests__/test-helpers/setup.ts +1 -0
  342. package/src/api/Ledger.ts +11 -1
  343. package/src/api/explorerConfig/index.ts +1 -3
  344. package/src/data/icons/react/cro.tsx +12 -0
  345. package/src/data/icons/react/index.tsx +2 -0
  346. package/src/data/icons/react/sol.tsx +12 -0
  347. package/src/data/icons/reactNative/cro.tsx +13 -0
  348. package/src/data/icons/reactNative/index.tsx +2 -0
  349. package/src/data/icons/reactNative/sol.tsx +13 -0
  350. package/src/data/icons/svg/CRO.svg +6 -0
  351. package/src/data/icons/svg/SOL.svg +3 -0
  352. package/src/derivation.ts +13 -0
  353. package/src/errors.ts +1 -0
  354. package/src/families/bitcoin/getAccountNetworkInfo.ts +5 -2
  355. package/src/families/bitcoin/js-signOperation.ts +4 -7
  356. package/src/families/bitcoin/specs.ts +16 -0
  357. package/src/families/bitcoin/wallet-btc/crypto/base.ts +1 -1
  358. package/src/families/bitcoin/wallet-btc/crypto/bitcoincash.ts +8 -1
  359. package/src/families/bitcoin/wallet-btc/crypto/decred.ts +251 -0
  360. package/src/families/bitcoin/wallet-btc/crypto/factory.ts +5 -0
  361. package/src/families/bitcoin/wallet-btc/crypto/index.ts +1 -0
  362. package/src/families/bitcoin/wallet-btc/crypto/litecoin.ts +13 -3
  363. package/src/families/bitcoin/wallet-btc/crypto/types.ts +1 -0
  364. package/src/families/bitcoin/wallet-btc/crypto/zec.ts +8 -1
  365. package/src/families/bitcoin/wallet-btc/crypto/zen.ts +8 -1
  366. package/src/families/bitcoin/wallet-btc/utils.ts +6 -1
  367. package/src/families/bitcoin/wallet-btc/wallet.ts +18 -5
  368. package/src/families/ethereum/synchronisation.ts +5 -2
  369. package/src/families/polkadot/api/sidecar.ts +2 -2
  370. package/src/families/solana/api/cached.ts +89 -0
  371. package/src/families/solana/api/chain/account/index.ts +1 -0
  372. package/src/families/solana/api/chain/account/parser.ts +35 -0
  373. package/src/families/solana/api/chain/account/stake.ts +50 -0
  374. package/src/families/solana/api/chain/account/token.ts +63 -0
  375. package/src/families/solana/api/chain/index.ts +115 -0
  376. package/src/families/solana/api/chain/instruction/associated-token-account/index.ts +37 -0
  377. package/src/families/solana/api/chain/instruction/associated-token-account/types.ts +23 -0
  378. package/src/families/solana/api/chain/instruction/memo/index.ts +24 -0
  379. package/src/families/solana/api/chain/instruction/memo/types.ts +18 -0
  380. package/src/families/solana/api/chain/instruction/stake/index.ts +29 -0
  381. package/src/families/solana/api/chain/instruction/stake/types.ts +95 -0
  382. package/src/families/solana/api/chain/instruction/token/index.ts +30 -0
  383. package/src/families/solana/api/chain/instruction/token/types.ts +237 -0
  384. package/src/families/solana/api/chain/program/constants.ts +10 -0
  385. package/src/families/solana/api/chain/program/index.ts +1 -0
  386. package/src/families/solana/api/chain/program/parser.ts +122 -0
  387. package/src/families/solana/api/chain/validators/bignum.ts +11 -0
  388. package/src/families/solana/api/chain/validators/index.ts +9 -0
  389. package/src/families/solana/api/chain/validators/pubkey.ts +8 -0
  390. package/src/families/solana/api/chain/web3.ts +258 -0
  391. package/src/families/solana/api/index.ts +4 -0
  392. package/src/families/solana/api/logged.ts +50 -0
  393. package/src/families/solana/api/queued.ts +23 -0
  394. package/src/families/solana/bridge/bridge.ts +169 -0
  395. package/src/families/solana/bridge/js.ts +28 -0
  396. package/src/families/solana/bridge/mock-data.ts +22 -0
  397. package/src/families/solana/bridge/mock.ts +80 -0
  398. package/src/families/solana/cli-transaction.ts +175 -0
  399. package/src/families/solana/datasets/solana.scanAccounts.1.ts +9 -0
  400. package/src/families/solana/deviceTransactionConfig.ts +160 -0
  401. package/src/families/solana/errors.ts +32 -0
  402. package/src/families/solana/hw-getAddress.ts +20 -0
  403. package/src/families/solana/js-broadcast.ts +20 -0
  404. package/src/families/solana/js-buildTransaction.ts +75 -0
  405. package/src/families/solana/js-createTransaction.ts +27 -0
  406. package/src/families/solana/js-estimateMaxSpendable.ts +29 -0
  407. package/src/families/solana/js-getTransactionStatus.ts +78 -0
  408. package/src/families/solana/js-prepareTransaction.ts +423 -0
  409. package/src/families/solana/js-signOperation.ts +230 -0
  410. package/src/families/solana/js-synchronization.ts +544 -0
  411. package/src/families/solana/logic.ts +52 -0
  412. package/src/families/solana/specs.ts +100 -0
  413. package/src/families/solana/speculos-deviceActions.ts +59 -0
  414. package/src/families/solana/test-dataset.ts +572 -0
  415. package/src/families/solana/transaction.ts +146 -0
  416. package/src/families/solana/types.ts +110 -0
  417. package/src/families/solana/utils.ts +80 -0
  418. package/src/generated/bridge/js.ts +3 -0
  419. package/src/generated/bridge/mock.ts +3 -0
  420. package/src/generated/cli-transaction.ts +3 -0
  421. package/src/generated/deviceTransactionConfig.ts +3 -0
  422. package/src/generated/hw-getAddress.ts +3 -0
  423. package/src/generated/specs.ts +3 -0
  424. package/src/generated/speculos-deviceActions.ts +3 -0
  425. package/src/generated/test-dataset.ts +3 -0
  426. package/src/generated/transaction.ts +3 -0
  427. package/src/generated/types.ts +14 -0
  428. package/src/nft/helpers.ts +1 -1
@@ -0,0 +1,78 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ import type { Account, TransactionStatus } from "../../types";
3
+ import type { Command, Transaction } from "./types";
4
+ import { assertUnreachable } from "./utils";
5
+
6
+ const getTransactionStatus = async (
7
+ _: Account,
8
+ tx: Transaction
9
+ ): Promise<TransactionStatus> => {
10
+ const txFees = new BigNumber(tx.feeCalculator?.lamportsPerSignature ?? 0);
11
+
12
+ const { commandDescriptor } = tx.model;
13
+
14
+ if (commandDescriptor === undefined) {
15
+ return {
16
+ amount: new BigNumber(tx.amount),
17
+ errors: {},
18
+ warnings: {},
19
+ estimatedFees: txFees,
20
+ totalSpent: new BigNumber(tx.amount),
21
+ };
22
+ }
23
+ switch (commandDescriptor.status) {
24
+ case "invalid":
25
+ return {
26
+ amount: new BigNumber(tx.amount),
27
+ errors: commandDescriptor.errors,
28
+ warnings: commandDescriptor.warnings ?? {},
29
+ estimatedFees: txFees,
30
+ totalSpent: new BigNumber(0),
31
+ };
32
+ case "valid": {
33
+ const { command } = commandDescriptor;
34
+ const estimatedFees = txFees.plus(commandDescriptor.fees ?? 0);
35
+ const amount = getAmount(tx, command);
36
+ const totalSpent = getTotalSpent(command, amount, estimatedFees);
37
+
38
+ return {
39
+ amount,
40
+ estimatedFees,
41
+ totalSpent,
42
+ warnings: commandDescriptor.warnings ?? {},
43
+ errors: {},
44
+ };
45
+ }
46
+ default:
47
+ return assertUnreachable(commandDescriptor);
48
+ }
49
+ };
50
+
51
+ function getAmount(tx: Transaction, command: Command) {
52
+ switch (command.kind) {
53
+ case "transfer":
54
+ case "token.transfer":
55
+ return new BigNumber(command.amount);
56
+ default:
57
+ return tx.amount;
58
+ }
59
+ }
60
+
61
+ function getTotalSpent(
62
+ command: Command,
63
+ amount: BigNumber,
64
+ estimatedFees: BigNumber
65
+ ) {
66
+ switch (command.kind) {
67
+ case "transfer":
68
+ return amount.plus(estimatedFees);
69
+ case "token.transfer":
70
+ return amount;
71
+ case "token.createATA":
72
+ return estimatedFees;
73
+ default:
74
+ return assertUnreachable(command);
75
+ }
76
+ }
77
+
78
+ export default getTransactionStatus;
@@ -0,0 +1,423 @@
1
+ import { getTokenById } from "@ledgerhq/cryptoassets";
2
+ import {
3
+ AmountRequired,
4
+ InvalidAddress,
5
+ InvalidAddressBecauseDestinationIsAlsoSource,
6
+ NotEnoughBalance,
7
+ RecipientRequired,
8
+ } from "@ledgerhq/errors";
9
+ import BigNumber from "bignumber.js";
10
+ import { findSubAccountById } from "../../account";
11
+ import type { Account } from "../../types";
12
+ import { ChainAPI } from "./api";
13
+ import { getMaybeTokenAccount } from "./api/chain/web3";
14
+ import {
15
+ SolanaAccountNotFunded,
16
+ SolanaAddressOffEd25519,
17
+ SolanaMemoIsTooLong,
18
+ SolanaTokenAccountHoldsAnotherToken,
19
+ SolanaRecipientAssociatedTokenAccountWillBeFunded,
20
+ SolanaNotEnoughBalanceToPayFees,
21
+ SolanaTokenRecipientIsSenderATA,
22
+ SolanaTokenAccounNotInitialized,
23
+ } from "./errors";
24
+ import {
25
+ decodeAccountIdWithTokenAccountAddress,
26
+ isEd25519Address,
27
+ isValidBase58Address,
28
+ MAX_MEMO_LENGTH,
29
+ } from "./logic";
30
+
31
+ import type {
32
+ CommandDescriptor,
33
+ TokenCreateATATransaction,
34
+ TokenRecipientDescriptor,
35
+ TokenTransferTransaction,
36
+ Transaction,
37
+ TransactionModel,
38
+ TransferTransaction,
39
+ } from "./types";
40
+ import { assertUnreachable } from "./utils";
41
+
42
+ type TransactionWithFeeCalculator = Transaction & {
43
+ feeCalculator: Exclude<Transaction["feeCalculator"], undefined>;
44
+ };
45
+
46
+ async function deriveCommandDescriptor(
47
+ mainAccount: Account,
48
+ tx: TransactionWithFeeCalculator,
49
+ api: ChainAPI
50
+ ): Promise<CommandDescriptor> {
51
+ const errors: Record<string, Error> = {};
52
+
53
+ const { model } = tx;
54
+
55
+ switch (model.kind) {
56
+ case "transfer":
57
+ case "token.transfer":
58
+ if (!tx.recipient) {
59
+ errors.recipient = new RecipientRequired();
60
+ } else if (mainAccount.freshAddress === tx.recipient) {
61
+ errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
62
+ } else if (!isValidBase58Address(tx.recipient)) {
63
+ errors.recipient = new InvalidAddress();
64
+ }
65
+
66
+ if (model.uiState.memo) {
67
+ const encoder = new TextEncoder();
68
+ if (encoder.encode(model.uiState.memo).byteLength > MAX_MEMO_LENGTH) {
69
+ errors.memo = errors.memo = new SolanaMemoIsTooLong(undefined, {
70
+ maxLength: MAX_MEMO_LENGTH,
71
+ });
72
+ }
73
+ }
74
+
75
+ if (Object.keys(errors).length > 0) {
76
+ return toInvalidStatusCommand(errors);
77
+ }
78
+
79
+ return model.kind === "transfer"
80
+ ? deriveTransferCommandDescriptor(mainAccount, tx, model, api)
81
+ : deriveTokenTransferCommandDescriptor(mainAccount, tx, model, api);
82
+ case "token.createATA":
83
+ return deriveCreateAssociatedTokenAccountCommandDescriptor(
84
+ mainAccount,
85
+ model,
86
+ api
87
+ );
88
+ default:
89
+ return assertUnreachable(model);
90
+ }
91
+ }
92
+
93
+ const prepareTransaction = async (
94
+ mainAccount: Account,
95
+ tx: Transaction,
96
+ api: ChainAPI
97
+ ): Promise<Transaction> => {
98
+ const patch: Partial<Transaction> = {};
99
+ const errors: Record<string, Error> = {};
100
+
101
+ const feeCalculator = tx.feeCalculator ?? (await api.getTxFeeCalculator());
102
+
103
+ if (tx.feeCalculator === undefined) {
104
+ patch.feeCalculator = feeCalculator;
105
+ }
106
+
107
+ const txToDeriveFrom = {
108
+ ...updateModelIfSubAccountIdPresent(tx),
109
+ feeCalculator,
110
+ };
111
+
112
+ const commandDescriptor = await deriveCommandDescriptor(
113
+ mainAccount,
114
+ txToDeriveFrom,
115
+ api
116
+ );
117
+
118
+ if (commandDescriptor.status === "invalid") {
119
+ return toInvalidTx(
120
+ tx,
121
+ patch,
122
+ commandDescriptor.errors,
123
+ commandDescriptor.warnings
124
+ );
125
+ }
126
+
127
+ const command = commandDescriptor.command;
128
+ switch (command.kind) {
129
+ case "transfer": {
130
+ const totalSpend = command.amount + feeCalculator.lamportsPerSignature;
131
+ if (mainAccount.balance.lt(totalSpend)) {
132
+ errors.amount = new NotEnoughBalance();
133
+ }
134
+ break;
135
+ }
136
+ default: {
137
+ const totalFees =
138
+ feeCalculator.lamportsPerSignature + (commandDescriptor.fees ?? 0);
139
+ if (mainAccount.balance.lt(totalFees)) {
140
+ errors.amount = new SolanaNotEnoughBalanceToPayFees();
141
+ }
142
+ }
143
+ }
144
+
145
+ if (Object.keys(errors).length > 0) {
146
+ return toInvalidTx(tx, patch, errors);
147
+ }
148
+
149
+ patch.model = {
150
+ ...tx.model,
151
+ commandDescriptor,
152
+ };
153
+
154
+ return Object.keys(patch).length > 0
155
+ ? {
156
+ ...tx,
157
+ ...patch,
158
+ }
159
+ : tx;
160
+ };
161
+
162
+ const deriveTokenTransferCommandDescriptor = async (
163
+ mainAccount: Account,
164
+ tx: Transaction,
165
+ model: TransactionModel & { kind: TokenTransferTransaction["kind"] },
166
+ api: ChainAPI
167
+ ): Promise<CommandDescriptor> => {
168
+ const errors: Record<string, Error> = {};
169
+ const warnings: Record<string, Error> = {};
170
+
171
+ const subAccount = findSubAccountById(
172
+ mainAccount,
173
+ model.uiState.subAccountId
174
+ );
175
+
176
+ if (!subAccount || subAccount.type !== "TokenAccount") {
177
+ throw new Error("subaccount not found");
178
+ }
179
+
180
+ const tokenIdParts = subAccount.token.id.split("/");
181
+ const mintAddress = tokenIdParts[tokenIdParts.length - 1];
182
+ const mintDecimals = subAccount.token.units[0].magnitude;
183
+
184
+ const senderAssociatedTokenAccountAddress =
185
+ decodeAccountIdWithTokenAccountAddress(subAccount.id).address;
186
+
187
+ if (tx.recipient === senderAssociatedTokenAccountAddress) {
188
+ errors.recipient = new SolanaTokenRecipientIsSenderATA();
189
+ return toInvalidStatusCommand(errors, warnings);
190
+ }
191
+
192
+ const recipientDescriptor = await getTokenRecipient(
193
+ tx.recipient,
194
+ mintAddress,
195
+ api
196
+ );
197
+
198
+ if (recipientDescriptor instanceof Error) {
199
+ errors.recipient = recipientDescriptor;
200
+ return toInvalidStatusCommand(errors, warnings);
201
+ }
202
+
203
+ const fees = recipientDescriptor.shouldCreateAsAssociatedTokenAccount
204
+ ? await api.getAssocTokenAccMinNativeBalance()
205
+ : 0;
206
+
207
+ if (recipientDescriptor.shouldCreateAsAssociatedTokenAccount) {
208
+ warnings.recipientAssociatedTokenAccount =
209
+ new SolanaRecipientAssociatedTokenAccountWillBeFunded();
210
+
211
+ if (!(await isAccountFunded(tx.recipient, api))) {
212
+ warnings.recipient = new SolanaAccountNotFunded();
213
+ }
214
+ }
215
+
216
+ if (!tx.useAllAmount && tx.amount.lte(0)) {
217
+ errors.amount = new AmountRequired();
218
+ return toInvalidStatusCommand(errors, warnings);
219
+ }
220
+
221
+ const txAmount = tx.useAllAmount
222
+ ? subAccount.spendableBalance.toNumber()
223
+ : tx.amount.toNumber();
224
+
225
+ if (txAmount > subAccount.spendableBalance.toNumber()) {
226
+ errors.amount = new NotEnoughBalance();
227
+ return toInvalidStatusCommand(errors, warnings);
228
+ }
229
+
230
+ return {
231
+ status: "valid",
232
+ command: {
233
+ kind: "token.transfer",
234
+ ownerAddress: mainAccount.freshAddress,
235
+ ownerAssociatedTokenAccountAddress: senderAssociatedTokenAccountAddress,
236
+ amount: txAmount,
237
+ mintAddress,
238
+ mintDecimals,
239
+ recipientDescriptor: recipientDescriptor,
240
+ memo: model.uiState.memo,
241
+ },
242
+ fees,
243
+ warnings,
244
+ };
245
+ };
246
+
247
+ async function getTokenRecipient(
248
+ recipientAddress: string,
249
+ mintAddress: string,
250
+ api: ChainAPI
251
+ ): Promise<TokenRecipientDescriptor | Error> {
252
+ const recipientTokenAccount = await getMaybeTokenAccount(
253
+ recipientAddress,
254
+ api
255
+ );
256
+
257
+ if (recipientTokenAccount instanceof Error) {
258
+ throw recipientTokenAccount;
259
+ }
260
+
261
+ if (recipientTokenAccount === undefined) {
262
+ if (!isEd25519Address(recipientAddress)) {
263
+ return new SolanaAddressOffEd25519();
264
+ }
265
+
266
+ const recipientAssociatedTokenAccountAddress =
267
+ await api.findAssocTokenAccAddress(recipientAddress, mintAddress);
268
+
269
+ const shouldCreateAsAssociatedTokenAccount = !(await isAccountFunded(
270
+ recipientAssociatedTokenAccountAddress,
271
+ api
272
+ ));
273
+
274
+ return {
275
+ walletAddress: recipientAddress,
276
+ shouldCreateAsAssociatedTokenAccount,
277
+ tokenAccAddress: recipientAssociatedTokenAccountAddress,
278
+ };
279
+ } else {
280
+ if (recipientTokenAccount.mint.toBase58() !== mintAddress) {
281
+ return new SolanaTokenAccountHoldsAnotherToken();
282
+ }
283
+ if (recipientTokenAccount.state !== "initialized") {
284
+ return new SolanaTokenAccounNotInitialized();
285
+ }
286
+ }
287
+
288
+ return {
289
+ walletAddress: recipientTokenAccount.owner.toBase58(),
290
+ shouldCreateAsAssociatedTokenAccount: false,
291
+ tokenAccAddress: recipientAddress,
292
+ };
293
+ }
294
+
295
+ async function deriveCreateAssociatedTokenAccountCommandDescriptor(
296
+ mainAccount: Account,
297
+ model: TransactionModel & { kind: TokenCreateATATransaction["kind"] },
298
+ api: ChainAPI
299
+ ): Promise<CommandDescriptor> {
300
+ const token = getTokenById(model.uiState.tokenId);
301
+ const tokenIdParts = token.id.split("/");
302
+ const mint = tokenIdParts[tokenIdParts.length - 1];
303
+
304
+ const associatedTokenAccountAddress = await api.findAssocTokenAccAddress(
305
+ mainAccount.freshAddress,
306
+ mint
307
+ );
308
+
309
+ const fees = await api.getAssocTokenAccMinNativeBalance();
310
+
311
+ return {
312
+ status: "valid",
313
+ fees,
314
+ command: {
315
+ kind: model.kind,
316
+ mint: mint,
317
+ owner: mainAccount.freshAddress,
318
+ associatedTokenAccountAddress,
319
+ },
320
+ };
321
+ }
322
+
323
+ async function deriveTransferCommandDescriptor(
324
+ mainAccount: Account,
325
+ tx: TransactionWithFeeCalculator,
326
+ model: TransactionModel & { kind: TransferTransaction["kind"] },
327
+ api: ChainAPI
328
+ ): Promise<CommandDescriptor> {
329
+ const errors: Record<string, Error> = {};
330
+ const warnings: Record<string, Error> = {};
331
+
332
+ if (!isEd25519Address(tx.recipient)) {
333
+ warnings.recipientOffCurve = new SolanaAddressOffEd25519();
334
+ }
335
+
336
+ const recipientWalletIsUnfunded = !(await isAccountFunded(tx.recipient, api));
337
+ if (recipientWalletIsUnfunded) {
338
+ warnings.recipient = new SolanaAccountNotFunded();
339
+ }
340
+
341
+ if (!tx.useAllAmount && tx.amount.lte(0)) {
342
+ errors.amount = new AmountRequired();
343
+ return toInvalidStatusCommand(errors, warnings);
344
+ }
345
+
346
+ const fee = tx.feeCalculator.lamportsPerSignature;
347
+
348
+ const txAmount = tx.useAllAmount
349
+ ? BigNumber.max(mainAccount.balance.minus(fee), 0)
350
+ : tx.amount;
351
+
352
+ if (txAmount.plus(fee).gt(mainAccount.balance)) {
353
+ errors.amount = new NotEnoughBalance();
354
+ return toInvalidStatusCommand(errors, warnings);
355
+ }
356
+
357
+ return {
358
+ status: "valid",
359
+ command: {
360
+ kind: "transfer",
361
+ sender: mainAccount.freshAddress,
362
+ recipient: tx.recipient,
363
+ amount: txAmount.toNumber(),
364
+ memo: model.uiState.memo,
365
+ },
366
+ warnings: Object.keys(warnings).length > 0 ? warnings : undefined,
367
+ };
368
+ }
369
+
370
+ function toInvalidTx(
371
+ tx: Transaction,
372
+ patch: Partial<Transaction>,
373
+ errors: Record<string, Error>,
374
+ warnings?: Record<string, Error>
375
+ ): Transaction {
376
+ return {
377
+ ...tx,
378
+ ...patch,
379
+ model: {
380
+ ...tx.model,
381
+ commandDescriptor: toInvalidStatusCommand(errors, warnings),
382
+ },
383
+ };
384
+ }
385
+
386
+ function toInvalidStatusCommand(
387
+ errors: Record<string, Error>,
388
+ warnings?: Record<string, Error>
389
+ ) {
390
+ return {
391
+ status: "invalid" as const,
392
+ errors,
393
+ warnings,
394
+ };
395
+ }
396
+
397
+ // if subaccountid present - it's a token transfer
398
+ function updateModelIfSubAccountIdPresent(tx: Transaction): Transaction {
399
+ if (tx.subAccountId) {
400
+ return {
401
+ ...tx,
402
+ model: {
403
+ kind: "token.transfer",
404
+ uiState: {
405
+ ...tx.model.uiState,
406
+ subAccountId: tx.subAccountId,
407
+ },
408
+ },
409
+ };
410
+ }
411
+
412
+ return tx;
413
+ }
414
+
415
+ async function isAccountFunded(
416
+ address: string,
417
+ api: ChainAPI
418
+ ): Promise<boolean> {
419
+ const balance = await api.getBalance(address);
420
+ return balance > 0;
421
+ }
422
+
423
+ export { prepareTransaction };