mainnet-js 2.7.34 → 3.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/{mainnet-2.7.34.js → mainnet-3.0.0-next.1.js} +728 -708
  3. package/dist/module/cache/MemoryCache.d.ts +0 -1
  4. package/dist/module/cache/MemoryCache.d.ts.map +1 -1
  5. package/dist/module/cache/MemoryCache.js +5 -7
  6. package/dist/module/cache/MemoryCache.js.map +1 -1
  7. package/dist/module/cache/index.d.ts +1 -0
  8. package/dist/module/cache/index.d.ts.map +1 -1
  9. package/dist/module/cache/index.js +1 -0
  10. package/dist/module/cache/index.js.map +1 -1
  11. package/dist/module/cache/walletCache.d.ts +45 -0
  12. package/dist/module/cache/walletCache.d.ts.map +1 -0
  13. package/dist/module/cache/walletCache.js +140 -0
  14. package/dist/module/cache/walletCache.js.map +1 -0
  15. package/dist/module/chain.d.ts +1 -1
  16. package/dist/module/chain.js +1 -1
  17. package/dist/module/chain.js.map +1 -1
  18. package/dist/module/constant.d.ts +1 -1
  19. package/dist/module/constant.d.ts.map +1 -1
  20. package/dist/module/constant.js +1 -1
  21. package/dist/module/constant.js.map +1 -1
  22. package/dist/module/enum.d.ts +1 -7
  23. package/dist/module/enum.d.ts.map +1 -1
  24. package/dist/module/enum.js +0 -6
  25. package/dist/module/enum.js.map +1 -1
  26. package/dist/module/history/{electrumTransformer.d.ts → getHistory.d.ts} +3 -3
  27. package/dist/module/history/getHistory.d.ts.map +1 -0
  28. package/dist/module/history/{electrumTransformer.js → getHistory.js} +17 -14
  29. package/dist/module/history/getHistory.js.map +1 -0
  30. package/dist/module/index.d.ts +3 -1
  31. package/dist/module/index.d.ts.map +1 -1
  32. package/dist/module/index.js +3 -1
  33. package/dist/module/index.js.map +1 -1
  34. package/dist/module/interface.d.ts +7 -2
  35. package/dist/module/interface.d.ts.map +1 -1
  36. package/dist/module/interface.js.map +1 -1
  37. package/dist/module/message/interface.d.ts +2 -2
  38. package/dist/module/message/interface.d.ts.map +1 -1
  39. package/dist/module/message/interface.js +0 -3
  40. package/dist/module/message/interface.js.map +1 -1
  41. package/dist/module/message/signed.d.ts +5 -5
  42. package/dist/module/message/signed.d.ts.map +1 -1
  43. package/dist/module/message/signed.js +8 -8
  44. package/dist/module/message/signed.js.map +1 -1
  45. package/dist/module/network/ElectrumNetworkProvider.d.ts +2 -2
  46. package/dist/module/network/ElectrumNetworkProvider.d.ts.map +1 -1
  47. package/dist/module/network/ElectrumNetworkProvider.js +3 -2
  48. package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
  49. package/dist/module/network/NetworkProvider.d.ts +2 -2
  50. package/dist/module/network/NetworkProvider.d.ts.map +1 -1
  51. package/dist/module/network/constant.js +4 -4
  52. package/dist/module/network/constant.js.map +1 -1
  53. package/dist/module/network/getRelayFeeCache.js +2 -2
  54. package/dist/module/network/getRelayFeeCache.js.map +1 -1
  55. package/dist/module/rate/ExchangeRate.d.ts +2 -1
  56. package/dist/module/rate/ExchangeRate.d.ts.map +1 -1
  57. package/dist/module/rate/ExchangeRate.js +4 -1
  58. package/dist/module/rate/ExchangeRate.js.map +1 -1
  59. package/dist/module/transaction/Wif.d.ts +25 -23
  60. package/dist/module/transaction/Wif.d.ts.map +1 -1
  61. package/dist/module/transaction/Wif.js +26 -25
  62. package/dist/module/transaction/Wif.js.map +1 -1
  63. package/dist/module/transaction/allocateFee.d.ts +3 -3
  64. package/dist/module/transaction/allocateFee.d.ts.map +1 -1
  65. package/dist/module/transaction/allocateFee.js +5 -6
  66. package/dist/module/transaction/allocateFee.js.map +1 -1
  67. package/dist/module/util/amountInSatoshi.d.ts +1 -1
  68. package/dist/module/util/amountInSatoshi.d.ts.map +1 -1
  69. package/dist/module/util/amountInSatoshi.js +3 -9
  70. package/dist/module/util/amountInSatoshi.js.map +1 -1
  71. package/dist/module/util/asSendRequestObject.d.ts.map +1 -1
  72. package/dist/module/util/asSendRequestObject.js +10 -7
  73. package/dist/module/util/asSendRequestObject.js.map +1 -1
  74. package/dist/module/util/checkUtxos.d.ts +2 -2
  75. package/dist/module/util/checkUtxos.d.ts.map +1 -1
  76. package/dist/module/util/checkUtxos.js +11 -12
  77. package/dist/module/util/checkUtxos.js.map +1 -1
  78. package/dist/module/util/convert.d.ts +3 -0
  79. package/dist/module/util/convert.d.ts.map +1 -1
  80. package/dist/module/util/convert.js +12 -0
  81. package/dist/module/util/convert.js.map +1 -1
  82. package/dist/module/util/deriveCashaddr.d.ts.map +1 -1
  83. package/dist/module/util/deriveCashaddr.js +6 -0
  84. package/dist/module/util/deriveCashaddr.js.map +1 -1
  85. package/dist/module/util/deriveNetwork.js +1 -1
  86. package/dist/module/util/deriveNetwork.js.map +1 -1
  87. package/dist/module/util/hd.d.ts +3 -0
  88. package/dist/module/util/hd.d.ts.map +1 -0
  89. package/dist/module/util/hd.js +11 -0
  90. package/dist/module/util/hd.js.map +1 -0
  91. package/dist/module/util/index.d.ts +3 -3
  92. package/dist/module/util/index.d.ts.map +1 -1
  93. package/dist/module/util/index.js +3 -3
  94. package/dist/module/util/index.js.map +1 -1
  95. package/dist/module/util/satoshiToAmount.d.ts +1 -1
  96. package/dist/module/util/satoshiToAmount.d.ts.map +1 -1
  97. package/dist/module/util/satoshiToAmount.js +3 -9
  98. package/dist/module/util/satoshiToAmount.js.map +1 -1
  99. package/dist/module/util/sumSendRequestAmounts.d.ts.map +1 -1
  100. package/dist/module/util/sumSendRequestAmounts.js +3 -4
  101. package/dist/module/util/sumSendRequestAmounts.js.map +1 -1
  102. package/dist/module/util/sumUtxoValue.d.ts +3 -3
  103. package/dist/module/util/sumUtxoValue.d.ts.map +1 -1
  104. package/dist/module/util/sumUtxoValue.js +2 -2
  105. package/dist/module/util/sumUtxoValue.js.map +1 -1
  106. package/dist/module/wallet/Base.d.ts +45 -103
  107. package/dist/module/wallet/Base.d.ts.map +1 -1
  108. package/dist/module/wallet/Base.js +99 -298
  109. package/dist/module/wallet/Base.js.map +1 -1
  110. package/dist/module/wallet/HDWallet.d.ts +164 -0
  111. package/dist/module/wallet/HDWallet.d.ts.map +1 -0
  112. package/dist/module/wallet/HDWallet.js +486 -0
  113. package/dist/module/wallet/HDWallet.js.map +1 -0
  114. package/dist/module/wallet/Util.js +1 -1
  115. package/dist/module/wallet/Util.js.map +1 -1
  116. package/dist/module/wallet/Watch.d.ts +151 -0
  117. package/dist/module/wallet/Watch.d.ts.map +1 -0
  118. package/dist/module/wallet/Watch.js +307 -0
  119. package/dist/module/wallet/Watch.js.map +1 -0
  120. package/dist/module/wallet/Wif.d.ts +23 -29
  121. package/dist/module/wallet/Wif.d.ts.map +1 -1
  122. package/dist/module/wallet/Wif.js +204 -267
  123. package/dist/module/wallet/Wif.js.map +1 -1
  124. package/dist/module/wallet/createWallet.d.ts +7 -1
  125. package/dist/module/wallet/createWallet.d.ts.map +1 -1
  126. package/dist/module/wallet/createWallet.js +26 -17
  127. package/dist/module/wallet/createWallet.js.map +1 -1
  128. package/dist/module/wallet/interface.d.ts +5 -6
  129. package/dist/module/wallet/interface.d.ts.map +1 -1
  130. package/dist/module/wallet/model.d.ts +15 -19
  131. package/dist/module/wallet/model.d.ts.map +1 -1
  132. package/dist/module/wallet/model.js +5 -25
  133. package/dist/module/wallet/model.js.map +1 -1
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +1 -1
  136. package/src/cache/MemoryCache.ts +5 -5
  137. package/src/cache/index.ts +1 -0
  138. package/src/cache/walletCache.ts +239 -0
  139. package/src/chain.ts +1 -1
  140. package/src/constant.ts +1 -1
  141. package/src/enum.ts +0 -6
  142. package/src/history/{electrumTransformer.test.ts → getHistory.test.ts} +26 -53
  143. package/src/history/{electrumTransformer.ts → getHistory.ts} +31 -15
  144. package/src/index.ts +3 -1
  145. package/src/interface.ts +8 -2
  146. package/src/message/interface.ts +2 -28
  147. package/src/message/signed.test.ts +36 -48
  148. package/src/message/signed.ts +9 -12
  149. package/src/network/Connection.test.ts +3 -3
  150. package/src/network/ElectrumNetworkProvider.ts +5 -5
  151. package/src/network/NetworkProvider.ts +2 -2
  152. package/src/network/Rpc.test.ts +3 -4
  153. package/src/network/constant.ts +4 -4
  154. package/src/network/getRelayFeeCache.ts +2 -2
  155. package/src/rate/ExchangeRate.test.ts +2 -44
  156. package/src/rate/ExchangeRate.ts +5 -2
  157. package/src/transaction/Wif.ts +59 -52
  158. package/src/transaction/allocateFee.test.ts +110 -131
  159. package/src/transaction/allocateFee.ts +14 -15
  160. package/src/util/amountInSatoshi.test.ts +1 -9
  161. package/src/util/amountInSatoshi.ts +6 -10
  162. package/src/util/asSendRequestObject.ts +12 -7
  163. package/src/util/checkUtxos.ts +21 -26
  164. package/src/util/convert.ts +18 -0
  165. package/src/util/deriveCashaddr.ts +8 -0
  166. package/src/util/deriveNetwork.ts +1 -1
  167. package/src/util/derivePublicKeyHash.test.ts +0 -13
  168. package/src/util/hd.ts +16 -0
  169. package/src/util/index.ts +3 -7
  170. package/src/util/satoshiToAmount.test.ts +1 -1
  171. package/src/util/satoshiToAmount.ts +4 -10
  172. package/src/util/sumSendRequestAmounts.ts +3 -4
  173. package/src/util/sumUtxoValue.ts +7 -7
  174. package/src/wallet/Base.ts +147 -420
  175. package/src/wallet/Cashtokens.test.headless.js +11 -11
  176. package/src/wallet/Cashtokens.test.ts +36 -37
  177. package/src/wallet/HDWallet.test.ts +515 -0
  178. package/src/wallet/HDWallet.ts +764 -0
  179. package/src/wallet/Util.ts +1 -1
  180. package/src/wallet/Watch.ts +447 -0
  181. package/src/wallet/Wif.bip39.test.ts +1 -1
  182. package/src/wallet/Wif.test.ts +108 -133
  183. package/src/wallet/Wif.ts +258 -283
  184. package/src/wallet/createWallet.ts +28 -18
  185. package/src/wallet/interface.ts +5 -6
  186. package/src/wallet/model.test.ts +4 -7
  187. package/src/wallet/model.ts +19 -51
  188. package/dist/module/history/electrumTransformer.d.ts.map +0 -1
  189. package/dist/module/history/electrumTransformer.js.map +0 -1
  190. package/dist/module/util/balanceObjectFromSatoshi.d.ts +0 -8
  191. package/dist/module/util/balanceObjectFromSatoshi.d.ts.map +0 -1
  192. package/dist/module/util/balanceObjectFromSatoshi.js +0 -35
  193. package/dist/module/util/balanceObjectFromSatoshi.js.map +0 -1
  194. package/src/util/balanceObjectFromSatoshi.test.ts +0 -58
  195. package/src/util/balanceObjectFromSatoshi.ts +0 -52
@@ -0,0 +1,515 @@
1
+ import { assertSuccess, decodeTransaction, hexToBin } from "@bitauth/libauth";
2
+ import { HDWallet, RegTestHDWallet } from "./HDWallet";
3
+ import { RegTestWallet, Wallet } from "./Wif";
4
+ import { Config } from "../config";
5
+ import { getNextUnusedIndex } from "../util/hd";
6
+ import { NFTCapability } from "../interface";
7
+ import { TokenMintRequest, TokenSendRequest } from "./model";
8
+ import { stringify } from "../cache";
9
+
10
+ const expectedXpub =
11
+ "xpub6CGqRCnS5qDfyxtzV3y3tj8CY7qf3z3GiB2qnCUTdNkhpNxbLtobrU5ZXBVPG3rzPcBUpJAoj3K1u1jyDwKuduL71gLPm27Tckc85apgQRr";
12
+ const expectedXprv =
13
+ "xprv9yHV1hFYFTfNmUpXP2S3XbBTz61AeXKRLx7Eyp4r53DiwadSoMVMJfm5fvtxBc3NFKfozcH42LM66Kb5VaxdLvGk43JWahCegx6iaEJbkB2";
14
+
15
+ describe("HDWallet", () => {
16
+ it("should create a new HDWallet instance", async () => {
17
+ const wallet = await Wallet.fromSeed(
18
+ "divide battle bulb improve hockey favorite charge save merit fatal frog cage"
19
+ );
20
+ const walletSeed = await HDWallet.fromSeed(
21
+ "divide battle bulb improve hockey favorite charge save merit fatal frog cage"
22
+ );
23
+ const walletPriv = await HDWallet.fromXPriv(expectedXprv);
24
+ const walletPub = await HDWallet.fromXPub(expectedXpub);
25
+
26
+ expect(walletSeed.xPub).toBe(expectedXpub);
27
+ expect(walletSeed.xPriv).toBe(expectedXprv);
28
+ expect(walletPriv.xPub).toBe(expectedXpub);
29
+ expect(walletPriv.xPriv).toBe(expectedXprv);
30
+ expect(walletPub.xPub).toBe(expectedXpub);
31
+
32
+ expect(wallet.getDepositAddress()).toBe(walletSeed.getDepositAddress());
33
+ expect(wallet.getDepositAddress()).toBe(walletPriv.getDepositAddress());
34
+ expect(wallet.getDepositAddress()).toBe(walletPub.getDepositAddress());
35
+
36
+ expect(walletSeed.getChangeAddress()).toBe(walletPriv.getChangeAddress());
37
+ expect(walletSeed.getChangeAddress()).toBe(walletPub.getChangeAddress());
38
+ });
39
+
40
+ it("should serialize", async () => {
41
+ const wallet = await HDWallet.fromSeed(
42
+ "divide battle bulb improve hockey favorite charge save merit fatal frog cage"
43
+ );
44
+ expect(wallet.toString()).toBe(
45
+ "hd:mainnet:divide battle bulb improve hockey favorite charge save merit fatal frog cage:m/44'/0'/0':0:0"
46
+ );
47
+ expect(wallet.toDbString()).toBe(
48
+ "hd:mainnet:divide battle bulb improve hockey favorite charge save merit fatal frog cage:m/44'/0'/0':0:0"
49
+ );
50
+
51
+ wallet.name = "testWallet";
52
+ expect(wallet.toString()).toBe("named:mainnet:testWallet");
53
+ expect(wallet.toDbString()).toBe(
54
+ "hd:mainnet:divide battle bulb improve hockey favorite charge save merit fatal frog cage:m/44'/0'/0':0:0"
55
+ );
56
+
57
+ const xPrivWallet = await HDWallet.fromXPriv(expectedXprv);
58
+ expect(xPrivWallet.toString()).toBe(
59
+ "hd:mainnet:xprv9yHV1hFYFTfNmUpXP2S3XbBTz61AeXKRLx7Eyp4r53DiwadSoMVMJfm5fvtxBc3NFKfozcH42LM66Kb5VaxdLvGk43JWahCegx6iaEJbkB2:0:0"
60
+ );
61
+
62
+ const xPubWallet = await HDWallet.fromXPub(expectedXpub);
63
+ expect(xPubWallet.toString()).toBe(
64
+ "hd:mainnet:xpub6CGqRCnS5qDfyxtzV3y3tj8CY7qf3z3GiB2qnCUTdNkhpNxbLtobrU5ZXBVPG3rzPcBUpJAoj3K1u1jyDwKuduL71gLPm27Tckc85apgQRr:0:0"
65
+ );
66
+
67
+ const uninitializedWallet = new HDWallet();
68
+ expect(() => uninitializedWallet.toDbString()).toThrowError(
69
+ "HDWallet has no mnemonic, xPriv or xPub to serialize"
70
+ );
71
+ });
72
+
73
+ it("Get next index", () => {
74
+ expect(getNextUnusedIndex(-1, [null, null, null])).toBe(0);
75
+ expect(getNextUnusedIndex(-1, ["", null, null])).toBe(1);
76
+ expect(getNextUnusedIndex(-1, ["", null, ""])).toBe(1);
77
+ expect(getNextUnusedIndex(-1, ["", "", null])).toBe(2);
78
+ expect(getNextUnusedIndex(-1, ["", "", ""])).toBe(3);
79
+
80
+ expect(getNextUnusedIndex(0, [null, null, null])).toBe(0);
81
+ expect(getNextUnusedIndex(1, [null, null, null])).toBe(1);
82
+ expect(getNextUnusedIndex(2, [null, null, null])).toBe(2);
83
+
84
+ expect(
85
+ getNextUnusedIndex(-1, [
86
+ "759933dd4c6d75f097ec75158ebc04a1f89bc484fc6df0352816328fb4f533a4",
87
+ null,
88
+ null,
89
+ null,
90
+ ])
91
+ ).toBe(1);
92
+ });
93
+
94
+ it("promises", async () => {
95
+ const result = await Promise.all([
96
+ (async () => 1)(),
97
+ new Promise((resolve) => resolve(2)),
98
+ ]);
99
+ expect(stringify(result)).toBe(stringify([1, 2]));
100
+ });
101
+
102
+ it("deposit indexes", async () => {
103
+ const hdWallet = await RegTestHDWallet.newRandom();
104
+ expect(hdWallet.depositIndex).toBe(0);
105
+
106
+ const fundingWallet = await RegTestWallet.fromId(
107
+ "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
108
+ );
109
+
110
+ await fundingWallet.send({
111
+ cashaddr: hdWallet.getDepositAddress(0),
112
+ value: 100000n,
113
+ });
114
+ expect(hdWallet.depositIndex).toBe(1);
115
+
116
+ await fundingWallet.send({
117
+ cashaddr: hdWallet.getDepositAddress(1),
118
+ value: 100000n,
119
+ });
120
+ expect(hdWallet.depositIndex).toBe(2);
121
+
122
+ await fundingWallet.send({
123
+ cashaddr: hdWallet.getDepositAddress(4),
124
+ value: 100000n,
125
+ });
126
+ expect(hdWallet.depositIndex).toBe(5);
127
+
128
+ // beyond gap size, should not update index
129
+ await fundingWallet.send({
130
+ cashaddr: hdWallet.getDepositAddress(30),
131
+ value: 100000n,
132
+ });
133
+ expect(hdWallet.depositIndex).toBe(5);
134
+
135
+ await hdWallet.scanMoreAddresses(30);
136
+ expect(hdWallet.depositIndex).toBe(31);
137
+ });
138
+
139
+ it("Should send funds from an HDWallet", async () => {
140
+ const fundingWallet = await RegTestWallet.fromId(
141
+ "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
142
+ );
143
+
144
+ const hdWallet = await RegTestHDWallet.newRandom();
145
+ expect(await hdWallet.getBalance()).toBe(0n);
146
+
147
+ const depositAddress = hdWallet.getDepositAddress();
148
+ await fundingWallet.send({
149
+ cashaddr: depositAddress,
150
+ value: 100000n,
151
+ });
152
+
153
+ expect(await hdWallet.getBalance()).toBe(100000n);
154
+
155
+ const depositAddress2 = hdWallet.getDepositAddress();
156
+ expect(depositAddress).not.toBe(depositAddress2);
157
+
158
+ // send more funds to new deposit address
159
+ await fundingWallet.send({
160
+ cashaddr: depositAddress2,
161
+ value: 100000n,
162
+ });
163
+
164
+ expect(await hdWallet.getBalance()).toBe(200000n);
165
+
166
+ expect(
167
+ await (
168
+ await RegTestWallet.watchOnly(hdWallet.getDepositAddress(0))
169
+ ).getBalance()
170
+ ).toBe(100000n);
171
+ expect(
172
+ await (
173
+ await RegTestWallet.watchOnly(hdWallet.getDepositAddress(1))
174
+ ).getBalance()
175
+ ).toBe(100000n);
176
+ expect(
177
+ await (
178
+ await RegTestWallet.watchOnly(hdWallet.getDepositAddress(2))
179
+ ).getBalance()
180
+ ).toBe(0n);
181
+
182
+ expect(
183
+ await (
184
+ await RegTestWallet.watchOnly(hdWallet.getChangeAddress(0))
185
+ ).getBalance()
186
+ ).toBe(0n);
187
+
188
+ const bob = await RegTestWallet.newRandom();
189
+
190
+ await hdWallet.send({
191
+ cashaddr: bob.getDepositAddress(),
192
+ value: 150000n,
193
+ });
194
+
195
+ expect(
196
+ await (
197
+ await RegTestWallet.watchOnly(hdWallet.getDepositAddress(0))
198
+ ).getBalance()
199
+ ).toBe(0n);
200
+ expect(
201
+ await (
202
+ await RegTestWallet.watchOnly(hdWallet.getDepositAddress(1))
203
+ ).getBalance()
204
+ ).toBe(0n);
205
+ expect(
206
+ await (
207
+ await RegTestWallet.watchOnly(hdWallet.getDepositAddress(2))
208
+ ).getBalance()
209
+ ).toBe(0n);
210
+
211
+ expect(
212
+ await (
213
+ await RegTestWallet.watchOnly(hdWallet.getChangeAddress(0))
214
+ ).getBalance()
215
+ ).toBeGreaterThan(50000n - 1000n);
216
+
217
+ expect(hdWallet.getChangeAddress()).not.toBe(hdWallet.getChangeAddress(0));
218
+ expect(hdWallet.getChangeAddress()).toBe(hdWallet.getChangeAddress(1));
219
+
220
+ expect(hdWallet.depositIndex).toBe(2);
221
+ expect(hdWallet.changeIndex).toBe(1);
222
+
223
+ expect(await bob.getBalance()).toBe(150000n);
224
+
225
+ expect(await hdWallet.getBalance()).toBe(49639n); // minus fees
226
+
227
+ expect(await hdWallet.getMaxAmountToSend()).toBe(49407n);
228
+ const charlie = await RegTestWallet.newRandom();
229
+ await hdWallet.sendMax(charlie.cashaddr);
230
+
231
+ expect(await charlie.getBalance()).toBe(49407n);
232
+ expect(await hdWallet.getBalance()).toBe(0n);
233
+ });
234
+
235
+ it("Should build unsigned transactions from an HDWallet", async () => {
236
+ const fundingWallet = await RegTestWallet.fromId(
237
+ "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
238
+ );
239
+
240
+ const hdWallet = await RegTestHDWallet.newRandom();
241
+ expect(await hdWallet.getBalance()).toBe(0n);
242
+
243
+ const depositAddress = hdWallet.getDepositAddress();
244
+ await fundingWallet.send({
245
+ cashaddr: depositAddress,
246
+ value: 100000n,
247
+ });
248
+
249
+ expect(await hdWallet.getBalance()).toBe(100000n);
250
+
251
+ const unsignedTx = await hdWallet.send(
252
+ {
253
+ cashaddr: (await RegTestWallet.newRandom()).getDepositAddress(),
254
+ value: 50000n,
255
+ },
256
+ {
257
+ buildUnsigned: true,
258
+ }
259
+ );
260
+
261
+ const tx = assertSuccess(
262
+ decodeTransaction(hexToBin(unsignedTx.unsignedTransaction!))
263
+ );
264
+ expect(tx.inputs.length).toBe(1);
265
+ expect(tx.inputs[0].unlockingBytecode.length).toBe(0); // should be empty
266
+ });
267
+
268
+ it("WalletCache persistence, addresses", async () => {
269
+ const memoryCacheValue = Config.UseMemoryCache;
270
+ Config.UseMemoryCache = true;
271
+
272
+ const hdWallet = await RegTestHDWallet.newRandom();
273
+
274
+ // get some addresses to populate cache
275
+ hdWallet.getDepositAddress(0);
276
+ hdWallet.getDepositAddress(100);
277
+
278
+ hdWallet.getChangeAddress(0);
279
+ hdWallet.getChangeAddress(100);
280
+
281
+ // persist cache
282
+ await hdWallet.walletCache.persist();
283
+
284
+ // check cache data is there in other instance
285
+ const otherWallet = await RegTestHDWallet.fromId(hdWallet.toDbString());
286
+ expect(
287
+ otherWallet.walletCache.get(hdWallet.getDepositAddress(0))
288
+ ).toBeDefined();
289
+ expect(
290
+ otherWallet.walletCache.get(hdWallet.getDepositAddress(99))
291
+ ).not.toBeDefined();
292
+ expect(
293
+ otherWallet.walletCache.get(hdWallet.getDepositAddress(100))
294
+ ).toBeDefined();
295
+
296
+ expect(
297
+ otherWallet.walletCache.get(hdWallet.getChangeAddress(0))
298
+ ).toBeDefined();
299
+ expect(
300
+ otherWallet.walletCache.get(hdWallet.getChangeAddress(99))
301
+ ).not.toBeDefined();
302
+ expect(
303
+ otherWallet.walletCache.get(hdWallet.getChangeAddress(100))
304
+ ).toBeDefined();
305
+
306
+ Config.UseMemoryCache = memoryCacheValue;
307
+ });
308
+
309
+ it("WalletCache persistence, status and utxo", async () => {
310
+ const memoryCacheValue = Config.UseMemoryCache;
311
+ Config.UseMemoryCache = true;
312
+
313
+ const hdWallet = await RegTestHDWallet.newRandom();
314
+
315
+ // get some addresses to populate cache
316
+ hdWallet.getDepositAddress(0);
317
+ expect(
318
+ hdWallet.walletCache.get(hdWallet.getDepositAddress(0))?.status
319
+ ).toBeNull();
320
+
321
+ const fundingWallet = await RegTestWallet.fromId(
322
+ "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
323
+ );
324
+ await fundingWallet.send({
325
+ cashaddr: hdWallet.getDepositAddress(0),
326
+ value: 100000n,
327
+ });
328
+
329
+ expect(
330
+ hdWallet.walletCache.get(hdWallet.getDepositAddress(0))?.status
331
+ ).not.toBeNull();
332
+ expect(
333
+ hdWallet.walletCache.get(hdWallet.getDepositAddress(0))?.utxos.length
334
+ ).toBe(1);
335
+
336
+ // persist cache
337
+ await hdWallet.walletCache.persist();
338
+
339
+ // check cache data is there in other instance
340
+ const otherWallet = await RegTestHDWallet.fromId(hdWallet.toDbString());
341
+ await otherWallet.watchPromise; // ensure any async init is done
342
+ expect(
343
+ otherWallet.walletCache.get(hdWallet.getDepositAddress(0))?.status
344
+ ).not.toBeNull();
345
+ expect(
346
+ hdWallet.walletCache.get(hdWallet.getDepositAddress(0))?.utxos.length
347
+ ).toBe(1);
348
+ expect(
349
+ stringify(hdWallet.walletCache.get(hdWallet.getDepositAddress(0))?.utxos)
350
+ ).toBe(
351
+ stringify(
352
+ otherWallet.walletCache.get(hdWallet.getDepositAddress(0))?.utxos
353
+ )
354
+ );
355
+
356
+ Config.UseMemoryCache = memoryCacheValue;
357
+ });
358
+
359
+ it("Cashtokens integration test", async () => {
360
+ const fundingWallet = await RegTestWallet.fromId(
361
+ "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
362
+ );
363
+ const alice = await RegTestHDWallet.newRandom();
364
+ await fundingWallet.send({
365
+ cashaddr: alice.getDepositAddress(),
366
+ value: 1000000n,
367
+ });
368
+
369
+ const genesisResponse = await alice.tokenGenesis({
370
+ cashaddr: alice.getDepositAddress(1),
371
+ capability: NFTCapability.minting,
372
+ commitment: "abcd",
373
+ amount: 1000n,
374
+ });
375
+
376
+ const tokenId = genesisResponse.tokenIds![0];
377
+
378
+ await new Promise((resolve) => setTimeout(resolve, 500));
379
+
380
+ // mint 2 NFTs, amount reducing
381
+ const response = await alice.tokenMint(tokenId, [
382
+ new TokenMintRequest({
383
+ cashaddr: alice.getDepositAddress(2),
384
+ capability: NFTCapability.none,
385
+ commitment: "",
386
+ }),
387
+ new TokenMintRequest({
388
+ cashaddr: alice.getDepositAddress(3),
389
+ capability: NFTCapability.mutable,
390
+ commitment: "00",
391
+ }),
392
+ ]);
393
+
394
+ await new Promise((resolve) => setTimeout(resolve, 500));
395
+
396
+ const newTokenUtxos = await alice.getTokenUtxos(tokenId);
397
+ expect(newTokenUtxos.length).toBe(3);
398
+ expect(tokenId).toEqual(response.tokenIds![0]);
399
+
400
+ const bob = await RegTestWallet.newRandom();
401
+ await alice.send([
402
+ new TokenSendRequest({
403
+ cashaddr: bob.cashaddr!,
404
+ tokenId: tokenId,
405
+ capability: NFTCapability.minting,
406
+ commitment: "abcd",
407
+ amount: 1000n,
408
+ }),
409
+ new TokenSendRequest({
410
+ cashaddr: bob.cashaddr!,
411
+ tokenId: tokenId,
412
+ capability: NFTCapability.none,
413
+ commitment: "",
414
+ }),
415
+ new TokenSendRequest({
416
+ cashaddr: bob.cashaddr!,
417
+ tokenId: tokenId,
418
+ capability: NFTCapability.mutable,
419
+ commitment: "00",
420
+ }),
421
+ ]);
422
+
423
+ await new Promise((resolve) => setTimeout(resolve, 500));
424
+
425
+ expect((await alice.getTokenUtxos(tokenId)).length).toBe(0);
426
+ const bobTokenUtxos = await bob.getTokenUtxos(tokenId);
427
+ expect(bobTokenUtxos.length).toBe(3);
428
+ expect(tokenId).toEqual(response.tokenIds![0]);
429
+ });
430
+
431
+ test("Test enforcing token addresses", async () => {
432
+ const fundingWallet = await RegTestWallet.fromId(
433
+ "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
434
+ );
435
+ const alice = await RegTestHDWallet.newRandom();
436
+ await fundingWallet.send({
437
+ cashaddr: alice.getDepositAddress(),
438
+ value: 1000000n,
439
+ });
440
+
441
+ const genesisResponse = await alice.tokenGenesis({
442
+ amount: 100n,
443
+ });
444
+ const tokenId = genesisResponse.tokenIds![0];
445
+
446
+ await new Promise((resolve) => setTimeout(resolve, 500));
447
+
448
+ const previousValue = Config.EnforceCashTokenReceiptAddresses;
449
+
450
+ const wrap = (addr) => {
451
+ return new Promise((resolve) => {
452
+ resolve(new TokenSendRequest({ cashaddr: addr, tokenId: "" }));
453
+ });
454
+ };
455
+
456
+ Config.EnforceCashTokenReceiptAddresses = false;
457
+ await expect(wrap(alice.getDepositAddress())).resolves.not.toThrow();
458
+ await expect(wrap(alice.getTokenDepositAddress())).resolves.not.toThrow();
459
+
460
+ await expect(
461
+ alice.send(
462
+ new TokenSendRequest({
463
+ cashaddr: alice.getDepositAddress(),
464
+ tokenId: tokenId,
465
+ amount: 1n,
466
+ })
467
+ )
468
+ ).resolves.not.toThrow();
469
+
470
+ await new Promise((resolve) => setTimeout(resolve, 500));
471
+
472
+ await expect(
473
+ alice.send(
474
+ new TokenSendRequest({
475
+ cashaddr: alice.getTokenDepositAddress(),
476
+ tokenId: tokenId,
477
+ amount: 2n,
478
+ })
479
+ )
480
+ ).resolves.not.toThrow();
481
+
482
+ await new Promise((resolve) => setTimeout(resolve, 500));
483
+
484
+ Config.EnforceCashTokenReceiptAddresses = true;
485
+ await expect(wrap(alice.getDepositAddress())).rejects.toThrow();
486
+ await expect(wrap(alice.getTokenDepositAddress())).resolves.not.toThrow();
487
+
488
+ await expect(
489
+ (async () =>
490
+ await alice.send(
491
+ new TokenSendRequest({
492
+ cashaddr: alice.getDepositAddress(),
493
+ tokenId: tokenId,
494
+ amount: 1n,
495
+ })
496
+ ))()
497
+ ).rejects.toThrow();
498
+
499
+ await new Promise((resolve) => setTimeout(resolve, 500));
500
+
501
+ await expect(
502
+ alice.send(
503
+ new TokenSendRequest({
504
+ cashaddr: alice.getTokenDepositAddress(),
505
+ tokenId: tokenId,
506
+ amount: 2n,
507
+ })
508
+ )
509
+ ).resolves.not.toThrow();
510
+
511
+ await new Promise((resolve) => setTimeout(resolve, 500));
512
+
513
+ Config.EnforceCashTokenReceiptAddresses = previousValue;
514
+ });
515
+ });