@ledgerhq/coin-kaspa 1.3.0-nightly.7 → 1.3.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 (163) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +26 -67
  3. package/lib/logic/tests/bip32.test.d.ts +2 -0
  4. package/lib/logic/tests/bip32.test.d.ts.map +1 -0
  5. package/lib/logic/tests/bip32.test.js +108 -0
  6. package/lib/logic/tests/bip32.test.js.map +1 -0
  7. package/lib/logic/tests/getFeeRate.test.d.ts +2 -0
  8. package/lib/logic/tests/getFeeRate.test.d.ts.map +1 -0
  9. package/lib/logic/tests/getFeeRate.test.js +57 -0
  10. package/lib/logic/tests/getFeeRate.test.js.map +1 -0
  11. package/lib/logic/tests/kaspaAddresses.test.d.ts +2 -0
  12. package/lib/logic/tests/kaspaAddresses.test.d.ts.map +1 -0
  13. package/lib/logic/tests/kaspaAddresses.test.js +172 -0
  14. package/lib/logic/tests/kaspaAddresses.test.js.map +1 -0
  15. package/lib/logic/tests/massCalcluation.test.d.ts +2 -0
  16. package/lib/logic/tests/massCalcluation.test.d.ts.map +1 -0
  17. package/lib/logic/tests/massCalcluation.test.js +27 -0
  18. package/lib/logic/tests/massCalcluation.test.js.map +1 -0
  19. package/lib/logic/tests/scanAddresses.integ.test.d.ts +2 -0
  20. package/lib/logic/tests/scanAddresses.integ.test.d.ts.map +1 -0
  21. package/lib/logic/tests/scanAddresses.integ.test.js +18 -0
  22. package/lib/logic/tests/scanAddresses.integ.test.js.map +1 -0
  23. package/lib/logic/tests/scanOperations.integ.test.d.ts +2 -0
  24. package/lib/logic/tests/scanOperations.integ.test.d.ts.map +1 -0
  25. package/lib/logic/tests/scanOperations.integ.test.js +254 -0
  26. package/lib/logic/tests/scanOperations.integ.test.js.map +1 -0
  27. package/lib/logic/tests/scanOperations.test.d.ts +2 -0
  28. package/lib/logic/tests/scanOperations.test.d.ts.map +1 -0
  29. package/lib/logic/tests/scanOperations.test.js +184 -0
  30. package/lib/logic/tests/scanOperations.test.js.map +1 -0
  31. package/lib/logic/tests/scanUtxos.integ.test.d.ts +2 -0
  32. package/lib/logic/tests/scanUtxos.integ.test.d.ts.map +1 -0
  33. package/lib/logic/tests/scanUtxos.integ.test.js +13 -0
  34. package/lib/logic/tests/scanUtxos.integ.test.js.map +1 -0
  35. package/lib/logic/tests/scanUtxos.test.d.ts +2 -0
  36. package/lib/logic/tests/scanUtxos.test.d.ts.map +1 -0
  37. package/lib/logic/tests/scanUtxos.test.js +167 -0
  38. package/lib/logic/tests/scanUtxos.test.js.map +1 -0
  39. package/lib/logic/tests/utxoLib.test.d.ts +2 -0
  40. package/lib/logic/tests/utxoLib.test.d.ts.map +1 -0
  41. package/lib/logic/tests/utxoLib.test.js +26 -0
  42. package/lib/logic/tests/utxoLib.test.js.map +1 -0
  43. package/lib/logic/tests/utxoSelection.test.d.ts +10 -0
  44. package/lib/logic/tests/utxoSelection.test.d.ts.map +1 -0
  45. package/lib/logic/tests/utxoSelection.test.js +256 -0
  46. package/lib/logic/tests/utxoSelection.test.js.map +1 -0
  47. package/lib/logic/tests/validAddress.test.d.ts +2 -0
  48. package/lib/logic/tests/validAddress.test.d.ts.map +1 -0
  49. package/lib/logic/tests/validAddress.test.js +56 -0
  50. package/lib/logic/tests/validAddress.test.js.map +1 -0
  51. package/lib/network/tests/getAddressesActive.test.d.ts +2 -0
  52. package/lib/network/tests/getAddressesActive.test.d.ts.map +1 -0
  53. package/lib/network/tests/getAddressesActive.test.js +65 -0
  54. package/lib/network/tests/getAddressesActive.test.js.map +1 -0
  55. package/lib/network/tests/getBalancesForAddresss.test.d.ts +2 -0
  56. package/lib/network/tests/getBalancesForAddresss.test.d.ts.map +1 -0
  57. package/lib/network/tests/getBalancesForAddresss.test.js +40 -0
  58. package/lib/network/tests/getBalancesForAddresss.test.js.map +1 -0
  59. package/lib/network/tests/getBlockDagInfo.test.d.ts +2 -0
  60. package/lib/network/tests/getBlockDagInfo.test.d.ts.map +1 -0
  61. package/lib/network/tests/getBlockDagInfo.test.js +36 -0
  62. package/lib/network/tests/getBlockDagInfo.test.js.map +1 -0
  63. package/lib/network/tests/getFeeEstimate.test.d.ts +2 -0
  64. package/lib/network/tests/getFeeEstimate.test.d.ts.map +1 -0
  65. package/lib/network/tests/getFeeEstimate.test.js +54 -0
  66. package/lib/network/tests/getFeeEstimate.test.js.map +1 -0
  67. package/lib/network/tests/getTransactions.test.d.ts +2 -0
  68. package/lib/network/tests/getTransactions.test.d.ts.map +1 -0
  69. package/lib/network/tests/getTransactions.test.js +157 -0
  70. package/lib/network/tests/getTransactions.test.js.map +1 -0
  71. package/lib/network/tests/getUtxosForAddress.test.d.ts +2 -0
  72. package/lib/network/tests/getUtxosForAddress.test.d.ts.map +1 -0
  73. package/lib/network/tests/getUtxosForAddress.test.js +142 -0
  74. package/lib/network/tests/getUtxosForAddress.test.js.map +1 -0
  75. package/lib/network/tests/getVirtualChainBlueScore.test.d.ts +2 -0
  76. package/lib/network/tests/getVirtualChainBlueScore.test.d.ts.map +1 -0
  77. package/lib/network/tests/getVirtualChainBlueScore.test.js +27 -0
  78. package/lib/network/tests/getVirtualChainBlueScore.test.js.map +1 -0
  79. package/lib/network/tests/submitTransaction.test.d.ts +2 -0
  80. package/lib/network/tests/submitTransaction.test.d.ts.map +1 -0
  81. package/lib/network/tests/submitTransaction.test.js +43 -0
  82. package/lib/network/tests/submitTransaction.test.js.map +1 -0
  83. package/lib-es/logic/tests/bip32.test.d.ts +2 -0
  84. package/lib-es/logic/tests/bip32.test.d.ts.map +1 -0
  85. package/lib-es/logic/tests/bip32.test.js +80 -0
  86. package/lib-es/logic/tests/bip32.test.js.map +1 -0
  87. package/lib-es/logic/tests/getFeeRate.test.d.ts +2 -0
  88. package/lib-es/logic/tests/getFeeRate.test.d.ts.map +1 -0
  89. package/lib-es/logic/tests/getFeeRate.test.js +55 -0
  90. package/lib-es/logic/tests/getFeeRate.test.js.map +1 -0
  91. package/lib-es/logic/tests/kaspaAddresses.test.d.ts +2 -0
  92. package/lib-es/logic/tests/kaspaAddresses.test.d.ts.map +1 -0
  93. package/lib-es/logic/tests/kaspaAddresses.test.js +170 -0
  94. package/lib-es/logic/tests/kaspaAddresses.test.js.map +1 -0
  95. package/lib-es/logic/tests/massCalcluation.test.d.ts +2 -0
  96. package/lib-es/logic/tests/massCalcluation.test.d.ts.map +1 -0
  97. package/lib-es/logic/tests/massCalcluation.test.js +22 -0
  98. package/lib-es/logic/tests/massCalcluation.test.js.map +1 -0
  99. package/lib-es/logic/tests/scanAddresses.integ.test.d.ts +2 -0
  100. package/lib-es/logic/tests/scanAddresses.integ.test.d.ts.map +1 -0
  101. package/lib-es/logic/tests/scanAddresses.integ.test.js +16 -0
  102. package/lib-es/logic/tests/scanAddresses.integ.test.js.map +1 -0
  103. package/lib-es/logic/tests/scanOperations.integ.test.d.ts +2 -0
  104. package/lib-es/logic/tests/scanOperations.integ.test.d.ts.map +1 -0
  105. package/lib-es/logic/tests/scanOperations.integ.test.js +249 -0
  106. package/lib-es/logic/tests/scanOperations.integ.test.js.map +1 -0
  107. package/lib-es/logic/tests/scanOperations.test.d.ts +2 -0
  108. package/lib-es/logic/tests/scanOperations.test.d.ts.map +1 -0
  109. package/lib-es/logic/tests/scanOperations.test.js +156 -0
  110. package/lib-es/logic/tests/scanOperations.test.js.map +1 -0
  111. package/lib-es/logic/tests/scanUtxos.integ.test.d.ts +2 -0
  112. package/lib-es/logic/tests/scanUtxos.integ.test.d.ts.map +1 -0
  113. package/lib-es/logic/tests/scanUtxos.integ.test.js +11 -0
  114. package/lib-es/logic/tests/scanUtxos.integ.test.js.map +1 -0
  115. package/lib-es/logic/tests/scanUtxos.test.d.ts +2 -0
  116. package/lib-es/logic/tests/scanUtxos.test.d.ts.map +1 -0
  117. package/lib-es/logic/tests/scanUtxos.test.js +139 -0
  118. package/lib-es/logic/tests/scanUtxos.test.js.map +1 -0
  119. package/lib-es/logic/tests/utxoLib.test.d.ts +2 -0
  120. package/lib-es/logic/tests/utxoLib.test.d.ts.map +1 -0
  121. package/lib-es/logic/tests/utxoLib.test.js +24 -0
  122. package/lib-es/logic/tests/utxoLib.test.js.map +1 -0
  123. package/lib-es/logic/tests/utxoSelection.test.d.ts +10 -0
  124. package/lib-es/logic/tests/utxoSelection.test.d.ts.map +1 -0
  125. package/lib-es/logic/tests/utxoSelection.test.js +229 -0
  126. package/lib-es/logic/tests/utxoSelection.test.js.map +1 -0
  127. package/lib-es/logic/tests/validAddress.test.d.ts +2 -0
  128. package/lib-es/logic/tests/validAddress.test.d.ts.map +1 -0
  129. package/lib-es/logic/tests/validAddress.test.js +54 -0
  130. package/lib-es/logic/tests/validAddress.test.js.map +1 -0
  131. package/lib-es/network/tests/getAddressesActive.test.d.ts +2 -0
  132. package/lib-es/network/tests/getAddressesActive.test.d.ts.map +1 -0
  133. package/lib-es/network/tests/getAddressesActive.test.js +63 -0
  134. package/lib-es/network/tests/getAddressesActive.test.js.map +1 -0
  135. package/lib-es/network/tests/getBalancesForAddresss.test.d.ts +2 -0
  136. package/lib-es/network/tests/getBalancesForAddresss.test.d.ts.map +1 -0
  137. package/lib-es/network/tests/getBalancesForAddresss.test.js +38 -0
  138. package/lib-es/network/tests/getBalancesForAddresss.test.js.map +1 -0
  139. package/lib-es/network/tests/getBlockDagInfo.test.d.ts +2 -0
  140. package/lib-es/network/tests/getBlockDagInfo.test.d.ts.map +1 -0
  141. package/lib-es/network/tests/getBlockDagInfo.test.js +34 -0
  142. package/lib-es/network/tests/getBlockDagInfo.test.js.map +1 -0
  143. package/lib-es/network/tests/getFeeEstimate.test.d.ts +2 -0
  144. package/lib-es/network/tests/getFeeEstimate.test.d.ts.map +1 -0
  145. package/lib-es/network/tests/getFeeEstimate.test.js +52 -0
  146. package/lib-es/network/tests/getFeeEstimate.test.js.map +1 -0
  147. package/lib-es/network/tests/getTransactions.test.d.ts +2 -0
  148. package/lib-es/network/tests/getTransactions.test.d.ts.map +1 -0
  149. package/lib-es/network/tests/getTransactions.test.js +155 -0
  150. package/lib-es/network/tests/getTransactions.test.js.map +1 -0
  151. package/lib-es/network/tests/getUtxosForAddress.test.d.ts +2 -0
  152. package/lib-es/network/tests/getUtxosForAddress.test.d.ts.map +1 -0
  153. package/lib-es/network/tests/getUtxosForAddress.test.js +140 -0
  154. package/lib-es/network/tests/getUtxosForAddress.test.js.map +1 -0
  155. package/lib-es/network/tests/getVirtualChainBlueScore.test.d.ts +2 -0
  156. package/lib-es/network/tests/getVirtualChainBlueScore.test.d.ts.map +1 -0
  157. package/lib-es/network/tests/getVirtualChainBlueScore.test.js +25 -0
  158. package/lib-es/network/tests/getVirtualChainBlueScore.test.js.map +1 -0
  159. package/lib-es/network/tests/submitTransaction.test.d.ts +2 -0
  160. package/lib-es/network/tests/submitTransaction.test.d.ts.map +1 -0
  161. package/lib-es/network/tests/submitTransaction.test.js +41 -0
  162. package/lib-es/network/tests/submitTransaction.test.js.map +1 -0
  163. package/package.json +11 -11
@@ -0,0 +1,24 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ import { KaspaUtxoGenerator } from "./utxoSelection.test";
3
+ import { calcMaxSpendableAmount } from "../utxos/lib";
4
+ describe("calcMaxSpendableAmount", () => {
5
+ it("should calculate max spendable amount correctly with default fee rate", () => {
6
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, new BigNumber(1_0000_0000), "12345");
7
+ const isEcdsaRecipient = false;
8
+ const result = calcMaxSpendableAmount(utxos, isEcdsaRecipient);
9
+ expect(result.toNumber()).toBe(5_0000_0000 - 5 * 1118 - 506);
10
+ });
11
+ it("should calculate max spendable amount correctly with default fee rate", () => {
12
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, new BigNumber(1_0000_0000), "12345");
13
+ const isEcdsaRecipient = false;
14
+ const result = calcMaxSpendableAmount(utxos, isEcdsaRecipient, 14);
15
+ expect(result.toNumber()).toBe(5_0000_0000 - (5 * 1118 + 506) * 14);
16
+ });
17
+ it("high fee forces to calculate 0", () => {
18
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, new BigNumber(1_0000_0000), "12345");
19
+ const isEcdsaRecipient = false;
20
+ const result = calcMaxSpendableAmount(utxos, isEcdsaRecipient, 100_000);
21
+ expect(result.toNumber()).toBe(0);
22
+ });
23
+ });
24
+ //# sourceMappingURL=utxoLib.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utxoLib.test.js","sourceRoot":"","sources":["../../../src/logic/tests/utxoLib.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,KAAK,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACzF,MAAM,gBAAgB,GAAG,KAAK,CAAC;QAE/B,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,KAAK,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACzF,MAAM,gBAAgB,GAAG,KAAK,CAAC;QAE/B,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACzF,MAAM,gBAAgB,GAAG,KAAK,CAAC;QAE/B,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ import { KaspaUtxo } from "../../types";
3
+ export declare class KaspaUtxoGenerator {
4
+ static generateUtxo(amount: BigNumber, blockDaaScore: string): KaspaUtxo;
5
+ static generateUtxoSet(count: number, amount: BigNumber, startBlockDaaScore: string): KaspaUtxo[];
6
+ private static generateRandomTransactionId;
7
+ private static generateRandomIndex;
8
+ private static generateRandomScriptPublicKey;
9
+ }
10
+ //# sourceMappingURL=utxoSelection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utxoSelection.test.d.ts","sourceRoot":"","sources":["../../../src/logic/tests/utxoSelection.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS;IAqBxE,MAAM,CAAC,eAAe,CACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,EACjB,kBAAkB,EAAE,MAAM,GACzB,SAAS,EAAE;IASd,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAO1C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC,OAAO,CAAC,MAAM,CAAC,6BAA6B;CAM7C"}
@@ -0,0 +1,229 @@
1
+ import { selectUtxos } from "../utxos/selection";
2
+ import { BigNumber } from "bignumber.js";
3
+ import * as lib from "../utxos/lib";
4
+ const TX_MASS_PER_INPUT = 1118;
5
+ const TX_MASS_FOR_TWO_OUTPUTS = 918;
6
+ const TX_MASS_FOR_ECDSA = 11;
7
+ export class KaspaUtxoGenerator {
8
+ static generateUtxo(amount, blockDaaScore) {
9
+ return {
10
+ address: "kaspa:qrp78nf43jaz3zk0j4dxga4ncdzk95xhun95hp6scyh6g6z7kwugy02wfw6ee",
11
+ outpoint: {
12
+ transactionId: this.generateRandomTransactionId(),
13
+ index: this.generateRandomIndex(),
14
+ },
15
+ utxoEntry: {
16
+ amount,
17
+ scriptPublicKey: {
18
+ version: 0,
19
+ scriptPublicKey: this.generateRandomScriptPublicKey(),
20
+ },
21
+ blockDaaScore,
22
+ isCoinbase: true,
23
+ },
24
+ accountType: 0,
25
+ accountIndex: 4,
26
+ };
27
+ }
28
+ static generateUtxoSet(count, amount, startBlockDaaScore) {
29
+ const utxos = [];
30
+ for (let i = 0; i < count; i++) {
31
+ utxos.push(this.generateUtxo(amount, startBlockDaaScore));
32
+ startBlockDaaScore = (parseInt(startBlockDaaScore) + 1).toString();
33
+ }
34
+ return utxos;
35
+ }
36
+ static generateRandomTransactionId() {
37
+ const randomBytes = crypto.getRandomValues(new Uint8Array(32));
38
+ return Array.from(randomBytes)
39
+ .map(b => b.toString(16).padStart(2, "0"))
40
+ .join("");
41
+ }
42
+ static generateRandomIndex() {
43
+ return Math.floor(Math.random() * 1000);
44
+ }
45
+ static generateRandomScriptPublicKey() {
46
+ const randomBytes = crypto.getRandomValues(new Uint8Array(34));
47
+ return Array.from(randomBytes)
48
+ .map(b => b.toString(16).padStart(2, "0"))
49
+ .join("");
50
+ }
51
+ }
52
+ describe("2 outputs - no discard", () => {
53
+ test("2/5 inputs, 2 outputs", () => {
54
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
55
+ const feeRate = 1;
56
+ const isEcdsaRecipient = false;
57
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_5000_0000), feeRate);
58
+ expect(utxos.length).toBe(5);
59
+ // Selected 2 times 1_0000_0000 UTXO
60
+ expect(selectedUtxos.utxos.length).toBe(2);
61
+ expect(selectedUtxos.utxos[0].utxoEntry.blockDaaScore).toBe("12345");
62
+ expect(selectedUtxos.utxos[1].utxoEntry.blockDaaScore).toBe("12346");
63
+ // TX should have: 2 inputs and 2 outputs
64
+ // compute mass = 3154
65
+ // storage mass = 6668
66
+ // fee only depends on compute mass
67
+ expect(selectedUtxos.fee.toNumber()).toBe(3154);
68
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(2_0000_0000 - 1_5000_0000 - 3154);
69
+ });
70
+ test("1/5 inputs, 2 outputs", () => {
71
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(2_0000_0000), "12345");
72
+ const isEcdsaRecipient = false;
73
+ const feeRate = 1;
74
+ const sendAmount = BigNumber(1_5000_0000);
75
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
76
+ expect(selectedUtxos.utxos.length).toBe(1);
77
+ expect(selectedUtxos.utxos[0].utxoEntry.blockDaaScore).toBe("12345");
78
+ // TX should be: 1 in + 2 out
79
+ // compute mass = 2036
80
+ // storage mass = 21674
81
+ expect(selectedUtxos.fee.toNumber()).toBe(2036);
82
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(2_0000_0000 - 1_5000_0000 - 2036);
83
+ });
84
+ it.each([1, 10, 20, 80, 5000])("5 inputs, 2 outputs, feeRate = %i", feeRate => {
85
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(15, BigNumber(1_0000_0000), "12345");
86
+ const isEcdsaRecipient = false;
87
+ const sendAmount = BigNumber(4_5000_0000);
88
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
89
+ expect(selectedUtxos.utxos.length).toBe(5);
90
+ // TX should be: 1 in + 2 out
91
+ // compute mass = 1118 * 5 + 918 = 6508
92
+ // storage mass = 0 ( 5 in and 2 out.. )
93
+ expect(selectedUtxos.fee.toNumber()).toBe(6508 * feeRate);
94
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(5_0000_0000 - 4_5000_0000 - 6508 * feeRate);
95
+ });
96
+ test("5 inputs, 2 outputs, feerate = 8203 => not possible!", () => {
97
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
98
+ const feerate = 8203;
99
+ expect(selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate - 1)).toBeDefined();
100
+ expect(() => selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate)).toThrow("UTXO total amount is not sufficient for sending amount 450000000");
101
+ });
102
+ });
103
+ describe("ECDSA mass", () => {
104
+ it.each([1, 2, 5])("5 inputs, 2 outputs, feerate = %i, ECDSA", feeRate => {
105
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(10, BigNumber(1_0000_0000), "12345");
106
+ const selectedUtxos = selectUtxos(utxos, true, BigNumber(4_5000_0000), feeRate);
107
+ const expectedInputCnt = 5;
108
+ const computeMass = TX_MASS_FOR_TWO_OUTPUTS + TX_MASS_PER_INPUT * expectedInputCnt + TX_MASS_FOR_ECDSA;
109
+ const expectedFee = computeMass * feeRate;
110
+ expect(selectedUtxos.utxos.length).toBe(expectedInputCnt);
111
+ // TX should be: 1 in + 2 out
112
+ // compute mass = 1118 * 5 + 918 + 11 (ECDSA) = 6508
113
+ // storage mass = 0 ( 5 in and 2 out.. )
114
+ expect(selectedUtxos.fee.toNumber()).toBe(expectedFee);
115
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(5_0000_0000 - 4_5000_0000 - expectedFee);
116
+ });
117
+ test("2/2 input, 2 outputs, feerate = 1, ECDSA", () => {
118
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
119
+ const selectedUtxos = selectUtxos(utxos, true, BigNumber(1_5000_0000), 1);
120
+ expect(utxos.length).toBe(5);
121
+ expect(selectedUtxos.utxos.length).toBe(2);
122
+ // TX should be: 2 in + 2 out
123
+ // compute mass = 3165 (ECDSA)
124
+ // storage mass = 6668
125
+ expect(selectedUtxos.fee.toNumber()).toBe(3165);
126
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(2_0000_0000 - 1_5000_0000 - 3165);
127
+ });
128
+ });
129
+ describe("2 outputs - no discard", () => { });
130
+ describe("1 output with discard", () => {
131
+ test("check sweetspot - discard up to 1530 sompis change", () => {
132
+ const feeRate = 1;
133
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(6, BigNumber(1_0000_0000), "12345");
134
+ const isEcdsaRecipient = false;
135
+ const sendAmount = BigNumber(5_0000_0000 - 5 * 1118 - 918 - 1530);
136
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
137
+ expect(selectedUtxos.utxos.length).toBe(5);
138
+ expect(selectedUtxos.fee.toNumber()).toBe(5 * 1118 + 918 + 1530);
139
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
140
+ const selectedUtxos2 = selectUtxos(utxos, isEcdsaRecipient, sendAmount.minus(1), feeRate);
141
+ expect(selectedUtxos2.utxos.length).toBe(6);
142
+ expect(selectedUtxos2.fee.toNumber()).toBe(6 * 1118 + 918);
143
+ expect(selectedUtxos2.changeAmount.toNumber()).toBe(100000413);
144
+ });
145
+ test("check sweetspot with feeRate", () => {
146
+ const feeRate = 2;
147
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(6, BigNumber(1_0000_0000), "12345");
148
+ const isEcdsaRecipient = false;
149
+ const sendAmount = BigNumber(5_0000_0000 - (5 * 1118 + 506) * 2);
150
+ const selectedUtxos = selectUtxos(utxos, isEcdsaRecipient, sendAmount, feeRate);
151
+ expect(selectedUtxos.utxos.length).toBe(5);
152
+ expect(selectedUtxos.fee.toNumber()).toBe((5 * 1118 + 506) * 2);
153
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
154
+ });
155
+ test("6 inputs, 2 outputs, feerate = 7682 => don't discard change, pick one more UTXO", () => {
156
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(10, BigNumber(1_0000_0000), "12345");
157
+ const feerate = 7682;
158
+ const selectedUtxos = selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate);
159
+ // in this case the change has to be discarded, as it's only 5544 sompis
160
+ // and the storage mass explodes to an inacceptable value of 180327402g
161
+ expect(selectedUtxos.utxos.length).toBe(5);
162
+ expect(selectedUtxos.fee.toNumber()).toBe(50000000);
163
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
164
+ });
165
+ test("6 inputs, 2 outputs, feerate = 8203 => need 6 inputs now.!", () => {
166
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(6, BigNumber(1_0000_0000), "12345");
167
+ const feerate = 8203;
168
+ const selectedUtxos = selectUtxos(utxos, false, BigNumber(4_5000_0000), feerate);
169
+ const expectedInputCnt = 6;
170
+ const computeMass = TX_MASS_FOR_TWO_OUTPUTS + TX_MASS_PER_INPUT * expectedInputCnt;
171
+ const expectedFee = computeMass * feerate;
172
+ expect(selectedUtxos.utxos.length).toBe(expectedInputCnt);
173
+ expect(selectedUtxos.fee.toNumber()).toBe(expectedFee);
174
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(1_5000_0000 - expectedFee);
175
+ });
176
+ });
177
+ describe("1 output without discard", () => {
178
+ test("send exact UTXO sum for all UTXOs with no change", () => {
179
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
180
+ const feerate = 1;
181
+ const selectedUtxos = selectUtxos(utxos, false, BigNumber(5_0000_0000 - (5 * 1118 + 506)), feerate);
182
+ expect(selectedUtxos.utxos.length).toBe(5);
183
+ expect(selectedUtxos.fee.toNumber()).toBe(5 * 1118 + 506);
184
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
185
+ });
186
+ test("send exact UTXO sum for 2 UTXOs with no change", () => {
187
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(5, BigNumber(1_0000_0000), "12345");
188
+ const feerate = 1;
189
+ const selectedUtxos = selectUtxos(utxos, false, BigNumber(2_0000_0000 - (2 * 1118 + 506)), feerate);
190
+ expect(selectedUtxos.utxos.length).toBe(2);
191
+ expect(selectedUtxos.fee.toNumber()).toBe(2 * 1118 + 506);
192
+ expect(selectedUtxos.changeAmount.toNumber()).toBe(0);
193
+ });
194
+ test("should throw an error if UTXO count exceeds maximum limit", () => {
195
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(100, BigNumber(1_0000_0000), "0");
196
+ const feeRate = 1;
197
+ const isEcdsaRecipient = false;
198
+ expect(() => {
199
+ selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_0000_0000), feeRate);
200
+ }).toThrow("UTXO count exceeds the limit of 88 for a TX.");
201
+ });
202
+ test("should throw an error if discarded change exceeds maximum allowable discard value", () => {
203
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(10, BigNumber(1_0000_0000), "0");
204
+ const feeRate = 1;
205
+ const isEcdsaRecipient = false;
206
+ expect(() => {
207
+ selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_0000), feeRate);
208
+ }).toThrow(/Change \d+ Sompis is too high to be discarded./);
209
+ });
210
+ test("should throw - UTXOs can't be determined to fulfill the specified amount", () => {
211
+ jest.spyOn(lib, "calcMaxSpendableAmount").mockReturnValue(BigNumber(1_2345_0000));
212
+ const feeRate = 1;
213
+ const isEcdsaRecipient = false;
214
+ expect(() => {
215
+ selectUtxos([], isEcdsaRecipient, BigNumber(1_0000), feeRate);
216
+ }).toThrow("UTXOs can't be determined to fulfill the specified amount");
217
+ });
218
+ test("same blockdaascore, still working.", () => {
219
+ // Generate more UTXOs than the allowed limit (88)
220
+ const utxos = KaspaUtxoGenerator.generateUtxoSet(2, BigNumber(1_0000_0000), "0");
221
+ const isEcdsaRecipient = false;
222
+ utxos[1].utxoEntry.blockDaaScore = "0";
223
+ expect(selectUtxos(utxos, isEcdsaRecipient, BigNumber(1_0000_0000)).utxos.length).toBe(2);
224
+ });
225
+ afterEach(() => {
226
+ jest.restoreAllMocks();
227
+ });
228
+ });
229
+ //# sourceMappingURL=utxoSelection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utxoSelection.test.js","sourceRoot":"","sources":["../../../src/logic/tests/utxoSelection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validAddress.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validAddress.test.d.ts","sourceRoot":"","sources":["../../../src/logic/tests/validAddress.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { isValidKaspaAddress } from "../kaspaAddresses";
2
+ describe("isValidKaspaAddress", () => {
3
+ const testCases = [
4
+ {
5
+ input: "kaspa:qq82f9sdsqqkr74memhxt9yrefc8vq9khf5vt6xjp4tscc3pdenmks29mlp9y",
6
+ expected: true,
7
+ },
8
+ {
9
+ input: "kaspa:qqq7n4n232754kgw6jeu4zu86uerwn4kq9lnl2n2prwl3t2t9hvec720vk9s2",
10
+ expected: true,
11
+ },
12
+ {
13
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crl",
14
+ expected: true,
15
+ },
16
+ // scripthash
17
+ {
18
+ input: "kaspa:pp6jt8u5hj3mnjy8v0kk5fg7a8ddnfu7ls7egmqspdtpy0708eervp47e6ls2",
19
+ expected: true,
20
+ },
21
+ // wrong hash for Schnorr
22
+ {
23
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crr",
24
+ expected: false,
25
+ },
26
+ {
27
+ input: "kaspa:qyp0r5mcq4rd5grj3652ra09u5dcgwqq9ntuswp247nama5quyj40eq03sc2dkx", // ecdsa
28
+ expected: true,
29
+ },
30
+ // wrong hash for ECDSA
31
+ {
32
+ input: "kaspa:qyp0r5mcq4rd5grj3652ra09u5dcgwqq9ntuswp247nama5quyj40eq03sc2dkk", // ecdsa
33
+ expected: false,
34
+ },
35
+ {
36
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crl0", // wrong size
37
+ expected: false,
38
+ },
39
+ {
40
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3crb", // unknown char b
41
+ expected: false,
42
+ },
43
+ {
44
+ input: "kaspa:qpc6twj20gxqpeyxvgqe3v4y2ng8t0tawfax89jkf8f24wazmcreu9ggw3cri", // unknown char i
45
+ expected: false,
46
+ },
47
+ ];
48
+ testCases.forEach(({ input, expected }, index) => {
49
+ it(`should return ${expected} for test case ${index + 1}`, () => {
50
+ expect(isValidKaspaAddress(input)).toBe(expected);
51
+ });
52
+ });
53
+ });
54
+ //# sourceMappingURL=validAddress.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validAddress.test.js","sourceRoot":"","sources":["../../../src/logic/tests/validAddress.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,SAAS,GAAG;QAChB;YACE,KAAK,EAAE,qEAAqE;YAC5E,QAAQ,EAAE,IAAI;SACf;QACD;YACE,KAAK,EAAE,qEAAqE;YAC5E,QAAQ,EAAE,IAAI;SACf;QACD;YACE,KAAK,EAAE,qEAAqE;YAC5E,QAAQ,EAAE,IAAI;SACf;QACD,aAAa;QACb;YACE,KAAK,EAAE,qEAAqE;YAC5E,QAAQ,EAAE,IAAI;SACf;QACD,yBAAyB;QACzB;YACE,KAAK,EAAE,qEAAqE;YAC5E,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EAAE,uEAAuE,EAAE,QAAQ;YACxF,QAAQ,EAAE,IAAI;SACf;QACD,uBAAuB;QACvB;YACE,KAAK,EAAE,uEAAuE,EAAE,QAAQ;YACxF,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EAAE,sEAAsE,EAAE,aAAa;YAC5F,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EAAE,qEAAqE,EAAE,iBAAiB;YAC/F,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EAAE,qEAAqE,EAAE,iBAAiB;YAC/F,QAAQ,EAAE,KAAK;SAChB;KACF,CAAC;IAEF,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE;QAC/C,EAAE,CAAC,iBAAiB,QAAQ,kBAAkB,KAAK,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE;YAC9D,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getAddressesActive.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAddressesActive.test.d.ts","sourceRoot":"","sources":["../../../src/network/tests/getAddressesActive.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { getAddressesActive } from "../index";
2
+ describe("getAddressesActive function", () => {
3
+ beforeEach(() => {
4
+ // Clear all mocks before each test to avoid interference
5
+ jest.clearAllMocks();
6
+ });
7
+ it("Gets information about addresses being active or not", async () => {
8
+ global.fetch = jest.fn().mockResolvedValueOnce({
9
+ ok: true,
10
+ json: async () => [
11
+ {
12
+ address: "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp4e",
13
+ active: true,
14
+ },
15
+ ],
16
+ });
17
+ const addresses = ["kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp4e"];
18
+ const result = await getAddressesActive(addresses);
19
+ const expectedResult = [
20
+ {
21
+ address: "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp4e",
22
+ active: true,
23
+ },
24
+ ];
25
+ expect(result).toEqual(expectedResult);
26
+ });
27
+ it("Wrong address should deliver false", async () => {
28
+ global.fetch = jest.fn().mockResolvedValueOnce({
29
+ ok: true,
30
+ json: async () => [
31
+ {
32
+ address: "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp42",
33
+ active: false,
34
+ },
35
+ ],
36
+ });
37
+ const addresses = ["kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp42"];
38
+ const result = await getAddressesActive(addresses);
39
+ const expectedResult = [
40
+ {
41
+ address: "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp42",
42
+ active: false,
43
+ },
44
+ ];
45
+ expect(result).toEqual(expectedResult);
46
+ });
47
+ it("Should throw an error if the server returns a bad response", async () => {
48
+ const addresses = ["kaspa:invalid_address"];
49
+ global.fetch = jest.fn().mockResolvedValueOnce({
50
+ ok: false,
51
+ status: 404,
52
+ });
53
+ await expect(getAddressesActive(addresses)).rejects.toThrow("Failed to fetch active state for addresses kaspa:invalid_address. Status: 404");
54
+ });
55
+ it("Should throw an error if fetch throws an exception", async () => {
56
+ const addresses = ["kaspa:another_invalid_address"];
57
+ global.fetch = jest.fn().mockImplementationOnce(() => {
58
+ throw new Error("Network Error");
59
+ });
60
+ await expect(getAddressesActive(addresses)).rejects.toThrow("Error fetching AddressesActives: Network Error");
61
+ });
62
+ });
63
+ //# sourceMappingURL=getAddressesActive.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAddressesActive.test.js","sourceRoot":"","sources":["../../../src/network/tests/getAddressesActive.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,UAAU,CAAC,GAAG,EAAE;QACd,yDAAyD;QACzD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB;oBACE,OAAO,EAAE,qEAAqE;oBAC9E,MAAM,EAAE,IAAI;iBACb;aACF;SACF,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,cAAc,GAAG;YACrB;gBACE,OAAO,EAAE,qEAAqE;gBAC9E,MAAM,EAAE,IAAI;aACb;SACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB;oBACE,OAAO,EAAE,qEAAqE;oBAC9E,MAAM,EAAE,KAAK;iBACd;aACF;SACF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,cAAc,GAAG;YACrB;gBACE,OAAO,EAAE,qEAAqE;gBAC9E,MAAM,EAAE,KAAK;aACd;SACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,SAAS,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzD,+EAA+E,CAChF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,SAAS,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzD,gDAAgD,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getBalancesForAddresss.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBalancesForAddresss.test.d.ts","sourceRoot":"","sources":["../../../src/network/tests/getBalancesForAddresss.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { getBalancesForAddresses } from "../index";
2
+ describe("getBalanceForAddress", () => {
3
+ beforeEach(() => {
4
+ // Clear all mocks before each test to avoid interference
5
+ jest.clearAllMocks();
6
+ });
7
+ it("returns the balance for a given address", async () => {
8
+ global.fetch = jest.fn().mockResolvedValueOnce({
9
+ ok: true,
10
+ json: async () => [
11
+ {
12
+ address: "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp4e",
13
+ balance: 1122124984318255,
14
+ },
15
+ {
16
+ address: "kaspa:qqkqkzjvr7zwxxmjxjkmxxdwju9kjs6e9u82uh59z07vgaks6gg62v8707g73",
17
+ balance: 132655169913451,
18
+ },
19
+ ],
20
+ });
21
+ const addresses = [
22
+ "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp4e",
23
+ "kaspa:qqkqkzjvr7zwxxmjxjkmxxdwju9kjs6e9u82uh59z07vgaks6gg62v8707g73",
24
+ ];
25
+ const result = await getBalancesForAddresses(addresses);
26
+ expect(result[0].address).toBe(addresses[0]);
27
+ expect(result[0].balance).toBeGreaterThan(0);
28
+ expect(result.length).toBe(2);
29
+ });
30
+ it("throws an error for an invalid address", async () => {
31
+ global.fetch = jest.fn().mockResolvedValueOnce({
32
+ ok: false,
33
+ });
34
+ const invalidAddress = "invalid:address";
35
+ await expect(getBalancesForAddresses([invalidAddress])).rejects.toThrow("Error fetching balance");
36
+ });
37
+ });
38
+ //# sourceMappingURL=getBalancesForAddresss.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBalancesForAddresss.test.js","sourceRoot":"","sources":["../../../src/network/tests/getBalancesForAddresss.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEnD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,yDAAyD;QACzD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB;oBACE,OAAO,EAAE,qEAAqE;oBAC9E,OAAO,EAAE,gBAAgB;iBAC1B;gBACD;oBACE,OAAO,EAAE,qEAAqE;oBAC9E,OAAO,EAAE,eAAe;iBACzB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG;YAChB,qEAAqE;YACrE,qEAAqE;SACtE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAExD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,KAAK;SACV,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,iBAAiB,CAAC;QACzC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACrE,wBAAwB,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getBlockDagInfo.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBlockDagInfo.test.d.ts","sourceRoot":"","sources":["../../../src/network/tests/getBlockDagInfo.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { getBlockDagInfo } from "../index";
2
+ describe("getBlockDagInfo", () => {
3
+ beforeEach(() => {
4
+ // Clear all mocks before each test to avoid interference
5
+ jest.clearAllMocks();
6
+ });
7
+ it("Check if getBlockDagInfo gives correct output", async () => {
8
+ global.fetch = jest.fn().mockResolvedValueOnce({
9
+ ok: true,
10
+ json: async () => ({
11
+ networkName: "kaspa-mainnet",
12
+ blockCount: "220840",
13
+ headerCount: "220840",
14
+ tipHashes: ["d604806a806c9a0e4573b772a9b6a6595b4a8ca8baa2ea48a62fb8733f1677b3"],
15
+ difficulty: 620427120032880600,
16
+ pastMedianTime: "1737569348584",
17
+ virtualParentHashes: ["d604806a806c9a0e4573b772a9b6a6595b4a8ca8baa2ea48a62fb8733f1677b3"],
18
+ pruningPointHash: "3914b495474186cbf116561e935a11a1991e42b26e7fbbc4658a0c50cb5d2fa6",
19
+ virtualDaaScore: "101277083",
20
+ }),
21
+ });
22
+ const result = await getBlockDagInfo();
23
+ expect(result.pastMedianTime).toBe("1737569348584");
24
+ expect(result.blockCount).toBe("220840");
25
+ });
26
+ });
27
+ it("Should throw an error when fetch returns a 500 response", async () => {
28
+ global.fetch = jest.fn().mockResolvedValueOnce({
29
+ ok: false,
30
+ status: 500,
31
+ });
32
+ await expect(getBlockDagInfo()).rejects.toThrow("Failed to fetch BlockDAG info. Error: Error: Status: 500");
33
+ });
34
+ //# sourceMappingURL=getBlockDagInfo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBlockDagInfo.test.js","sourceRoot":"","sources":["../../../src/network/tests/getBlockDagInfo.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,yDAAyD;QACzD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,WAAW,EAAE,eAAe;gBAC5B,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,CAAC,kEAAkE,CAAC;gBAC/E,UAAU,EAAE,kBAAkB;gBAC9B,cAAc,EAAE,eAAe;gBAC/B,mBAAmB,EAAE,CAAC,kEAAkE,CAAC;gBACzF,gBAAgB,EAAE,kEAAkE;gBACpF,eAAe,EAAE,WAAW;aAC7B,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QAEvC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AACH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;QAC7C,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAC7C,0DAA0D,CAC3D,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getFeeEstimate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFeeEstimate.test.d.ts","sourceRoot":"","sources":["../../../src/network/tests/getFeeEstimate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { getFeeEstimate } from "../index";
2
+ describe("getFees", () => {
3
+ beforeEach(() => {
4
+ // Clear all mocks before each test to avoid interference
5
+ jest.clearAllMocks();
6
+ });
7
+ it("Error response", async () => {
8
+ global.fetch = jest.fn().mockResolvedValueOnce({
9
+ ok: false,
10
+ status: 500,
11
+ statusText: "Internal Server Error",
12
+ });
13
+ await expect(getFeeEstimate()).rejects.toThrow("Network response was not ok");
14
+ });
15
+ it("Check if getFees gives correct output", async () => {
16
+ global.fetch = jest.fn().mockResolvedValueOnce({
17
+ ok: true,
18
+ json: async () => ({
19
+ priorityBucket: {
20
+ feerate: 1,
21
+ estimatedSeconds: 0.004,
22
+ },
23
+ normalBuckets: [
24
+ {
25
+ feerate: 1,
26
+ estimatedSeconds: 0.004,
27
+ },
28
+ {
29
+ feerate: 1,
30
+ estimatedSeconds: 0.004,
31
+ },
32
+ ],
33
+ lowBuckets: [
34
+ {
35
+ feerate: 1,
36
+ estimatedSeconds: 0.004,
37
+ },
38
+ ],
39
+ }),
40
+ });
41
+ const result = await getFeeEstimate();
42
+ expect(result.priorityBucket.feerate).toBeGreaterThan(0);
43
+ expect(result.priorityBucket.estimatedSeconds).toBeGreaterThan(0);
44
+ expect(result.normalBuckets.length).toBeGreaterThan(0);
45
+ expect(result.normalBuckets[0].feerate).toBeGreaterThan(0);
46
+ expect(result.normalBuckets[0].estimatedSeconds).toBeGreaterThan(0);
47
+ expect(result.lowBuckets.length).toBeGreaterThan(0);
48
+ expect(result.lowBuckets[0].feerate).toBeGreaterThan(0);
49
+ expect(result.lowBuckets[0].estimatedSeconds).toBeGreaterThan(0);
50
+ });
51
+ });
52
+ //# sourceMappingURL=getFeeEstimate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFeeEstimate.test.js","sourceRoot":"","sources":["../../../src/network/tests/getFeeEstimate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,UAAU,CAAC,GAAG,EAAE;QACd,yDAAyD;QACzD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,uBAAuB;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;YAC7C,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,cAAc,EAAE;oBACd,OAAO,EAAE,CAAC;oBACV,gBAAgB,EAAE,KAAK;iBACxB;gBACD,aAAa,EAAE;oBACb;wBACE,OAAO,EAAE,CAAC;wBACV,gBAAgB,EAAE,KAAK;qBACxB;oBACD;wBACE,OAAO,EAAE,CAAC;wBACV,gBAAgB,EAAE,KAAK;qBACxB;iBACF;gBACD,UAAU,EAAE;oBACV;wBACE,OAAO,EAAE,CAAC;wBACV,gBAAgB,EAAE,KAAK;qBACxB;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getTransactions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTransactions.test.d.ts","sourceRoot":"","sources":["../../../src/network/tests/getTransactions.test.ts"],"names":[],"mappings":""}