mainnet-js 0.4.19 → 0.4.23
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/main/db/SqlProvider.js +2 -2
- package/dist/main/db/SqlProvider.js.map +1 -1
- package/dist/main/db/util.d.ts +1 -1
- package/dist/main/db/util.js +6 -1
- package/dist/main/db/util.js.map +1 -1
- package/dist/main/index.d.ts +1 -0
- package/dist/main/index.js +5 -1
- package/dist/main/index.js.map +1 -1
- package/dist/main/mine/mine.js +1 -1
- package/dist/main/mine/mine.js.map +1 -1
- package/dist/main/network/ElectrumNetworkProvider.d.ts +1 -2
- package/dist/main/network/ElectrumNetworkProvider.js +47 -19
- package/dist/main/network/ElectrumNetworkProvider.js.map +1 -1
- package/dist/main/network/constant.js +6 -1
- package/dist/main/network/constant.js.map +1 -1
- package/dist/main/util/eventsource.js +1 -1
- package/dist/main/util/eventsource.js.map +1 -1
- package/dist/main/util/randomBytes.js +2 -1
- package/dist/main/util/randomBytes.js.map +1 -1
- package/dist/main/wallet/Wif.d.ts +0 -2
- package/dist/main/wallet/Wif.js +33 -14
- package/dist/main/wallet/Wif.js.map +1 -1
- package/dist/mainnet-0.4.23.js +2 -0
- package/dist/{mainnet-0.4.19.js.LICENSE.txt → mainnet-0.4.23.js.LICENSE.txt} +0 -0
- package/dist/module/db/SqlProvider.js +2 -2
- package/dist/module/db/SqlProvider.js.map +1 -1
- package/dist/module/db/util.d.ts +1 -1
- package/dist/module/db/util.js +6 -1
- package/dist/module/db/util.js.map +1 -1
- package/dist/module/index.d.ts +1 -0
- package/dist/module/index.js +3 -0
- package/dist/module/index.js.map +1 -1
- package/dist/module/mine/mine.js +1 -1
- package/dist/module/mine/mine.js.map +1 -1
- package/dist/module/network/ElectrumNetworkProvider.d.ts +1 -2
- package/dist/module/network/ElectrumNetworkProvider.js +47 -19
- package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
- package/dist/module/network/constant.js +6 -1
- package/dist/module/network/constant.js.map +1 -1
- package/dist/module/util/eventsource.js +1 -1
- package/dist/module/util/eventsource.js.map +1 -1
- package/dist/module/util/randomBytes.js +2 -1
- package/dist/module/util/randomBytes.js.map +1 -1
- package/dist/module/wallet/Wif.d.ts +0 -2
- package/dist/module/wallet/Wif.js +33 -14
- package/dist/module/wallet/Wif.js.map +1 -1
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -6
- package/src/Wallet.test.headless.js +12 -12
- package/src/db/SqlProvider.test.ts +18 -1
- package/src/db/SqlProvider.ts +2 -2
- package/src/db/util.ts +6 -2
- package/src/index.ts +4 -0
- package/src/mine/mine.ts +1 -2
- package/src/network/ElectrumNetworkProvider.ts +52 -26
- package/src/network/constant.ts +6 -1
- package/src/network/electrum.test.ts +3 -1
- package/src/util/eventsource.ts +1 -1
- package/src/util/randomBytes.ts +2 -1
- package/src/wallet/Wif.test.ts +63 -3
- package/src/wallet/Wif.ts +45 -27
- package/dist/mainnet-0.4.19.js +0 -2
package/package.json
CHANGED
|
@@ -8,10 +8,16 @@
|
|
|
8
8
|
"url": "https://github.com/mainnet-cash/mainnet-js/issues"
|
|
9
9
|
},
|
|
10
10
|
"name": "mainnet-js",
|
|
11
|
-
"version": "0.4.
|
|
11
|
+
"version": "0.4.23",
|
|
12
12
|
"homepage": "https://mainnet.cash",
|
|
13
13
|
"main": "dist/main/index.js",
|
|
14
14
|
"module": "dist/module/index.js",
|
|
15
|
+
"browser": {
|
|
16
|
+
"http": false,
|
|
17
|
+
"https": false,
|
|
18
|
+
"fs": false,
|
|
19
|
+
"url": false
|
|
20
|
+
},
|
|
15
21
|
"types": "dist/main/index.d.ts",
|
|
16
22
|
"exports": {
|
|
17
23
|
"require": "./dist/main/index.js",
|
|
@@ -41,12 +47,13 @@
|
|
|
41
47
|
"bignumber.js": "^9.0.1",
|
|
42
48
|
"bip39": "^3.0.3",
|
|
43
49
|
"buffer": "^6.0.3",
|
|
50
|
+
"buffer-lite": "^1.0.0",
|
|
44
51
|
"cashaddrjs": "^0.4.4",
|
|
45
|
-
"events": "^3.2.0",
|
|
46
|
-
"fake-indexeddb": "^3.1.2",
|
|
47
52
|
"electrum-cash": "^2.0.8",
|
|
53
|
+
"events": "^3.2.0",
|
|
48
54
|
"eventsource": "^1.0.7",
|
|
49
|
-
"
|
|
55
|
+
"fake-indexeddb": "^3.1.2",
|
|
56
|
+
"qrcode-svg": "git+https://github.com/2qx/qrcode-svg.git",
|
|
50
57
|
"slp-parser": "^0.0.4"
|
|
51
58
|
},
|
|
52
59
|
"devDependencies": {},
|
|
@@ -66,10 +73,16 @@
|
|
|
66
73
|
"testPathIgnorePatterns": [
|
|
67
74
|
"dist"
|
|
68
75
|
],
|
|
69
|
-
"sideEffects":
|
|
76
|
+
"sideEffects": [
|
|
77
|
+
"src/rate/ExchangeRate.ts",
|
|
78
|
+
"src/network/getRelayFeeCache.ts",
|
|
79
|
+
"src/network/default.ts",
|
|
80
|
+
"src/util/eventsource.ts"
|
|
81
|
+
],
|
|
70
82
|
"keywords": [
|
|
71
83
|
"bch",
|
|
72
|
-
"bitcoin cash"
|
|
84
|
+
"bitcoin cash",
|
|
85
|
+
"wasm"
|
|
73
86
|
],
|
|
74
87
|
"author": "readcash"
|
|
75
88
|
}
|
|
@@ -298,17 +298,17 @@ describe(`Wallet should function in the browser`, () => {
|
|
|
298
298
|
waitBalanceResult = true;
|
|
299
299
|
}, 0);
|
|
300
300
|
|
|
301
|
-
let aliceWatchResult = false;
|
|
302
|
-
const aliceWatchCancel = alice.watchAddressTransactions((_tx) => {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
});
|
|
301
|
+
// let aliceWatchResult = false;
|
|
302
|
+
// const aliceWatchCancel = alice.watchAddressTransactions((_tx) => {
|
|
303
|
+
// aliceWatchCancel();
|
|
304
|
+
// aliceWatchResult = true;
|
|
305
|
+
// });
|
|
306
306
|
|
|
307
|
-
let bobWatchResult = false;
|
|
308
|
-
const bobWatchCancel = bob.watchAddress((_txHash) => {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
});
|
|
307
|
+
// let bobWatchResult = false;
|
|
308
|
+
// const bobWatchCancel = bob.watchAddress((_txHash) => {
|
|
309
|
+
// bobWatchCancel();
|
|
310
|
+
// bobWatchResult = true;
|
|
311
|
+
// });
|
|
312
312
|
|
|
313
313
|
let bobBalanceWatchResult = false;
|
|
314
314
|
const bobBalanceWatchCancel = bob.watchBalance((balance) => {
|
|
@@ -358,8 +358,8 @@ describe(`Wallet should function in the browser`, () => {
|
|
|
358
358
|
await delay(5000);
|
|
359
359
|
expect(waitTxResult).toBe(true);
|
|
360
360
|
expect(waitBalanceResult).toBe(true);
|
|
361
|
-
expect(aliceWatchResult).toBe(true);
|
|
362
|
-
expect(bobWatchResult).toBe(true);
|
|
361
|
+
// expect(aliceWatchResult).toBe(true);
|
|
362
|
+
// expect(bobWatchResult).toBe(true);
|
|
363
363
|
expect(bobBalanceWatchResult).toBe(true);
|
|
364
364
|
// expect(blockWatchResult).toBe(true);
|
|
365
365
|
// expect(blockWaitResult).toBe(true);
|
|
@@ -251,10 +251,27 @@ test("Should default to rejectUnauthorized false if not exactly false", async ()
|
|
|
251
251
|
expect(c.ssl.rejectUnauthorized).toBe(true);
|
|
252
252
|
});
|
|
253
253
|
|
|
254
|
-
test("Should default to rejectUnauthorized when
|
|
254
|
+
test("Should default to rejectUnauthorized when undefined", async () => {
|
|
255
255
|
process.env.DATABASE_SSL_REJECT_UNAUTHORIZED = undefined;
|
|
256
256
|
|
|
257
257
|
let provider = new SqlProvider(`regtest ${Math.random()}`);
|
|
258
258
|
let c = provider.getConfig();
|
|
259
259
|
expect(c.ssl.rejectUnauthorized).toBe(true);
|
|
260
260
|
});
|
|
261
|
+
|
|
262
|
+
test("Should default to rejectUnauthorized when non-existent", async () => {
|
|
263
|
+
delete process.env.DATABASE_SSL_REJECT_UNAUTHORIZED;
|
|
264
|
+
let provider = new SqlProvider(`regtest ${Math.random()}`);
|
|
265
|
+
let c = provider.getConfig();
|
|
266
|
+
expect(c.ssl.rejectUnauthorized).toBe(true);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test("Should not have ssl property when unconfigured", async () => {
|
|
270
|
+
delete process.env.DATABASE_SSL_REJECT_UNAUTHORIZED;
|
|
271
|
+
delete process.env.DATABASE_SSL_CA;
|
|
272
|
+
delete process.env.DATABASE_SSL_KEY;
|
|
273
|
+
delete process.env.DATABASE_SSL_CERT;
|
|
274
|
+
let provider = new SqlProvider(`regtest ${Math.random()}`);
|
|
275
|
+
let c = provider.getConfig();
|
|
276
|
+
expect(c.ssl).toBe(undefined);
|
|
277
|
+
});
|
package/src/db/SqlProvider.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { WebhookBch } from "../webhook/WebhookBch";
|
|
|
6
6
|
import { WebhookSlp } from "../webhook/WebhookSlp";
|
|
7
7
|
import { RegisterWebhookParams } from "../webhook/interface";
|
|
8
8
|
import { isCashAddress } from "../util/bchaddr";
|
|
9
|
-
var parseDbUrl = require("parse-database-url");
|
|
10
9
|
import { getSslConfig } from "./util";
|
|
11
10
|
|
|
12
11
|
export default class SqlProvider implements StorageProvider {
|
|
@@ -26,9 +25,10 @@ export default class SqlProvider implements StorageProvider {
|
|
|
26
25
|
"Named wallets and webhooks require a postgres DATABASE_URL environment variable to be set"
|
|
27
26
|
);
|
|
28
27
|
}
|
|
28
|
+
const parseDbUrl = eval("require")("parse-database-url");
|
|
29
29
|
let dbConfig = parseDbUrl(process.env.DATABASE_URL);
|
|
30
30
|
let ssl = getSslConfig();
|
|
31
|
-
if (ssl
|
|
31
|
+
if (ssl) {
|
|
32
32
|
dbConfig.ssl = ssl;
|
|
33
33
|
}
|
|
34
34
|
this.config = dbConfig;
|
package/src/db/util.ts
CHANGED
|
@@ -23,7 +23,7 @@ export function indexedDbIsAvailable() {
|
|
|
23
23
|
return "indexedDB" in globalThis;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export function getSslConfig(): sslConfigI {
|
|
26
|
+
export function getSslConfig(): sslConfigI | undefined {
|
|
27
27
|
const ca = process.env.DATABASE_SSL_CA
|
|
28
28
|
? Buffer.from(process.env.DATABASE_SSL_CA, "base64").toString("ascii")
|
|
29
29
|
: undefined;
|
|
@@ -40,5 +40,9 @@ export function getSslConfig(): sslConfigI {
|
|
|
40
40
|
key: key,
|
|
41
41
|
cert: cert,
|
|
42
42
|
};
|
|
43
|
-
|
|
43
|
+
if (ssl.ca || ssl.cert || ssl.key) {
|
|
44
|
+
return ssl;
|
|
45
|
+
} else {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
44
48
|
}
|
package/src/index.ts
CHANGED
package/src/mine/mine.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const { spawnSync } = require("child_process");
|
|
2
1
|
import { browserNotSupported } from "../util/browserNotSupported";
|
|
3
2
|
/**
|
|
4
3
|
* Mine blocks to a regtest address
|
|
@@ -32,7 +31,7 @@ export async function mine({
|
|
|
32
31
|
blocks,
|
|
33
32
|
cashaddr,
|
|
34
33
|
];
|
|
35
|
-
|
|
34
|
+
const spawnSync = eval('require("child_process")').spawnSync;
|
|
36
35
|
const cli = await spawnSync(`docker`, generateArgs);
|
|
37
36
|
if (cli.stderr.length > 0) {
|
|
38
37
|
return console.log("Mine Error: " + cli.stderr.toString());
|
|
@@ -139,6 +139,7 @@ export default class ElectrumNetworkProvider implements NetworkProvider {
|
|
|
139
139
|
return new Promise(async (resolve, reject) => {
|
|
140
140
|
let txHash = await Util.getTransactionHash(txHex);
|
|
141
141
|
if (!awaitPropagation) {
|
|
142
|
+
this.performRequest("blockchain.transaction.broadcast", txHex);
|
|
142
143
|
resolve(txHash);
|
|
143
144
|
} else {
|
|
144
145
|
const waitForTransactionCallback = async (data) => {
|
|
@@ -176,48 +177,73 @@ export default class ElectrumNetworkProvider implements NetworkProvider {
|
|
|
176
177
|
return result;
|
|
177
178
|
}
|
|
178
179
|
|
|
179
|
-
public
|
|
180
|
+
public watchAddressStatus(
|
|
180
181
|
cashaddr: string,
|
|
181
|
-
callback: (
|
|
182
|
+
callback: (status: string) => void
|
|
182
183
|
): CancelWatchFn {
|
|
183
|
-
const
|
|
184
|
+
const watchAddressStatusCallback = async (data) => {
|
|
184
185
|
// subscription acknowledgement is the latest known status or null if no status is known
|
|
185
|
-
// status is an array: [ cashaddr,
|
|
186
|
+
// status is an array: [ cashaddr, statusHash ]
|
|
186
187
|
if (data instanceof Array) {
|
|
187
|
-
|
|
188
|
+
const addr = data[0] as string;
|
|
188
189
|
if (addr !== cashaddr) {
|
|
189
190
|
return;
|
|
190
191
|
}
|
|
191
192
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
// data[1] can be null eventually if there are no tx for this address
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
callback(txHash);
|
|
198
|
-
}
|
|
193
|
+
const status = data[1];
|
|
194
|
+
callback(status);
|
|
199
195
|
}
|
|
200
196
|
};
|
|
201
197
|
|
|
202
|
-
this.
|
|
198
|
+
this.subscribeToAddress(cashaddr, watchAddressStatusCallback);
|
|
203
199
|
|
|
204
200
|
return async () => {
|
|
205
|
-
await this.
|
|
206
|
-
cashaddr,
|
|
207
|
-
watchAddressCallback
|
|
208
|
-
);
|
|
201
|
+
await this.unsubscribeFromAddress(cashaddr, watchAddressStatusCallback);
|
|
209
202
|
};
|
|
210
203
|
}
|
|
211
204
|
|
|
212
|
-
public
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
): CancelWatchFn {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
205
|
+
// public watchAddress(
|
|
206
|
+
// cashaddr: string,
|
|
207
|
+
// callback: (txHash: string) => void
|
|
208
|
+
// ): CancelWatchFn {
|
|
209
|
+
// const watchAddressCallback = async (data) => {
|
|
210
|
+
// // subscription acknowledgement is the latest known status or null if no status is known
|
|
211
|
+
// // status is an array: [ cashaddr, [tx_hashes] ]
|
|
212
|
+
// if (data instanceof Array) {
|
|
213
|
+
// let addr = data[0] as string;
|
|
214
|
+
// if (addr !== cashaddr) {
|
|
215
|
+
// return;
|
|
216
|
+
// }
|
|
217
|
+
|
|
218
|
+
// for (const txHash of data[1]) {
|
|
219
|
+
// if (!txHash) {
|
|
220
|
+
// // data[1] can be null eventually if there are no tx for this address
|
|
221
|
+
// continue;
|
|
222
|
+
// }
|
|
223
|
+
// callback(txHash);
|
|
224
|
+
// }
|
|
225
|
+
// }
|
|
226
|
+
// };
|
|
227
|
+
|
|
228
|
+
// this.subscribeToAddressTransactions(cashaddr, watchAddressCallback);
|
|
229
|
+
|
|
230
|
+
// return async () => {
|
|
231
|
+
// await this.unsubscribeFromAddressTransactions(
|
|
232
|
+
// cashaddr,
|
|
233
|
+
// watchAddressCallback
|
|
234
|
+
// );
|
|
235
|
+
// };
|
|
236
|
+
// }
|
|
237
|
+
|
|
238
|
+
// public watchAddressTransactions(
|
|
239
|
+
// cashaddr: string,
|
|
240
|
+
// callback: (tx: ElectrumRawTransaction) => void
|
|
241
|
+
// ): CancelWatchFn {
|
|
242
|
+
// return this.watchAddress(cashaddr, async (txHash: string) => {
|
|
243
|
+
// const tx = await this.getRawTransactionObject(txHash);
|
|
244
|
+
// callback(tx);
|
|
245
|
+
// });
|
|
246
|
+
// }
|
|
221
247
|
|
|
222
248
|
// Wait for the next block or a block at given blockchain height.
|
|
223
249
|
public watchBlocks(callback: (header: HeaderI) => void): CancelWatchFn {
|
package/src/network/constant.ts
CHANGED
|
@@ -10,7 +10,12 @@ export const networkTickerMap = {
|
|
|
10
10
|
|
|
11
11
|
export const mainnetServers = ["wss://fulcrum.fountainhead.cash"];
|
|
12
12
|
|
|
13
|
-
export const testnetServers = [
|
|
13
|
+
export const testnetServers = [
|
|
14
|
+
"wss://electroncash.de:60004", //,
|
|
15
|
+
// "wss://testnet.bitcoincash.network:60004",
|
|
16
|
+
// "wss://blackie.c3-soft.com:60004",
|
|
17
|
+
// "wss://tbch.loping.net:60004",
|
|
18
|
+
];
|
|
14
19
|
|
|
15
20
|
export const regtestServers = ["ws://127.0.0.1:60003"];
|
|
16
21
|
|
|
@@ -6,7 +6,9 @@ test("Should get a transaction with bare electrum", async () => {
|
|
|
6
6
|
const electrum = new ElectrumClient(
|
|
7
7
|
"Electrum client example",
|
|
8
8
|
"1.4.1",
|
|
9
|
-
"bch.imaginary.cash"
|
|
9
|
+
"bch.imaginary.cash",
|
|
10
|
+
50004,
|
|
11
|
+
"wss"
|
|
10
12
|
);
|
|
11
13
|
await electrum.connect();
|
|
12
14
|
const transactionID =
|
package/src/util/eventsource.ts
CHANGED
package/src/util/randomBytes.ts
CHANGED
|
@@ -3,7 +3,8 @@ import { getRuntimePlatform } from "./getRuntimePlatform";
|
|
|
3
3
|
export function generateRandomBytes(len = 32) {
|
|
4
4
|
// nodejs
|
|
5
5
|
if (getRuntimePlatform() === "node") {
|
|
6
|
-
|
|
6
|
+
//
|
|
7
|
+
const crypto = eval("require")("crypto");
|
|
7
8
|
return crypto.randomBytes(len);
|
|
8
9
|
}
|
|
9
10
|
// window, webworkers, service workers
|
package/src/wallet/Wif.test.ts
CHANGED
|
@@ -8,8 +8,8 @@ import { delay } from "../util/delay";
|
|
|
8
8
|
import { OpReturnData, SendResponse } from "./model";
|
|
9
9
|
import { ElectrumRawTransaction } from "../network/interface";
|
|
10
10
|
import { binToHex, binToUtf8, hexToBin, utf8ToBin } from "@bitauth/libauth";
|
|
11
|
-
import { ElectrumNetworkProvider } from "cashscript";
|
|
12
11
|
import { mine } from "../mine";
|
|
12
|
+
import ElectrumNetworkProvider from "../network/ElectrumNetworkProvider";
|
|
13
13
|
|
|
14
14
|
beforeAll(async () => {
|
|
15
15
|
await initProviders();
|
|
@@ -358,6 +358,62 @@ describe(`Wallet subscriptions`, () => {
|
|
|
358
358
|
await bobWallet.sendMax(aliceWallet.cashaddr!);
|
|
359
359
|
});
|
|
360
360
|
|
|
361
|
+
test("Should await and skip transaction propagation", async () => {
|
|
362
|
+
const aliceWallet = await RegTestWallet.fromId(process.env.ALICE_ID!);
|
|
363
|
+
const bobWallet = await RegTestWallet.newRandom();
|
|
364
|
+
|
|
365
|
+
let balance, newBalance;
|
|
366
|
+
balance = await aliceWallet.getBalance("sat");
|
|
367
|
+
|
|
368
|
+
aliceWallet
|
|
369
|
+
.send(
|
|
370
|
+
[
|
|
371
|
+
{
|
|
372
|
+
cashaddr: bobWallet.cashaddr!,
|
|
373
|
+
value: 1000,
|
|
374
|
+
unit: "satoshis",
|
|
375
|
+
},
|
|
376
|
+
],
|
|
377
|
+
{ awaitTransactionPropagation: false }
|
|
378
|
+
)
|
|
379
|
+
.then(async () => {
|
|
380
|
+
newBalance = await aliceWallet.getBalance("sat");
|
|
381
|
+
expect(balance).toBe(newBalance);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
await delay(1500);
|
|
385
|
+
|
|
386
|
+
balance = await aliceWallet.getBalance("sat");
|
|
387
|
+
await aliceWallet.send(
|
|
388
|
+
[
|
|
389
|
+
{
|
|
390
|
+
cashaddr: bobWallet.cashaddr!,
|
|
391
|
+
value: 1000,
|
|
392
|
+
unit: "satoshis",
|
|
393
|
+
},
|
|
394
|
+
],
|
|
395
|
+
{ awaitTransactionPropagation: false }
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
newBalance = await aliceWallet.getBalance("sat");
|
|
399
|
+
expect(balance).toBe(newBalance);
|
|
400
|
+
|
|
401
|
+
balance = await aliceWallet.getBalance("sat");
|
|
402
|
+
await aliceWallet.send(
|
|
403
|
+
[
|
|
404
|
+
{
|
|
405
|
+
cashaddr: bobWallet.cashaddr!,
|
|
406
|
+
value: 1000,
|
|
407
|
+
unit: "satoshis",
|
|
408
|
+
},
|
|
409
|
+
],
|
|
410
|
+
{ awaitTransactionPropagation: true }
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
newBalance = await aliceWallet.getBalance("sat");
|
|
414
|
+
expect(balance).toBeGreaterThan(newBalance);
|
|
415
|
+
});
|
|
416
|
+
|
|
361
417
|
test("Create two wallets, get balances concurrently", async () => {
|
|
362
418
|
let balance1 = 999,
|
|
363
419
|
balance2 = 666;
|
|
@@ -534,13 +590,17 @@ describe(`Wallet subscriptions`, () => {
|
|
|
534
590
|
}, 0);
|
|
535
591
|
|
|
536
592
|
let aliceWatchResult = false;
|
|
537
|
-
const aliceWatchCancel =
|
|
593
|
+
const aliceWatchCancel = (
|
|
594
|
+
alice.provider! as ElectrumNetworkProvider
|
|
595
|
+
).watchAddressStatus(alice.getDepositAddress(), (_status) => {
|
|
538
596
|
aliceWatchCancel();
|
|
539
597
|
aliceWatchResult = true;
|
|
540
598
|
});
|
|
541
599
|
|
|
542
600
|
let bobWatchResult = false;
|
|
543
|
-
const bobWatchCancel =
|
|
601
|
+
const bobWatchCancel = (
|
|
602
|
+
bob.provider! as ElectrumNetworkProvider
|
|
603
|
+
).watchAddressStatus(bob.getDepositAddress(), (_status) => {
|
|
544
604
|
bobWatchCancel();
|
|
545
605
|
bobWatchResult = true;
|
|
546
606
|
});
|
package/src/wallet/Wif.ts
CHANGED
|
@@ -557,33 +557,38 @@ export class Wallet extends BaseWallet {
|
|
|
557
557
|
}
|
|
558
558
|
}
|
|
559
559
|
|
|
560
|
-
// waiting for any transaction hash of this wallet
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
560
|
+
// // waiting for any transaction hash of this wallet
|
|
561
|
+
// // commented out until fulcrum supports new method https://github.com/cculianu/Fulcrum/pull/89
|
|
562
|
+
// public watchAddress(callback: (txHash: string) => void): CancelWatchFn {
|
|
563
|
+
// return (this.provider! as ElectrumNetworkProvider).watchAddress(
|
|
564
|
+
// this.getDepositAddress(),
|
|
565
|
+
// callback
|
|
566
|
+
// );
|
|
567
|
+
// }
|
|
568
|
+
|
|
569
|
+
// // waiting for any transaction of this wallet
|
|
570
|
+
// // commented out until fulcrum supports new method https://github.com/cculianu/Fulcrum/pull/89
|
|
571
|
+
// public watchAddressTransactions(
|
|
572
|
+
// callback: (tx: ElectrumRawTransaction) => void
|
|
573
|
+
// ): CancelWatchFn {
|
|
574
|
+
// return (this.provider! as ElectrumNetworkProvider).watchAddressTransactions(
|
|
575
|
+
// this.getDepositAddress(),
|
|
576
|
+
// callback
|
|
577
|
+
// );
|
|
578
|
+
// }
|
|
577
579
|
|
|
578
580
|
// sets up a callback to be called upon wallet's balance change
|
|
579
581
|
// can be cancelled by calling the function returned from this one
|
|
580
582
|
public watchBalance(
|
|
581
583
|
callback: (balance: BalanceResponse) => void
|
|
582
584
|
): CancelWatchFn {
|
|
583
|
-
return this.
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
585
|
+
return (this.provider! as ElectrumNetworkProvider).watchAddressStatus(
|
|
586
|
+
this.getDepositAddress(),
|
|
587
|
+
async (_status: string) => {
|
|
588
|
+
const balance = (await this.getBalance()) as BalanceResponse;
|
|
589
|
+
callback(balance);
|
|
590
|
+
}
|
|
591
|
+
);
|
|
587
592
|
}
|
|
588
593
|
|
|
589
594
|
// sets up a callback to be called upon wallet's BCH or USD balance change
|
|
@@ -608,7 +613,9 @@ export class Wallet extends BaseWallet {
|
|
|
608
613
|
}
|
|
609
614
|
};
|
|
610
615
|
|
|
611
|
-
const watchCancel =
|
|
616
|
+
const watchCancel = (
|
|
617
|
+
this.provider! as ElectrumNetworkProvider
|
|
618
|
+
).watchAddressStatus(this.getDepositAddress(), _callback);
|
|
612
619
|
const interval = setInterval(_callback, usdPriceRefreshInterval);
|
|
613
620
|
|
|
614
621
|
return async () => {
|
|
@@ -690,7 +697,12 @@ export class Wallet extends BaseWallet {
|
|
|
690
697
|
});
|
|
691
698
|
const spendableAmount = await sumUtxoValue(fundingUtxos);
|
|
692
699
|
|
|
693
|
-
|
|
700
|
+
let result = spendableAmount - fee;
|
|
701
|
+
if (result < 0) {
|
|
702
|
+
result = 0;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
return await balanceResponseFromSatoshi(result);
|
|
694
706
|
}
|
|
695
707
|
|
|
696
708
|
/**
|
|
@@ -788,7 +800,7 @@ export class Wallet extends BaseWallet {
|
|
|
788
800
|
return new Promise(async (resolve) => {
|
|
789
801
|
let txHashSeen = false;
|
|
790
802
|
|
|
791
|
-
const makeResponse = async (txHash
|
|
803
|
+
const makeResponse = async (txHash?: string) => {
|
|
792
804
|
const response = <WaitForTransactionResponse>{};
|
|
793
805
|
const promises: any[] = [undefined, undefined];
|
|
794
806
|
|
|
@@ -797,7 +809,11 @@ export class Wallet extends BaseWallet {
|
|
|
797
809
|
}
|
|
798
810
|
|
|
799
811
|
if (options.getTransactionInfo === true) {
|
|
800
|
-
|
|
812
|
+
if (!txHash) {
|
|
813
|
+
promises[1] = this.getLastTransaction();
|
|
814
|
+
} else {
|
|
815
|
+
promises[1] = this.provider!.getRawTransactionObject(txHash);
|
|
816
|
+
}
|
|
801
817
|
}
|
|
802
818
|
|
|
803
819
|
const result = await Promise.all(promises);
|
|
@@ -829,9 +845,11 @@ export class Wallet extends BaseWallet {
|
|
|
829
845
|
}
|
|
830
846
|
|
|
831
847
|
// waiting for any address transaction
|
|
832
|
-
const watchCancel =
|
|
848
|
+
const watchCancel = (
|
|
849
|
+
this.provider! as ElectrumNetworkProvider
|
|
850
|
+
).watchAddressStatus(this.getDepositAddress(), async (_status) => {
|
|
833
851
|
watchCancel();
|
|
834
|
-
resolve(makeResponse(
|
|
852
|
+
resolve(makeResponse());
|
|
835
853
|
});
|
|
836
854
|
});
|
|
837
855
|
}
|