mainnet-js 3.1.7 → 4.0.0-next.10

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 (267) hide show
  1. package/dist/module/cache/IndexedDbCache.d.ts +1 -1
  2. package/dist/module/cache/IndexedDbCache.d.ts.map +1 -1
  3. package/dist/module/cache/MemoryCache.d.ts +1 -1
  4. package/dist/module/cache/MemoryCache.d.ts.map +1 -1
  5. package/dist/module/cache/WebStorageCache.d.ts +1 -1
  6. package/dist/module/cache/WebStorageCache.d.ts.map +1 -1
  7. package/dist/module/cache/walletCache.d.ts +16 -6
  8. package/dist/module/cache/walletCache.d.ts.map +1 -1
  9. package/dist/module/cache/walletCache.js +92 -34
  10. package/dist/module/cache/walletCache.js.map +1 -1
  11. package/dist/module/cli.js +1 -2
  12. package/dist/module/cli.js.map +1 -1
  13. package/dist/module/db/index.d.ts +1 -1
  14. package/dist/module/db/index.d.ts.map +1 -1
  15. package/dist/module/db/index.js +1 -1
  16. package/dist/module/db/index.js.map +1 -1
  17. package/dist/module/enum.d.ts +1 -1
  18. package/dist/module/enum.d.ts.map +1 -1
  19. package/dist/module/history/getHistory.d.ts +1 -1
  20. package/dist/module/history/getHistory.d.ts.map +1 -1
  21. package/dist/module/history/getHistory.js +3 -3
  22. package/dist/module/history/getHistory.js.map +1 -1
  23. package/dist/module/index.d.ts +25 -22
  24. package/dist/module/index.d.ts.map +1 -1
  25. package/dist/module/index.js +33 -26
  26. package/dist/module/index.js.map +1 -1
  27. package/dist/module/interface.d.ts +12 -2
  28. package/dist/module/interface.d.ts.map +1 -1
  29. package/dist/module/interface.js.map +1 -1
  30. package/dist/module/libauth.d.ts +1 -1
  31. package/dist/module/libauth.d.ts.map +1 -1
  32. package/dist/module/libauth.js +1 -1
  33. package/dist/module/libauth.js.map +1 -1
  34. package/dist/module/mine/mine.d.ts +2 -7
  35. package/dist/module/mine/mine.d.ts.map +1 -1
  36. package/dist/module/mine/mine.js +6 -27
  37. package/dist/module/mine/mine.js.map +1 -1
  38. package/dist/module/network/Connection.d.ts +1 -12
  39. package/dist/module/network/Connection.d.ts.map +1 -1
  40. package/dist/module/network/Connection.js +24 -33
  41. package/dist/module/network/Connection.js.map +1 -1
  42. package/dist/module/network/ElectrumNetworkProvider.d.ts +16 -17
  43. package/dist/module/network/ElectrumNetworkProvider.d.ts.map +1 -1
  44. package/dist/module/network/ElectrumNetworkProvider.js +91 -93
  45. package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
  46. package/dist/module/network/MockNetworkProvider.d.ts +28 -0
  47. package/dist/module/network/MockNetworkProvider.d.ts.map +1 -0
  48. package/dist/module/network/MockNetworkProvider.js +74 -0
  49. package/dist/module/network/MockNetworkProvider.js.map +1 -0
  50. package/dist/module/network/NetworkProvider.d.ts +9 -2
  51. package/dist/module/network/NetworkProvider.d.ts.map +1 -1
  52. package/dist/module/network/configuration.d.ts +2 -4
  53. package/dist/module/network/configuration.d.ts.map +1 -1
  54. package/dist/module/network/configuration.js +25 -50
  55. package/dist/module/network/configuration.js.map +1 -1
  56. package/dist/module/network/constant.d.ts +7 -7
  57. package/dist/module/network/constant.d.ts.map +1 -1
  58. package/dist/module/network/constant.js +21 -24
  59. package/dist/module/network/constant.js.map +1 -1
  60. package/dist/module/network/default.d.ts +5 -3
  61. package/dist/module/network/default.d.ts.map +1 -1
  62. package/dist/module/network/default.js +29 -51
  63. package/dist/module/network/default.js.map +1 -1
  64. package/dist/module/network/index.d.ts +4 -4
  65. package/dist/module/network/index.d.ts.map +1 -1
  66. package/dist/module/network/index.js +2 -2
  67. package/dist/module/network/index.js.map +1 -1
  68. package/dist/module/network/interface.d.ts +0 -6
  69. package/dist/module/network/interface.d.ts.map +1 -1
  70. package/dist/module/rate/ExchangeRate.d.ts +1 -1
  71. package/dist/module/rate/ExchangeRate.d.ts.map +1 -1
  72. package/dist/module/rate/ExchangeRate.js +13 -7
  73. package/dist/module/rate/ExchangeRate.js.map +1 -1
  74. package/dist/module/transaction/Wif.d.ts +3 -3
  75. package/dist/module/transaction/Wif.d.ts.map +1 -1
  76. package/dist/module/transaction/Wif.js +4 -4
  77. package/dist/module/transaction/Wif.js.map +1 -1
  78. package/dist/module/transaction/allocateFee.d.ts +1 -1
  79. package/dist/module/transaction/allocateFee.d.ts.map +1 -1
  80. package/dist/module/transaction/allocateFee.js +2 -2
  81. package/dist/module/transaction/allocateFee.js.map +1 -1
  82. package/dist/module/util/deriveCashaddr.js.map +1 -1
  83. package/dist/module/util/deriveNetwork.js +1 -1
  84. package/dist/module/util/deriveNetwork.js.map +1 -1
  85. package/dist/module/util/getAddrsByXpubKey.js +1 -1
  86. package/dist/module/util/getAddrsByXpubKey.js.map +1 -1
  87. package/dist/module/util/getXPubKey.js +1 -1
  88. package/dist/module/util/getXPubKey.js.map +1 -1
  89. package/dist/module/util/hd.d.ts +2 -0
  90. package/dist/module/util/hd.d.ts.map +1 -1
  91. package/dist/module/util/hd.js +41 -0
  92. package/dist/module/util/hd.js.map +1 -1
  93. package/dist/module/util/index.d.ts +7 -9
  94. package/dist/module/util/index.d.ts.map +1 -1
  95. package/dist/module/util/index.js +7 -9
  96. package/dist/module/util/index.js.map +1 -1
  97. package/dist/module/util/transaction.js +1 -1
  98. package/dist/module/util/transaction.js.map +1 -1
  99. package/dist/module/wallet/Base.d.ts +13 -9
  100. package/dist/module/wallet/Base.d.ts.map +1 -1
  101. package/dist/module/wallet/Base.js +54 -58
  102. package/dist/module/wallet/Base.js.map +1 -1
  103. package/dist/module/wallet/HDWallet.d.ts.map +1 -1
  104. package/dist/module/wallet/HDWallet.js +19 -38
  105. package/dist/module/wallet/HDWallet.js.map +1 -1
  106. package/dist/module/wallet/Util.d.ts +4 -22
  107. package/dist/module/wallet/Util.d.ts.map +1 -1
  108. package/dist/module/wallet/Util.js +75 -102
  109. package/dist/module/wallet/Util.js.map +1 -1
  110. package/dist/module/wallet/Watch.d.ts +24 -5
  111. package/dist/module/wallet/Watch.d.ts.map +1 -1
  112. package/dist/module/wallet/Watch.js +141 -17
  113. package/dist/module/wallet/Watch.js.map +1 -1
  114. package/dist/module/wallet/Wif.d.ts +2 -6
  115. package/dist/module/wallet/Wif.d.ts.map +1 -1
  116. package/dist/module/wallet/Wif.js +3 -69
  117. package/dist/module/wallet/Wif.js.map +1 -1
  118. package/dist/module/wallet/createWallet.d.ts +1 -1
  119. package/dist/module/wallet/createWallet.d.ts.map +1 -1
  120. package/dist/module/wallet/createWallet.js +2 -1
  121. package/dist/module/wallet/createWallet.js.map +1 -1
  122. package/dist/module/wallet/interface.d.ts +3 -2
  123. package/dist/module/wallet/interface.d.ts.map +1 -1
  124. package/dist/module/wallet/model.d.ts +2 -1
  125. package/dist/module/wallet/model.d.ts.map +1 -1
  126. package/dist/module/wallet/model.js +1 -1
  127. package/dist/module/wallet/model.js.map +1 -1
  128. package/package.json +17 -29
  129. package/dist/index.html +0 -9
  130. package/dist/mainnet-3.1.7.js +0 -2066
  131. package/dist/module/network/util.d.ts +0 -3
  132. package/dist/module/network/util.d.ts.map +0 -1
  133. package/dist/module/network/util.js +0 -27
  134. package/dist/module/network/util.js.map +0 -1
  135. package/dist/module/test/expect.d.ts +0 -12
  136. package/dist/module/test/expect.d.ts.map +0 -1
  137. package/dist/module/test/expect.js +0 -47
  138. package/dist/module/test/expect.js.map +0 -1
  139. package/dist/module/test/fetch.d.ts +0 -3
  140. package/dist/module/test/fetch.d.ts.map +0 -1
  141. package/dist/module/test/fetch.js +0 -32
  142. package/dist/module/test/fetch.js.map +0 -1
  143. package/dist/module/util/randomBytes.d.ts +0 -2
  144. package/dist/module/util/randomBytes.d.ts.map +0 -1
  145. package/dist/module/util/randomBytes.js +0 -13
  146. package/dist/module/util/randomBytes.js.map +0 -1
  147. package/dist/tsconfig.tsbuildinfo +0 -1
  148. package/src/cache/IndexedDbCache.test.ts +0 -15
  149. package/src/cache/IndexedDbCache.ts +0 -172
  150. package/src/cache/MemoryCache.test.ts +0 -15
  151. package/src/cache/MemoryCache.ts +0 -32
  152. package/src/cache/WebStorageCache.test.ts +0 -15
  153. package/src/cache/WebStorageCache.ts +0 -38
  154. package/src/cache/index.ts +0 -2
  155. package/src/cache/interface.ts +0 -9
  156. package/src/cache/walletCache.ts +0 -254
  157. package/src/chain.ts +0 -3
  158. package/src/cli.ts +0 -32
  159. package/src/config.ts +0 -23
  160. package/src/constant.ts +0 -27
  161. package/src/db/ExchangeRateProvider.ts +0 -28
  162. package/src/db/StorageProvider.ts +0 -64
  163. package/src/db/index.ts +0 -2
  164. package/src/db/interface.ts +0 -11
  165. package/src/enum.ts +0 -34
  166. package/src/history/getHistory.test.ts +0 -290
  167. package/src/history/getHistory.ts +0 -411
  168. package/src/history/interface.ts +0 -24
  169. package/src/index.ts +0 -48
  170. package/src/interface.ts +0 -72
  171. package/src/libauth.ts +0 -11
  172. package/src/message/index.ts +0 -2
  173. package/src/message/interface.ts +0 -40
  174. package/src/message/signed.test.ts +0 -309
  175. package/src/message/signed.ts +0 -201
  176. package/src/mine/index.ts +0 -1
  177. package/src/mine/mine.test.ts +0 -10
  178. package/src/mine/mine.ts +0 -42
  179. package/src/network/Connection.test.ts +0 -51
  180. package/src/network/Connection.ts +0 -73
  181. package/src/network/ElectrumNetworkProvider.ts +0 -657
  182. package/src/network/NetworkProvider.ts +0 -180
  183. package/src/network/Rpc.test.ts +0 -130
  184. package/src/network/configuration.test.ts +0 -59
  185. package/src/network/configuration.ts +0 -72
  186. package/src/network/constant.ts +0 -43
  187. package/src/network/default.ts +0 -120
  188. package/src/network/electrum.test.ts +0 -28
  189. package/src/network/getRelayFeeCache.test.ts +0 -15
  190. package/src/network/getRelayFeeCache.ts +0 -23
  191. package/src/network/index.ts +0 -14
  192. package/src/network/interface.ts +0 -80
  193. package/src/network/util.test.ts +0 -24
  194. package/src/network/util.ts +0 -30
  195. package/src/rate/ExchangeRate.test.headless.js +0 -35
  196. package/src/rate/ExchangeRate.test.ts +0 -51
  197. package/src/rate/ExchangeRate.ts +0 -142
  198. package/src/test/expect.ts +0 -59
  199. package/src/test/fetch.ts +0 -39
  200. package/src/test/json.test.ts +0 -13
  201. package/src/transaction/Wif.ts +0 -680
  202. package/src/transaction/allocateFee.test.ts +0 -298
  203. package/src/transaction/allocateFee.ts +0 -149
  204. package/src/util/amountInSatoshi.test.ts +0 -27
  205. package/src/util/amountInSatoshi.ts +0 -33
  206. package/src/util/asSendRequestObject.ts +0 -81
  207. package/src/util/base64.test.ts +0 -39
  208. package/src/util/base64.ts +0 -12
  209. package/src/util/browserNotSupported.ts +0 -7
  210. package/src/util/checkForEmptySeed.ts +0 -9
  211. package/src/util/checkUtxos.ts +0 -29
  212. package/src/util/checkWifNetwork.ts +0 -24
  213. package/src/util/convert.test.ts +0 -46
  214. package/src/util/convert.ts +0 -50
  215. package/src/util/delay.ts +0 -3
  216. package/src/util/deriveCashaddr.test.ts +0 -164
  217. package/src/util/deriveCashaddr.ts +0 -143
  218. package/src/util/deriveLockscript.ts +0 -16
  219. package/src/util/deriveNetwork.ts +0 -19
  220. package/src/util/derivePublicKeyHash.test.ts +0 -55
  221. package/src/util/derivePublicKeyHash.ts +0 -64
  222. package/src/util/floor.test.ts +0 -21
  223. package/src/util/floor.ts +0 -4
  224. package/src/util/getAddrsByXpubKey.test.ts +0 -115
  225. package/src/util/getAddrsByXpubKey.ts +0 -86
  226. package/src/util/getRuntimePlatform.test.headless.js +0 -40
  227. package/src/util/getRuntimePlatform.test.ts +0 -5
  228. package/src/util/getRuntimePlatform.ts +0 -31
  229. package/src/util/getUsdRate.ts +0 -5
  230. package/src/util/getXPubKey.ts +0 -39
  231. package/src/util/hash160.test.ts +0 -18
  232. package/src/util/hash160.ts +0 -12
  233. package/src/util/hd.ts +0 -16
  234. package/src/util/header.test.ts +0 -34
  235. package/src/util/header.ts +0 -26
  236. package/src/util/index.ts +0 -33
  237. package/src/util/randomBytes.ts +0 -13
  238. package/src/util/randomInt.test.ts +0 -15
  239. package/src/util/randomInt.ts +0 -4
  240. package/src/util/sanitizeAddress.ts +0 -10
  241. package/src/util/sanitizeUnit.ts +0 -11
  242. package/src/util/satoshiToAmount.test.ts +0 -6
  243. package/src/util/satoshiToAmount.ts +0 -33
  244. package/src/util/sumSendRequestAmounts.ts +0 -34
  245. package/src/util/sumUtxoValue.ts +0 -27
  246. package/src/util/transaction.ts +0 -10
  247. package/src/wallet/Base.ts +0 -1563
  248. package/src/wallet/Cashtokens.test.headless.js +0 -730
  249. package/src/wallet/Cashtokens.test.ts +0 -1411
  250. package/src/wallet/HDWallet.test.ts +0 -1086
  251. package/src/wallet/HDWallet.ts +0 -992
  252. package/src/wallet/Util.test.ts +0 -134
  253. package/src/wallet/Util.ts +0 -191
  254. package/src/wallet/WalletCache.test.ts +0 -45
  255. package/src/wallet/Watch.ts +0 -441
  256. package/src/wallet/Wif.bip39.test.ts +0 -48
  257. package/src/wallet/Wif.test.ts +0 -1189
  258. package/src/wallet/Wif.ts +0 -687
  259. package/src/wallet/Wif.watchOnly.test.ts +0 -58
  260. package/src/wallet/createWallet.ts +0 -238
  261. package/src/wallet/enum.ts +0 -18
  262. package/src/wallet/interface.ts +0 -102
  263. package/src/wallet/model.test.ts +0 -24
  264. package/src/wallet/model.ts +0 -352
  265. package/tsconfig.browser.json +0 -11
  266. package/tsconfig.json +0 -33
  267. package/webpack.config.cjs +0 -132
@@ -1,1189 +0,0 @@
1
- import { RegTestWallet, TestNetWallet, Wallet } from "./Wif";
2
- import { bchParam } from "../chain";
3
- import { initProviders, disconnectProviders } from "../network/Connection";
4
- import { DERIVATION_PATHS, DUST_UTXO_THRESHOLD as DUST } from "../constant";
5
- import { delay } from "../util/delay";
6
- import { OpReturnData, SendResponse, toUtxoId } from "./model";
7
- import { ElectrumRawTransaction } from "../network/interface";
8
- import {
9
- binToHex,
10
- binsAreEqual,
11
- decodeTransaction,
12
- hexToBin,
13
- lockingBytecodeToCashAddress,
14
- utf8ToBin,
15
- } from "@bitauth/libauth";
16
- import { mine } from "../mine";
17
- import { Config } from "../config";
18
- import { CancelFn } from "./interface";
19
- import json from "../test/json.test";
20
- import { convert, sumUtxoValue, toBch, toCurrency, toSat } from "../util";
21
-
22
- beforeAll(async () => {
23
- await initProviders();
24
- });
25
- afterAll(async () => {
26
- await disconnectProviders();
27
- });
28
-
29
- describe(`Test creation of wallet from walletId`, () => {
30
- test("Get a regtest wallet from string id", async () => {
31
- let w = await RegTestWallet.fromId(
32
- "wif:regtest:cQAurrWpGpAtvKcGWvTYFpiTickpTUa3YzXkXpbqD342pscjbCxH"
33
- );
34
- expect(w.cashaddr!.startsWith("bchreg:")).toBeTruthy();
35
- expect(w.publicKey!.length).toBe(65);
36
- expect(w.publicKeyCompressed!.length).toBe(33);
37
- expect(w.privateKey!.length).toBe(32);
38
- expect(w.publicKeyHash!.length).toBe(20);
39
- expect(w.privateKeyWif !== "undefined").toBeTruthy();
40
- });
41
-
42
- test("hasAddress should recognize wallet address", async () => {
43
- let w = await RegTestWallet.fromId(
44
- "wif:regtest:cQAurrWpGpAtvKcGWvTYFpiTickpTUa3YzXkXpbqD342pscjbCxH"
45
- );
46
- expect(w.hasAddress(w.getDepositAddress())).toBe(true);
47
- expect(
48
- w.hasAddress("bchreg:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq9d5dxv4")
49
- ).toBe(false);
50
- });
51
-
52
- test("Should get a new random wallet", async () => {
53
- let w = await RegTestWallet.newRandom();
54
- expect(w.cashaddr!.startsWith("bchreg:")).toBeTruthy();
55
- expect(w.publicKey!.length).toBe(65);
56
- expect(w.publicKeyCompressed!.length).toBe(33);
57
- expect(w.privateKey!.length).toBe(32);
58
- expect(w.publicKeyHash!.length).toBe(20);
59
- expect(w.privateKeyWif !== "undefined").toBeTruthy();
60
- });
61
-
62
- test("Should get a regtest wallet from wif id string", async () => {
63
- let w = await RegTestWallet.fromId(process.env.ALICE_ID!);
64
- expect(w.cashaddr!.startsWith("bchreg:")).toBeTruthy();
65
- expect(w.publicKey!.length).toBe(65);
66
- expect(w.publicKeyCompressed!.length).toBe(33);
67
- expect(w.privateKey!.length).toBe(32);
68
- expect(w.publicKeyHash!.length).toBe(20);
69
- expect(w.privateKeyWif !== "undefined").toBeTruthy();
70
- });
71
-
72
- test("Should get a regtest wallet from seed id string", async () => {
73
- let w = await RegTestWallet.fromId(process.env.BOB_ID!);
74
- expect(w.cashaddr!.startsWith("bchreg:")).toBeTruthy();
75
- expect(w.publicKey!.length).toBe(65);
76
- expect(w.publicKeyCompressed!.length).toBe(33);
77
- expect(w.privateKey!.length).toBe(32);
78
- expect(w.publicKeyHash!.length).toBe(20);
79
- expect(w.privateKeyWif !== "undefined").toBeTruthy();
80
- });
81
-
82
- test("Get a testnet wallet from string id", async () => {
83
- let w = await TestNetWallet.fromId(
84
- "wif:testnet:cPS12C2bpGHtKjS5NXNyWyTGGRMPk7D7pjp5JfgxRKWyFnWoDyZg"
85
- );
86
- expect(w.publicKey!.length).toBe(65);
87
- expect(w.publicKeyCompressed!.length).toBe(33);
88
- expect(w.privateKey!.length).toBe(32);
89
- expect(w.publicKeyHash!.length).toBe(20);
90
- expect(w.cashaddr!.startsWith("bchtest:")).toBeTruthy();
91
- });
92
-
93
- test("Get a mainnet wallet from string id", async () => {
94
- let w = await Wallet.fromId(
95
- "wif:mainnet:KysvoRyDkxQycBGj49K8oC3minAfoXnVmkcgx6UsZx3g2VvyGCAa"
96
- );
97
- expect(w.publicKey!.length).toBe(65);
98
- expect(w.privateKey!.length).toBe(32);
99
- expect(w.publicKeyHash!.length).toBe(20);
100
- expect(w.cashaddr!.startsWith("bitcoincash")).toBeTruthy();
101
- });
102
-
103
- describe(`Errors from walletId`, () => {
104
- test("Expect Error passing testnet wallet to mainnet", async () => {
105
- expect.assertions(1);
106
- try {
107
- await TestNetWallet.fromId(
108
- "wif:testnet:KysvoRyDkxQycBGj49K8oC3minAfoXnVmkcgx6UsZx3g2VvyGCAa"
109
- );
110
- } catch (e: any) {
111
- expect(e.message).toBe(
112
- "Testnet type wif KysvoRyDkxQycBGj49K8oC3minAfoXnVmkcgx6UsZx3g2VvyGCAa passed, should start with c"
113
- );
114
- }
115
- });
116
-
117
- test("Expect Error passing mainnet wallet to testnet", async () => {
118
- expect.assertions(1);
119
- try {
120
- await Wallet.fromId(
121
- "wif:mainnet:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
122
- );
123
- } catch (e: any) {
124
- expect(e.message).toBe(
125
- "Mainnet type wif cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6 passed, should start with L or K"
126
- );
127
- }
128
- });
129
-
130
- test("Expect Error passing hd wallet", async () => {
131
- expect.assertions(1);
132
- try {
133
- await Wallet.fromId(
134
- "hd:mainnet:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
135
- );
136
- } catch (e: any) {
137
- expect(e.message).toBe("Unknown wallet type 'hd'");
138
- }
139
- });
140
-
141
- test("Expect Error passing unknown wallet", async () => {
142
- expect.assertions(1);
143
- try {
144
- await Wallet.fromId(
145
- "q2k:mainnet:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
146
- );
147
- } catch (e: any) {
148
- expect(e.message).toBe("Unknown wallet type 'q2k'");
149
- }
150
- });
151
- });
152
- });
153
-
154
- describe(`Mnemonic wallet creation`, () => {
155
- test("Expect '11x abandon about' to have the correct key, seed and path", async () => {
156
- let w = await Wallet.fromId(
157
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
158
- );
159
- expect(w.cashaddr!).toBe(
160
- "bitcoincash:qrvcdmgpk73zyfd8pmdl9wnuld36zh9n4gms8s0u59"
161
- );
162
- expect(w.privateKeyWif!).toBe(
163
- "L4p2b9VAf8k5aUahF1JCJUzZkgNEAqLfq8DDdQiyAprQAKSbu8hf"
164
- );
165
- expect(w.getSeed().seed).toBe(
166
- "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
167
- );
168
- expect(w.getSeed().derivationPath).toBe("m/44'/0'/0'/0/0");
169
- const info = {
170
- cashaddr: "bitcoincash:qrvcdmgpk73zyfd8pmdl9wnuld36zh9n4gms8s0u59",
171
- tokenaddr: "bitcoincash:zrvcdmgpk73zyfd8pmdl9wnuld36zh9n4gu65wp6tk",
172
- isTestnet: false,
173
- name: "",
174
- network: "mainnet",
175
- privateKey:
176
- "e284129cc0922579a535bbf4d1a3b25773090d28c909bc0fed73b5e0222cc372",
177
- privateKeyWif: "L4p2b9VAf8k5aUahF1JCJUzZkgNEAqLfq8DDdQiyAprQAKSbu8hf",
178
- publicKey:
179
- "04aaeb52dd7494c361049de67cc680e83ebcbbbdbeb13637d92cd845f70308af5e9370164133294e5fd1679672fe7866c307daf97281a28f66dca7cbb52919824f",
180
- publicKeyHash: "d986ed01b7a22225a70edbf2ba7cfb63a15cb3aa",
181
-
182
- parentXPubKey:
183
- "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj",
184
- parentDerivationPath: "m/44'/0'/0'",
185
- derivationPath: "m/44'/0'/0'/0/0",
186
- seed: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
187
-
188
- walletDbEntry:
189
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about:m/44'/0'/0'/0/0",
190
- walletId:
191
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about:m/44'/0'/0'/0/0",
192
- };
193
- expect(w.getInfo()).toEqual(info);
194
- });
195
-
196
- test("Expect '11x abandon about' to have the correct key, seed and path when generated on 145' coin path", async () => {
197
- let w = await Wallet.fromId(
198
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about:m/44'/145'/0'/0/0"
199
- );
200
- expect(w.cashaddr!).toBe(
201
- "bitcoincash:qqyx49mu0kkn9ftfj6hje6g2wfer34yfnq5tahq3q6"
202
- );
203
- expect(w.privateKeyWif!).toBe(
204
- "KxbEv3FeYig2afQp7QEA9R3gwqdTBFwAJJ6Ma7j1SkmZoxC9bAXZ"
205
- );
206
- expect(w.getSeed().seed).toBe(
207
- "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
208
- );
209
- expect(w.getSeed().derivationPath).toBe("m/44'/145'/0'/0/0");
210
- expect(w.getSeed().parentDerivationPath).toBe("m/44'/145'/0'");
211
- });
212
- test("Expect '11x abandon about' to have the correct key, seed and path from regtest wallet", async () => {
213
- let w = await RegTestWallet.fromId(
214
- "seed:regtest:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
215
- );
216
- expect(w.cashaddr!).toBe(
217
- "bchreg:qrvcdmgpk73zyfd8pmdl9wnuld36zh9n4g974kwcsl"
218
- );
219
- expect(w.privateKeyWif!).toBe(
220
- "cVB244V26CSLjv3xdR7KfoVdNufdqHSMuAMgjqBUfwWQR4WVFsky"
221
- );
222
- expect(w.getSeed().seed).toBe(
223
- "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
224
- );
225
- expect(w.getSeed().derivationPath).toBe("m/44'/0'/0'/0/0");
226
- });
227
- });
228
-
229
- describe(`XPubKey path derivation`, () => {
230
- test("Expect '11x abandon about' to have the correct xpubs for common derivation paths, seed and path", async () => {
231
- let w = await Wallet.fromId(
232
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
233
- );
234
- let commonPaths = await w.deriveHdPaths(DERIVATION_PATHS);
235
- expect(commonPaths).toStrictEqual([
236
- {
237
- path: "m/0",
238
- xPubKey:
239
- "xpub68jrRzQfUmwSaf5Y37Yd5uwfnMRxiR14M3HBonDr91GB7GKEh7R9Mvu2UeCtbASfXZ9FdNo9FwFx6a37HNXUDiXVQFXuadXmevRBa3y7rL8",
240
- },
241
- {
242
- path: "m/0'",
243
- xPubKey:
244
- "xpub68jrRzQopSUQm76hJ6TNtiJMJfhj38u1X12xCzExrw388hcN443UVnYpswdUkV7vPJ3KayiCdp3Q5E23s4wvkucohVTh7eSstJdBFyn2DMx",
245
- },
246
- {
247
- path: "m/0'/0",
248
- xPubKey:
249
- "xpub6A7PsGUCo9qsn1jhZVB68WKWU9bTt1Wu7fzRqhczRbJ3u3xsF1bJmWBL1MvygTtrfmvNw1adLzmRjQHtDCJDXAHFa4K3wELpGGqEXL4e6d4",
250
- },
251
- {
252
- path: "m/0'/0'",
253
- xPubKey:
254
- "xpub6A7PsGUM8pNqwy9AceVuFK6KxY88FhvFMRGP9fjEDKA3P4WpR1zyHH3Lmczj7eorx4RbDC4Qttd8C7HhLA2W9LsxxZzXo1DMCwJFb3zZKZ8",
255
- },
256
- {
257
- path: "m/0'/0'/0'",
258
- xPubKey:
259
- "xpub6BiChRN7aqq51RA7RnAmKhqKdGckPncrHWLrj1xoj6ZMfdMJ1dX4Ysh9V3yEhpFCpC3BapjR83xPKY693XXTEU6qgWU3qZs78WBHA15uhYf",
260
- },
261
- {
262
- path: "m/44'/0'/0'",
263
- xPubKey:
264
- "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj",
265
- },
266
- {
267
- path: "m/44'/0'/0'/0",
268
- xPubKey:
269
- "xpub6ELHKXNimKbxMCytPh7EdC2QXx46T9qLDJWGnTraz1H9kMMFdcduoU69wh9cxP12wDxqAAfbaESWGYt5rREsX1J8iR2TEunvzvddduAPYcY",
270
- },
271
- {
272
- path: "m/44'/145'/0'",
273
- xPubKey:
274
- "xpub6ByHsPNSQXTWZ7PLESMY2FufyYWtLXagSUpMQq7Un96SiThZH2iJB1X7pwviH1WtKVeDP6K8d6xxFzzoaFzF3s8BKCZx8oEDdDkNnp4owAZ",
275
- },
276
- {
277
- path: "m/44'/145'/0'/0",
278
- xPubKey:
279
- "xpub6F2iaK2JUPcgrZ6RTGH6t8VybLPu1XzfrHsDsaKvK6NfULznU6i6aw6ZoefDW2DpNruSLw73RwQg46qvpqB3eryeJJ2tkFCF4Z6gbr8Pjja",
280
- },
281
- {
282
- path: "m/44'/245'/0",
283
- xPubKey:
284
- "xpub6Ch34ms5osevEtkEZX81n8EG4c6vgHWGH1gQXBG2uf2Tihb1eed4H1wozLfZB31mV9JD7mymYTQxcLKFFjZHdM5NGdH2Ud1ksSkfwSFjjCg",
285
- },
286
- {
287
- path: "m/44'/245'/0'",
288
- xPubKey:
289
- "xpub6Ch34msE9YBtQV7pZrLyRXHwocrpJtNN4KDG8bbyxyhGmEM5MirtqkiH4h9dvnVJ3MekET3w2Fkvej3fyo8WLz9bRPyDynDf6NXNfuydhv1",
290
- },
291
- {
292
- path: "m/44'/245'/0'/0",
293
- xPubKey:
294
- "xpub6FFeETss5Zwkw78NDAibKEaGxigU3bgYzLihcqbQqqTyb6jorR9mgR9AexYydxmiPU8koAf5ndaQPjPWK3sDz1wjBjf2TkLbD982S9PWd9Z",
295
- },
296
- ]);
297
- });
298
- test("Expect '11x abandon about' to return 'protected' for root path", async () => {
299
- expect.assertions(1);
300
- try {
301
- let w = await Wallet.fromId(
302
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
303
- );
304
- let commonPaths = await w.deriveHdPaths(["m"]);
305
- } catch (e: any) {
306
- expect(e.message).toBe(
307
- "Storing or sharing of parent public key may lead to loss of funds. Storing or sharing *root* parent public keys is strongly discouraged, although all parent keys have risk. See: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#implications"
308
- );
309
- }
310
- });
311
-
312
- test("Expect '11x abandon about' to have the correct xpubs for common derivation paths, seed and path", async () => {
313
- let w = await Wallet.fromId(
314
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
315
- );
316
- let commonPaths = await w.getXPubKeys();
317
- expect(commonPaths).toStrictEqual([
318
- {
319
- path: "m/0",
320
- xPubKey:
321
- "xpub68jrRzQfUmwSaf5Y37Yd5uwfnMRxiR14M3HBonDr91GB7GKEh7R9Mvu2UeCtbASfXZ9FdNo9FwFx6a37HNXUDiXVQFXuadXmevRBa3y7rL8",
322
- },
323
- {
324
- path: "m/0'",
325
- xPubKey:
326
- "xpub68jrRzQopSUQm76hJ6TNtiJMJfhj38u1X12xCzExrw388hcN443UVnYpswdUkV7vPJ3KayiCdp3Q5E23s4wvkucohVTh7eSstJdBFyn2DMx",
327
- },
328
- {
329
- path: "m/0'/0",
330
- xPubKey:
331
- "xpub6A7PsGUCo9qsn1jhZVB68WKWU9bTt1Wu7fzRqhczRbJ3u3xsF1bJmWBL1MvygTtrfmvNw1adLzmRjQHtDCJDXAHFa4K3wELpGGqEXL4e6d4",
332
- },
333
- {
334
- path: "m/0'/0'",
335
- xPubKey:
336
- "xpub6A7PsGUM8pNqwy9AceVuFK6KxY88FhvFMRGP9fjEDKA3P4WpR1zyHH3Lmczj7eorx4RbDC4Qttd8C7HhLA2W9LsxxZzXo1DMCwJFb3zZKZ8",
337
- },
338
- {
339
- path: "m/0'/0'/0'",
340
- xPubKey:
341
- "xpub6BiChRN7aqq51RA7RnAmKhqKdGckPncrHWLrj1xoj6ZMfdMJ1dX4Ysh9V3yEhpFCpC3BapjR83xPKY693XXTEU6qgWU3qZs78WBHA15uhYf",
342
- },
343
- {
344
- path: "m/44'/0'/0'",
345
- xPubKey:
346
- "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj",
347
- },
348
- {
349
- path: "m/44'/0'/0'/0",
350
- xPubKey:
351
- "xpub6ELHKXNimKbxMCytPh7EdC2QXx46T9qLDJWGnTraz1H9kMMFdcduoU69wh9cxP12wDxqAAfbaESWGYt5rREsX1J8iR2TEunvzvddduAPYcY",
352
- },
353
- {
354
- path: "m/44'/145'/0'",
355
- xPubKey:
356
- "xpub6ByHsPNSQXTWZ7PLESMY2FufyYWtLXagSUpMQq7Un96SiThZH2iJB1X7pwviH1WtKVeDP6K8d6xxFzzoaFzF3s8BKCZx8oEDdDkNnp4owAZ",
357
- },
358
- {
359
- path: "m/44'/145'/0'/0",
360
- xPubKey:
361
- "xpub6F2iaK2JUPcgrZ6RTGH6t8VybLPu1XzfrHsDsaKvK6NfULznU6i6aw6ZoefDW2DpNruSLw73RwQg46qvpqB3eryeJJ2tkFCF4Z6gbr8Pjja",
362
- },
363
- {
364
- path: "m/44'/245'/0",
365
- xPubKey:
366
- "xpub6Ch34ms5osevEtkEZX81n8EG4c6vgHWGH1gQXBG2uf2Tihb1eed4H1wozLfZB31mV9JD7mymYTQxcLKFFjZHdM5NGdH2Ud1ksSkfwSFjjCg",
367
- },
368
- {
369
- path: "m/44'/245'/0'",
370
- xPubKey:
371
- "xpub6Ch34msE9YBtQV7pZrLyRXHwocrpJtNN4KDG8bbyxyhGmEM5MirtqkiH4h9dvnVJ3MekET3w2Fkvej3fyo8WLz9bRPyDynDf6NXNfuydhv1",
372
- },
373
- {
374
- path: "m/44'/245'/0'/0",
375
- xPubKey:
376
- "xpub6FFeETss5Zwkw78NDAibKEaGxigU3bgYzLihcqbQqqTyb6jorR9mgR9AexYydxmiPU8koAf5ndaQPjPWK3sDz1wjBjf2TkLbD982S9PWd9Z",
377
- },
378
- ]);
379
- });
380
- test("Expect '11x abandon about' to return 'protected' for root path", async () => {
381
- expect.assertions(1);
382
- try {
383
- let w = await Wallet.fromId(
384
- "seed:mainnet:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
385
- );
386
- let commonPaths = await w.getXPubKeys(["m"]);
387
- } catch (e: any) {
388
- expect(e.message).toBe(
389
- "Storing or sharing of parent public key may lead to loss of funds. Storing or sharing *root* parent public keys is strongly discouraged, although all parent keys have risk. See: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#implications"
390
- );
391
- }
392
- });
393
- });
394
-
395
- describe(`Watch only Wallets`, () => {
396
- test("Create a watch only testnet wallet from string id", async () => {
397
- let w = await TestNetWallet.fromId(
398
- "watch:testnet:qppr9h7whx9pzucgqukhtlj8lvgvjlgr3g9ggtkq22"
399
- );
400
- expect(w.network).toBe("testnet");
401
- expect(w.networkPrefix).toBe("bchtest");
402
- expect(w.cashaddr).toBe(
403
- "bchtest:qppr9h7whx9pzucgqukhtlj8lvgvjlgr3g9ggtkq22"
404
- );
405
- expect(w.getInfo()).toStrictEqual({
406
- cashaddr: "bchtest:qppr9h7whx9pzucgqukhtlj8lvgvjlgr3g9ggtkq22",
407
- tokenaddr: "bchtest:zppr9h7whx9pzucgqukhtlj8lvgvjlgr3gzzm4cx4e",
408
- derivationPath: undefined,
409
- isTestnet: true,
410
- name: "",
411
- network: "testnet",
412
- parentDerivationPath: undefined,
413
- parentXPubKey: undefined,
414
- privateKey: undefined,
415
- privateKeyWif: undefined,
416
- publicKey: undefined,
417
- publicKeyHash: "4232dfceb98a117308072d75fe47fb10c97d038a",
418
- seed: undefined,
419
- walletDbEntry:
420
- "watch:testnet:bchtest:qppr9h7whx9pzucgqukhtlj8lvgvjlgr3g9ggtkq22",
421
- walletId:
422
- "watch:testnet:bchtest:qppr9h7whx9pzucgqukhtlj8lvgvjlgr3g9ggtkq22",
423
- });
424
- });
425
-
426
- test("Create a watch only regtest wallet from string id", async () => {
427
- let w = await RegTestWallet.fromId(
428
- "watch:regtest:qql8ypk6y9qksmjj2qp3r5fr3ne35ltkzss902evnt"
429
- );
430
- if (!w) {
431
- throw Error("Could not derive wallet");
432
- }
433
-
434
- // the balance unit may also be empty
435
- expect(await w.getBalance()).toBe(0n);
436
- expect(w.network).toBe("regtest");
437
- expect(w.networkPrefix).toBe("bchreg");
438
- expect(w.cashaddr).toBe(
439
- "bchreg:qql8ypk6y9qksmjj2qp3r5fr3ne35ltkzss902evnt"
440
- );
441
- });
442
-
443
- test("Create a watch only mainnet wallet from string id", async () => {
444
- let w = await Wallet.fromId(
445
- "watch:mainnet:qp6e6enhpy0fwwu7nkvlr8rgl06ru0c9lywalz8st5"
446
- );
447
- expect(w.network).toBe("mainnet");
448
- expect(w.networkPrefix).toBe("bitcoincash");
449
- expect(w.cashaddr).toBe(
450
- "bitcoincash:qp6e6enhpy0fwwu7nkvlr8rgl06ru0c9lywalz8st5"
451
- );
452
- });
453
-
454
- test("Should get the regtest wallet balance", async () => {
455
- // Build Alice's wallet from Wallet Import Format string, send some sats
456
- if (!process.env.ADDRESS) {
457
- throw Error("Attempted to pass an empty address");
458
- } else {
459
- let alice = await RegTestWallet.watchOnly(process.env.ADDRESS); // insert WIF from #1
460
- // Build Bob's wallet from a public address, check his balance.
461
- expect(alice.getPublicKeyHash()!.length).toBe(20);
462
- const aliceBalance = await alice.getBalance();
463
- expect(toBch(aliceBalance)).toBeGreaterThan(5000);
464
- expect(await alice.getBalance()).toBeGreaterThan(
465
- 5000n * bchParam.subUnits
466
- );
467
- }
468
- });
469
-
470
- test("Should get the regtest wallet balance in eur", async () => {
471
- // Build Alice's wallet from Wallet Import Format string, send some sats
472
- if (!process.env.ADDRESS) {
473
- throw Error("Attempted to pass an empty address");
474
- } else {
475
- Config.DefaultCurrency = "eur";
476
- let alice = await RegTestWallet.watchOnly(process.env.ADDRESS); // insert WIF from #1
477
- // Build Bob's wallet from a public address, check his balance.
478
- expect(alice.getPublicKeyHash()!.length).toBe(20);
479
- const aliceBalance = await alice.getBalance();
480
- expect(toBch(aliceBalance)).toBeGreaterThan(5000);
481
- expect(await toCurrency(await alice.getBalance(), "eur")).toBeGreaterThan(
482
- 0
483
- );
484
- expect(
485
- await toCurrency(
486
- await (await RegTestWallet.newRandom()).getBalance(),
487
- "eur"
488
- )
489
- ).toBe(0);
490
- Config.DefaultCurrency = "usd";
491
- }
492
- });
493
-
494
- test("Should send to testnet coins to a random address", async () => {
495
- if (!process.env.ALICE_TESTNET_WALLET_ID) {
496
- throw Error("Attempted to pass an empty address");
497
- } else {
498
- let alice = await TestNetWallet.fromId(
499
- process.env.ALICE_TESTNET_WALLET_ID
500
- ); // insert WIF from #1
501
- // Build Bob's wallet from a public address, check his balance.
502
- expect(alice.getPublicKeyHash()!.length).toBe(20);
503
- let aliceBalance = await alice.send([
504
- { cashaddr: alice.cashaddr!, value: 720n },
505
- ]);
506
- expect(aliceBalance.balance).toBeGreaterThan(5000n);
507
- }
508
- });
509
-
510
- test("Should get the testnet wallet balance", async () => {
511
- // Build Alice's wallet from Wallet Import Format string, send some sats
512
- if (!process.env.PRIVATE_WIF) {
513
- throw Error("Attempted to pass an empty WIF");
514
- } else {
515
- let alice = await TestNetWallet.watchOnly(
516
- process.env.ALICE_TESTNET_ADDRESS!
517
- ); // insert WIF from #1
518
- // Build Bob's wallet from a public address, check his balance.
519
- const aliceBalance = await alice.getBalance();
520
- expect(aliceBalance).toBeGreaterThan(2000n);
521
- }
522
- });
523
-
524
- test("Should encode and submit a transaction", async () => {
525
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
526
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
527
- const bobWallet = await RegTestWallet.newRandom();
528
-
529
- const { encodedTransaction } = await aliceWallet.encodeTransaction([
530
- {
531
- cashaddr: bobWallet.cashaddr!,
532
- value: 2000n,
533
- },
534
- ]);
535
- expect(encodedTransaction.length).toBeGreaterThan(0);
536
-
537
- const txId = await aliceWallet.submitTransaction(encodedTransaction, true);
538
- expect(txId.length).toBeGreaterThan(0);
539
-
540
- expect(await bobWallet.getBalance()).toBe(2000n);
541
- });
542
-
543
- test("Should get last transaction", async () => {
544
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
545
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
546
- const bobWallet = await RegTestWallet.newRandom();
547
-
548
- expect(await bobWallet.getLastTransaction()).toBeNull();
549
-
550
- await aliceWallet.send([
551
- {
552
- cashaddr: bobWallet.cashaddr!,
553
- value: 2000n,
554
- },
555
- ]);
556
-
557
- expect(await bobWallet.getLastTransaction()).not.toBeNull();
558
- });
559
- });
560
- describe(`Wallet subscriptions`, () => {
561
- test("Should wait for transaction", async () => {
562
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
563
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
564
- const bobWallet = await RegTestWallet.newRandom();
565
-
566
- setTimeout(
567
- () =>
568
- aliceWallet.send([
569
- {
570
- cashaddr: bobWallet.cashaddr!,
571
- value: 1000n,
572
- },
573
- ]),
574
- 0
575
- );
576
-
577
- const response = await bobWallet.waitForTransaction({
578
- getTransactionInfo: true,
579
- getBalance: true,
580
- });
581
- expect(response.balance).toBeGreaterThan(0);
582
- expect(response.transactionInfo!.hash).not.toBe("");
583
-
584
- await bobWallet.sendMax(aliceWallet.cashaddr!);
585
- });
586
-
587
- test("Should await and skip transaction propagation", async () => {
588
- const aliceWallet = await RegTestWallet.fromId(process.env.ALICE_ID!);
589
- const bobWallet = await RegTestWallet.newRandom();
590
-
591
- let balance, newBalance;
592
- balance = await aliceWallet.getBalance();
593
-
594
- aliceWallet.send(
595
- [
596
- {
597
- cashaddr: bobWallet.cashaddr!,
598
- value: 1000n,
599
- },
600
- ],
601
- { awaitTransactionPropagation: false }
602
- );
603
- newBalance = await aliceWallet.getBalance();
604
- expect(balance).toBe(newBalance);
605
-
606
- await delay(1500);
607
-
608
- balance = await aliceWallet.getBalance();
609
- await aliceWallet.send(
610
- [
611
- {
612
- cashaddr: bobWallet.cashaddr!,
613
- value: 1000n,
614
- },
615
- ],
616
- { awaitTransactionPropagation: false }
617
- );
618
-
619
- newBalance = await aliceWallet.getBalance();
620
- expect(balance).toBe(newBalance);
621
-
622
- balance = await aliceWallet.getBalance();
623
- await aliceWallet.send(
624
- [
625
- {
626
- cashaddr: bobWallet.cashaddr!,
627
- value: 1000n,
628
- },
629
- ],
630
- { awaitTransactionPropagation: true }
631
- );
632
-
633
- newBalance = await aliceWallet.getBalance();
634
- expect(balance).toBeGreaterThan(newBalance);
635
- });
636
-
637
- test("Create two wallets, get balances concurrently", async () => {
638
- let balance1 = 999n;
639
- let balance2 = 666n;
640
- Wallet.newRandom().then((wallet) =>
641
- wallet.getBalance().then((balance) => (balance1 = balance))
642
- );
643
- Wallet.newRandom().then((wallet) =>
644
- wallet.getBalance().then((balance) => (balance2 = balance))
645
- );
646
- await delay(5000);
647
- expect(balance1).toBe(0n);
648
- expect(balance2).toBe(0n);
649
- });
650
-
651
- test("Should watch then wait", async () => {
652
- const aliceWallet = await RegTestWallet.newRandom();
653
-
654
- let cancel = await aliceWallet.watchBalance(() => {});
655
-
656
- await cancel();
657
- });
658
-
659
- test("Should wait for balance", async () => {
660
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
661
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
662
- const bobWallet = await RegTestWallet.newRandom();
663
-
664
- aliceWallet.send([
665
- {
666
- cashaddr: bobWallet.cashaddr!,
667
- value: 2000n,
668
- },
669
- ]);
670
-
671
- let balance = await bobWallet.waitForBalance(2000n);
672
- expect(balance).toBeGreaterThanOrEqual(2000n);
673
- await bobWallet.sendMax(aliceWallet.cashaddr!);
674
- });
675
-
676
- test("Should watch balance, then waitForBalance, then cancel watch", async () => {
677
- const aliceId = `wif:regtest:${process.env.PRIVATE_WIF!}`;
678
- const alice = await RegTestWallet.fromId(aliceId);
679
- const bob = await RegTestWallet.newRandom();
680
- alice.send([
681
- {
682
- cashaddr: bob.cashaddr!,
683
- value: 2000n,
684
- },
685
- ]);
686
-
687
- let cancel = await bob.watchBalance(() => {});
688
- let balance = await bob.waitForBalance(2000n);
689
- expect(balance).toBe(2000n);
690
- await cancel();
691
- });
692
-
693
- test("Should watch multiple wallets", async () => {
694
- const aliceId = `wif:regtest:${process.env.PRIVATE_WIF!}`;
695
- const alice = await RegTestWallet.fromId(aliceId);
696
- const bob = await RegTestWallet.newRandom();
697
- const charlie = await RegTestWallet.newRandom();
698
- const dave = await RegTestWallet.newRandom();
699
-
700
- setTimeout(
701
- () =>
702
- alice.send([
703
- {
704
- cashaddr: bob.cashaddr!,
705
- value: 1000n,
706
- },
707
- ]),
708
- 600
709
- );
710
-
711
- let bobBalance = await bob.waitForBalance(1000n).catch((e) => {
712
- throw e;
713
- });
714
- setTimeout(
715
- () =>
716
- alice.send([
717
- {
718
- cashaddr: charlie.cashaddr!,
719
- value: 1000n,
720
- },
721
- ]),
722
- 600
723
- );
724
- let charlieBalance = await charlie.waitForBalance(1000n);
725
- setTimeout(
726
- () =>
727
- alice.send([
728
- {
729
- cashaddr: dave.cashaddr!,
730
- value: 1000n,
731
- },
732
- ]),
733
- 600
734
- );
735
- let daveBalance = await dave.waitForBalance(1000n);
736
- expect(bobBalance).toBe(1000n);
737
- expect(charlieBalance).toBe(1000n);
738
- expect(daveBalance).toBe(1000n);
739
- setTimeout(
740
- () =>
741
- alice.send([
742
- {
743
- cashaddr: bob.cashaddr!,
744
- value: 1000n,
745
- },
746
- ]),
747
- 600
748
- );
749
- let bobResponse = await bob.waitForTransaction();
750
- expect(bobResponse.transactionInfo!.version).toBe(2);
751
- setTimeout(
752
- () =>
753
- alice.send([
754
- {
755
- cashaddr: bob.cashaddr!,
756
- value: 1000n,
757
- },
758
- ]),
759
- 600
760
- );
761
- bobResponse = await bob.waitForTransaction();
762
- expect(bobResponse.transactionInfo!.version).toBe(2);
763
- setTimeout(
764
- () =>
765
- alice.send([
766
- {
767
- cashaddr: bob.cashaddr!,
768
- value: 1000n,
769
- },
770
- ]),
771
- 600
772
- );
773
- bobResponse = await bob.waitForTransaction();
774
- expect(bobResponse.transactionInfo!.version).toBe(2);
775
- expect(await bob.getBalance()).toBe(4000n);
776
- });
777
-
778
- test("Test waiting and watching", async () => {
779
- const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
780
-
781
- const bob = await RegTestWallet.newRandom();
782
-
783
- let waitTxResult = false;
784
- setTimeout(async () => {
785
- const result = await alice.waitForTransaction({
786
- getBalance: true,
787
- getTransactionInfo: true,
788
- });
789
- expect(result.balance!).toBeGreaterThan(0);
790
- expect(result.transactionInfo!.hash.length).toBe(64);
791
- waitTxResult = true;
792
- }, 0);
793
-
794
- let waitBalanceResult = false;
795
- setTimeout(async () => {
796
- const result = await alice.waitForBalance(toSat(0.001));
797
- expect(result).toBeGreaterThan(0n);
798
- waitBalanceResult = true;
799
- }, 0);
800
-
801
- let aliceWatchResult = false;
802
- let aliceWatchCancel: CancelFn;
803
- aliceWatchCancel = await alice.watchStatus(async (_status) => {
804
- await aliceWatchCancel?.();
805
- aliceWatchResult = true;
806
- });
807
-
808
- let bobWatchResult = false;
809
- let bobTransactionId = "";
810
- let bobWatchCancel: CancelFn;
811
- bobWatchCancel = await bob.watchTransactionHashes(async (txHash) => {
812
- await bobWatchCancel?.();
813
- bobWatchResult = true;
814
- bobTransactionId = txHash;
815
- });
816
-
817
- let bobBalanceWatchResult = false;
818
- let bobBalanceWatchCancel: CancelFn;
819
- bobBalanceWatchCancel = await bob.watchBalance(async (balance) => {
820
- // skip if balance is zero yet
821
- if (!balance) {
822
- return;
823
- }
824
-
825
- expect(balance).toBe(toSat(0.001));
826
- await bobBalanceWatchCancel?.();
827
- bobBalanceWatchResult = true;
828
- });
829
-
830
- let blockWatchResult = false;
831
- let blockWatchCancel: CancelFn;
832
- blockWatchCancel = await bob.watchBlocks(async (block) => {
833
- expect(block.height).toBeGreaterThan(1);
834
- await blockWatchCancel?.();
835
- blockWatchResult = true;
836
- });
837
-
838
- const blockNumber = await alice.provider!.getBlockHeight();
839
-
840
- let blockWaitResult = false;
841
- setTimeout(async () => {
842
- const result = await alice.waitForBlock(blockNumber + 1);
843
- expect(result.height).toBe(blockNumber + 1);
844
- blockWaitResult = true;
845
- }, 0);
846
-
847
- let blockNumberWaitResult = false;
848
- setTimeout(async () => {
849
- const result = await alice.waitForBlock(blockNumber + 2);
850
- expect(result.height).toBe(blockNumber + 2);
851
- blockNumberWaitResult = true;
852
- }, 0);
853
-
854
- const sendResponse = await alice.send({
855
- cashaddr: bob.getDepositAddress(),
856
- value: BigInt(await convert(0.001, "bch", "sat")),
857
- });
858
-
859
- await mine({ cashaddr: alice.cashaddr!, blocks: 1 });
860
- await delay(1000);
861
- await mine({ cashaddr: alice.cashaddr!, blocks: 1 });
862
-
863
- await delay(5000);
864
- expect(waitTxResult).toBe(true);
865
- expect(waitBalanceResult).toBe(true);
866
- expect(aliceWatchResult).toBe(true);
867
- expect(bobWatchResult).toBe(true);
868
- expect(bobTransactionId).toBe(sendResponse.txId);
869
- expect(bobBalanceWatchResult).toBe(true);
870
- expect(blockWatchResult).toBe(true);
871
- expect(blockWaitResult).toBe(true);
872
- expect(blockNumberWaitResult).toBe(true);
873
- });
874
- });
875
-
876
- describe(`Wallet extrema behavior regression testing`, () => {
877
- test(`Should operate very well above dust threshold (${
878
- DUST * 3n
879
- }), 'min relay fee not met (code 66)' regression`, async () => {
880
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
881
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
882
- const bobWallet = await RegTestWallet.newRandom();
883
- const charlieWallet = await RegTestWallet.newRandom();
884
-
885
- await aliceWallet.send([
886
- { cashaddr: bobWallet.cashaddr!, value: DUST },
887
- { cashaddr: bobWallet.cashaddr!, value: DUST * 3n },
888
- ]);
889
-
890
- await bobWallet.send({
891
- cashaddr: charlieWallet.cashaddr!,
892
- value: DUST,
893
- });
894
- expect(await charlieWallet.getBalance()).toBe(DUST);
895
- });
896
-
897
- test(`Should operate very well above dust threshold (${
898
- DUST * 2n
899
- }), 'min relay fee not met (code 66)' regression`, async () => {
900
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
901
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
902
- const bobWallet = await RegTestWallet.newRandom();
903
- const charlieWallet = await RegTestWallet.newRandom();
904
-
905
- await aliceWallet.send([
906
- { cashaddr: bobWallet.cashaddr!, value: DUST },
907
- { cashaddr: bobWallet.cashaddr!, value: DUST * 2n },
908
- ]);
909
-
910
- await bobWallet.send({
911
- cashaddr: charlieWallet.cashaddr!,
912
- value: DUST,
913
- });
914
- expect(await charlieWallet.getBalance()).toBe(DUST);
915
- });
916
-
917
- test(`Should operate well above dust threshold (${
918
- DUST + 328n
919
- }), 'min relay fee not met (code 66)' regression`, async () => {
920
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
921
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
922
- const bobWallet = await RegTestWallet.newRandom();
923
- const charlieWallet = await RegTestWallet.newRandom();
924
-
925
- await aliceWallet.send([
926
- { cashaddr: bobWallet.cashaddr!, value: DUST },
927
- { cashaddr: bobWallet.cashaddr!, value: DUST + 328n },
928
- ]);
929
-
930
- await bobWallet.send([{ cashaddr: charlieWallet.cashaddr!, value: DUST }]);
931
- expect(await charlieWallet.getBalance()).toBe(DUST);
932
- });
933
-
934
- test(`Should operate slightly above dust threshold (${
935
- DUST + 1n
936
- }), 'min relay fee not met (code 66)' regression`, async () => {
937
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
938
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
939
- const bobWallet = await RegTestWallet.newRandom();
940
- const charlieWallet = await RegTestWallet.newRandom();
941
-
942
- await aliceWallet.send([
943
- { cashaddr: bobWallet.cashaddr!, value: DUST },
944
- { cashaddr: bobWallet.cashaddr!, value: DUST + 1n },
945
- ]);
946
-
947
- await bobWallet.send([{ cashaddr: charlieWallet.cashaddr!, value: DUST }]);
948
- expect(await charlieWallet.getBalance()).toBe(DUST);
949
- });
950
-
951
- test(`Should operate with dust threshold (${DUST}), 'min relay fee not met (code 66)' regression`, async () => {
952
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
953
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
954
- const bobWallet = await RegTestWallet.newRandom();
955
- const charlieWallet = await RegTestWallet.newRandom();
956
-
957
- await aliceWallet.send([
958
- { cashaddr: bobWallet.cashaddr!, value: DUST },
959
- { cashaddr: bobWallet.cashaddr!, value: DUST },
960
- ]);
961
-
962
- await bobWallet.send([{ cashaddr: charlieWallet.cashaddr!, value: DUST }]);
963
- expect(await charlieWallet.getBalance()).toBe(DUST);
964
- });
965
- test(`Should throw error with dust amounts (${
966
- DUST - 1n
967
- }), 'min relay fee not met (code 66)' regression`, async () => {
968
- expect.assertions(1);
969
- try {
970
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
971
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
972
- const bobWallet = await RegTestWallet.newRandom();
973
- const charlieWallet = await RegTestWallet.newRandom();
974
-
975
- await aliceWallet.send([
976
- { cashaddr: bobWallet.cashaddr!, value: DUST },
977
- { cashaddr: bobWallet.cashaddr!, value: DUST - 1n },
978
- ]);
979
-
980
- await bobWallet.send([
981
- { cashaddr: charlieWallet.cashaddr!, value: DUST },
982
- ]);
983
- } catch (e: any) {
984
- expect(e.message).toBe(
985
- `the transaction was rejected by network rules.\n\ndust (code 64)\n`
986
- );
987
- }
988
- });
989
-
990
- test("Send op_return data", async () => {
991
- let wallet = await RegTestWallet.fromId(process.env.ALICE_ID!);
992
- let result: SendResponse, transaction: ElectrumRawTransaction;
993
-
994
- result = await wallet.send([
995
- OpReturnData.from("MEMO\x10LÖL😅"),
996
- { cashaddr: wallet.cashaddr!, value: 546n },
997
- ]);
998
- transaction = await wallet.provider!.getRawTransactionObject(result.txId!);
999
- expect(transaction.vout[0].scriptPubKey.asm).toContain("OP_RETURN");
1000
- expect(transaction.vout[0].scriptPubKey.hex.slice(4)).toBe(
1001
- binToHex(utf8ToBin("MEMO\x10LÖL😅"))
1002
- );
1003
-
1004
- result = await wallet.send([
1005
- [wallet.cashaddr!, 546n],
1006
- ["OP_RETURN", Uint8Array.from([0x00, 0x01, 0x02])],
1007
- ]);
1008
- transaction = await wallet.provider!.getRawTransactionObject(result.txId!);
1009
- expect(transaction.vout[1].scriptPubKey.asm).toContain("OP_RETURN");
1010
- expect([
1011
- ...hexToBin(transaction.vout[1].scriptPubKey.hex.slice(4)),
1012
- ]).toStrictEqual([0x00, 0x01, 0x02]);
1013
-
1014
- result = await wallet.send([
1015
- OpReturnData.from(""),
1016
- OpReturnData.from(Uint8Array.from([])),
1017
- ]);
1018
- transaction = await wallet.provider!.getRawTransactionObject(result.txId!);
1019
- expect(transaction.vout[0].scriptPubKey.asm).toContain("OP_RETURN");
1020
- expect([...hexToBin(transaction.vout[0].scriptPubKey.hex)]).toStrictEqual([
1021
- 0x6a, 0x00,
1022
- ]);
1023
- expect(transaction.vout[1].scriptPubKey.asm).toContain("OP_RETURN");
1024
- expect([...hexToBin(transaction.vout[1].scriptPubKey.hex)]).toStrictEqual([
1025
- 0x6a, 0x00,
1026
- ]);
1027
- });
1028
-
1029
- test("Test slpSemiAware", async () => {
1030
- const alice = await RegTestWallet.fromId(process.env.ALICE_ID!);
1031
- const bob = await RegTestWallet.newRandom();
1032
- await alice.send([
1033
- { cashaddr: bob.getDepositAddress(), value: 546n },
1034
- { cashaddr: bob.getDepositAddress(), value: 1000n },
1035
- ]);
1036
- expect(sumUtxoValue(await bob.getUtxos())).toBe(1546n);
1037
- bob.slpSemiAware();
1038
- expect(sumUtxoValue(await bob.getUtxos())).toBe(1000n);
1039
-
1040
- expect(
1041
- await bob.getMaxAmountToSend({ options: { slpSemiAware: true } })
1042
- ).toBe(768n);
1043
- await bob.sendMax(alice.getDepositAddress());
1044
- expect(await bob.getBalance()).toBe(0n + 546n);
1045
-
1046
- bob.slpSemiAware(false);
1047
- expect(await bob.getBalance()).toBe(546n);
1048
- expect(
1049
- await bob.getMaxAmountToSend({ options: { slpSemiAware: false } })
1050
- ).toBeLessThanOrEqual(546n);
1051
- });
1052
-
1053
- test("Should encode unsigned transactions", async () => {
1054
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
1055
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
1056
- const bobWallet = await RegTestWallet.newRandom();
1057
- delete (aliceWallet as any).privateKey;
1058
-
1059
- const aliceUtxos = await aliceWallet.getUtxos();
1060
-
1061
- {
1062
- const { encodedTransaction, sourceOutputs } =
1063
- await aliceWallet.encodeTransaction(
1064
- [
1065
- {
1066
- cashaddr: bobWallet.cashaddr!,
1067
- value: 2000n,
1068
- },
1069
- ],
1070
- false,
1071
- { buildUnsigned: true }
1072
- );
1073
- expect(encodedTransaction.length).toBeGreaterThan(0);
1074
-
1075
- // check transaction was not submitted
1076
- // BigInts can't be serialized as strings
1077
- //
1078
- expect(json(aliceUtxos)).toBe(json(await aliceWallet.getUtxos()));
1079
-
1080
- const decoded = decodeTransaction(encodedTransaction);
1081
- if (typeof decoded === "string") {
1082
- throw decoded;
1083
- }
1084
-
1085
- expect(
1086
- binsAreEqual(decoded.inputs[0].unlockingBytecode, Uint8Array.from([]))
1087
- ).toBe(true);
1088
- const toCashAddress = (bytecode) => {
1089
- const cashaddr = lockingBytecodeToCashAddress({
1090
- bytecode: bytecode,
1091
- prefix: "bchreg",
1092
- });
1093
- if (typeof cashaddr === "string") {
1094
- throw Error(cashaddr);
1095
- }
1096
- return cashaddr.address;
1097
- };
1098
- expect(toCashAddress(decoded.outputs[0].lockingBytecode)).toBe(
1099
- bobWallet.cashaddr
1100
- );
1101
- expect(toCashAddress(decoded.outputs[1].lockingBytecode)).toBe(
1102
- aliceWallet.cashaddr
1103
- );
1104
- expect(sourceOutputs.length).toBe(decoded.inputs.length);
1105
- }
1106
-
1107
- {
1108
- const { unsignedTransaction, sourceOutputs } = await aliceWallet.send(
1109
- [
1110
- {
1111
- cashaddr: bobWallet.cashaddr!,
1112
- value: 2000n,
1113
- },
1114
- ],
1115
- { buildUnsigned: true }
1116
- );
1117
- const encodedTransaction = hexToBin(unsignedTransaction!);
1118
- expect(encodedTransaction.length).toBeGreaterThan(0);
1119
-
1120
- // check transaction was not submitted
1121
- expect(json(aliceUtxos)).toBe(json(await aliceWallet.getUtxos()));
1122
-
1123
- const decoded = decodeTransaction(encodedTransaction);
1124
- if (typeof decoded === "string") {
1125
- throw decoded;
1126
- }
1127
-
1128
- expect(
1129
- binsAreEqual(decoded.inputs[0].unlockingBytecode, Uint8Array.from([]))
1130
- ).toBe(true);
1131
- expect(sourceOutputs!.length).toBe(decoded.inputs.length);
1132
- }
1133
-
1134
- {
1135
- const { unsignedTransaction, sourceOutputs } = await aliceWallet.sendMax(
1136
- bobWallet.cashaddr!,
1137
- { buildUnsigned: true }
1138
- );
1139
- const encodedTransaction = hexToBin(unsignedTransaction!);
1140
- expect(encodedTransaction.length).toBeGreaterThan(0);
1141
-
1142
- // check transaction was not submitted
1143
- expect(json(aliceUtxos)).toBe(json(await aliceWallet.getUtxos()));
1144
-
1145
- const decoded = decodeTransaction(encodedTransaction);
1146
- if (typeof decoded === "string") {
1147
- throw decoded;
1148
- }
1149
-
1150
- expect(
1151
- binsAreEqual(decoded.inputs[0].unlockingBytecode, Uint8Array.from([]))
1152
- ).toBe(true);
1153
- expect(sourceOutputs!.length).toBe(decoded.inputs.length);
1154
- }
1155
- });
1156
-
1157
- test("Should send with utxoIds", async () => {
1158
- const aliceWif = `wif:regtest:${process.env.PRIVATE_WIF!}`;
1159
- const aliceWallet = await RegTestWallet.fromId(aliceWif);
1160
- const bobWallet = await RegTestWallet.newRandom();
1161
-
1162
- const aliceUtxos = await aliceWallet.getUtxos();
1163
-
1164
- await expect(
1165
- aliceWallet.send(
1166
- {
1167
- cashaddr: bobWallet.cashaddr!,
1168
- value: 1000n,
1169
- },
1170
- { utxoIds: ["00ab:1", "00cd:2"] }
1171
- )
1172
- ).rejects.toThrow("not found in wallet");
1173
-
1174
- await expect(
1175
- aliceWallet.send(
1176
- {
1177
- cashaddr: bobWallet.cashaddr!,
1178
- value: 1000n,
1179
- },
1180
- {
1181
- utxoIds: [
1182
- toUtxoId(aliceUtxos[0]),
1183
- `${aliceUtxos[1].txid}:${aliceUtxos[1].vout}`,
1184
- ],
1185
- }
1186
- )
1187
- ).resolves.not.toThrow();
1188
- });
1189
- });