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.
Files changed (64) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/main/db/SqlProvider.js +2 -2
  3. package/dist/main/db/SqlProvider.js.map +1 -1
  4. package/dist/main/db/util.d.ts +1 -1
  5. package/dist/main/db/util.js +6 -1
  6. package/dist/main/db/util.js.map +1 -1
  7. package/dist/main/index.d.ts +1 -0
  8. package/dist/main/index.js +5 -1
  9. package/dist/main/index.js.map +1 -1
  10. package/dist/main/mine/mine.js +1 -1
  11. package/dist/main/mine/mine.js.map +1 -1
  12. package/dist/main/network/ElectrumNetworkProvider.d.ts +1 -2
  13. package/dist/main/network/ElectrumNetworkProvider.js +47 -19
  14. package/dist/main/network/ElectrumNetworkProvider.js.map +1 -1
  15. package/dist/main/network/constant.js +6 -1
  16. package/dist/main/network/constant.js.map +1 -1
  17. package/dist/main/util/eventsource.js +1 -1
  18. package/dist/main/util/eventsource.js.map +1 -1
  19. package/dist/main/util/randomBytes.js +2 -1
  20. package/dist/main/util/randomBytes.js.map +1 -1
  21. package/dist/main/wallet/Wif.d.ts +0 -2
  22. package/dist/main/wallet/Wif.js +33 -14
  23. package/dist/main/wallet/Wif.js.map +1 -1
  24. package/dist/mainnet-0.4.23.js +2 -0
  25. package/dist/{mainnet-0.4.19.js.LICENSE.txt → mainnet-0.4.23.js.LICENSE.txt} +0 -0
  26. package/dist/module/db/SqlProvider.js +2 -2
  27. package/dist/module/db/SqlProvider.js.map +1 -1
  28. package/dist/module/db/util.d.ts +1 -1
  29. package/dist/module/db/util.js +6 -1
  30. package/dist/module/db/util.js.map +1 -1
  31. package/dist/module/index.d.ts +1 -0
  32. package/dist/module/index.js +3 -0
  33. package/dist/module/index.js.map +1 -1
  34. package/dist/module/mine/mine.js +1 -1
  35. package/dist/module/mine/mine.js.map +1 -1
  36. package/dist/module/network/ElectrumNetworkProvider.d.ts +1 -2
  37. package/dist/module/network/ElectrumNetworkProvider.js +47 -19
  38. package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
  39. package/dist/module/network/constant.js +6 -1
  40. package/dist/module/network/constant.js.map +1 -1
  41. package/dist/module/util/eventsource.js +1 -1
  42. package/dist/module/util/eventsource.js.map +1 -1
  43. package/dist/module/util/randomBytes.js +2 -1
  44. package/dist/module/util/randomBytes.js.map +1 -1
  45. package/dist/module/wallet/Wif.d.ts +0 -2
  46. package/dist/module/wallet/Wif.js +33 -14
  47. package/dist/module/wallet/Wif.js.map +1 -1
  48. package/dist/tsconfig.browser.tsbuildinfo +1 -1
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +19 -6
  51. package/src/Wallet.test.headless.js +12 -12
  52. package/src/db/SqlProvider.test.ts +18 -1
  53. package/src/db/SqlProvider.ts +2 -2
  54. package/src/db/util.ts +6 -2
  55. package/src/index.ts +4 -0
  56. package/src/mine/mine.ts +1 -2
  57. package/src/network/ElectrumNetworkProvider.ts +52 -26
  58. package/src/network/constant.ts +6 -1
  59. package/src/network/electrum.test.ts +3 -1
  60. package/src/util/eventsource.ts +1 -1
  61. package/src/util/randomBytes.ts +2 -1
  62. package/src/wallet/Wif.test.ts +63 -3
  63. package/src/wallet/Wif.ts +45 -27
  64. 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.19",
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
- "qrcode-svg": "^1.1.0",
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": false,
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
- aliceWatchCancel();
304
- aliceWatchResult = true;
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
- bobWatchCancel();
310
- bobWatchResult = true;
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 unconfigured", async () => {
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
+ });
@@ -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.cert) {
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
- return ssl;
43
+ if (ssl.ca || ssl.cert || ssl.key) {
44
+ return ssl;
45
+ } else {
46
+ return;
47
+ }
44
48
  }
package/src/index.ts CHANGED
@@ -38,3 +38,7 @@ export { WalletRequestI, WalletResponseI } from "./wallet/interface";
38
38
 
39
39
  // TODO move this up to util (Mainnet) ?
40
40
  export * from "./util/bchaddr";
41
+
42
+ export function cube(x: number) {
43
+ return x * x * x;
44
+ }
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 watchAddress(
180
+ public watchAddressStatus(
180
181
  cashaddr: string,
181
- callback: (txHash: string) => void
182
+ callback: (status: string) => void
182
183
  ): CancelWatchFn {
183
- const watchAddressCallback = async (data) => {
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, [tx_hashes] ]
186
+ // status is an array: [ cashaddr, statusHash ]
186
187
  if (data instanceof Array) {
187
- let addr = data[0] as string;
188
+ const addr = data[0] as string;
188
189
  if (addr !== cashaddr) {
189
190
  return;
190
191
  }
191
192
 
192
- for (const txHash of data[1]) {
193
- if (!txHash) {
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.subscribeToAddressTransactions(cashaddr, watchAddressCallback);
198
+ this.subscribeToAddress(cashaddr, watchAddressStatusCallback);
203
199
 
204
200
  return async () => {
205
- await this.unsubscribeFromAddressTransactions(
206
- cashaddr,
207
- watchAddressCallback
208
- );
201
+ await this.unsubscribeFromAddress(cashaddr, watchAddressStatusCallback);
209
202
  };
210
203
  }
211
204
 
212
- public watchAddressTransactions(
213
- cashaddr: string,
214
- callback: (tx: ElectrumRawTransaction) => void
215
- ): CancelWatchFn {
216
- return this.watchAddress(cashaddr, async (txHash: string) => {
217
- const tx = await this.getRawTransactionObject(txHash);
218
- callback(tx);
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 {
@@ -10,7 +10,12 @@ export const networkTickerMap = {
10
10
 
11
11
  export const mainnetServers = ["wss://fulcrum.fountainhead.cash"];
12
12
 
13
- export const testnetServers = ["wss://electroncash.de:60004"];
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 =
@@ -4,7 +4,7 @@ let EventSource;
4
4
  if (getRuntimePlatform() != "node") {
5
5
  EventSource = globalThis.EventSource;
6
6
  } else {
7
- EventSource = require("eventsource/");
7
+ EventSource = eval("require")("eventsource/");
8
8
  }
9
9
 
10
10
  export default EventSource;
@@ -3,7 +3,8 @@ import { getRuntimePlatform } from "./getRuntimePlatform";
3
3
  export function generateRandomBytes(len = 32) {
4
4
  // nodejs
5
5
  if (getRuntimePlatform() === "node") {
6
- let crypto = require("crypto");
6
+ //
7
+ const crypto = eval("require")("crypto");
7
8
  return crypto.randomBytes(len);
8
9
  }
9
10
  // window, webworkers, service workers
@@ -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 = alice.watchAddressTransactions((_tx) => {
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 = bob.watchAddress((_txHash) => {
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
- public watchAddress(callback: (txHash: string) => void): CancelWatchFn {
562
- return (this.provider! as ElectrumNetworkProvider).watchAddress(
563
- this.getDepositAddress(),
564
- callback
565
- );
566
- }
567
-
568
- // waiting for any transaction of this wallet
569
- public watchAddressTransactions(
570
- callback: (tx: ElectrumRawTransaction) => void
571
- ): CancelWatchFn {
572
- return (this.provider! as ElectrumNetworkProvider).watchAddressTransactions(
573
- this.getDepositAddress(),
574
- callback
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.watchAddress(async (_txHash: string) => {
584
- const balance = (await this.getBalance()) as BalanceResponse;
585
- callback(balance);
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 = this.watchAddress(_callback);
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
- return await balanceResponseFromSatoshi(spendableAmount - fee);
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: string) => {
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
- promises[1] = this.provider!.getRawTransactionObject(txHash);
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 = this.watchAddress(async (txHash) => {
848
+ const watchCancel = (
849
+ this.provider! as ElectrumNetworkProvider
850
+ ).watchAddressStatus(this.getDepositAddress(), async (_status) => {
833
851
  watchCancel();
834
- resolve(makeResponse(txHash));
852
+ resolve(makeResponse());
835
853
  });
836
854
  });
837
855
  }