mainnet-js 2.7.34 → 3.0.0-next.1

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 (195) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/{mainnet-2.7.34.js → mainnet-3.0.0-next.1.js} +728 -708
  3. package/dist/module/cache/MemoryCache.d.ts +0 -1
  4. package/dist/module/cache/MemoryCache.d.ts.map +1 -1
  5. package/dist/module/cache/MemoryCache.js +5 -7
  6. package/dist/module/cache/MemoryCache.js.map +1 -1
  7. package/dist/module/cache/index.d.ts +1 -0
  8. package/dist/module/cache/index.d.ts.map +1 -1
  9. package/dist/module/cache/index.js +1 -0
  10. package/dist/module/cache/index.js.map +1 -1
  11. package/dist/module/cache/walletCache.d.ts +45 -0
  12. package/dist/module/cache/walletCache.d.ts.map +1 -0
  13. package/dist/module/cache/walletCache.js +140 -0
  14. package/dist/module/cache/walletCache.js.map +1 -0
  15. package/dist/module/chain.d.ts +1 -1
  16. package/dist/module/chain.js +1 -1
  17. package/dist/module/chain.js.map +1 -1
  18. package/dist/module/constant.d.ts +1 -1
  19. package/dist/module/constant.d.ts.map +1 -1
  20. package/dist/module/constant.js +1 -1
  21. package/dist/module/constant.js.map +1 -1
  22. package/dist/module/enum.d.ts +1 -7
  23. package/dist/module/enum.d.ts.map +1 -1
  24. package/dist/module/enum.js +0 -6
  25. package/dist/module/enum.js.map +1 -1
  26. package/dist/module/history/{electrumTransformer.d.ts → getHistory.d.ts} +3 -3
  27. package/dist/module/history/getHistory.d.ts.map +1 -0
  28. package/dist/module/history/{electrumTransformer.js → getHistory.js} +17 -14
  29. package/dist/module/history/getHistory.js.map +1 -0
  30. package/dist/module/index.d.ts +3 -1
  31. package/dist/module/index.d.ts.map +1 -1
  32. package/dist/module/index.js +3 -1
  33. package/dist/module/index.js.map +1 -1
  34. package/dist/module/interface.d.ts +7 -2
  35. package/dist/module/interface.d.ts.map +1 -1
  36. package/dist/module/interface.js.map +1 -1
  37. package/dist/module/message/interface.d.ts +2 -2
  38. package/dist/module/message/interface.d.ts.map +1 -1
  39. package/dist/module/message/interface.js +0 -3
  40. package/dist/module/message/interface.js.map +1 -1
  41. package/dist/module/message/signed.d.ts +5 -5
  42. package/dist/module/message/signed.d.ts.map +1 -1
  43. package/dist/module/message/signed.js +8 -8
  44. package/dist/module/message/signed.js.map +1 -1
  45. package/dist/module/network/ElectrumNetworkProvider.d.ts +2 -2
  46. package/dist/module/network/ElectrumNetworkProvider.d.ts.map +1 -1
  47. package/dist/module/network/ElectrumNetworkProvider.js +3 -2
  48. package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
  49. package/dist/module/network/NetworkProvider.d.ts +2 -2
  50. package/dist/module/network/NetworkProvider.d.ts.map +1 -1
  51. package/dist/module/network/constant.js +4 -4
  52. package/dist/module/network/constant.js.map +1 -1
  53. package/dist/module/network/getRelayFeeCache.js +2 -2
  54. package/dist/module/network/getRelayFeeCache.js.map +1 -1
  55. package/dist/module/rate/ExchangeRate.d.ts +2 -1
  56. package/dist/module/rate/ExchangeRate.d.ts.map +1 -1
  57. package/dist/module/rate/ExchangeRate.js +4 -1
  58. package/dist/module/rate/ExchangeRate.js.map +1 -1
  59. package/dist/module/transaction/Wif.d.ts +25 -23
  60. package/dist/module/transaction/Wif.d.ts.map +1 -1
  61. package/dist/module/transaction/Wif.js +26 -25
  62. package/dist/module/transaction/Wif.js.map +1 -1
  63. package/dist/module/transaction/allocateFee.d.ts +3 -3
  64. package/dist/module/transaction/allocateFee.d.ts.map +1 -1
  65. package/dist/module/transaction/allocateFee.js +5 -6
  66. package/dist/module/transaction/allocateFee.js.map +1 -1
  67. package/dist/module/util/amountInSatoshi.d.ts +1 -1
  68. package/dist/module/util/amountInSatoshi.d.ts.map +1 -1
  69. package/dist/module/util/amountInSatoshi.js +3 -9
  70. package/dist/module/util/amountInSatoshi.js.map +1 -1
  71. package/dist/module/util/asSendRequestObject.d.ts.map +1 -1
  72. package/dist/module/util/asSendRequestObject.js +10 -7
  73. package/dist/module/util/asSendRequestObject.js.map +1 -1
  74. package/dist/module/util/checkUtxos.d.ts +2 -2
  75. package/dist/module/util/checkUtxos.d.ts.map +1 -1
  76. package/dist/module/util/checkUtxos.js +11 -12
  77. package/dist/module/util/checkUtxos.js.map +1 -1
  78. package/dist/module/util/convert.d.ts +3 -0
  79. package/dist/module/util/convert.d.ts.map +1 -1
  80. package/dist/module/util/convert.js +12 -0
  81. package/dist/module/util/convert.js.map +1 -1
  82. package/dist/module/util/deriveCashaddr.d.ts.map +1 -1
  83. package/dist/module/util/deriveCashaddr.js +6 -0
  84. package/dist/module/util/deriveCashaddr.js.map +1 -1
  85. package/dist/module/util/deriveNetwork.js +1 -1
  86. package/dist/module/util/deriveNetwork.js.map +1 -1
  87. package/dist/module/util/hd.d.ts +3 -0
  88. package/dist/module/util/hd.d.ts.map +1 -0
  89. package/dist/module/util/hd.js +11 -0
  90. package/dist/module/util/hd.js.map +1 -0
  91. package/dist/module/util/index.d.ts +3 -3
  92. package/dist/module/util/index.d.ts.map +1 -1
  93. package/dist/module/util/index.js +3 -3
  94. package/dist/module/util/index.js.map +1 -1
  95. package/dist/module/util/satoshiToAmount.d.ts +1 -1
  96. package/dist/module/util/satoshiToAmount.d.ts.map +1 -1
  97. package/dist/module/util/satoshiToAmount.js +3 -9
  98. package/dist/module/util/satoshiToAmount.js.map +1 -1
  99. package/dist/module/util/sumSendRequestAmounts.d.ts.map +1 -1
  100. package/dist/module/util/sumSendRequestAmounts.js +3 -4
  101. package/dist/module/util/sumSendRequestAmounts.js.map +1 -1
  102. package/dist/module/util/sumUtxoValue.d.ts +3 -3
  103. package/dist/module/util/sumUtxoValue.d.ts.map +1 -1
  104. package/dist/module/util/sumUtxoValue.js +2 -2
  105. package/dist/module/util/sumUtxoValue.js.map +1 -1
  106. package/dist/module/wallet/Base.d.ts +45 -103
  107. package/dist/module/wallet/Base.d.ts.map +1 -1
  108. package/dist/module/wallet/Base.js +99 -298
  109. package/dist/module/wallet/Base.js.map +1 -1
  110. package/dist/module/wallet/HDWallet.d.ts +164 -0
  111. package/dist/module/wallet/HDWallet.d.ts.map +1 -0
  112. package/dist/module/wallet/HDWallet.js +486 -0
  113. package/dist/module/wallet/HDWallet.js.map +1 -0
  114. package/dist/module/wallet/Util.js +1 -1
  115. package/dist/module/wallet/Util.js.map +1 -1
  116. package/dist/module/wallet/Watch.d.ts +151 -0
  117. package/dist/module/wallet/Watch.d.ts.map +1 -0
  118. package/dist/module/wallet/Watch.js +307 -0
  119. package/dist/module/wallet/Watch.js.map +1 -0
  120. package/dist/module/wallet/Wif.d.ts +23 -29
  121. package/dist/module/wallet/Wif.d.ts.map +1 -1
  122. package/dist/module/wallet/Wif.js +204 -267
  123. package/dist/module/wallet/Wif.js.map +1 -1
  124. package/dist/module/wallet/createWallet.d.ts +7 -1
  125. package/dist/module/wallet/createWallet.d.ts.map +1 -1
  126. package/dist/module/wallet/createWallet.js +26 -17
  127. package/dist/module/wallet/createWallet.js.map +1 -1
  128. package/dist/module/wallet/interface.d.ts +5 -6
  129. package/dist/module/wallet/interface.d.ts.map +1 -1
  130. package/dist/module/wallet/model.d.ts +15 -19
  131. package/dist/module/wallet/model.d.ts.map +1 -1
  132. package/dist/module/wallet/model.js +5 -25
  133. package/dist/module/wallet/model.js.map +1 -1
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +1 -1
  136. package/src/cache/MemoryCache.ts +5 -5
  137. package/src/cache/index.ts +1 -0
  138. package/src/cache/walletCache.ts +239 -0
  139. package/src/chain.ts +1 -1
  140. package/src/constant.ts +1 -1
  141. package/src/enum.ts +0 -6
  142. package/src/history/{electrumTransformer.test.ts → getHistory.test.ts} +26 -53
  143. package/src/history/{electrumTransformer.ts → getHistory.ts} +31 -15
  144. package/src/index.ts +3 -1
  145. package/src/interface.ts +8 -2
  146. package/src/message/interface.ts +2 -28
  147. package/src/message/signed.test.ts +36 -48
  148. package/src/message/signed.ts +9 -12
  149. package/src/network/Connection.test.ts +3 -3
  150. package/src/network/ElectrumNetworkProvider.ts +5 -5
  151. package/src/network/NetworkProvider.ts +2 -2
  152. package/src/network/Rpc.test.ts +3 -4
  153. package/src/network/constant.ts +4 -4
  154. package/src/network/getRelayFeeCache.ts +2 -2
  155. package/src/rate/ExchangeRate.test.ts +2 -44
  156. package/src/rate/ExchangeRate.ts +5 -2
  157. package/src/transaction/Wif.ts +59 -52
  158. package/src/transaction/allocateFee.test.ts +110 -131
  159. package/src/transaction/allocateFee.ts +14 -15
  160. package/src/util/amountInSatoshi.test.ts +1 -9
  161. package/src/util/amountInSatoshi.ts +6 -10
  162. package/src/util/asSendRequestObject.ts +12 -7
  163. package/src/util/checkUtxos.ts +21 -26
  164. package/src/util/convert.ts +18 -0
  165. package/src/util/deriveCashaddr.ts +8 -0
  166. package/src/util/deriveNetwork.ts +1 -1
  167. package/src/util/derivePublicKeyHash.test.ts +0 -13
  168. package/src/util/hd.ts +16 -0
  169. package/src/util/index.ts +3 -7
  170. package/src/util/satoshiToAmount.test.ts +1 -1
  171. package/src/util/satoshiToAmount.ts +4 -10
  172. package/src/util/sumSendRequestAmounts.ts +3 -4
  173. package/src/util/sumUtxoValue.ts +7 -7
  174. package/src/wallet/Base.ts +147 -420
  175. package/src/wallet/Cashtokens.test.headless.js +11 -11
  176. package/src/wallet/Cashtokens.test.ts +36 -37
  177. package/src/wallet/HDWallet.test.ts +515 -0
  178. package/src/wallet/HDWallet.ts +764 -0
  179. package/src/wallet/Util.ts +1 -1
  180. package/src/wallet/Watch.ts +447 -0
  181. package/src/wallet/Wif.bip39.test.ts +1 -1
  182. package/src/wallet/Wif.test.ts +108 -133
  183. package/src/wallet/Wif.ts +258 -283
  184. package/src/wallet/createWallet.ts +28 -18
  185. package/src/wallet/interface.ts +5 -6
  186. package/src/wallet/model.test.ts +4 -7
  187. package/src/wallet/model.ts +19 -51
  188. package/dist/module/history/electrumTransformer.d.ts.map +0 -1
  189. package/dist/module/history/electrumTransformer.js.map +0 -1
  190. package/dist/module/util/balanceObjectFromSatoshi.d.ts +0 -8
  191. package/dist/module/util/balanceObjectFromSatoshi.d.ts.map +0 -1
  192. package/dist/module/util/balanceObjectFromSatoshi.js +0 -35
  193. package/dist/module/util/balanceObjectFromSatoshi.js.map +0 -1
  194. package/src/util/balanceObjectFromSatoshi.test.ts +0 -58
  195. package/src/util/balanceObjectFromSatoshi.ts +0 -52
@@ -29,66 +29,61 @@ describe("Fee tests", () => {
29
29
  await funder.send([
30
30
  {
31
31
  cashaddr: alice.cashaddr!,
32
- value: 4500,
33
- unit: "satoshis",
32
+ value: 4500n,
34
33
  },
35
34
  ]);
36
35
  await alice.send(
37
36
  [
38
37
  {
39
38
  cashaddr: bob.cashaddr!,
40
- unit: "sat",
41
- value: 549,
39
+ value: 549n,
42
40
  },
43
41
  {
44
42
  cashaddr: charlie.cashaddr!,
45
- unit: "sat",
46
- value: 550,
43
+ value: 550n,
47
44
  },
48
45
  {
49
46
  cashaddr: dave.cashaddr!,
50
- unit: "sat",
51
- value: 551,
47
+ value: 551n,
52
48
  },
53
49
  {
54
50
  cashaddr: edward.cashaddr!,
55
- unit: "sat",
56
- value: 2552,
51
+ value: 2552n,
57
52
  },
58
53
  ],
59
54
  { feePaidBy: FeePaidByEnum.changeThenAny }
60
55
  );
61
- expect(await alice.getBalance("sat")).toBe(0);
62
- expect(await bob.getBalance("sat")).toBe(0);
63
- expect(await charlie.getBalance("sat")).toBe(550);
64
- expect(await dave.getBalance("sat")).toBe(551);
65
- expect(await edward.getBalance("sat")).toBe(2552);
56
+ expect(await alice.getBalance()).toBe(0n);
57
+ expect(await bob.getBalance()).toBe(0n);
58
+ expect(await charlie.getBalance()).toBe(550n);
59
+ expect(await dave.getBalance()).toBe(551n);
60
+ expect(await edward.getBalance()).toBe(2552n);
66
61
  }
67
62
  });
68
63
 
69
64
  test("Expect first in to subtract fee from first", async () => {
70
65
  let to = [
71
- ["alice", 2000, "sat"],
72
- ["bob", 2000, "sat"],
66
+ ["alice", 2000n],
67
+ ["bob", 2000n],
73
68
  ];
74
- let fee = 1;
69
+ let fee = 1n;
75
70
  let requests = asSendRequestObject(to) as SendRequest[];
76
- let allocatedInputs = await allocateFee(
71
+ let allocatedInputs = allocateFee(
77
72
  requests,
78
73
  fee,
79
74
  FeePaidByEnum.first,
80
75
  BigInt(0)
81
76
  );
82
- expect(allocatedInputs[0].value).toBeLessThan(2000);
83
- expect(allocatedInputs[1].value).toBe(2000);
77
+ expect(allocatedInputs[0].value).toBeLessThan(2000n);
78
+ expect(allocatedInputs[1].value).toBe(2000n);
84
79
  });
85
80
 
86
81
  test("Expect last to subtract fee from last", async () => {
87
82
  let to = [
88
- ["alice", 2000, "sat"],
89
- ["bob", 2000, "sat"],
83
+ ["alice", 2000n],
84
+ ["bob", 2000n],
90
85
  ];
91
- let fee = 1;
86
+ let fee = 1n;
92
87
  let requests = asSendRequestObject(to) as SendRequest[];
93
88
  let allocatedInputs = allocateFee(
94
89
  requests,
@@ -97,17 +92,17 @@ describe("Fee tests", () => {
97
92
  BigInt(0)
98
93
  );
99
94
 
100
- expect(allocatedInputs[0].value).toBe(2000);
101
- expect(allocatedInputs[1].value).toBeLessThan(2000);
95
+ expect(allocatedInputs[0].value).toBe(2000n);
96
+ expect(allocatedInputs[1].value).toBeLessThan(2000n);
102
97
  });
103
98
 
104
99
  test("Expect all to allocate fees equally", async () => {
105
100
  let to = [
106
- ["alice", 2000, "sat"],
107
- ["bob", 2000, "sat"],
108
- ["charlie", 2000, "sat"],
101
+ ["alice", 2000n],
102
+ ["bob", 2000n],
103
+ ["charlie", 2000n],
109
104
  ];
110
- let fee = 3;
105
+ let fee = 3n;
111
106
  let requests = asSendRequestObject(to) as SendRequest[];
112
107
 
113
108
  let allocatedInputs = allocateFee(
@@ -117,18 +112,18 @@ describe("Fee tests", () => {
117
112
  BigInt(0)
118
113
  );
119
114
 
120
- expect(allocatedInputs[0].value).toBe(1999);
121
- expect(allocatedInputs[1].value).toBe(1999);
122
- expect(allocatedInputs[2].value).toBe(1999);
115
+ expect(allocatedInputs[0].value).toBe(1999n);
116
+ expect(allocatedInputs[1].value).toBe(1999n);
117
+ expect(allocatedInputs[2].value).toBe(1999n);
123
118
  });
124
119
 
125
120
  test("Expect all to allocate fees equally, taking dust result", async () => {
126
121
  let to = [
127
- ["alice", 2000, "sat"],
128
- ["bob", 547, "sat"],
129
- ["charlie", 2000, "sat"],
122
+ ["alice", 2000n],
123
+ ["bob", 547n],
124
+ ["charlie", 2000n],
130
125
  ];
131
- let fee = 300;
126
+ let fee = 300n;
132
127
  let requests = asSendRequestObject(to) as SendRequest[];
133
128
 
134
129
  let allocatedInputs = allocateFee(
@@ -138,18 +133,18 @@ describe("Fee tests", () => {
138
133
  BigInt(0)
139
134
  );
140
135
 
141
- expect(allocatedInputs[0].value).toBe(2000);
142
- expect(allocatedInputs[1].value).toBe(2000);
136
+ expect(allocatedInputs[0].value).toBe(2000n);
137
+ expect(allocatedInputs[1].value).toBe(2000n);
143
138
  expect(allocatedInputs.length).toBe(2);
144
139
  });
145
140
 
146
141
  test("Expect all to allocate fees equally, taking dust result output, dividing remainder", async () => {
147
142
  let to = [
148
- ["alice", 2000, "sat"],
149
- ["bob", 547, "sat"],
150
- ["charlie", 2000, "sat"],
143
+ ["alice", 2000n],
144
+ ["bob", 547n],
145
+ ["charlie", 2000n],
151
146
  ];
152
- let fee = 647;
147
+ let fee = 647n;
153
148
  let requests = asSendRequestObject(to) as SendRequest[];
154
149
 
155
150
  let allocatedInputs = allocateFee(
@@ -159,18 +154,18 @@ describe("Fee tests", () => {
159
154
  BigInt(0)
160
155
  );
161
156
 
162
- expect(allocatedInputs[0].value).toBe(1950);
163
- expect(allocatedInputs[1].value).toBe(1950);
157
+ expect(allocatedInputs[0].value).toBe(1950n);
158
+ expect(allocatedInputs[1].value).toBe(1950n);
164
159
  expect(allocatedInputs.length).toBe(2);
165
160
  });
166
161
 
167
162
  test("Expect an odd fee to be applied to have remainder applied to first receipt", async () => {
168
163
  let to = [
169
- ["alice", 2000, "sat"],
170
- ["bob", 2000, "sat"],
171
- ["charlie", 2000, "sat"],
164
+ ["alice", 2000n],
165
+ ["bob", 2000n],
166
+ ["charlie", 2000n],
172
167
  ];
173
- let fee = 301;
168
+ let fee = 301n;
174
169
  let requests = asSendRequestObject(to) as SendRequest[];
175
170
 
176
171
  let allocatedInputs = allocateFee(
@@ -180,88 +175,72 @@ describe("Fee tests", () => {
180
175
  BigInt(0)
181
176
  );
182
177
 
183
- expect(allocatedInputs[0].value).toBe(1899);
184
- expect(allocatedInputs[1].value).toBe(1900);
185
- expect(allocatedInputs[2].value).toBe(1900);
178
+ expect(allocatedInputs[0].value).toBe(1899n);
179
+ expect(allocatedInputs[1].value).toBe(1900n);
180
+ expect(allocatedInputs[2].value).toBe(1900n);
186
181
  });
187
182
 
188
183
  test("Expect insufficient funds to error", async () => {
189
- expect.assertions(1);
190
- try {
191
- let to = [
192
- ["alice", 2000, "sat"],
193
- ["bob", 2000, "sat"],
194
- ["charlie", 2000, "sat"],
195
- ];
196
- let fee = 7000;
197
- let requests = asSendRequestObject(to) as SendRequest[];
198
- let allocatedInputs = allocateFee(
199
- requests,
200
- fee,
201
- FeePaidByEnum.changeThenAny,
202
- BigInt(999)
203
- );
204
- } catch (e: any) {
205
- expect(e.message).toBe("Insufficient funds for transaction given fee");
206
- }
184
+ let to = [
185
+ ["alice", 2000n],
186
+ ["bob", 2000n],
187
+ ["charlie", 2000n],
188
+ ];
189
+ let fee = 7000n;
190
+ let requests = asSendRequestObject(to) as SendRequest[];
191
+ expect(() =>
192
+ allocateFee(requests, fee, FeePaidByEnum.changeThenAny, BigInt(999))
193
+ ).toThrow("Insufficient funds for transaction given fee");
207
194
  });
208
195
 
209
196
  test("Expect dust amounts to error", async () => {
210
- expect.assertions(1);
211
- try {
212
- let to = [
213
- ["alice", 2000, "sat"],
214
- ["bob", 2000, "sat"],
215
- ["charlie", 2000, "sat"],
216
- ];
217
- let fee = 1500;
218
- let requests = asSendRequestObject(to) as SendRequest[];
219
- let allocatedInputs = allocateFee(
220
- requests,
221
- fee,
222
- FeePaidByEnum.first,
223
- BigInt(0)
224
- );
225
- } catch (e: any) {
226
- expect(e.message).toBe("Fee strategy would result in dust output");
227
- }
197
+ let to = [
198
+ ["alice", 2000n],
199
+ ["bob", 2000n],
200
+ ["charlie", 2000n],
201
+ ];
202
+ let fee = 1500n;
203
+ let requests = asSendRequestObject(to) as SendRequest[];
204
+ expect(() =>
205
+ allocateFee(requests, fee, FeePaidByEnum.first, BigInt(0))
206
+ ).toThrow("Fee strategy would result in dust output");
228
207
  });
229
208
 
230
209
  test("Expect near-dust amounts not to error", async () => {
231
210
  let to = [
232
- ["alice", 1000, "sat"],
233
- ["bob", 1000, "sat"],
234
- ["charlie", 1000, "sat"],
211
+ ["alice", 1000n],
212
+ ["bob", 1000n],
213
+ ["charlie", 1000n],
235
214
  ];
236
- let fee = 1362;
215
+ let fee = 1362n;
237
216
  let requests = asSendRequestObject(to) as SendRequest[];
238
217
  let result = allocateFee(requests, fee, FeePaidByEnum.any, BigInt(0));
239
- expect(result[0].value).toBe(546);
240
- expect(result[1].value).toBe(546);
241
- expect(result[2].value).toBe(546);
218
+ expect(result[0].value).toBe(546n);
219
+ expect(result[1].value).toBe(546n);
220
+ expect(result[2].value).toBe(546n);
242
221
  });
243
222
 
244
223
  test("Expect `any` to not consume change", async () => {
245
224
  let to = [
246
- ["alice", 1000, "sat"],
247
- ["bob", 1000, "sat"],
248
- ["charlie", 1000, "sat"],
225
+ ["alice", 1000n],
226
+ ["bob", 1000n],
227
+ ["charlie", 1000n],
249
228
  ];
250
- let fee = 1362;
229
+ let fee = 1362n;
251
230
  let requests = asSendRequestObject(to) as SendRequest[];
252
231
  let result = allocateFee(requests, fee, FeePaidByEnum.any, BigInt(1362));
253
- expect(result[0].value).toBe(546);
254
- expect(result[1].value).toBe(546);
255
- expect(result[2].value).toBe(546);
232
+ expect(result[0].value).toBe(546n);
233
+ expect(result[1].value).toBe(546n);
234
+ expect(result[2].value).toBe(546n);
256
235
  });
257
236
 
258
237
  test("Expect `change,any` to consume only change", async () => {
259
238
  let to = [
260
- ["alice", 1000, "sat"],
261
- ["bob", 1000, "sat"],
262
- ["charlie", 1000, "sat"],
239
+ ["alice", 1000n],
240
+ ["bob", 1000n],
241
+ ["charlie", 1000n],
263
242
  ];
264
- let fee = 1362;
243
+ let fee = 1362n;
265
244
  let requests = asSendRequestObject(to) as SendRequest[];
266
245
  let result = allocateFee(
267
246
  requests,
@@ -269,18 +248,18 @@ describe("Fee tests", () => {
269
248
  FeePaidByEnum.changeThenAny,
270
249
  BigInt(1362)
271
250
  );
272
- expect(result[0].value).toBe(1000);
273
- expect(result[1].value).toBe(1000);
274
- expect(result[2].value).toBe(1000);
251
+ expect(result[0].value).toBe(1000n);
252
+ expect(result[1].value).toBe(1000n);
253
+ expect(result[2].value).toBe(1000n);
275
254
  });
276
255
 
277
256
  test("Expect `change,any` to use both", async () => {
278
257
  let to = [
279
- ["alice", 1000, "sat"],
280
- ["bob", 1000, "sat"],
281
- ["charlie", 1000, "sat"],
258
+ ["alice", 1000n],
259
+ ["bob", 1000n],
260
+ ["charlie", 1000n],
282
261
  ];
283
- let fee = 1362 * 2;
262
+ let fee = 1362n * 2n;
284
263
  let requests = asSendRequestObject(to) as SendRequest[];
285
264
  let result = allocateFee(
286
265
  requests,
@@ -288,32 +267,32 @@ describe("Fee tests", () => {
288
267
  FeePaidByEnum.changeThenAny,
289
268
  BigInt(1362)
290
269
  );
291
- expect(result[0].value).toBe(546);
292
- expect(result[1].value).toBe(546);
293
- expect(result[2].value).toBe(546);
270
+ expect(result[0].value).toBe(546n);
271
+ expect(result[1].value).toBe(546n);
272
+ expect(result[2].value).toBe(546n);
294
273
  });
295
274
 
296
275
  test("Expect sortSendRequests to sort by lowest value first", async () => {
297
276
  let to = [
298
- ["alice", 2000, "sat"],
299
- ["bob", 547, "sat"],
300
- ["charlie", 1, "sat"],
301
- ["dave", 4, "sat"],
302
- ["edward", 6, "sat"],
303
- ["fred", 2000, "sat"],
304
- ["greg", 2000, "sat"],
305
- ["harry", 2000, "sat"],
277
+ ["alice", 2000n],
278
+ ["bob", 547n],
279
+ ["charlie", 1n],
280
+ ["dave", 4n],
281
+ ["edward", 6n],
282
+ ["fred", 2000n],
283
+ ["greg", 2000n],
284
+ ["harry", 2000n],
306
285
  ];
307
- let fee = 1;
286
+ let fee = 1n;
308
287
  let requests = asSendRequestObject(to) as SendRequest[];
309
288
 
310
289
  let result = sortSendRequests(requests);
311
- expect(result[0].value).toBe(1);
312
- expect(result[1].value).toBe(4);
313
- expect(result[2].value).toBe(6);
314
- expect(result[3].value).toBe(547);
315
- expect(result[4].value).toBe(2000);
316
- expect(result[5].value).toBe(2000);
290
+ expect(result[0].value).toBe(1n);
291
+ expect(result[1].value).toBe(4n);
292
+ expect(result[2].value).toBe(6n);
293
+ expect(result[3].value).toBe(547n);
294
+ expect(result[4].value).toBe(2000n);
295
+ expect(result[5].value).toBe(2000n);
317
296
  expect(result.length).toBe(8);
318
297
  });
319
298
  });
@@ -6,7 +6,7 @@ import {
6
6
  import { FeePaidByEnum } from "../wallet/enum.js";
7
7
  import { DUST_UTXO_THRESHOLD } from "../constant.js";
8
8
 
9
- export function checkFeeForDust(value: number) {
9
+ export function checkFeeForDust(value: bigint) {
10
10
  if (value < DUST_UTXO_THRESHOLD) {
11
11
  throw Error("Fee strategy would result in dust output");
12
12
  }
@@ -14,11 +14,11 @@ export function checkFeeForDust(value: number) {
14
14
 
15
15
  export function checkSatsAvailable(
16
16
  sendRequestArray: Array<SendRequest>,
17
- fee: number
17
+ fee: bigint
18
18
  ) {
19
19
  let amountAvailable = sendRequestArray.reduce(function (sum, r) {
20
20
  return sum + (r.value - DUST_UTXO_THRESHOLD);
21
- }, 0);
21
+ }, 0n);
22
22
  if (amountAvailable < fee) {
23
23
  throw Error("Insufficient funds for transaction given fee");
24
24
  }
@@ -39,22 +39,21 @@ export function checkForNonStandardSendRequest(
39
39
  }
40
40
 
41
41
  export function sortSendRequests(sendRequestArray: Array<SendRequest>) {
42
- return sendRequestArray.sort(
43
- (a: SendRequest, b: SendRequest) => a.value - b.value
42
+ return sendRequestArray.sort((a: SendRequest, b: SendRequest) =>
43
+ Number(a.value - b.value)
44
44
  );
45
45
  }
46
46
 
47
- function distributeFees(requests: Array<SendRequest>, fee: number) {
47
+ function distributeFees(requests: Array<SendRequest>, fee: bigint) {
48
48
  checkSatsAvailable(requests, fee);
49
- fee = Number(fee);
50
49
  for (let r = 0; r < requests.length; r++) {
51
50
  if (fee > 0) {
52
51
  checkForNonStandardSendRequest(requests[r]);
53
- let perRequestFee = Math.floor(fee / (requests.length - r));
54
- perRequestFee += fee % (requests.length - r);
52
+ let perRequestFee = fee / BigInt(requests.length - r);
53
+ perRequestFee += fee % BigInt(requests.length - r);
55
54
  if (requests[r].value - perRequestFee < DUST_UTXO_THRESHOLD) {
56
55
  fee -= requests[r].value;
57
- requests[r].value = 0;
56
+ requests[r].value = 0n;
58
57
  } else {
59
58
  fee -= perRequestFee;
60
59
  requests[r].value -= perRequestFee;
@@ -66,7 +65,7 @@ function distributeFees(requests: Array<SendRequest>, fee: number) {
66
65
 
67
66
  function firstPays(
68
67
  requests: Array<SendRequest | TokenSendRequest | OpReturnData>,
69
- fee: number
68
+ fee: bigint
70
69
  ) {
71
70
  let payer = requests.shift()!;
72
71
  payer = checkForNonStandardSendRequest(payer);
@@ -77,7 +76,7 @@ function firstPays(
77
76
  }
78
77
  function lastPays(
79
78
  requests: Array<SendRequest | TokenSendRequest | OpReturnData>,
80
- fee: number
79
+ fee: bigint
81
80
  ) {
82
81
  let payer = requests.pop()!;
83
82
  payer = checkForNonStandardSendRequest(payer);
@@ -88,7 +87,7 @@ function lastPays(
88
87
  }
89
88
  function anyPays(
90
89
  requests: Array<SendRequest | TokenSendRequest | OpReturnData>,
91
- fee: number
90
+ fee: bigint
92
91
  ) {
93
92
  for (let r of requests) {
94
93
  checkForNonStandardSendRequest(r);
@@ -100,7 +99,7 @@ function anyPays(
100
99
 
101
100
  function changeThenFallback(
102
101
  requests: Array<SendRequest | TokenSendRequest | OpReturnData>,
103
- fee: number,
102
+ fee: bigint,
104
103
  change: bigint,
105
104
  fallbackFn: Function
106
105
  ) {
@@ -113,7 +112,7 @@ function changeThenFallback(
113
112
 
114
113
  export function allocateFee(
115
114
  requests: Array<SendRequest | TokenSendRequest | OpReturnData>,
116
- fee: number,
115
+ fee: bigint,
117
116
  feePaidBy: FeePaidByEnum,
118
117
  change: bigint
119
118
  ): Array<SendRequest> {
@@ -13,15 +13,7 @@ test("Get price of Bch, BCH, bch in sat", async () => {
13
13
 
14
14
  test("Get price of sat(s)", async () => {
15
15
  let rate = await amountInSatoshi(1, "sat");
16
- expect(rate).toBe(1);
17
- rate = await amountInSatoshi(1, "sats");
18
- expect(rate).toBe(1);
19
- rate = await amountInSatoshi(1, "Satoshi");
20
- expect(rate).toBe(1);
21
- rate = await amountInSatoshi(1, "SATOSHIS");
22
- expect(rate).toBe(1);
23
- rate = await amountInSatoshi(1, "satoshis");
24
- expect(rate).toBe(1);
16
+ expect(rate).toBe(1n);
25
17
  });
26
18
 
27
19
  test("Get price of USD, Usd, usd", async () => {
@@ -15,23 +15,19 @@ import { sanitizeUnit } from "../util/sanitizeUnit.js";
15
15
  export async function amountInSatoshi(
16
16
  value: number,
17
17
  rawUnit: any
18
- ): Promise<number> {
18
+ ): Promise<bigint> {
19
19
  const unit = sanitizeUnit(rawUnit);
20
20
  switch (unit) {
21
21
  case UnitEnum.BCH:
22
- return Math.round(value * bchParam.subUnits);
23
- case UnitEnum.SATOSHI:
24
- return value;
22
+ return BigInt(Math.round(value * Number(bchParam.subUnits)));
25
23
  case UnitEnum.SAT:
26
- return value;
27
- case UnitEnum.SATS:
28
- return value;
29
- case UnitEnum.SATOSHIS:
30
- return value;
24
+ return BigInt(value);
31
25
  default:
32
26
  const Currency_over_BCH = await ExchangeRate.get(rawUnit);
33
27
  const SAT_over_BCH = bchParam.subUnits;
34
28
 
35
- return Math.round(Number(value * (SAT_over_BCH / Currency_over_BCH)));
29
+ return BigInt(
30
+ Math.round(Number(value * (Number(SAT_over_BCH) / Currency_over_BCH)))
31
+ );
36
32
  }
37
33
  }
@@ -1,5 +1,4 @@
1
1
  import { base64ToBin } from "@bitauth/libauth";
2
- import { UnitEnum } from "../enum.js";
3
2
  import {
4
3
  OpReturnData,
5
4
  SendRequest,
@@ -31,12 +30,14 @@ export function asSendRequestObject(
31
30
  )
32
31
  );
33
32
  } else {
34
- // ['cashaddr', 120, 'sats'],
33
+ // ['cashaddr', 120] or ['cashaddr', 120n],
35
34
  resp.push(
36
35
  new SendRequest({
37
36
  cashaddr: r[0] as string,
38
- value: r[1] as number,
39
- unit: r[2] as UnitEnum,
37
+ value:
38
+ typeof r[1] === "number"
39
+ ? BigInt(Math.floor[1])
40
+ : (r[1] as bigint),
40
41
  })
41
42
  );
42
43
  }
@@ -56,9 +57,7 @@ export function asSendRequestObject(
56
57
  }
57
58
 
58
59
  function convertToClass(object: SendRequest | TokenSendRequest | OpReturnData) {
59
- if (object.hasOwnProperty("unit")) {
60
- return new SendRequest(object as SendRequest);
61
- } else if (object.hasOwnProperty("tokenId")) {
60
+ if (object.hasOwnProperty("tokenId")) {
62
61
  return new TokenSendRequest(object as TokenSendRequest);
63
62
  } else if (object.hasOwnProperty("buffer")) {
64
63
  return OpReturnData.fromUint8Array((object as OpReturnData).buffer);
@@ -70,6 +69,12 @@ function convertToClass(object: SendRequest | TokenSendRequest | OpReturnData) {
70
69
  return OpReturnData.fromUint8Array(
71
70
  Uint8Array.from(base64ToBin((object as any).dataBuffer))
72
71
  );
72
+ } else if (
73
+ object.hasOwnProperty("cashaddr") &&
74
+ object.hasOwnProperty("value") &&
75
+ object.hasOwnProperty("tokenId") === false
76
+ ) {
77
+ return new SendRequest(object as SendRequest);
73
78
  }
74
79
 
75
80
  throw new Error("Unsupported send object");
@@ -1,31 +1,26 @@
1
- import { UtxoI } from "../interface.js";
1
+ import { Utxo, UtxoId } from "../interface.js";
2
2
 
3
3
  export async function checkUtxos(
4
- utxos: UtxoI[],
5
- wallet: import("../wallet/Wif.js").Wallet
6
- ): Promise<UtxoI[]> {
7
- if (utxos.some((val) => val.satoshis === 0)) {
8
- const addressUtxos = await wallet.getAddressUtxos(wallet.cashaddr);
9
- const absent = utxos.filter(
10
- (val) =>
11
- !addressUtxos.find(
12
- (utxo) => val.txid === utxo.txid && val.vout === utxo.vout
13
- )
14
- );
15
- if (absent.length) {
16
- const absentString = absent
17
- .map((val) => `${val.txid}:${val.vout}`)
18
- .join(", ");
19
- throw Error(`Utxos [${absentString}] not found in wallet`);
20
- }
21
-
22
- utxos = utxos.map(
23
- (val) =>
24
- addressUtxos.find(
25
- (utxo) => val.txid === utxo.txid && val.vout === utxo.vout
26
- )!
27
- );
4
+ utxoIds: UtxoId[],
5
+ walletOrUtxos: Utxo[] | import("../wallet/Wif.js").Wallet
6
+ ): Promise<Utxo[]> {
7
+ const addressUtxos = Array.isArray(walletOrUtxos)
8
+ ? walletOrUtxos
9
+ : await walletOrUtxos.getUtxos();
10
+ const absent = utxoIds.filter(
11
+ (val) =>
12
+ !addressUtxos.find(
13
+ (utxo) => val.txid === utxo.txid && val.vout === utxo.vout
14
+ )
15
+ );
16
+ if (absent.length) {
17
+ const absentString = absent
18
+ .map((val) => `${val.txid}:${val.vout}`)
19
+ .join(", ");
20
+ throw Error(`Utxos [${absentString}] not found in wallet`);
28
21
  }
29
22
 
30
- return utxos;
23
+ return addressUtxos.filter((val) =>
24
+ utxoIds.find((utxo) => val.txid === utxo.txid && val.vout === utxo.vout)
25
+ );
31
26
  }
@@ -1,3 +1,4 @@
1
+ import { bchParam } from "../chain.js";
1
2
  import { amountInSatoshi } from "./amountInSatoshi.js";
2
3
  import { satoshiToAmount } from "./satoshiToAmount.js";
3
4
 
@@ -30,3 +31,20 @@ export async function convertObject({
30
31
  }) {
31
32
  return await convert(value, from, to);
32
33
  }
34
+
35
+ // sats -> bch
36
+ export function toBch(sats: bigint): number {
37
+ return Number(sats) / Number(bchParam.subUnits);
38
+ }
39
+
40
+ // bch -> sats
41
+ export function toSat(bch: string | number): bigint {
42
+ return BigInt(Math.round(Number(bch) * Number(bchParam.subUnits)));
43
+ }
44
+
45
+ export async function toCurrency(
46
+ sats: bigint,
47
+ currency: string
48
+ ): Promise<number> {
49
+ return convert(Number(sats), "sat", currency);
50
+ }