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.
- package/dist/module/cache/IndexedDbCache.d.ts +1 -1
- package/dist/module/cache/IndexedDbCache.d.ts.map +1 -1
- package/dist/module/cache/MemoryCache.d.ts +1 -1
- package/dist/module/cache/MemoryCache.d.ts.map +1 -1
- package/dist/module/cache/WebStorageCache.d.ts +1 -1
- package/dist/module/cache/WebStorageCache.d.ts.map +1 -1
- package/dist/module/cache/walletCache.d.ts +16 -6
- package/dist/module/cache/walletCache.d.ts.map +1 -1
- package/dist/module/cache/walletCache.js +92 -34
- package/dist/module/cache/walletCache.js.map +1 -1
- package/dist/module/cli.js +1 -2
- package/dist/module/cli.js.map +1 -1
- package/dist/module/db/index.d.ts +1 -1
- package/dist/module/db/index.d.ts.map +1 -1
- package/dist/module/db/index.js +1 -1
- package/dist/module/db/index.js.map +1 -1
- package/dist/module/enum.d.ts +1 -1
- package/dist/module/enum.d.ts.map +1 -1
- package/dist/module/history/getHistory.d.ts +1 -1
- package/dist/module/history/getHistory.d.ts.map +1 -1
- package/dist/module/history/getHistory.js +3 -3
- package/dist/module/history/getHistory.js.map +1 -1
- package/dist/module/index.d.ts +25 -22
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +33 -26
- package/dist/module/index.js.map +1 -1
- package/dist/module/interface.d.ts +12 -2
- package/dist/module/interface.d.ts.map +1 -1
- package/dist/module/interface.js.map +1 -1
- package/dist/module/libauth.d.ts +1 -1
- package/dist/module/libauth.d.ts.map +1 -1
- package/dist/module/libauth.js +1 -1
- package/dist/module/libauth.js.map +1 -1
- package/dist/module/mine/mine.d.ts +2 -7
- package/dist/module/mine/mine.d.ts.map +1 -1
- package/dist/module/mine/mine.js +6 -27
- package/dist/module/mine/mine.js.map +1 -1
- package/dist/module/network/Connection.d.ts +1 -12
- package/dist/module/network/Connection.d.ts.map +1 -1
- package/dist/module/network/Connection.js +24 -33
- package/dist/module/network/Connection.js.map +1 -1
- package/dist/module/network/ElectrumNetworkProvider.d.ts +16 -17
- package/dist/module/network/ElectrumNetworkProvider.d.ts.map +1 -1
- package/dist/module/network/ElectrumNetworkProvider.js +91 -93
- package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
- package/dist/module/network/MockNetworkProvider.d.ts +28 -0
- package/dist/module/network/MockNetworkProvider.d.ts.map +1 -0
- package/dist/module/network/MockNetworkProvider.js +74 -0
- package/dist/module/network/MockNetworkProvider.js.map +1 -0
- package/dist/module/network/NetworkProvider.d.ts +9 -2
- package/dist/module/network/NetworkProvider.d.ts.map +1 -1
- package/dist/module/network/configuration.d.ts +2 -4
- package/dist/module/network/configuration.d.ts.map +1 -1
- package/dist/module/network/configuration.js +25 -50
- package/dist/module/network/configuration.js.map +1 -1
- package/dist/module/network/constant.d.ts +7 -7
- package/dist/module/network/constant.d.ts.map +1 -1
- package/dist/module/network/constant.js +21 -24
- package/dist/module/network/constant.js.map +1 -1
- package/dist/module/network/default.d.ts +5 -3
- package/dist/module/network/default.d.ts.map +1 -1
- package/dist/module/network/default.js +29 -51
- package/dist/module/network/default.js.map +1 -1
- package/dist/module/network/index.d.ts +4 -4
- package/dist/module/network/index.d.ts.map +1 -1
- package/dist/module/network/index.js +2 -2
- package/dist/module/network/index.js.map +1 -1
- package/dist/module/network/interface.d.ts +0 -6
- package/dist/module/network/interface.d.ts.map +1 -1
- package/dist/module/rate/ExchangeRate.d.ts +1 -1
- package/dist/module/rate/ExchangeRate.d.ts.map +1 -1
- package/dist/module/rate/ExchangeRate.js +13 -7
- package/dist/module/rate/ExchangeRate.js.map +1 -1
- package/dist/module/transaction/Wif.d.ts +3 -3
- package/dist/module/transaction/Wif.d.ts.map +1 -1
- package/dist/module/transaction/Wif.js +4 -4
- package/dist/module/transaction/Wif.js.map +1 -1
- package/dist/module/transaction/allocateFee.d.ts +1 -1
- package/dist/module/transaction/allocateFee.d.ts.map +1 -1
- package/dist/module/transaction/allocateFee.js +2 -2
- package/dist/module/transaction/allocateFee.js.map +1 -1
- package/dist/module/util/deriveCashaddr.js.map +1 -1
- package/dist/module/util/deriveNetwork.js +1 -1
- package/dist/module/util/deriveNetwork.js.map +1 -1
- package/dist/module/util/getAddrsByXpubKey.js +1 -1
- package/dist/module/util/getAddrsByXpubKey.js.map +1 -1
- package/dist/module/util/getXPubKey.js +1 -1
- package/dist/module/util/getXPubKey.js.map +1 -1
- package/dist/module/util/hd.d.ts +2 -0
- package/dist/module/util/hd.d.ts.map +1 -1
- package/dist/module/util/hd.js +41 -0
- package/dist/module/util/hd.js.map +1 -1
- package/dist/module/util/index.d.ts +7 -9
- package/dist/module/util/index.d.ts.map +1 -1
- package/dist/module/util/index.js +7 -9
- package/dist/module/util/index.js.map +1 -1
- package/dist/module/util/transaction.js +1 -1
- package/dist/module/util/transaction.js.map +1 -1
- package/dist/module/wallet/Base.d.ts +13 -9
- package/dist/module/wallet/Base.d.ts.map +1 -1
- package/dist/module/wallet/Base.js +54 -58
- package/dist/module/wallet/Base.js.map +1 -1
- package/dist/module/wallet/HDWallet.d.ts.map +1 -1
- package/dist/module/wallet/HDWallet.js +19 -38
- package/dist/module/wallet/HDWallet.js.map +1 -1
- package/dist/module/wallet/Util.d.ts +4 -22
- package/dist/module/wallet/Util.d.ts.map +1 -1
- package/dist/module/wallet/Util.js +75 -102
- package/dist/module/wallet/Util.js.map +1 -1
- package/dist/module/wallet/Watch.d.ts +24 -5
- package/dist/module/wallet/Watch.d.ts.map +1 -1
- package/dist/module/wallet/Watch.js +141 -17
- package/dist/module/wallet/Watch.js.map +1 -1
- package/dist/module/wallet/Wif.d.ts +2 -6
- package/dist/module/wallet/Wif.d.ts.map +1 -1
- package/dist/module/wallet/Wif.js +3 -69
- package/dist/module/wallet/Wif.js.map +1 -1
- package/dist/module/wallet/createWallet.d.ts +1 -1
- package/dist/module/wallet/createWallet.d.ts.map +1 -1
- package/dist/module/wallet/createWallet.js +2 -1
- package/dist/module/wallet/createWallet.js.map +1 -1
- package/dist/module/wallet/interface.d.ts +3 -2
- package/dist/module/wallet/interface.d.ts.map +1 -1
- package/dist/module/wallet/model.d.ts +2 -1
- package/dist/module/wallet/model.d.ts.map +1 -1
- package/dist/module/wallet/model.js +1 -1
- package/dist/module/wallet/model.js.map +1 -1
- package/package.json +17 -29
- package/dist/index.html +0 -9
- package/dist/mainnet-3.1.7.js +0 -2066
- package/dist/module/network/util.d.ts +0 -3
- package/dist/module/network/util.d.ts.map +0 -1
- package/dist/module/network/util.js +0 -27
- package/dist/module/network/util.js.map +0 -1
- package/dist/module/test/expect.d.ts +0 -12
- package/dist/module/test/expect.d.ts.map +0 -1
- package/dist/module/test/expect.js +0 -47
- package/dist/module/test/expect.js.map +0 -1
- package/dist/module/test/fetch.d.ts +0 -3
- package/dist/module/test/fetch.d.ts.map +0 -1
- package/dist/module/test/fetch.js +0 -32
- package/dist/module/test/fetch.js.map +0 -1
- package/dist/module/util/randomBytes.d.ts +0 -2
- package/dist/module/util/randomBytes.d.ts.map +0 -1
- package/dist/module/util/randomBytes.js +0 -13
- package/dist/module/util/randomBytes.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/cache/IndexedDbCache.test.ts +0 -15
- package/src/cache/IndexedDbCache.ts +0 -172
- package/src/cache/MemoryCache.test.ts +0 -15
- package/src/cache/MemoryCache.ts +0 -32
- package/src/cache/WebStorageCache.test.ts +0 -15
- package/src/cache/WebStorageCache.ts +0 -38
- package/src/cache/index.ts +0 -2
- package/src/cache/interface.ts +0 -9
- package/src/cache/walletCache.ts +0 -254
- package/src/chain.ts +0 -3
- package/src/cli.ts +0 -32
- package/src/config.ts +0 -23
- package/src/constant.ts +0 -27
- package/src/db/ExchangeRateProvider.ts +0 -28
- package/src/db/StorageProvider.ts +0 -64
- package/src/db/index.ts +0 -2
- package/src/db/interface.ts +0 -11
- package/src/enum.ts +0 -34
- package/src/history/getHistory.test.ts +0 -290
- package/src/history/getHistory.ts +0 -411
- package/src/history/interface.ts +0 -24
- package/src/index.ts +0 -48
- package/src/interface.ts +0 -72
- package/src/libauth.ts +0 -11
- package/src/message/index.ts +0 -2
- package/src/message/interface.ts +0 -40
- package/src/message/signed.test.ts +0 -309
- package/src/message/signed.ts +0 -201
- package/src/mine/index.ts +0 -1
- package/src/mine/mine.test.ts +0 -10
- package/src/mine/mine.ts +0 -42
- package/src/network/Connection.test.ts +0 -51
- package/src/network/Connection.ts +0 -73
- package/src/network/ElectrumNetworkProvider.ts +0 -657
- package/src/network/NetworkProvider.ts +0 -180
- package/src/network/Rpc.test.ts +0 -130
- package/src/network/configuration.test.ts +0 -59
- package/src/network/configuration.ts +0 -72
- package/src/network/constant.ts +0 -43
- package/src/network/default.ts +0 -120
- package/src/network/electrum.test.ts +0 -28
- package/src/network/getRelayFeeCache.test.ts +0 -15
- package/src/network/getRelayFeeCache.ts +0 -23
- package/src/network/index.ts +0 -14
- package/src/network/interface.ts +0 -80
- package/src/network/util.test.ts +0 -24
- package/src/network/util.ts +0 -30
- package/src/rate/ExchangeRate.test.headless.js +0 -35
- package/src/rate/ExchangeRate.test.ts +0 -51
- package/src/rate/ExchangeRate.ts +0 -142
- package/src/test/expect.ts +0 -59
- package/src/test/fetch.ts +0 -39
- package/src/test/json.test.ts +0 -13
- package/src/transaction/Wif.ts +0 -680
- package/src/transaction/allocateFee.test.ts +0 -298
- package/src/transaction/allocateFee.ts +0 -149
- package/src/util/amountInSatoshi.test.ts +0 -27
- package/src/util/amountInSatoshi.ts +0 -33
- package/src/util/asSendRequestObject.ts +0 -81
- package/src/util/base64.test.ts +0 -39
- package/src/util/base64.ts +0 -12
- package/src/util/browserNotSupported.ts +0 -7
- package/src/util/checkForEmptySeed.ts +0 -9
- package/src/util/checkUtxos.ts +0 -29
- package/src/util/checkWifNetwork.ts +0 -24
- package/src/util/convert.test.ts +0 -46
- package/src/util/convert.ts +0 -50
- package/src/util/delay.ts +0 -3
- package/src/util/deriveCashaddr.test.ts +0 -164
- package/src/util/deriveCashaddr.ts +0 -143
- package/src/util/deriveLockscript.ts +0 -16
- package/src/util/deriveNetwork.ts +0 -19
- package/src/util/derivePublicKeyHash.test.ts +0 -55
- package/src/util/derivePublicKeyHash.ts +0 -64
- package/src/util/floor.test.ts +0 -21
- package/src/util/floor.ts +0 -4
- package/src/util/getAddrsByXpubKey.test.ts +0 -115
- package/src/util/getAddrsByXpubKey.ts +0 -86
- package/src/util/getRuntimePlatform.test.headless.js +0 -40
- package/src/util/getRuntimePlatform.test.ts +0 -5
- package/src/util/getRuntimePlatform.ts +0 -31
- package/src/util/getUsdRate.ts +0 -5
- package/src/util/getXPubKey.ts +0 -39
- package/src/util/hash160.test.ts +0 -18
- package/src/util/hash160.ts +0 -12
- package/src/util/hd.ts +0 -16
- package/src/util/header.test.ts +0 -34
- package/src/util/header.ts +0 -26
- package/src/util/index.ts +0 -33
- package/src/util/randomBytes.ts +0 -13
- package/src/util/randomInt.test.ts +0 -15
- package/src/util/randomInt.ts +0 -4
- package/src/util/sanitizeAddress.ts +0 -10
- package/src/util/sanitizeUnit.ts +0 -11
- package/src/util/satoshiToAmount.test.ts +0 -6
- package/src/util/satoshiToAmount.ts +0 -33
- package/src/util/sumSendRequestAmounts.ts +0 -34
- package/src/util/sumUtxoValue.ts +0 -27
- package/src/util/transaction.ts +0 -10
- package/src/wallet/Base.ts +0 -1563
- package/src/wallet/Cashtokens.test.headless.js +0 -730
- package/src/wallet/Cashtokens.test.ts +0 -1411
- package/src/wallet/HDWallet.test.ts +0 -1086
- package/src/wallet/HDWallet.ts +0 -992
- package/src/wallet/Util.test.ts +0 -134
- package/src/wallet/Util.ts +0 -191
- package/src/wallet/WalletCache.test.ts +0 -45
- package/src/wallet/Watch.ts +0 -441
- package/src/wallet/Wif.bip39.test.ts +0 -48
- package/src/wallet/Wif.test.ts +0 -1189
- package/src/wallet/Wif.ts +0 -687
- package/src/wallet/Wif.watchOnly.test.ts +0 -58
- package/src/wallet/createWallet.ts +0 -238
- package/src/wallet/enum.ts +0 -18
- package/src/wallet/interface.ts +0 -102
- package/src/wallet/model.test.ts +0 -24
- package/src/wallet/model.ts +0 -352
- package/tsconfig.browser.json +0 -11
- package/tsconfig.json +0 -33
- package/webpack.config.cjs +0 -132
package/src/wallet/Wif.test.ts
DELETED
|
@@ -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
|
-
});
|