mainnet-js 3.0.0-next.0 → 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.
- package/dist/index.html +1 -1
- package/dist/{mainnet-3.0.0-next.0.js → mainnet-3.0.0-next.1.js} +21 -41
- package/dist/module/cache/walletCache.d.ts +10 -4
- package/dist/module/cache/walletCache.d.ts.map +1 -1
- package/dist/module/cache/walletCache.js +12 -13
- package/dist/module/cache/walletCache.js.map +1 -1
- package/dist/module/chain.d.ts +1 -1
- package/dist/module/chain.js +1 -1
- package/dist/module/chain.js.map +1 -1
- package/dist/module/constant.d.ts +1 -1
- package/dist/module/constant.d.ts.map +1 -1
- package/dist/module/constant.js +1 -1
- package/dist/module/constant.js.map +1 -1
- package/dist/module/enum.d.ts +1 -7
- package/dist/module/enum.d.ts.map +1 -1
- package/dist/module/enum.js +0 -6
- package/dist/module/enum.js.map +1 -1
- package/dist/module/history/getHistory.d.ts.map +1 -1
- package/dist/module/history/getHistory.js +0 -30
- package/dist/module/history/getHistory.js.map +1 -1
- package/dist/module/interface.d.ts +1 -2
- package/dist/module/interface.d.ts.map +1 -1
- package/dist/module/interface.js.map +1 -1
- package/dist/module/network/ElectrumNetworkProvider.js +1 -1
- package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
- package/dist/module/network/getRelayFeeCache.js +2 -2
- package/dist/module/network/getRelayFeeCache.js.map +1 -1
- package/dist/module/rate/ExchangeRate.d.ts +2 -1
- package/dist/module/rate/ExchangeRate.d.ts.map +1 -1
- package/dist/module/rate/ExchangeRate.js +4 -1
- package/dist/module/rate/ExchangeRate.js.map +1 -1
- package/dist/module/transaction/Wif.d.ts +9 -9
- package/dist/module/transaction/Wif.d.ts.map +1 -1
- package/dist/module/transaction/Wif.js +11 -13
- package/dist/module/transaction/Wif.js.map +1 -1
- package/dist/module/transaction/allocateFee.d.ts +3 -3
- package/dist/module/transaction/allocateFee.d.ts.map +1 -1
- package/dist/module/transaction/allocateFee.js +5 -6
- package/dist/module/transaction/allocateFee.js.map +1 -1
- package/dist/module/util/amountInSatoshi.d.ts +1 -1
- package/dist/module/util/amountInSatoshi.d.ts.map +1 -1
- package/dist/module/util/amountInSatoshi.js +3 -9
- package/dist/module/util/amountInSatoshi.js.map +1 -1
- package/dist/module/util/asSendRequestObject.d.ts.map +1 -1
- package/dist/module/util/asSendRequestObject.js +10 -7
- package/dist/module/util/asSendRequestObject.js.map +1 -1
- package/dist/module/util/convert.d.ts +3 -0
- package/dist/module/util/convert.d.ts.map +1 -1
- package/dist/module/util/convert.js +12 -0
- package/dist/module/util/convert.js.map +1 -1
- package/dist/module/util/index.d.ts +2 -3
- package/dist/module/util/index.d.ts.map +1 -1
- package/dist/module/util/index.js +2 -3
- package/dist/module/util/index.js.map +1 -1
- package/dist/module/util/satoshiToAmount.d.ts +1 -1
- package/dist/module/util/satoshiToAmount.d.ts.map +1 -1
- package/dist/module/util/satoshiToAmount.js +3 -9
- package/dist/module/util/satoshiToAmount.js.map +1 -1
- package/dist/module/util/sumSendRequestAmounts.d.ts.map +1 -1
- package/dist/module/util/sumSendRequestAmounts.js +3 -4
- package/dist/module/util/sumSendRequestAmounts.js.map +1 -1
- package/dist/module/util/sumUtxoValue.d.ts +1 -1
- package/dist/module/util/sumUtxoValue.js +2 -2
- package/dist/module/util/sumUtxoValue.js.map +1 -1
- package/dist/module/wallet/Base.d.ts +10 -12
- package/dist/module/wallet/Base.d.ts.map +1 -1
- package/dist/module/wallet/Base.js +18 -50
- package/dist/module/wallet/Base.js.map +1 -1
- package/dist/module/wallet/Util.js +1 -1
- package/dist/module/wallet/Util.js.map +1 -1
- package/dist/module/wallet/interface.d.ts +2 -3
- package/dist/module/wallet/interface.d.ts.map +1 -1
- package/dist/module/wallet/model.d.ts +12 -16
- package/dist/module/wallet/model.d.ts.map +1 -1
- package/dist/module/wallet/model.js +4 -8
- package/dist/module/wallet/model.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/cache/walletCache.ts +23 -36
- package/src/chain.ts +1 -1
- package/src/constant.ts +1 -1
- package/src/enum.ts +0 -6
- package/src/history/getHistory.test.ts +20 -34
- package/src/history/getHistory.ts +0 -32
- package/src/interface.ts +1 -2
- package/src/network/Connection.test.ts +3 -3
- package/src/network/ElectrumNetworkProvider.ts +1 -1
- package/src/network/Rpc.test.ts +2 -3
- package/src/network/getRelayFeeCache.ts +2 -2
- package/src/rate/ExchangeRate.test.ts +2 -44
- package/src/rate/ExchangeRate.ts +5 -2
- package/src/transaction/Wif.ts +24 -23
- package/src/transaction/allocateFee.test.ts +110 -131
- package/src/transaction/allocateFee.ts +14 -15
- package/src/util/amountInSatoshi.test.ts +1 -9
- package/src/util/amountInSatoshi.ts +6 -10
- package/src/util/asSendRequestObject.ts +12 -7
- package/src/util/convert.ts +18 -0
- package/src/util/index.ts +2 -7
- package/src/util/satoshiToAmount.test.ts +1 -1
- package/src/util/satoshiToAmount.ts +4 -10
- package/src/util/sumSendRequestAmounts.ts +3 -4
- package/src/util/sumUtxoValue.ts +3 -3
- package/src/wallet/Base.ts +28 -92
- package/src/wallet/Cashtokens.test.headless.js +11 -11
- package/src/wallet/Cashtokens.test.ts +36 -37
- package/src/wallet/HDWallet.test.ts +211 -68
- package/src/wallet/Util.ts +1 -1
- package/src/wallet/Wif.test.ts +108 -133
- package/src/wallet/interface.ts +2 -3
- package/src/wallet/model.test.ts +2 -5
- package/src/wallet/model.ts +15 -30
- package/dist/module/util/balanceObjectFromSatoshi.d.ts +0 -8
- package/dist/module/util/balanceObjectFromSatoshi.d.ts.map +0 -1
- package/dist/module/util/balanceObjectFromSatoshi.js +0 -35
- package/dist/module/util/balanceObjectFromSatoshi.js.map +0 -1
- package/src/util/balanceObjectFromSatoshi.test.ts +0 -58
- 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:
|
|
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
|
-
|
|
41
|
-
value: 549,
|
|
39
|
+
value: 549n,
|
|
42
40
|
},
|
|
43
41
|
{
|
|
44
42
|
cashaddr: charlie.cashaddr!,
|
|
45
|
-
|
|
46
|
-
value: 550,
|
|
43
|
+
value: 550n,
|
|
47
44
|
},
|
|
48
45
|
{
|
|
49
46
|
cashaddr: dave.cashaddr!,
|
|
50
|
-
|
|
51
|
-
value: 551,
|
|
47
|
+
value: 551n,
|
|
52
48
|
},
|
|
53
49
|
{
|
|
54
50
|
cashaddr: edward.cashaddr!,
|
|
55
|
-
|
|
56
|
-
value: 2552,
|
|
51
|
+
value: 2552n,
|
|
57
52
|
},
|
|
58
53
|
],
|
|
59
54
|
{ feePaidBy: FeePaidByEnum.changeThenAny }
|
|
60
55
|
);
|
|
61
|
-
expect(await alice.getBalance(
|
|
62
|
-
expect(await bob.getBalance(
|
|
63
|
-
expect(await charlie.getBalance(
|
|
64
|
-
expect(await dave.getBalance(
|
|
65
|
-
expect(await edward.getBalance(
|
|
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",
|
|
72
|
-
["bob",
|
|
66
|
+
["alice", 2000n],
|
|
67
|
+
["bob", 2000n],
|
|
73
68
|
];
|
|
74
|
-
let fee =
|
|
69
|
+
let fee = 1n;
|
|
75
70
|
let requests = asSendRequestObject(to) as SendRequest[];
|
|
76
|
-
let allocatedInputs =
|
|
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(
|
|
83
|
-
expect(allocatedInputs[1].value).toBe(
|
|
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",
|
|
89
|
-
["bob",
|
|
83
|
+
["alice", 2000n],
|
|
84
|
+
["bob", 2000n],
|
|
90
85
|
];
|
|
91
|
-
let fee =
|
|
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(
|
|
101
|
-
expect(allocatedInputs[1].value).toBeLessThan(
|
|
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",
|
|
107
|
-
["bob",
|
|
108
|
-
["charlie",
|
|
101
|
+
["alice", 2000n],
|
|
102
|
+
["bob", 2000n],
|
|
103
|
+
["charlie", 2000n],
|
|
109
104
|
];
|
|
110
|
-
let fee =
|
|
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(
|
|
121
|
-
expect(allocatedInputs[1].value).toBe(
|
|
122
|
-
expect(allocatedInputs[2].value).toBe(
|
|
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",
|
|
128
|
-
["bob",
|
|
129
|
-
["charlie",
|
|
122
|
+
["alice", 2000n],
|
|
123
|
+
["bob", 547n],
|
|
124
|
+
["charlie", 2000n],
|
|
130
125
|
];
|
|
131
|
-
let fee =
|
|
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(
|
|
142
|
-
expect(allocatedInputs[1].value).toBe(
|
|
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",
|
|
149
|
-
["bob",
|
|
150
|
-
["charlie",
|
|
143
|
+
["alice", 2000n],
|
|
144
|
+
["bob", 547n],
|
|
145
|
+
["charlie", 2000n],
|
|
151
146
|
];
|
|
152
|
-
let fee =
|
|
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(
|
|
163
|
-
expect(allocatedInputs[1].value).toBe(
|
|
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",
|
|
170
|
-
["bob",
|
|
171
|
-
["charlie",
|
|
164
|
+
["alice", 2000n],
|
|
165
|
+
["bob", 2000n],
|
|
166
|
+
["charlie", 2000n],
|
|
172
167
|
];
|
|
173
|
-
let fee =
|
|
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(
|
|
184
|
-
expect(allocatedInputs[1].value).toBe(
|
|
185
|
-
expect(allocatedInputs[2].value).toBe(
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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",
|
|
233
|
-
["bob",
|
|
234
|
-
["charlie",
|
|
211
|
+
["alice", 1000n],
|
|
212
|
+
["bob", 1000n],
|
|
213
|
+
["charlie", 1000n],
|
|
235
214
|
];
|
|
236
|
-
let fee =
|
|
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(
|
|
240
|
-
expect(result[1].value).toBe(
|
|
241
|
-
expect(result[2].value).toBe(
|
|
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",
|
|
247
|
-
["bob",
|
|
248
|
-
["charlie",
|
|
225
|
+
["alice", 1000n],
|
|
226
|
+
["bob", 1000n],
|
|
227
|
+
["charlie", 1000n],
|
|
249
228
|
];
|
|
250
|
-
let fee =
|
|
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(
|
|
254
|
-
expect(result[1].value).toBe(
|
|
255
|
-
expect(result[2].value).toBe(
|
|
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",
|
|
261
|
-
["bob",
|
|
262
|
-
["charlie",
|
|
239
|
+
["alice", 1000n],
|
|
240
|
+
["bob", 1000n],
|
|
241
|
+
["charlie", 1000n],
|
|
263
242
|
];
|
|
264
|
-
let fee =
|
|
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(
|
|
273
|
-
expect(result[1].value).toBe(
|
|
274
|
-
expect(result[2].value).toBe(
|
|
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",
|
|
280
|
-
["bob",
|
|
281
|
-
["charlie",
|
|
258
|
+
["alice", 1000n],
|
|
259
|
+
["bob", 1000n],
|
|
260
|
+
["charlie", 1000n],
|
|
282
261
|
];
|
|
283
|
-
let fee =
|
|
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(
|
|
292
|
-
expect(result[1].value).toBe(
|
|
293
|
-
expect(result[2].value).toBe(
|
|
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",
|
|
299
|
-
["bob",
|
|
300
|
-
["charlie",
|
|
301
|
-
["dave",
|
|
302
|
-
["edward",
|
|
303
|
-
["fred",
|
|
304
|
-
["greg",
|
|
305
|
-
["harry",
|
|
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 =
|
|
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(
|
|
312
|
-
expect(result[1].value).toBe(
|
|
313
|
-
expect(result[2].value).toBe(
|
|
314
|
-
expect(result[3].value).toBe(
|
|
315
|
-
expect(result[4].value).toBe(
|
|
316
|
-
expect(result[5].value).toBe(
|
|
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:
|
|
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:
|
|
17
|
+
fee: bigint
|
|
18
18
|
) {
|
|
19
19
|
let amountAvailable = sendRequestArray.reduce(function (sum, r) {
|
|
20
20
|
return sum + (r.value - DUST_UTXO_THRESHOLD);
|
|
21
|
-
},
|
|
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
|
|
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:
|
|
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 =
|
|
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 =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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<
|
|
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
|
|
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
|
|
33
|
+
// ['cashaddr', 120] or ['cashaddr', 120n],
|
|
35
34
|
resp.push(
|
|
36
35
|
new SendRequest({
|
|
37
36
|
cashaddr: r[0] as string,
|
|
38
|
-
value:
|
|
39
|
-
|
|
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("
|
|
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");
|
package/src/util/convert.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/util/index.ts
CHANGED
|
@@ -8,7 +8,7 @@ export {
|
|
|
8
8
|
binToBase64,
|
|
9
9
|
sha256,
|
|
10
10
|
} from "@bitauth/libauth";
|
|
11
|
-
export
|
|
11
|
+
export * from "./convert.js";
|
|
12
12
|
export { delay } from "./delay.js";
|
|
13
13
|
export { derivedNetwork } from "./deriveNetwork.js";
|
|
14
14
|
export { derivePublicKeyHash } from "./derivePublicKeyHash.js";
|
|
@@ -22,17 +22,12 @@ export {
|
|
|
22
22
|
export { getRuntimePlatform, RuntimePlatform } from "./getRuntimePlatform.js";
|
|
23
23
|
export { getUsdRate } from "./getUsdRate.js";
|
|
24
24
|
export { hash160 } from "./hash160.js";
|
|
25
|
-
export { ExchangeRate } from "../rate/ExchangeRate.js";
|
|
25
|
+
export { ExchangeRate, ExchageRatePromise } from "../rate/ExchangeRate.js";
|
|
26
26
|
export { sanitizeAddress } from "./sanitizeAddress.js";
|
|
27
27
|
export { sanitizeUnit } from "./sanitizeUnit.js";
|
|
28
28
|
export { getWeakRandomInt } from "./randomInt.js";
|
|
29
29
|
export { getXPubKey } from "../util/getXPubKey.js";
|
|
30
30
|
export { sumUtxoValue } from "./sumUtxoValue.js";
|
|
31
|
-
export {
|
|
32
|
-
BalanceResponse,
|
|
33
|
-
balanceFromSatoshi,
|
|
34
|
-
balanceResponseFromSatoshi,
|
|
35
|
-
} from "./balanceObjectFromSatoshi.js";
|
|
36
31
|
export * from "./sumUtxoValue.js";
|
|
37
32
|
export { decodeHeader } from "./header.js";
|
|
38
33
|
export * from "./checkUtxos.js";
|
|
@@ -12,27 +12,21 @@ import { sanitizeUnit } from "../util/sanitizeUnit.js";
|
|
|
12
12
|
* @returns a promise to the value in the unit of account given by rawUnit
|
|
13
13
|
*/
|
|
14
14
|
export async function satoshiToAmount(
|
|
15
|
-
value:
|
|
15
|
+
value: bigint,
|
|
16
16
|
rawUnit: any
|
|
17
17
|
): Promise<number> {
|
|
18
18
|
const unit = sanitizeUnit(rawUnit);
|
|
19
19
|
switch (unit) {
|
|
20
20
|
case UnitEnum.BCH:
|
|
21
|
-
return value / bchParam.subUnits;
|
|
22
|
-
case UnitEnum.SATOSHI:
|
|
23
|
-
return value;
|
|
21
|
+
return Number(value) / Number(bchParam.subUnits);
|
|
24
22
|
case UnitEnum.SAT:
|
|
25
|
-
return value;
|
|
26
|
-
case UnitEnum.SATS:
|
|
27
|
-
return value;
|
|
28
|
-
case UnitEnum.SATOSHIS:
|
|
29
|
-
return value;
|
|
23
|
+
return Number(value);
|
|
30
24
|
default:
|
|
31
25
|
const Currency_over_BCH = await ExchangeRate.get(rawUnit);
|
|
32
26
|
// truncate currency amounts to fixed precision (2),
|
|
33
27
|
// then return the fixed value string as a float.
|
|
34
28
|
const currencyValue = Number(
|
|
35
|
-
value * (Currency_over_BCH / bchParam.subUnits)
|
|
29
|
+
Number(value) * (Currency_over_BCH / Number(bchParam.subUnits))
|
|
36
30
|
).toFixed(2);
|
|
37
31
|
return Number.parseFloat(currencyValue);
|
|
38
32
|
}
|