@ledgerhq/coin-kaspa 1.1.0-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 (640) hide show
  1. package/.eslintrc.js +20 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/.unimportedrc.json +87 -0
  4. package/CHANGELOG.md +978 -0
  5. package/LICENSE.txt +21 -0
  6. package/jest-global-setup.js +9 -0
  7. package/jest.config.js +21 -0
  8. package/jest.integ.config.js +8 -0
  9. package/lib/bridge/broadcast.d.ts +8 -0
  10. package/lib/bridge/broadcast.d.ts.map +1 -0
  11. package/lib/bridge/broadcast.js +16 -0
  12. package/lib/bridge/broadcast.js.map +1 -0
  13. package/lib/bridge/buildInitialOperation.d.ts +5 -0
  14. package/lib/bridge/buildInitialOperation.d.ts.map +1 -0
  15. package/lib/bridge/buildInitialOperation.js +31 -0
  16. package/lib/bridge/buildInitialOperation.js.map +1 -0
  17. package/lib/bridge/buildTransaction.d.ts +16 -0
  18. package/lib/bridge/buildTransaction.d.ts.map +1 -0
  19. package/lib/bridge/buildTransaction.js +63 -0
  20. package/lib/bridge/buildTransaction.js.map +1 -0
  21. package/lib/bridge/createTransaction.d.ts +4 -0
  22. package/lib/bridge/createTransaction.d.ts.map +1 -0
  23. package/lib/bridge/createTransaction.js +15 -0
  24. package/lib/bridge/createTransaction.js.map +1 -0
  25. package/lib/bridge/estimateMaxSpendable.d.ts +4 -0
  26. package/lib/bridge/estimateMaxSpendable.d.ts.map +1 -0
  27. package/lib/bridge/estimateMaxSpendable.js +19 -0
  28. package/lib/bridge/estimateMaxSpendable.js.map +1 -0
  29. package/lib/bridge/getTransactionStatus.d.ts +4 -0
  30. package/lib/bridge/getTransactionStatus.d.ts.map +1 -0
  31. package/lib/bridge/getTransactionStatus.js +68 -0
  32. package/lib/bridge/getTransactionStatus.js.map +1 -0
  33. package/lib/bridge/index.d.ts +9 -0
  34. package/lib/bridge/index.d.ts.map +1 -0
  35. package/lib/bridge/index.js +75 -0
  36. package/lib/bridge/index.js.map +1 -0
  37. package/lib/bridge/initAccount.d.ts +2 -0
  38. package/lib/bridge/initAccount.d.ts.map +1 -0
  39. package/lib/bridge/initAccount.js +6 -0
  40. package/lib/bridge/initAccount.js.map +1 -0
  41. package/lib/bridge/prepareTransaction.d.ts +14 -0
  42. package/lib/bridge/prepareTransaction.d.ts.map +1 -0
  43. package/lib/bridge/prepareTransaction.js +46 -0
  44. package/lib/bridge/prepareTransaction.js.map +1 -0
  45. package/lib/bridge/signOperation.d.ts +8 -0
  46. package/lib/bridge/signOperation.d.ts.map +1 -0
  47. package/lib/bridge/signOperation.js +34 -0
  48. package/lib/bridge/signOperation.js.map +1 -0
  49. package/lib/bridge/synchronization.d.ts +4 -0
  50. package/lib/bridge/synchronization.d.ts.map +1 -0
  51. package/lib/bridge/synchronization.js +66 -0
  52. package/lib/bridge/synchronization.js.map +1 -0
  53. package/lib/config.d.ts +8 -0
  54. package/lib/config.d.ts.map +1 -0
  55. package/lib/config.js +9 -0
  56. package/lib/config.js.map +1 -0
  57. package/lib/deviceTransactionConfig.d.ts +11 -0
  58. package/lib/deviceTransactionConfig.d.ts.map +1 -0
  59. package/lib/deviceTransactionConfig.js +32 -0
  60. package/lib/deviceTransactionConfig.js.map +1 -0
  61. package/lib/errors.d.ts +8 -0
  62. package/lib/errors.d.ts.map +1 -0
  63. package/lib/errors.js +8 -0
  64. package/lib/errors.js.map +1 -0
  65. package/lib/hw-getAddress.d.ts +6 -0
  66. package/lib/hw-getAddress.d.ts.map +1 -0
  67. package/lib/hw-getAddress.js +14 -0
  68. package/lib/hw-getAddress.js.map +1 -0
  69. package/lib/index.d.ts +2 -0
  70. package/lib/index.d.ts.map +1 -0
  71. package/lib/index.js +18 -0
  72. package/lib/index.js.map +1 -0
  73. package/lib/logic/base32.d.ts +30 -0
  74. package/lib/logic/base32.d.ts.map +1 -0
  75. package/lib/logic/base32.js +99 -0
  76. package/lib/logic/base32.js.map +1 -0
  77. package/lib/logic/bip32.d.ts +9 -0
  78. package/lib/logic/bip32.d.ts.map +1 -0
  79. package/lib/logic/bip32.js +23 -0
  80. package/lib/logic/bip32.js.map +1 -0
  81. package/lib/logic/getAllTransactions.d.ts +3 -0
  82. package/lib/logic/getAllTransactions.d.ts.map +1 -0
  83. package/lib/logic/getAllTransactions.js +19 -0
  84. package/lib/logic/getAllTransactions.js.map +1 -0
  85. package/lib/logic/getFeeRate.d.ts +4 -0
  86. package/lib/logic/getFeeRate.d.ts.map +1 -0
  87. package/lib/logic/getFeeRate.js +19 -0
  88. package/lib/logic/getFeeRate.js.map +1 -0
  89. package/lib/logic/index.d.ts +11 -0
  90. package/lib/logic/index.d.ts.map +1 -0
  91. package/lib/logic/index.js +27 -0
  92. package/lib/logic/index.js.map +1 -0
  93. package/lib/logic/kaspaAddresses.d.ts +30 -0
  94. package/lib/logic/kaspaAddresses.d.ts.map +1 -0
  95. package/lib/logic/kaspaAddresses.js +231 -0
  96. package/lib/logic/kaspaAddresses.js.map +1 -0
  97. package/lib/logic/massCalcluation.d.ts +4 -0
  98. package/lib/logic/massCalcluation.d.ts.map +1 -0
  99. package/lib/logic/massCalcluation.js +40 -0
  100. package/lib/logic/massCalcluation.js.map +1 -0
  101. package/lib/logic/scanAddresses.d.ts +13 -0
  102. package/lib/logic/scanAddresses.d.ts.map +1 -0
  103. package/lib/logic/scanAddresses.js +147 -0
  104. package/lib/logic/scanAddresses.js.map +1 -0
  105. package/lib/logic/scanOperations.d.ts +3 -0
  106. package/lib/logic/scanOperations.d.ts.map +1 -0
  107. package/lib/logic/scanOperations.js +43 -0
  108. package/lib/logic/scanOperations.js.map +1 -0
  109. package/lib/logic/scanUtxos.d.ts +8 -0
  110. package/lib/logic/scanUtxos.d.ts.map +1 -0
  111. package/lib/logic/scanUtxos.js +39 -0
  112. package/lib/logic/scanUtxos.js.map +1 -0
  113. package/lib/logic/tests/bip32.test.d.ts +2 -0
  114. package/lib/logic/tests/bip32.test.d.ts.map +1 -0
  115. package/lib/logic/tests/bip32.test.js +64 -0
  116. package/lib/logic/tests/bip32.test.js.map +1 -0
  117. package/lib/logic/tests/getFeeRate.test.d.ts +2 -0
  118. package/lib/logic/tests/getFeeRate.test.d.ts.map +1 -0
  119. package/lib/logic/tests/getFeeRate.test.js +57 -0
  120. package/lib/logic/tests/getFeeRate.test.js.map +1 -0
  121. package/lib/logic/tests/kaspaAddresses.test.d.ts +2 -0
  122. package/lib/logic/tests/kaspaAddresses.test.d.ts.map +1 -0
  123. package/lib/logic/tests/kaspaAddresses.test.js +172 -0
  124. package/lib/logic/tests/kaspaAddresses.test.js.map +1 -0
  125. package/lib/logic/tests/massCalcluation.test.d.ts +2 -0
  126. package/lib/logic/tests/massCalcluation.test.d.ts.map +1 -0
  127. package/lib/logic/tests/massCalcluation.test.js +27 -0
  128. package/lib/logic/tests/massCalcluation.test.js.map +1 -0
  129. package/lib/logic/tests/scanAddresses.integ.test.d.ts +2 -0
  130. package/lib/logic/tests/scanAddresses.integ.test.d.ts.map +1 -0
  131. package/lib/logic/tests/scanAddresses.integ.test.js +18 -0
  132. package/lib/logic/tests/scanAddresses.integ.test.js.map +1 -0
  133. package/lib/logic/tests/scanOperations.integ.test.d.ts +2 -0
  134. package/lib/logic/tests/scanOperations.integ.test.d.ts.map +1 -0
  135. package/lib/logic/tests/scanOperations.integ.test.js +254 -0
  136. package/lib/logic/tests/scanOperations.integ.test.js.map +1 -0
  137. package/lib/logic/tests/scanOperations.test.d.ts +2 -0
  138. package/lib/logic/tests/scanOperations.test.d.ts.map +1 -0
  139. package/lib/logic/tests/scanOperations.test.js +184 -0
  140. package/lib/logic/tests/scanOperations.test.js.map +1 -0
  141. package/lib/logic/tests/scanUtxos.integ.test.d.ts +2 -0
  142. package/lib/logic/tests/scanUtxos.integ.test.d.ts.map +1 -0
  143. package/lib/logic/tests/scanUtxos.integ.test.js +13 -0
  144. package/lib/logic/tests/scanUtxos.integ.test.js.map +1 -0
  145. package/lib/logic/tests/scanUtxos.test.d.ts +2 -0
  146. package/lib/logic/tests/scanUtxos.test.d.ts.map +1 -0
  147. package/lib/logic/tests/scanUtxos.test.js +167 -0
  148. package/lib/logic/tests/scanUtxos.test.js.map +1 -0
  149. package/lib/logic/tests/utxoLib.test.d.ts +2 -0
  150. package/lib/logic/tests/utxoLib.test.d.ts.map +1 -0
  151. package/lib/logic/tests/utxoLib.test.js +26 -0
  152. package/lib/logic/tests/utxoLib.test.js.map +1 -0
  153. package/lib/logic/tests/utxoSelection.test.d.ts +10 -0
  154. package/lib/logic/tests/utxoSelection.test.d.ts.map +1 -0
  155. package/lib/logic/tests/utxoSelection.test.js +256 -0
  156. package/lib/logic/tests/utxoSelection.test.js.map +1 -0
  157. package/lib/logic/tests/validAddress.test.d.ts +2 -0
  158. package/lib/logic/tests/validAddress.test.d.ts.map +1 -0
  159. package/lib/logic/tests/validAddress.test.js +56 -0
  160. package/lib/logic/tests/validAddress.test.js.map +1 -0
  161. package/lib/logic/utxos/lib.d.ts +6 -0
  162. package/lib/logic/utxos/lib.d.ts.map +1 -0
  163. package/lib/logic/utxos/lib.js +27 -0
  164. package/lib/logic/utxos/lib.js.map +1 -0
  165. package/lib/logic/utxos/selection.d.ts +8 -0
  166. package/lib/logic/utxos/selection.d.ts.map +1 -0
  167. package/lib/logic/utxos/selection.js +80 -0
  168. package/lib/logic/utxos/selection.js.map +1 -0
  169. package/lib/network/config.d.ts +3 -0
  170. package/lib/network/config.d.ts.map +1 -0
  171. package/lib/network/config.js +8 -0
  172. package/lib/network/config.js.map +1 -0
  173. package/lib/network/getAddressesActive.d.ts +3 -0
  174. package/lib/network/getAddressesActive.d.ts.map +1 -0
  175. package/lib/network/getAddressesActive.js +25 -0
  176. package/lib/network/getAddressesActive.js.map +1 -0
  177. package/lib/network/getBalancesForAddresses.d.ts +3 -0
  178. package/lib/network/getBalancesForAddresses.d.ts.map +1 -0
  179. package/lib/network/getBalancesForAddresses.js +25 -0
  180. package/lib/network/getBalancesForAddresses.js.map +1 -0
  181. package/lib/network/getBlockDagInfo.d.ts +3 -0
  182. package/lib/network/getBlockDagInfo.d.ts.map +1 -0
  183. package/lib/network/getBlockDagInfo.js +24 -0
  184. package/lib/network/getBlockDagInfo.js.map +1 -0
  185. package/lib/network/getFeeEstimate.d.ts +3 -0
  186. package/lib/network/getFeeEstimate.d.ts.map +1 -0
  187. package/lib/network/getFeeEstimate.js +23 -0
  188. package/lib/network/getFeeEstimate.js.map +1 -0
  189. package/lib/network/getTransactions.d.ts +6 -0
  190. package/lib/network/getTransactions.d.ts.map +1 -0
  191. package/lib/network/getTransactions.js +19 -0
  192. package/lib/network/getTransactions.js.map +1 -0
  193. package/lib/network/getUtxosForAddresses.d.ts +3 -0
  194. package/lib/network/getUtxosForAddresses.d.ts.map +1 -0
  195. package/lib/network/getUtxosForAddresses.js +25 -0
  196. package/lib/network/getUtxosForAddresses.js.map +1 -0
  197. package/lib/network/getVirtualChainBlueScore.d.ts +2 -0
  198. package/lib/network/getVirtualChainBlueScore.d.ts.map +1 -0
  199. package/lib/network/getVirtualChainBlueScore.js +24 -0
  200. package/lib/network/getVirtualChainBlueScore.js.map +1 -0
  201. package/lib/network/index.d.ts +9 -0
  202. package/lib/network/index.d.ts.map +1 -0
  203. package/lib/network/index.js +20 -0
  204. package/lib/network/index.js.map +1 -0
  205. package/lib/network/submitTransaction.d.ts +3 -0
  206. package/lib/network/submitTransaction.d.ts.map +1 -0
  207. package/lib/network/submitTransaction.js +27 -0
  208. package/lib/network/submitTransaction.js.map +1 -0
  209. package/lib/network/tests/getAddressesActive.test.d.ts +2 -0
  210. package/lib/network/tests/getAddressesActive.test.d.ts.map +1 -0
  211. package/lib/network/tests/getAddressesActive.test.js +65 -0
  212. package/lib/network/tests/getAddressesActive.test.js.map +1 -0
  213. package/lib/network/tests/getBalancesForAddresss.test.d.ts +2 -0
  214. package/lib/network/tests/getBalancesForAddresss.test.d.ts.map +1 -0
  215. package/lib/network/tests/getBalancesForAddresss.test.js +40 -0
  216. package/lib/network/tests/getBalancesForAddresss.test.js.map +1 -0
  217. package/lib/network/tests/getBlockDagInfo.test.d.ts +2 -0
  218. package/lib/network/tests/getBlockDagInfo.test.d.ts.map +1 -0
  219. package/lib/network/tests/getBlockDagInfo.test.js +36 -0
  220. package/lib/network/tests/getBlockDagInfo.test.js.map +1 -0
  221. package/lib/network/tests/getFeeEstimate.test.d.ts +2 -0
  222. package/lib/network/tests/getFeeEstimate.test.d.ts.map +1 -0
  223. package/lib/network/tests/getFeeEstimate.test.js +54 -0
  224. package/lib/network/tests/getFeeEstimate.test.js.map +1 -0
  225. package/lib/network/tests/getTransactions.test.d.ts +2 -0
  226. package/lib/network/tests/getTransactions.test.d.ts.map +1 -0
  227. package/lib/network/tests/getTransactions.test.js +157 -0
  228. package/lib/network/tests/getTransactions.test.js.map +1 -0
  229. package/lib/network/tests/getUtxosForAddress.test.d.ts +2 -0
  230. package/lib/network/tests/getUtxosForAddress.test.d.ts.map +1 -0
  231. package/lib/network/tests/getUtxosForAddress.test.js +142 -0
  232. package/lib/network/tests/getUtxosForAddress.test.js.map +1 -0
  233. package/lib/network/tests/getVirtualChainBlueScore.test.d.ts +2 -0
  234. package/lib/network/tests/getVirtualChainBlueScore.test.d.ts.map +1 -0
  235. package/lib/network/tests/getVirtualChainBlueScore.test.js +27 -0
  236. package/lib/network/tests/getVirtualChainBlueScore.test.js.map +1 -0
  237. package/lib/network/tests/submitTransaction.test.d.ts +2 -0
  238. package/lib/network/tests/submitTransaction.test.d.ts.map +1 -0
  239. package/lib/network/tests/submitTransaction.test.js +43 -0
  240. package/lib/network/tests/submitTransaction.test.js.map +1 -0
  241. package/lib/test/bridgeDatasetTest.d.ts +4 -0
  242. package/lib/test/bridgeDatasetTest.d.ts.map +1 -0
  243. package/lib/test/bridgeDatasetTest.js +46 -0
  244. package/lib/test/bridgeDatasetTest.js.map +1 -0
  245. package/lib/test/cli.d.ts +16 -0
  246. package/lib/test/cli.d.ts.map +1 -0
  247. package/lib/test/cli.js +30 -0
  248. package/lib/test/cli.js.map +1 -0
  249. package/lib/test/index.d.ts +2 -0
  250. package/lib/test/index.d.ts.map +1 -0
  251. package/lib/test/index.js +18 -0
  252. package/lib/test/index.js.map +1 -0
  253. package/lib/transaction.d.ts +16 -0
  254. package/lib/transaction.d.ts.map +1 -0
  255. package/lib/transaction.js +66 -0
  256. package/lib/transaction.js.map +1 -0
  257. package/lib/types/addresses.d.ts +18 -0
  258. package/lib/types/addresses.d.ts.map +1 -0
  259. package/lib/types/addresses.js +3 -0
  260. package/lib/types/addresses.js.map +1 -0
  261. package/lib/types/bridge.d.ts +34 -0
  262. package/lib/types/bridge.d.ts.map +1 -0
  263. package/lib/types/bridge.js +3 -0
  264. package/lib/types/bridge.js.map +1 -0
  265. package/lib/types/errors.d.ts +10 -0
  266. package/lib/types/errors.d.ts.map +1 -0
  267. package/lib/types/errors.js +8 -0
  268. package/lib/types/errors.js.map +1 -0
  269. package/lib/types/index.d.ts +8 -0
  270. package/lib/types/index.d.ts.map +1 -0
  271. package/lib/types/index.js +18 -0
  272. package/lib/types/index.js.map +1 -0
  273. package/lib/types/kaspaHwTransaction.d.ts +89 -0
  274. package/lib/types/kaspaHwTransaction.d.ts.map +1 -0
  275. package/lib/types/kaspaHwTransaction.js +167 -0
  276. package/lib/types/kaspaHwTransaction.js.map +1 -0
  277. package/lib/types/kaspaNetwork.d.ts +22 -0
  278. package/lib/types/kaspaNetwork.d.ts.map +1 -0
  279. package/lib/types/kaspaNetwork.js +3 -0
  280. package/lib/types/kaspaNetwork.js.map +1 -0
  281. package/lib/types/network.d.ts +91 -0
  282. package/lib/types/network.d.ts.map +1 -0
  283. package/lib/types/network.js +3 -0
  284. package/lib/types/network.js.map +1 -0
  285. package/lib/types/signer.d.ts +14 -0
  286. package/lib/types/signer.d.ts.map +1 -0
  287. package/lib/types/signer.js +3 -0
  288. package/lib/types/signer.js.map +1 -0
  289. package/lib-es/bridge/broadcast.d.ts +8 -0
  290. package/lib-es/bridge/broadcast.d.ts.map +1 -0
  291. package/lib-es/bridge/broadcast.js +12 -0
  292. package/lib-es/bridge/broadcast.js.map +1 -0
  293. package/lib-es/bridge/buildInitialOperation.d.ts +5 -0
  294. package/lib-es/bridge/buildInitialOperation.d.ts.map +1 -0
  295. package/lib-es/bridge/buildInitialOperation.js +27 -0
  296. package/lib-es/bridge/buildInitialOperation.js.map +1 -0
  297. package/lib-es/bridge/buildTransaction.d.ts +16 -0
  298. package/lib-es/bridge/buildTransaction.d.ts.map +1 -0
  299. package/lib-es/bridge/buildTransaction.js +59 -0
  300. package/lib-es/bridge/buildTransaction.js.map +1 -0
  301. package/lib-es/bridge/createTransaction.d.ts +4 -0
  302. package/lib-es/bridge/createTransaction.d.ts.map +1 -0
  303. package/lib-es/bridge/createTransaction.js +11 -0
  304. package/lib-es/bridge/createTransaction.js.map +1 -0
  305. package/lib-es/bridge/estimateMaxSpendable.d.ts +4 -0
  306. package/lib-es/bridge/estimateMaxSpendable.d.ts.map +1 -0
  307. package/lib-es/bridge/estimateMaxSpendable.js +15 -0
  308. package/lib-es/bridge/estimateMaxSpendable.js.map +1 -0
  309. package/lib-es/bridge/getTransactionStatus.d.ts +4 -0
  310. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -0
  311. package/lib-es/bridge/getTransactionStatus.js +66 -0
  312. package/lib-es/bridge/getTransactionStatus.js.map +1 -0
  313. package/lib-es/bridge/index.d.ts +9 -0
  314. package/lib-es/bridge/index.d.ts.map +1 -0
  315. package/lib-es/bridge/index.js +68 -0
  316. package/lib-es/bridge/index.js.map +1 -0
  317. package/lib-es/bridge/initAccount.d.ts +2 -0
  318. package/lib-es/bridge/initAccount.d.ts.map +1 -0
  319. package/lib-es/bridge/initAccount.js +2 -0
  320. package/lib-es/bridge/initAccount.js.map +1 -0
  321. package/lib-es/bridge/prepareTransaction.d.ts +14 -0
  322. package/lib-es/bridge/prepareTransaction.d.ts.map +1 -0
  323. package/lib-es/bridge/prepareTransaction.js +39 -0
  324. package/lib-es/bridge/prepareTransaction.js.map +1 -0
  325. package/lib-es/bridge/signOperation.d.ts +8 -0
  326. package/lib-es/bridge/signOperation.d.ts.map +1 -0
  327. package/lib-es/bridge/signOperation.js +27 -0
  328. package/lib-es/bridge/signOperation.js.map +1 -0
  329. package/lib-es/bridge/synchronization.d.ts +4 -0
  330. package/lib-es/bridge/synchronization.d.ts.map +1 -0
  331. package/lib-es/bridge/synchronization.js +62 -0
  332. package/lib-es/bridge/synchronization.js.map +1 -0
  333. package/lib-es/config.d.ts +8 -0
  334. package/lib-es/config.d.ts.map +1 -0
  335. package/lib-es/config.js +4 -0
  336. package/lib-es/config.js.map +1 -0
  337. package/lib-es/deviceTransactionConfig.d.ts +11 -0
  338. package/lib-es/deviceTransactionConfig.d.ts.map +1 -0
  339. package/lib-es/deviceTransactionConfig.js +30 -0
  340. package/lib-es/deviceTransactionConfig.js.map +1 -0
  341. package/lib-es/errors.d.ts +8 -0
  342. package/lib-es/errors.d.ts.map +1 -0
  343. package/lib-es/errors.js +5 -0
  344. package/lib-es/errors.js.map +1 -0
  345. package/lib-es/hw-getAddress.d.ts +6 -0
  346. package/lib-es/hw-getAddress.d.ts.map +1 -0
  347. package/lib-es/hw-getAddress.js +12 -0
  348. package/lib-es/hw-getAddress.js.map +1 -0
  349. package/lib-es/index.d.ts +2 -0
  350. package/lib-es/index.d.ts.map +1 -0
  351. package/lib-es/index.js +2 -0
  352. package/lib-es/index.js.map +1 -0
  353. package/lib-es/logic/base32.d.ts +30 -0
  354. package/lib-es/logic/base32.d.ts.map +1 -0
  355. package/lib-es/logic/base32.js +95 -0
  356. package/lib-es/logic/base32.js.map +1 -0
  357. package/lib-es/logic/bip32.d.ts +9 -0
  358. package/lib-es/logic/bip32.d.ts.map +1 -0
  359. package/lib-es/logic/bip32.js +17 -0
  360. package/lib-es/logic/bip32.js.map +1 -0
  361. package/lib-es/logic/getAllTransactions.d.ts +3 -0
  362. package/lib-es/logic/getAllTransactions.d.ts.map +1 -0
  363. package/lib-es/logic/getAllTransactions.js +15 -0
  364. package/lib-es/logic/getAllTransactions.js.map +1 -0
  365. package/lib-es/logic/getFeeRate.d.ts +4 -0
  366. package/lib-es/logic/getFeeRate.d.ts.map +1 -0
  367. package/lib-es/logic/getFeeRate.js +15 -0
  368. package/lib-es/logic/getFeeRate.js.map +1 -0
  369. package/lib-es/logic/index.d.ts +11 -0
  370. package/lib-es/logic/index.d.ts.map +1 -0
  371. package/lib-es/logic/index.js +11 -0
  372. package/lib-es/logic/index.js.map +1 -0
  373. package/lib-es/logic/kaspaAddresses.d.ts +30 -0
  374. package/lib-es/logic/kaspaAddresses.d.ts.map +1 -0
  375. package/lib-es/logic/kaspaAddresses.js +219 -0
  376. package/lib-es/logic/kaspaAddresses.js.map +1 -0
  377. package/lib-es/logic/massCalcluation.d.ts +4 -0
  378. package/lib-es/logic/massCalcluation.d.ts.map +1 -0
  379. package/lib-es/logic/massCalcluation.js +35 -0
  380. package/lib-es/logic/massCalcluation.js.map +1 -0
  381. package/lib-es/logic/scanAddresses.d.ts +13 -0
  382. package/lib-es/logic/scanAddresses.d.ts.map +1 -0
  383. package/lib-es/logic/scanAddresses.js +140 -0
  384. package/lib-es/logic/scanAddresses.js.map +1 -0
  385. package/lib-es/logic/scanOperations.d.ts +3 -0
  386. package/lib-es/logic/scanOperations.d.ts.map +1 -0
  387. package/lib-es/logic/scanOperations.js +39 -0
  388. package/lib-es/logic/scanOperations.js.map +1 -0
  389. package/lib-es/logic/scanUtxos.d.ts +8 -0
  390. package/lib-es/logic/scanUtxos.d.ts.map +1 -0
  391. package/lib-es/logic/scanUtxos.js +35 -0
  392. package/lib-es/logic/scanUtxos.js.map +1 -0
  393. package/lib-es/logic/tests/bip32.test.d.ts +2 -0
  394. package/lib-es/logic/tests/bip32.test.d.ts.map +1 -0
  395. package/lib-es/logic/tests/bip32.test.js +59 -0
  396. package/lib-es/logic/tests/bip32.test.js.map +1 -0
  397. package/lib-es/logic/tests/getFeeRate.test.d.ts +2 -0
  398. package/lib-es/logic/tests/getFeeRate.test.d.ts.map +1 -0
  399. package/lib-es/logic/tests/getFeeRate.test.js +55 -0
  400. package/lib-es/logic/tests/getFeeRate.test.js.map +1 -0
  401. package/lib-es/logic/tests/kaspaAddresses.test.d.ts +2 -0
  402. package/lib-es/logic/tests/kaspaAddresses.test.d.ts.map +1 -0
  403. package/lib-es/logic/tests/kaspaAddresses.test.js +170 -0
  404. package/lib-es/logic/tests/kaspaAddresses.test.js.map +1 -0
  405. package/lib-es/logic/tests/massCalcluation.test.d.ts +2 -0
  406. package/lib-es/logic/tests/massCalcluation.test.d.ts.map +1 -0
  407. package/lib-es/logic/tests/massCalcluation.test.js +22 -0
  408. package/lib-es/logic/tests/massCalcluation.test.js.map +1 -0
  409. package/lib-es/logic/tests/scanAddresses.integ.test.d.ts +2 -0
  410. package/lib-es/logic/tests/scanAddresses.integ.test.d.ts.map +1 -0
  411. package/lib-es/logic/tests/scanAddresses.integ.test.js +16 -0
  412. package/lib-es/logic/tests/scanAddresses.integ.test.js.map +1 -0
  413. package/lib-es/logic/tests/scanOperations.integ.test.d.ts +2 -0
  414. package/lib-es/logic/tests/scanOperations.integ.test.d.ts.map +1 -0
  415. package/lib-es/logic/tests/scanOperations.integ.test.js +249 -0
  416. package/lib-es/logic/tests/scanOperations.integ.test.js.map +1 -0
  417. package/lib-es/logic/tests/scanOperations.test.d.ts +2 -0
  418. package/lib-es/logic/tests/scanOperations.test.d.ts.map +1 -0
  419. package/lib-es/logic/tests/scanOperations.test.js +156 -0
  420. package/lib-es/logic/tests/scanOperations.test.js.map +1 -0
  421. package/lib-es/logic/tests/scanUtxos.integ.test.d.ts +2 -0
  422. package/lib-es/logic/tests/scanUtxos.integ.test.d.ts.map +1 -0
  423. package/lib-es/logic/tests/scanUtxos.integ.test.js +11 -0
  424. package/lib-es/logic/tests/scanUtxos.integ.test.js.map +1 -0
  425. package/lib-es/logic/tests/scanUtxos.test.d.ts +2 -0
  426. package/lib-es/logic/tests/scanUtxos.test.d.ts.map +1 -0
  427. package/lib-es/logic/tests/scanUtxos.test.js +139 -0
  428. package/lib-es/logic/tests/scanUtxos.test.js.map +1 -0
  429. package/lib-es/logic/tests/utxoLib.test.d.ts +2 -0
  430. package/lib-es/logic/tests/utxoLib.test.d.ts.map +1 -0
  431. package/lib-es/logic/tests/utxoLib.test.js +24 -0
  432. package/lib-es/logic/tests/utxoLib.test.js.map +1 -0
  433. package/lib-es/logic/tests/utxoSelection.test.d.ts +10 -0
  434. package/lib-es/logic/tests/utxoSelection.test.d.ts.map +1 -0
  435. package/lib-es/logic/tests/utxoSelection.test.js +229 -0
  436. package/lib-es/logic/tests/utxoSelection.test.js.map +1 -0
  437. package/lib-es/logic/tests/validAddress.test.d.ts +2 -0
  438. package/lib-es/logic/tests/validAddress.test.d.ts.map +1 -0
  439. package/lib-es/logic/tests/validAddress.test.js +54 -0
  440. package/lib-es/logic/tests/validAddress.test.js.map +1 -0
  441. package/lib-es/logic/utxos/lib.d.ts +6 -0
  442. package/lib-es/logic/utxos/lib.d.ts.map +1 -0
  443. package/lib-es/logic/utxos/lib.js +21 -0
  444. package/lib-es/logic/utxos/lib.js.map +1 -0
  445. package/lib-es/logic/utxos/selection.d.ts +8 -0
  446. package/lib-es/logic/utxos/selection.d.ts.map +1 -0
  447. package/lib-es/logic/utxos/selection.js +76 -0
  448. package/lib-es/logic/utxos/selection.js.map +1 -0
  449. package/lib-es/network/config.d.ts +3 -0
  450. package/lib-es/network/config.d.ts.map +1 -0
  451. package/lib-es/network/config.js +5 -0
  452. package/lib-es/network/config.js.map +1 -0
  453. package/lib-es/network/getAddressesActive.d.ts +3 -0
  454. package/lib-es/network/getAddressesActive.d.ts.map +1 -0
  455. package/lib-es/network/getAddressesActive.js +21 -0
  456. package/lib-es/network/getAddressesActive.js.map +1 -0
  457. package/lib-es/network/getBalancesForAddresses.d.ts +3 -0
  458. package/lib-es/network/getBalancesForAddresses.d.ts.map +1 -0
  459. package/lib-es/network/getBalancesForAddresses.js +21 -0
  460. package/lib-es/network/getBalancesForAddresses.js.map +1 -0
  461. package/lib-es/network/getBlockDagInfo.d.ts +3 -0
  462. package/lib-es/network/getBlockDagInfo.d.ts.map +1 -0
  463. package/lib-es/network/getBlockDagInfo.js +20 -0
  464. package/lib-es/network/getBlockDagInfo.js.map +1 -0
  465. package/lib-es/network/getFeeEstimate.d.ts +3 -0
  466. package/lib-es/network/getFeeEstimate.d.ts.map +1 -0
  467. package/lib-es/network/getFeeEstimate.js +19 -0
  468. package/lib-es/network/getFeeEstimate.js.map +1 -0
  469. package/lib-es/network/getTransactions.d.ts +6 -0
  470. package/lib-es/network/getTransactions.d.ts.map +1 -0
  471. package/lib-es/network/getTransactions.js +15 -0
  472. package/lib-es/network/getTransactions.js.map +1 -0
  473. package/lib-es/network/getUtxosForAddresses.d.ts +3 -0
  474. package/lib-es/network/getUtxosForAddresses.d.ts.map +1 -0
  475. package/lib-es/network/getUtxosForAddresses.js +21 -0
  476. package/lib-es/network/getUtxosForAddresses.js.map +1 -0
  477. package/lib-es/network/getVirtualChainBlueScore.d.ts +2 -0
  478. package/lib-es/network/getVirtualChainBlueScore.d.ts.map +1 -0
  479. package/lib-es/network/getVirtualChainBlueScore.js +20 -0
  480. package/lib-es/network/getVirtualChainBlueScore.js.map +1 -0
  481. package/lib-es/network/index.d.ts +9 -0
  482. package/lib-es/network/index.d.ts.map +1 -0
  483. package/lib-es/network/index.js +9 -0
  484. package/lib-es/network/index.js.map +1 -0
  485. package/lib-es/network/submitTransaction.d.ts +3 -0
  486. package/lib-es/network/submitTransaction.d.ts.map +1 -0
  487. package/lib-es/network/submitTransaction.js +23 -0
  488. package/lib-es/network/submitTransaction.js.map +1 -0
  489. package/lib-es/network/tests/getAddressesActive.test.d.ts +2 -0
  490. package/lib-es/network/tests/getAddressesActive.test.d.ts.map +1 -0
  491. package/lib-es/network/tests/getAddressesActive.test.js +63 -0
  492. package/lib-es/network/tests/getAddressesActive.test.js.map +1 -0
  493. package/lib-es/network/tests/getBalancesForAddresss.test.d.ts +2 -0
  494. package/lib-es/network/tests/getBalancesForAddresss.test.d.ts.map +1 -0
  495. package/lib-es/network/tests/getBalancesForAddresss.test.js +38 -0
  496. package/lib-es/network/tests/getBalancesForAddresss.test.js.map +1 -0
  497. package/lib-es/network/tests/getBlockDagInfo.test.d.ts +2 -0
  498. package/lib-es/network/tests/getBlockDagInfo.test.d.ts.map +1 -0
  499. package/lib-es/network/tests/getBlockDagInfo.test.js +34 -0
  500. package/lib-es/network/tests/getBlockDagInfo.test.js.map +1 -0
  501. package/lib-es/network/tests/getFeeEstimate.test.d.ts +2 -0
  502. package/lib-es/network/tests/getFeeEstimate.test.d.ts.map +1 -0
  503. package/lib-es/network/tests/getFeeEstimate.test.js +52 -0
  504. package/lib-es/network/tests/getFeeEstimate.test.js.map +1 -0
  505. package/lib-es/network/tests/getTransactions.test.d.ts +2 -0
  506. package/lib-es/network/tests/getTransactions.test.d.ts.map +1 -0
  507. package/lib-es/network/tests/getTransactions.test.js +155 -0
  508. package/lib-es/network/tests/getTransactions.test.js.map +1 -0
  509. package/lib-es/network/tests/getUtxosForAddress.test.d.ts +2 -0
  510. package/lib-es/network/tests/getUtxosForAddress.test.d.ts.map +1 -0
  511. package/lib-es/network/tests/getUtxosForAddress.test.js +140 -0
  512. package/lib-es/network/tests/getUtxosForAddress.test.js.map +1 -0
  513. package/lib-es/network/tests/getVirtualChainBlueScore.test.d.ts +2 -0
  514. package/lib-es/network/tests/getVirtualChainBlueScore.test.d.ts.map +1 -0
  515. package/lib-es/network/tests/getVirtualChainBlueScore.test.js +25 -0
  516. package/lib-es/network/tests/getVirtualChainBlueScore.test.js.map +1 -0
  517. package/lib-es/network/tests/submitTransaction.test.d.ts +2 -0
  518. package/lib-es/network/tests/submitTransaction.test.d.ts.map +1 -0
  519. package/lib-es/network/tests/submitTransaction.test.js +41 -0
  520. package/lib-es/network/tests/submitTransaction.test.js.map +1 -0
  521. package/lib-es/test/bridgeDatasetTest.d.ts +4 -0
  522. package/lib-es/test/bridgeDatasetTest.d.ts.map +1 -0
  523. package/lib-es/test/bridgeDatasetTest.js +43 -0
  524. package/lib-es/test/bridgeDatasetTest.js.map +1 -0
  525. package/lib-es/test/cli.d.ts +16 -0
  526. package/lib-es/test/cli.d.ts.map +1 -0
  527. package/lib-es/test/cli.js +25 -0
  528. package/lib-es/test/cli.js.map +1 -0
  529. package/lib-es/test/index.d.ts +2 -0
  530. package/lib-es/test/index.d.ts.map +1 -0
  531. package/lib-es/test/index.js +2 -0
  532. package/lib-es/test/index.js.map +1 -0
  533. package/lib-es/transaction.d.ts +16 -0
  534. package/lib-es/transaction.d.ts.map +1 -0
  535. package/lib-es/transaction.js +59 -0
  536. package/lib-es/transaction.js.map +1 -0
  537. package/lib-es/types/addresses.d.ts +18 -0
  538. package/lib-es/types/addresses.d.ts.map +1 -0
  539. package/lib-es/types/addresses.js +2 -0
  540. package/lib-es/types/addresses.js.map +1 -0
  541. package/lib-es/types/bridge.d.ts +34 -0
  542. package/lib-es/types/bridge.d.ts.map +1 -0
  543. package/lib-es/types/bridge.js +2 -0
  544. package/lib-es/types/bridge.js.map +1 -0
  545. package/lib-es/types/errors.d.ts +10 -0
  546. package/lib-es/types/errors.d.ts.map +1 -0
  547. package/lib-es/types/errors.js +5 -0
  548. package/lib-es/types/errors.js.map +1 -0
  549. package/lib-es/types/index.d.ts +8 -0
  550. package/lib-es/types/index.d.ts.map +1 -0
  551. package/lib-es/types/index.js +2 -0
  552. package/lib-es/types/index.js.map +1 -0
  553. package/lib-es/types/kaspaHwTransaction.d.ts +89 -0
  554. package/lib-es/types/kaspaHwTransaction.d.ts.map +1 -0
  555. package/lib-es/types/kaspaHwTransaction.js +160 -0
  556. package/lib-es/types/kaspaHwTransaction.js.map +1 -0
  557. package/lib-es/types/kaspaNetwork.d.ts +22 -0
  558. package/lib-es/types/kaspaNetwork.d.ts.map +1 -0
  559. package/lib-es/types/kaspaNetwork.js +2 -0
  560. package/lib-es/types/kaspaNetwork.js.map +1 -0
  561. package/lib-es/types/network.d.ts +91 -0
  562. package/lib-es/types/network.d.ts.map +1 -0
  563. package/lib-es/types/network.js +2 -0
  564. package/lib-es/types/network.js.map +1 -0
  565. package/lib-es/types/signer.d.ts +14 -0
  566. package/lib-es/types/signer.d.ts.map +1 -0
  567. package/lib-es/types/signer.js +2 -0
  568. package/lib-es/types/signer.js.map +1 -0
  569. package/package.json +138 -0
  570. package/src/bridge/broadcast.ts +14 -0
  571. package/src/bridge/buildInitialOperation.ts +38 -0
  572. package/src/bridge/buildTransaction.ts +80 -0
  573. package/src/bridge/createTransaction.ts +13 -0
  574. package/src/bridge/estimateMaxSpendable.ts +23 -0
  575. package/src/bridge/getTransactionStatus.ts +116 -0
  576. package/src/bridge/index.ts +106 -0
  577. package/src/bridge/initAccount.ts +1 -0
  578. package/src/bridge/prepareTransaction.ts +48 -0
  579. package/src/bridge/signOperation.ts +43 -0
  580. package/src/bridge/synchronization.ts +80 -0
  581. package/src/config.ts +7 -0
  582. package/src/deviceTransactionConfig.ts +44 -0
  583. package/src/errors.ts +6 -0
  584. package/src/hw-getAddress.ts +17 -0
  585. package/src/index.ts +1 -0
  586. package/src/logic/base32.ts +100 -0
  587. package/src/logic/bip32.ts +21 -0
  588. package/src/logic/getAllTransactions.ts +22 -0
  589. package/src/logic/getFeeRate.ts +20 -0
  590. package/src/logic/index.ts +10 -0
  591. package/src/logic/kaspaAddresses.ts +274 -0
  592. package/src/logic/massCalcluation.ts +50 -0
  593. package/src/logic/scanAddresses.ts +173 -0
  594. package/src/logic/scanOperations.ts +59 -0
  595. package/src/logic/scanUtxos.ts +44 -0
  596. package/src/logic/tests/bip32.test.ts +78 -0
  597. package/src/logic/tests/getFeeRate.test.ts +64 -0
  598. package/src/logic/tests/kaspaAddresses.test.ts +278 -0
  599. package/src/logic/tests/massCalcluation.test.ts +37 -0
  600. package/src/logic/tests/scanAddresses.integ.test.ts +27 -0
  601. package/src/logic/tests/scanOperations.integ.test.ts +271 -0
  602. package/src/logic/tests/scanOperations.test.ts +191 -0
  603. package/src/logic/tests/scanUtxos.integ.test.ts +14 -0
  604. package/src/logic/tests/scanUtxos.test.ts +153 -0
  605. package/src/logic/tests/utxoLib.test.ts +29 -0
  606. package/src/logic/tests/utxoSelection.test.ts +290 -0
  607. package/src/logic/tests/validAddress.test.ts +55 -0
  608. package/src/logic/utxos/lib.ts +40 -0
  609. package/src/logic/utxos/selection.ts +100 -0
  610. package/src/network/config.ts +6 -0
  611. package/src/network/getAddressesActive.ts +27 -0
  612. package/src/network/getBalancesForAddresses.ts +27 -0
  613. package/src/network/getBlockDagInfo.ts +22 -0
  614. package/src/network/getFeeEstimate.ts +21 -0
  615. package/src/network/getTransactions.ts +25 -0
  616. package/src/network/getUtxosForAddresses.ts +23 -0
  617. package/src/network/getVirtualChainBlueScore.ts +21 -0
  618. package/src/network/index.ts +8 -0
  619. package/src/network/submitTransaction.ts +27 -0
  620. package/src/network/tests/getAddressesActive.test.ts +77 -0
  621. package/src/network/tests/getBalancesForAddresss.test.ts +44 -0
  622. package/src/network/tests/getBlockDagInfo.test.ts +40 -0
  623. package/src/network/tests/getFeeEstimate.test.ts +57 -0
  624. package/src/network/tests/getTransactions.test.ts +173 -0
  625. package/src/network/tests/getUtxosForAddress.test.ts +159 -0
  626. package/src/network/tests/getVirtualChainBlueScore.test.ts +29 -0
  627. package/src/network/tests/submitTransaction.test.ts +53 -0
  628. package/src/test/bridgeDatasetTest.ts +47 -0
  629. package/src/test/cli.ts +33 -0
  630. package/src/test/index.ts +1 -0
  631. package/src/transaction.ts +84 -0
  632. package/src/types/addresses.ts +19 -0
  633. package/src/types/bridge.ts +43 -0
  634. package/src/types/errors.ts +7 -0
  635. package/src/types/index.ts +7 -0
  636. package/src/types/kaspaHwTransaction.ts +234 -0
  637. package/src/types/kaspaNetwork.ts +21 -0
  638. package/src/types/network.ts +101 -0
  639. package/src/types/signer.ts +22 -0
  640. package/tsconfig.json +13 -0
@@ -0,0 +1,290 @@
1
+ import { selectUtxos } from "../utxos/selection";
2
+ import { BigNumber } from "bignumber.js";
3
+ import { KaspaUtxo } from "../../types";
4
+ import * as lib from "../utxos/lib";
5
+
6
+ const TX_MASS_PER_INPUT = 1118;
7
+ const TX_MASS_FOR_TWO_OUTPUTS = 918;
8
+ const TX_MASS_FOR_ECDSA = 11;
9
+
10
+ export class KaspaUtxoGenerator {
11
+ static generateUtxo(amount: BigNumber, blockDaaScore: string): KaspaUtxo {
12
+ return {
13
+ address: "kaspa:qrp78nf43jaz3zk0j4dxga4ncdzk95xhun95hp6scyh6g6z7kwugy02wfw6ee",
14
+ outpoint: {
15
+ transactionId: this.generateRandomTransactionId(),
16
+ index: this.generateRandomIndex(),
17
+ },
18
+ utxoEntry: {
19
+ amount,
20
+ scriptPublicKey: {
21
+ version: 0,
22
+ scriptPublicKey: this.generateRandomScriptPublicKey(),
23
+ },
24
+ blockDaaScore,
25
+ isCoinbase: true,
26
+ },
27
+ accountType: 0,
28
+ accountIndex: 4,
29
+ } as KaspaUtxo;
30
+ }
31
+
32
+ static generateUtxoSet(
33
+ count: number,
34
+ amount: BigNumber,
35
+ startBlockDaaScore: string,
36
+ ): KaspaUtxo[] {
37
+ const utxos: KaspaUtxo[] = [];
38
+ for (let i = 0; i < count; i++) {
39
+ utxos.push(this.generateUtxo(amount, startBlockDaaScore));
40
+ startBlockDaaScore = (parseInt(startBlockDaaScore) + 1).toString();
41
+ }
42
+ return utxos;
43
+ }
44
+
45
+ private static generateRandomTransactionId(): string {
46
+ const randomBytes = crypto.getRandomValues(new Uint8Array(32));
47
+ return Array.from(randomBytes)
48
+ .map(b => b.toString(16).padStart(2, "0"))
49
+ .join("");
50
+ }
51
+
52
+ private static generateRandomIndex(): number {
53
+ return Math.floor(Math.random() * 1000);
54
+ }
55
+
56
+ private static generateRandomScriptPublicKey(): string {
57
+ const randomBytes = crypto.getRandomValues(new Uint8Array(34));
58
+ return Array.from(randomBytes)
59
+ .map(b => b.toString(16).padStart(2, "0"))
60
+ .join("");
61
+ }
62
+ }
63
+
64
+ describe("2 outputs - no discard", () => {
65
+ test("2/5 inputs, 2 outputs", () => {
66
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
67
+ const feeRate = 1;
68
+ const isEcdsaRecipient = false;
69
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_5000_0000), feeRate);
70
+
71
+ expect(utxos.length).toBe(5);
72
+ // Selected 2 times 1_0000_0000 UTXO
73
+ expect(selectedUtxos.utxos.length).toBe(2);
74
+ expect(selectedUtxos.utxos[0].utxoEntry.blockDaaScore).toBe("12345");
75
+ expect(selectedUtxos.utxos[1].utxoEntry.blockDaaScore).toBe("12346");
76
+
77
+ // TX should have: 2 inputs and 2 outputs
78
+ // compute mass = 3154
79
+ // storage mass = 6668
80
+
81
+ // fee only depends on compute mass
82
+ expect(selectedUtxos.fee.toNumber()).toBe(3154);
83
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(2_0000_0000 - 1_5000_0000 - 3154);
84
+ });
85
+
86
+ test("1/5 inputs, 2 outputs", () => {
87
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(2_0000_0000), "12345");
88
+ const isEcdsaRecipient = false;
89
+ const feeRate = 1;
90
+ const sendAmount = BigNumber(1_5000_0000);
91
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
92
+
93
+ expect(selectedUtxos.utxos.length).toBe(1);
94
+ expect(selectedUtxos.utxos[0].utxoEntry.blockDaaScore).toBe("12345");
95
+
96
+ // TX should be: 1 in + 2 out
97
+ // compute mass = 2036
98
+ // storage mass = 21674
99
+ expect(selectedUtxos.fee.toNumber()).toBe(2036);
100
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(2_0000_0000 - 1_5000_0000 - 2036);
101
+ });
102
+
103
+ it.each([1, 10, 20, 80, 5000])("5 inputs, 2 outputs, feeRate = %i", feeRate => {
104
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(15, BigNumber(1_0000_0000), "12345");
105
+ const isEcdsaRecipient = false;
106
+ const sendAmount = BigNumber(4_5000_0000);
107
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
108
+
109
+ expect(selectedUtxos.utxos.length).toBe(5);
110
+ // TX should be: 1 in + 2 out
111
+ // compute mass = 1118 * 5 + 918 = 6508
112
+ // storage mass = 0 ( 5 in and 2 out.. )
113
+ expect(selectedUtxos.fee.toNumber()).toBe(6508 * feeRate);
114
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(5_0000_0000 - 4_5000_0000 - 6508 * feeRate);
115
+ });
116
+
117
+ test("5 inputs, 2 outputs, feerate = 8203 => not possible!", () => {
118
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
119
+ const feerate = 8203;
120
+
121
+ expect(selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate - 1)).toBeDefined();
122
+ expect(() => selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate)).toThrow(
123
+ "UTXO total amount is not sufficient for sending amount 450000000",
124
+ );
125
+ });
126
+ });
127
+ describe("ECDSA mass", () => {
128
+ it.each([1, 2, 5])("5 inputs, 2 outputs, feerate = %i, ECDSA", feeRate => {
129
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(10, BigNumber(1_0000_0000), "12345");
130
+ const selectedUtxos = selectUtxos(utxos, true, BigNumber(4_5000_0000), feeRate);
131
+
132
+ const expectedInputCnt = 5;
133
+ const computeMass =
134
+ TX_MASS_FOR_TWO_OUTPUTS + TX_MASS_PER_INPUT * expectedInputCnt + TX_MASS_FOR_ECDSA;
135
+ const expectedFee = computeMass * feeRate;
136
+
137
+ expect(selectedUtxos.utxos.length).toBe(expectedInputCnt);
138
+ // TX should be: 1 in + 2 out
139
+ // compute mass = 1118 * 5 + 918 + 11 (ECDSA) = 6508
140
+ // storage mass = 0 ( 5 in and 2 out.. )
141
+
142
+ expect(selectedUtxos.fee.toNumber()).toBe(expectedFee);
143
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(5_0000_0000 - 4_5000_0000 - expectedFee);
144
+ });
145
+ test("2/2 input, 2 outputs, feerate = 1, ECDSA", () => {
146
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
147
+ const selectedUtxos = selectUtxos(utxos, true, BigNumber(1_5000_0000), 1);
148
+
149
+ expect(utxos.length).toBe(5);
150
+ expect(selectedUtxos.utxos.length).toBe(2);
151
+ // TX should be: 2 in + 2 out
152
+ // compute mass = 3165 (ECDSA)
153
+ // storage mass = 6668
154
+ expect(selectedUtxos.fee.toNumber()).toBe(3165);
155
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(2_0000_0000 - 1_5000_0000 - 3165);
156
+ });
157
+ });
158
+ describe("2 outputs - no discard", () => {});
159
+
160
+ describe("1 output with discard", () => {
161
+ test("check sweetspot - discard up to 1530 sompis change", () => {
162
+ const feeRate = 1;
163
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(6, BigNumber(1_0000_0000), "12345");
164
+ const isEcdsaRecipient = false;
165
+ const sendAmount = BigNumber(5_0000_0000 - 5 * 1118 - 918 - 1530);
166
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
167
+
168
+ expect(selectedUtxos.utxos.length).toBe(5);
169
+ expect(selectedUtxos.fee.toNumber()).toBe(5 * 1118 + 918 + 1530);
170
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
171
+
172
+ const selectedUtxos2 = selectUtxos(utxos, isEcdsaRecipient, sendAmount.minus(1), feeRate);
173
+ expect(selectedUtxos2.utxos.length).toBe(6);
174
+ expect(selectedUtxos2.fee.toNumber()).toBe(6 * 1118 + 918);
175
+ expect(selectedUtxos2.changeAmount.toNumber()).toBe(100000413);
176
+ });
177
+
178
+ test("check sweetspot with feeRate", () => {
179
+ const feeRate = 2;
180
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(6, BigNumber(1_0000_0000), "12345");
181
+ const isEcdsaRecipient = false;
182
+ const sendAmount = BigNumber(5_0000_0000 - (5 * 1118 + 506) * 2);
183
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
184
+
185
+ expect(selectedUtxos.utxos.length).toBe(5);
186
+ expect(selectedUtxos.fee.toNumber()).toBe((5 * 1118 + 506) * 2);
187
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
188
+ });
189
+
190
+ test("6 inputs, 2 outputs, feerate = 7682 => don't discard change, pick one more UTXO", () => {
191
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(10, BigNumber(1_0000_0000), "12345");
192
+ const feerate = 7682;
193
+ const selectedUtxos = selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate);
194
+ // in this case the change has to be discarded, as it's only 5544 sompis
195
+ // and the storage mass explodes to an inacceptable value of 180327402g
196
+ expect(selectedUtxos.utxos.length).toBe(5);
197
+ expect(selectedUtxos.fee.toNumber()).toBe(50000000);
198
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
199
+ });
200
+
201
+ test("6 inputs, 2 outputs, feerate = 8203 => need 6 inputs now.!", () => {
202
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(6, BigNumber(1_0000_0000), "12345");
203
+ const feerate = 8203;
204
+ const selectedUtxos = selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate);
205
+
206
+ const expectedInputCnt = 6;
207
+ const computeMass = TX_MASS_FOR_TWO_OUTPUTS + TX_MASS_PER_INPUT * expectedInputCnt;
208
+ const expectedFee = computeMass * feerate;
209
+
210
+ expect(selectedUtxos.utxos.length).toBe(expectedInputCnt);
211
+ expect(selectedUtxos.fee.toNumber()).toBe(expectedFee);
212
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(1_5000_0000 - expectedFee);
213
+ });
214
+ });
215
+
216
+ describe("1 output without discard", () => {
217
+ test("send exact UTXO sum for all UTXOs with no change", () => {
218
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
219
+ const feerate = 1;
220
+ const selectedUtxos = selectUtxos(
221
+ utxos,
222
+ false,
223
+ BigNumber(5_0000_0000 - (5 * 1118 + 506)),
224
+ feerate,
225
+ );
226
+
227
+ expect(selectedUtxos.utxos.length).toBe(5);
228
+ expect(selectedUtxos.fee.toNumber()).toBe(5 * 1118 + 506);
229
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
230
+ });
231
+
232
+ test("send exact UTXO sum for 2 UTXOs with no change", () => {
233
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
234
+ const feerate = 1;
235
+ const selectedUtxos = selectUtxos(
236
+ utxos,
237
+ false,
238
+ BigNumber(2_0000_0000 - (2 * 1118 + 506)),
239
+ feerate,
240
+ );
241
+
242
+ expect(selectedUtxos.utxos.length).toBe(2);
243
+ expect(selectedUtxos.fee.toNumber()).toBe(2 * 1118 + 506);
244
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
245
+ });
246
+
247
+ test("should throw an error if UTXO count exceeds maximum limit", () => {
248
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(100, BigNumber(1_0000_0000), "0");
249
+ const feeRate = 1;
250
+ const isEcdsaRecipient = false;
251
+
252
+ expect(() => {
253
+ selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_0000_0000), feeRate);
254
+ }).toThrow("UTXO count exceeds the limit of 88 for a TX.");
255
+ });
256
+
257
+ test("should throw an error if discarded change exceeds maximum allowable discard value", () => {
258
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(10, BigNumber(1_0000_0000), "0");
259
+ const feeRate = 1;
260
+ const isEcdsaRecipient = false;
261
+
262
+ expect(() => {
263
+ selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_0000), feeRate);
264
+ }).toThrow(/Change \d+ Sompis is too high to be discarded./);
265
+ });
266
+
267
+ test("should throw - UTXOs can't be determined to fulfill the specified amount", () => {
268
+ jest.spyOn(lib, "calcMaxSpendableAmount").mockReturnValue(BigNumber(1_2345_0000));
269
+ const feeRate = 1;
270
+ const isEcdsaRecipient = false;
271
+
272
+ expect(() => {
273
+ selectUtxos([], isEcdsaRecipient, BigNumber(1_0000), feeRate);
274
+ }).toThrow("UTXOs can't be determined to fulfill the specified amount");
275
+ });
276
+
277
+ test("same blockdaascore, still working.", () => {
278
+ // Generate more UTXOs than the allowed limit (88)
279
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(2, BigNumber(1_0000_0000), "0");
280
+ const isEcdsaRecipient = false;
281
+
282
+ utxos[1].utxoEntry.blockDaaScore = "0";
283
+
284
+ expect(selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_0000_0000)).utxos.length).toBe(2);
285
+ });
286
+
287
+ afterEach(() => {
288
+ jest.restoreAllMocks();
289
+ });
290
+ });
@@ -0,0 +1,55 @@
1
+ import { isValidKaspaAddress } from "../kaspaAddresses";
2
+
3
+ describe("isValidKaspaAddress", () => {
4
+ const testCases = [
5
+ {
6
+ input: "kaspa:qq82f9sdsqqkr74memhxt9yrefc8vq9khf5vt6xjp4tscc3pdenmks29mlp9y",
7
+ expected: true,
8
+ },
9
+ {
10
+ input: "kaspa:qqq7n4n232754kgw6jeu4zu86uerwn4kq9lnl2n2prwl3t2t9hvec720vk9s2",
11
+ expected: true,
12
+ },
13
+ {
14
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crl",
15
+ expected: true,
16
+ },
17
+ // scripthash
18
+ {
19
+ input: "kaspa:pp6jt8u5hj3mnjy8v0kk5fg7a8ddnfu7ls7egmqspdtpy0708eervp47e6ls2",
20
+ expected: true,
21
+ },
22
+ // wrong hash for Schnorr
23
+ {
24
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crr",
25
+ expected: false,
26
+ },
27
+ {
28
+ input: "kaspa:qyp0r5mcq4rd5grj3652ra09u5dcgwqq9ntuswp247nama5quyj40eq03sc2dkx", // ecdsa
29
+ expected: true,
30
+ },
31
+ // wrong hash for ECDSA
32
+ {
33
+ input: "kaspa:qyp0r5mcq4rd5grj3652ra09u5dcgwqq9ntuswp247nama5quyj40eq03sc2dkk", // ecdsa
34
+ expected: false,
35
+ },
36
+ {
37
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crl0", // wrong size
38
+ expected: false,
39
+ },
40
+ {
41
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crb", // unknown char b
42
+ expected: false,
43
+ },
44
+ {
45
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3cri", // unknown char i
46
+ expected: false,
47
+ },
48
+ ];
49
+
50
+ testCases.forEach(({ input, expected }, index) => {
51
+ it(`should return ${expected} for test case ${index + 1}`, () => {
52
+ expect(isValidKaspaAddress(input)).toBe(expected);
53
+ });
54
+ });
55
+ });
@@ -0,0 +1,40 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ import { KaspaUtxo } from "../../types";
3
+
4
+ const ADDITIONAL_MASS_PER_INPUT = 1118;
5
+
6
+ const DEFAULT_MASS_1_OUTPUT: number = 506;
7
+ const MAX_UTXOS_PER_TX: number = 88;
8
+
9
+ export const calcMaxSpendableAmount = (
10
+ utxos: KaspaUtxo[],
11
+ isEcdsaRecipient: boolean,
12
+ feerate: number = 1,
13
+ ): BigNumber => {
14
+ const maxInputAmount = utxos.reduce(
15
+ (sum, utxo) => sum.plus(new BigNumber(utxo.utxoEntry.amount)),
16
+ new BigNumber(0),
17
+ );
18
+
19
+ // storage mass can be neglected here
20
+ // max compute mass for one output and 88 inputs is 98901
21
+ let maxSpendableAmount = maxInputAmount.minus(
22
+ BigNumber(
23
+ DEFAULT_MASS_1_OUTPUT + Math.min(MAX_UTXOS_PER_TX, utxos.length) * ADDITIONAL_MASS_PER_INPUT,
24
+ ).times(feerate),
25
+ );
26
+
27
+ if (isEcdsaRecipient) {
28
+ maxSpendableAmount = maxSpendableAmount.minus(BigNumber(11));
29
+ }
30
+
31
+ return maxSpendableAmount.lt(0) ? BigNumber(0) : maxSpendableAmount;
32
+ };
33
+
34
+ export const sumBigNumber = (values: BigNumber[]): BigNumber => {
35
+ return values.reduce((acc, v) => acc.plus(v), BigNumber(0));
36
+ };
37
+
38
+ export const sumUtxoAmounts = (utxos: KaspaUtxo[]): BigNumber => {
39
+ return utxos.reduce((acc, v) => acc.plus(v.utxoEntry.amount), BigNumber(0));
40
+ };
@@ -0,0 +1,100 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ import { KaspaUtxo } from "../../types";
3
+ import { calcComputeMass, calcStorageMass } from "../massCalcluation";
4
+ import { calcMaxSpendableAmount, sumUtxoAmounts } from "./lib";
5
+
6
+ const MASS_LIMIT_PER_TX = 100_000; // TX mass must not exceed 100k gram.
7
+ const MASS_PER_INPUT: number = 1118; // Per selected utxo as input, mass increases by this value.
8
+ const MASS_PER_OUTPUT: number = 412; // Per selected utxo as input, mass increases by this value.
9
+ const MAX_UTXOS_PER_TX: number = 88; // 88 is the maximum of utxo inputs in one TX.
10
+ const MAX_DISCARD: number = 2000_0000; // Throw error, if discarded value is higher than this.
11
+
12
+ export const selectUtxos = (
13
+ utxos: KaspaUtxo[],
14
+ isEcdsaRecipient: boolean,
15
+ amount: BigNumber,
16
+ feerate: number = 1,
17
+ ): { changeAmount: BigNumber; fee: BigNumber; utxos: KaspaUtxo[] } => {
18
+ // always sort utxos
19
+ sortUtxos(utxos);
20
+ // Max UTXO count is 88. More don't fit into a regular TX
21
+ if (utxos.length > MAX_UTXOS_PER_TX) {
22
+ throw new Error(`UTXO count exceeds the limit of ${MAX_UTXOS_PER_TX} for a TX.`);
23
+ }
24
+
25
+ // First check in general, if there is enough amount in the UTXOs.
26
+ if (calcMaxSpendableAmount(utxos, isEcdsaRecipient, feerate).isLessThan(amount)) {
27
+ throw new Error(`UTXO total amount is not sufficient for sending amount ${amount}`);
28
+ }
29
+
30
+ // Find a sufficient slice.
31
+ for (let i = 0; i < utxos.length; i++) {
32
+ const selectedUtxos = utxos.slice(0, i + 1);
33
+ const selectedUtxoAmount = sumUtxoAmounts(selectedUtxos);
34
+ // calculate absolute min fee for regular TX with 1 outputs and the given feerate.
35
+ const minMass = calcComputeMass(i + 1, false, isEcdsaRecipient);
36
+ const minFee = minMass * feerate;
37
+
38
+ // Continue if utxo amount is not enough for transfering amount and fee for miners.
39
+ if (selectedUtxoAmount.isLessThan(amount.plus(minFee))) {
40
+ continue;
41
+ }
42
+
43
+ // Here there might be enough UTXOs for the amount + fee.
44
+ // Now the storage mass could be exceeding the TX limit, with having a low change amount value.
45
+ // If yes, add another UTXO.
46
+
47
+ // Assuming first, it is a valid TX with change ( 2 outputs )
48
+ const calcFee = feerate * calcComputeMass(i + 1, true, isEcdsaRecipient);
49
+ let changeAmount = selectedUtxoAmount.minus(amount).minus(calcFee);
50
+
51
+ const storageMass = changeAmount.isGreaterThan(0)
52
+ ? calcStorageMass(
53
+ selectedUtxos.map(u => u.utxoEntry.amount),
54
+ [amount, changeAmount],
55
+ )
56
+ : 0;
57
+
58
+ // If storage mass exceeds the limit or the change amount is negative ( 2 outputs not possible )
59
+ // Need to pick another UTXO or discard the change.
60
+ if (changeAmount.isLessThan(0) || storageMass > MASS_LIMIT_PER_TX) {
61
+ // Picking a further UTXO means a higher mass (one input and output) and thus a higher fee.
62
+ // Check if the fee is not higher, than just discarding the change.
63
+ const isWorthPickingAnotherUtxo = changeAmount.isGreaterThan(
64
+ BigNumber((MASS_PER_INPUT + MASS_PER_OUTPUT) * feerate),
65
+ );
66
+ if (i + 1 < utxos.length && isWorthPickingAnotherUtxo) {
67
+ // There is one more UTXO and it is cheaper to pick than discard the change.
68
+ continue;
69
+ } else {
70
+ // Change needs to be discarded as fee to keep mass low enough.
71
+ if (changeAmount.isGreaterThan(MAX_DISCARD)) {
72
+ throw new Error(
73
+ `Unable to select UTXOs. Change ${changeAmount} Sompis is too high to be discarded.`,
74
+ );
75
+ }
76
+ changeAmount = BigNumber(0);
77
+ }
78
+ }
79
+
80
+ return {
81
+ utxos: selectedUtxos,
82
+ changeAmount,
83
+ fee: selectedUtxoAmount.minus(amount).minus(changeAmount),
84
+ };
85
+ }
86
+ // Throw an error, if UTXOs can't be determined to fulfill the requirement.
87
+ throw new Error("UTXOs can't be determined to fulfill the specified amount");
88
+ };
89
+
90
+ const sortUtxos = (utxos: KaspaUtxo[]) => {
91
+ utxos.sort((a, b) => {
92
+ const transactionComparison = a.utxoEntry.blockDaaScore.localeCompare(
93
+ b.utxoEntry.blockDaaScore,
94
+ );
95
+ if (transactionComparison !== 0) {
96
+ return transactionComparison;
97
+ }
98
+ return a.utxoEntry.amount.minus(b.utxoEntry.amount).toNumber();
99
+ });
100
+ };
@@ -0,0 +1,6 @@
1
+ // const API_BASE = "https://api.kaspa.org";
2
+ import { getEnv } from "@ledgerhq/live-env";
3
+
4
+ const API_BASE = getEnv("API_KASPA_ENDPOINT");
5
+
6
+ export { API_BASE };
@@ -0,0 +1,27 @@
1
+ import { API_BASE } from "./config";
2
+ import { ApiResponseAddressActive } from "../types";
3
+
4
+ export const getAddressesActive = async (
5
+ addresses: string[],
6
+ ): Promise<ApiResponseAddressActive[]> => {
7
+ try {
8
+ const response = await fetch(`${API_BASE}/addresses/active`, {
9
+ method: "POST",
10
+ headers: {
11
+ Accept: "application/json",
12
+ "Content-Type": "application/json",
13
+ },
14
+ body: JSON.stringify({ addresses }),
15
+ });
16
+
17
+ if (!response.ok) {
18
+ throw new Error(
19
+ `Failed to fetch active state for addresses ${addresses}. Status: ${response.status}`,
20
+ );
21
+ }
22
+
23
+ return (await response.json()) as ApiResponseAddressActive[];
24
+ } catch (error) {
25
+ throw new Error(`Error fetching AddressesActives: ${(error as Error).message}`);
26
+ }
27
+ };
@@ -0,0 +1,27 @@
1
+ import { API_BASE } from "./config";
2
+ import { ApiResponseBalance } from "../types";
3
+
4
+ export const getBalancesForAddresses = async (
5
+ addresses: string[],
6
+ ): Promise<ApiResponseBalance[]> => {
7
+ try {
8
+ const response = await fetch(`${API_BASE}/addresses/balances`, {
9
+ method: "POST",
10
+ headers: {
11
+ Accept: "application/json",
12
+ "Content-Type": "application/json",
13
+ },
14
+ body: JSON.stringify({ addresses: addresses }),
15
+ });
16
+
17
+ if (!response.ok) {
18
+ throw new Error(
19
+ `Failed to fetch balance for address ${addresses}. Status: ${response.status}`,
20
+ );
21
+ }
22
+
23
+ return (await response.json()) as ApiResponseBalance[];
24
+ } catch (error) {
25
+ throw new Error(`Error fetching balance: ${(error as Error).message}`);
26
+ }
27
+ };
@@ -0,0 +1,22 @@
1
+ import { API_BASE } from "./config";
2
+ import { ApiResponseBlockDagInfo } from "../types";
3
+
4
+ export const getBlockDagInfo = async (): Promise<ApiResponseBlockDagInfo> => {
5
+ try {
6
+ const response = await fetch(`${API_BASE}/info/blockdag`, {
7
+ method: "GET",
8
+ headers: {
9
+ "Content-Type": "application/json",
10
+ },
11
+ });
12
+
13
+ if (!response.ok) {
14
+ throw new Error(`Status: ${response.status}`);
15
+ }
16
+
17
+ const blockDagInfo: ApiResponseBlockDagInfo = await response.json();
18
+ return blockDagInfo;
19
+ } catch (error) {
20
+ throw new Error(`Failed to fetch BlockDAG info. Error: ${error}`);
21
+ }
22
+ };
@@ -0,0 +1,21 @@
1
+ import { API_BASE } from "./config";
2
+ import { ApiResponseFeeEstimate } from "../types";
3
+
4
+ export const getFeeEstimate = async (): Promise<ApiResponseFeeEstimate> => {
5
+ try {
6
+ const response = await fetch(`${API_BASE}/info/fee-estimate`, {
7
+ headers: {
8
+ Accept: "application/json",
9
+ },
10
+ });
11
+
12
+ if (!response.ok) {
13
+ throw new Error("Network response was not ok");
14
+ }
15
+
16
+ const fees: ApiResponseFeeEstimate = await response.json();
17
+ return fees;
18
+ } catch (error) {
19
+ throw new Error(`Failed to fetch fee estimate. ${error}`);
20
+ }
21
+ };
@@ -0,0 +1,25 @@
1
+ import { ApiResponseTransaction } from "../types";
2
+ import { API_BASE } from "./config";
3
+
4
+ export const getTransactions = async (
5
+ address: string,
6
+ after: number = 1,
7
+ ): Promise<{ transactions: ApiResponseTransaction[]; nextPageAfter: string | null }> => {
8
+ const response = await fetch(
9
+ `${API_BASE}/addresses/${address}/full-transactions-page?resolve_previous_outpoints=light&limit=500&before=0&after=${after}`,
10
+ {
11
+ headers: {
12
+ Accept: "application/json",
13
+ },
14
+ },
15
+ );
16
+
17
+ if (!response.ok) {
18
+ throw new Error("Network response was not ok.");
19
+ }
20
+
21
+ const nextPageAfter = response.headers.get("X-Next-Page-After") || null;
22
+ const transactions = await response.json();
23
+
24
+ return { transactions, nextPageAfter };
25
+ };
@@ -0,0 +1,23 @@
1
+ import { API_BASE } from "./config";
2
+ import { ApiResponseUtxo } from "../types";
3
+
4
+ export const getUtxosForAddresses = async (addresses: string[]): Promise<ApiResponseUtxo[]> => {
5
+ try {
6
+ const response = await fetch(`${API_BASE}/addresses/utxos`, {
7
+ method: "POST",
8
+ headers: {
9
+ Accept: "application/json",
10
+ "Content-Type": "application/json",
11
+ },
12
+ body: JSON.stringify({ addresses }),
13
+ });
14
+
15
+ if (!response.ok) {
16
+ throw new Error(`Failed to fetch UTXOs for address ${addresses}. Status: ${response.status}`);
17
+ }
18
+
19
+ return (await response.json()) as ApiResponseUtxo[];
20
+ } catch (error) {
21
+ throw new Error(`Error fetching UTXOs: ${(error as Error).message}`);
22
+ }
23
+ };
@@ -0,0 +1,21 @@
1
+ import { API_BASE } from "./config";
2
+
3
+ export const getVirtualChainBlueScore = async (): Promise<number> => {
4
+ try {
5
+ const response = await fetch(`${API_BASE}/info/virtual-chain-blue-score`, {
6
+ method: "GET",
7
+ headers: {
8
+ Accept: "application/json",
9
+ "Content-Type": "application/json",
10
+ },
11
+ });
12
+
13
+ if (!response.ok) {
14
+ throw new Error(`Failed to fetch virtual-chain-blue-score. Status: ${response.status}`);
15
+ }
16
+
17
+ return (await response.json()).blueScore as number;
18
+ } catch (error) {
19
+ throw new Error(`Error fetching virtual chain blue score: ${(error as Error).message}`);
20
+ }
21
+ };
@@ -0,0 +1,8 @@
1
+ export { getAddressesActive } from "./getAddressesActive";
2
+ export { getBalancesForAddresses } from "./getBalancesForAddresses";
3
+ export { getFeeEstimate } from "./getFeeEstimate";
4
+ export { getTransactions } from "./getTransactions";
5
+ export { getUtxosForAddresses } from "./getUtxosForAddresses";
6
+ export { getVirtualChainBlueScore } from "./getVirtualChainBlueScore";
7
+ export { submitTransaction } from "./submitTransaction";
8
+ export { getBlockDagInfo } from "./getBlockDagInfo";