mainnet-js 1.1.34-alpha.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.html +1 -1
- package/dist/{mainnet-1.1.34-alpha.1.js → mainnet-2.0.0.js} +26 -338
- package/dist/module/db/SqlProvider.d.ts +2 -2
- package/dist/module/db/SqlProvider.d.ts.map +1 -1
- package/dist/module/db/SqlProvider.js +6 -24
- package/dist/module/db/SqlProvider.js.map +1 -1
- package/dist/module/index.d.ts +0 -3
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +3 -6
- package/dist/module/index.js.map +1 -1
- package/dist/module/transaction/Wif.d.ts +4 -8
- package/dist/module/transaction/Wif.d.ts.map +1 -1
- package/dist/module/transaction/Wif.js +6 -10
- package/dist/module/transaction/Wif.js.map +1 -1
- package/dist/module/util/deriveCashaddr.d.ts +1 -0
- package/dist/module/util/deriveCashaddr.d.ts.map +1 -1
- package/dist/module/util/deriveCashaddr.js +8 -1
- package/dist/module/util/deriveCashaddr.js.map +1 -1
- package/dist/module/wallet/Base.d.ts +1 -1
- package/dist/module/wallet/Base.js +1 -1
- package/dist/module/wallet/Bcmr.d.ts.map +1 -1
- package/dist/module/wallet/Bcmr.js +0 -1
- package/dist/module/wallet/Bcmr.js.map +1 -1
- package/dist/module/wallet/Util.d.ts +2 -2
- package/dist/module/wallet/Util.js +2 -2
- package/dist/module/wallet/Wif.d.ts +0 -28
- package/dist/module/wallet/Wif.d.ts.map +1 -1
- package/dist/module/wallet/Wif.js +2 -109
- package/dist/module/wallet/Wif.js.map +1 -1
- package/dist/module/wallet/createWallet.d.ts +0 -12
- package/dist/module/wallet/createWallet.d.ts.map +1 -1
- package/dist/module/wallet/createWallet.js +0 -43
- package/dist/module/wallet/createWallet.js.map +1 -1
- package/dist/module/wallet/interface.d.ts +0 -2
- package/dist/module/wallet/interface.d.ts.map +1 -1
- package/dist/module/webhook/Webhook.d.ts +1 -6
- package/dist/module/webhook/Webhook.d.ts.map +1 -1
- package/dist/module/webhook/Webhook.js +0 -4
- package/dist/module/webhook/Webhook.js.map +1 -1
- package/dist/module/webhook/index.d.ts +0 -1
- package/dist/module/webhook/index.d.ts.map +1 -1
- package/dist/module/webhook/index.js +0 -1
- package/dist/module/webhook/index.js.map +1 -1
- package/dist/module/webhook/interface.d.ts +0 -1
- package/dist/module/webhook/interface.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -10
- package/src/db/SqlProvider.test.ts +2 -18
- package/src/db/SqlProvider.ts +5 -26
- package/src/index.ts +3 -7
- package/src/transaction/Wif.ts +2 -19
- package/src/util/deriveCashaddr.test.ts +8 -0
- package/src/util/deriveCashaddr.ts +9 -0
- package/src/wallet/Base.ts +1 -1
- package/src/wallet/Bcmr.ts +0 -1
- package/src/wallet/Util.ts +2 -2
- package/src/wallet/Wif.test.ts +0 -23
- package/src/wallet/Wif.ts +2 -148
- package/src/wallet/createWallet.ts +0 -53
- package/src/wallet/interface.ts +0 -2
- package/src/webhook/Webhook.ts +4 -10
- package/src/webhook/index.ts +0 -1
- package/src/webhook/interface.ts +0 -1
- package/webpack.config.cjs +7 -7
- package/dist/module/slp/GsppProvider.d.ts +0 -55
- package/dist/module/slp/GsppProvider.d.ts.map +0 -1
- package/dist/module/slp/GsppProvider.js +0 -204
- package/dist/module/slp/GsppProvider.js.map +0 -1
- package/dist/module/slp/SlpDbProvider.d.ts +0 -52
- package/dist/module/slp/SlpDbProvider.d.ts.map +0 -1
- package/dist/module/slp/SlpDbProvider.js +0 -175
- package/dist/module/slp/SlpDbProvider.js.map +0 -1
- package/dist/module/slp/SlpDbTemplates.d.ts +0 -313
- package/dist/module/slp/SlpDbTemplates.d.ts.map +0 -1
- package/dist/module/slp/SlpDbTemplates.js +0 -375
- package/dist/module/slp/SlpDbTemplates.js.map +0 -1
- package/dist/module/slp/SlpLibAuth.d.ts +0 -210
- package/dist/module/slp/SlpLibAuth.d.ts.map +0 -1
- package/dist/module/slp/SlpLibAuth.js +0 -451
- package/dist/module/slp/SlpLibAuth.js.map +0 -1
- package/dist/module/slp/SlpProvider.d.ts +0 -24
- package/dist/module/slp/SlpProvider.d.ts.map +0 -1
- package/dist/module/slp/SlpProvider.js +0 -29
- package/dist/module/slp/SlpProvider.js.map +0 -1
- package/dist/module/slp/index.d.ts +0 -6
- package/dist/module/slp/index.d.ts.map +0 -1
- package/dist/module/slp/index.js +0 -5
- package/dist/module/slp/index.js.map +0 -1
- package/dist/module/slp/interface.d.ts +0 -114
- package/dist/module/slp/interface.d.ts.map +0 -1
- package/dist/module/slp/interface.js +0 -7
- package/dist/module/slp/interface.js.map +0 -1
- package/dist/module/util/bchaddr.d.ts +0 -2
- package/dist/module/util/bchaddr.d.ts.map +0 -1
- package/dist/module/util/bchaddr.js +0 -16
- package/dist/module/util/bchaddr.js.map +0 -1
- package/dist/module/wallet/Slp.d.ts +0 -431
- package/dist/module/wallet/Slp.d.ts.map +0 -1
- package/dist/module/wallet/Slp.js +0 -770
- package/dist/module/wallet/Slp.js.map +0 -1
- package/dist/module/webhook/WebhookSlp.d.ts +0 -15
- package/dist/module/webhook/WebhookSlp.d.ts.map +0 -1
- package/dist/module/webhook/WebhookSlp.js +0 -100
- package/dist/module/webhook/WebhookSlp.js.map +0 -1
- package/src/slp/GsppProvider.test.ts +0 -40
- package/src/slp/GsppProvider.ts +0 -329
- package/src/slp/SlpDbProvider.test.ts +0 -27
- package/src/slp/SlpDbProvider.ts +0 -291
- package/src/slp/SlpDbTemplates.ts +0 -400
- package/src/slp/SlpLibAuth.test.ts +0 -162
- package/src/slp/SlpLibAuth.ts +0 -532
- package/src/slp/SlpProvider.ts +0 -100
- package/src/slp/index.ts +0 -6
- package/src/slp/interface.ts +0 -128
- package/src/util/bchaddr.test.ts +0 -27
- package/src/util/bchaddr.ts +0 -27
- package/src/wallet/Slp.test.headless.js +0 -120
- package/src/wallet/Slp.test.ts +0 -1000
- package/src/wallet/Slp.ts +0 -1014
- package/src/webhook/WebhookSlp.test.ts +0 -288
- package/src/webhook/WebhookSlp.ts +0 -123
package/src/wallet/Slp.test.ts
DELETED
|
@@ -1,1000 +0,0 @@
|
|
|
1
|
-
import { RegTestWallet, TestNetWallet, Wallet } from "./Wif";
|
|
2
|
-
|
|
3
|
-
import { Network } from "..";
|
|
4
|
-
import { disconnectProviders, initProviders } from "../network";
|
|
5
|
-
|
|
6
|
-
import { mine } from "../mine/mine";
|
|
7
|
-
|
|
8
|
-
import { SlpGenesisOptions, SlpGenesisResult } from "../slp/interface";
|
|
9
|
-
import { DUST_UTXO_THRESHOLD } from "../constant";
|
|
10
|
-
import { ElectrumRawTransaction } from "../network/interface";
|
|
11
|
-
import { delay } from "../util/delay";
|
|
12
|
-
import BigNumber from "bignumber.js";
|
|
13
|
-
import { SlpDbProvider } from "../slp/SlpDbProvider";
|
|
14
|
-
import { GsppProvider } from "../slp/GsppProvider";
|
|
15
|
-
import { createSlpWallet, walletFromId } from "./createWallet";
|
|
16
|
-
import { WalletTypeEnum } from "./enum";
|
|
17
|
-
|
|
18
|
-
describe.skip("Slp wallet tests", () => {
|
|
19
|
-
beforeAll(async () => {
|
|
20
|
-
await initProviders([Network.MAINNET, Network.REGTEST]);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterAll(async () => {
|
|
24
|
-
await disconnectProviders([Network.MAINNET, Network.REGTEST]);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
let ticker: string = Math.random().toString(36).substring(8).toUpperCase();
|
|
28
|
-
let tokenId: string;
|
|
29
|
-
|
|
30
|
-
const genesisOptions: SlpGenesisOptions = {
|
|
31
|
-
name: "Mainnet coin",
|
|
32
|
-
ticker: ticker,
|
|
33
|
-
decimals: 2,
|
|
34
|
-
initialAmount: 10000,
|
|
35
|
-
documentUrl: "https://mainnet.cash",
|
|
36
|
-
documentHash:
|
|
37
|
-
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const useTestnet = false;
|
|
41
|
-
|
|
42
|
-
async function getAliceWallet(): Promise<Wallet> {
|
|
43
|
-
if (useTestnet) {
|
|
44
|
-
let aliceWif = `${process.env.ALICE_TESTNET_WALLET_ID!}`;
|
|
45
|
-
let aliceWallet = await TestNetWallet.fromId(aliceWif);
|
|
46
|
-
|
|
47
|
-
return aliceWallet;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const aliceWif = `${process.env.PRIVATE_WIF!}`;
|
|
51
|
-
const aliceWallet = await RegTestWallet.fromWIF(aliceWif);
|
|
52
|
-
|
|
53
|
-
return aliceWallet;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async function getRandomWallet(): Promise<Wallet> {
|
|
57
|
-
if (useTestnet) {
|
|
58
|
-
const bobWallet = await TestNetWallet.newRandom();
|
|
59
|
-
return bobWallet;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const bobWallet = await RegTestWallet.newRandom();
|
|
63
|
-
|
|
64
|
-
return bobWallet;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
test("Genesis test", async () => {
|
|
68
|
-
const aliceWallet = await getAliceWallet();
|
|
69
|
-
|
|
70
|
-
const result: SlpGenesisResult = await aliceWallet.slp.genesis(
|
|
71
|
-
genesisOptions
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
tokenId = result.tokenId;
|
|
75
|
-
expect(result.balance.value.isEqualTo(10000));
|
|
76
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
77
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
78
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
79
|
-
|
|
80
|
-
const info = await aliceWallet.slp.getTokenInfo(tokenId);
|
|
81
|
-
expect(info!.tokenId).toBe(result.tokenId);
|
|
82
|
-
delete (info as any).tokenId;
|
|
83
|
-
delete (info as any).parentTokenId;
|
|
84
|
-
const tokenInfo = {
|
|
85
|
-
decimals: 2,
|
|
86
|
-
documentHash:
|
|
87
|
-
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
|
|
88
|
-
documentUrl: "https://mainnet.cash",
|
|
89
|
-
initialAmount: new BigNumber(10000),
|
|
90
|
-
name: "Mainnet coin",
|
|
91
|
-
ticker: genesisOptions.ticker,
|
|
92
|
-
type: 1,
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
expect(info).toEqual(tokenInfo);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
test("Genesis test, utxos are not suitable", async () => {
|
|
99
|
-
const bobWallet = await getRandomWallet();
|
|
100
|
-
await mine({ cashaddr: bobWallet.cashaddr!, blocks: 5 });
|
|
101
|
-
await expect(bobWallet.slp.genesis(genesisOptions)).rejects.toThrow();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
test("Send test", async () => {
|
|
105
|
-
const aliceWallet = await getAliceWallet();
|
|
106
|
-
const bobWallet = await getRandomWallet();
|
|
107
|
-
|
|
108
|
-
let result = await aliceWallet.slp.send([
|
|
109
|
-
{
|
|
110
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
111
|
-
value: 5,
|
|
112
|
-
tokenId: tokenId,
|
|
113
|
-
},
|
|
114
|
-
]);
|
|
115
|
-
|
|
116
|
-
expect(result.balance.value.isEqualTo(9995));
|
|
117
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
118
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
119
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
120
|
-
expect(result.explorerUrl).toContain(result.txId);
|
|
121
|
-
|
|
122
|
-
expect(await bobWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
123
|
-
DUST_UTXO_THRESHOLD
|
|
124
|
-
);
|
|
125
|
-
expect(await bobWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
126
|
-
let bobBalance = await bobWallet.slp.getBalance(tokenId);
|
|
127
|
-
expect(bobBalance.value.isEqualTo(5));
|
|
128
|
-
expect(bobBalance.name).toBe("Mainnet coin");
|
|
129
|
-
expect(bobBalance.ticker).toBe(ticker);
|
|
130
|
-
expect(bobBalance.tokenId).toBe(tokenId);
|
|
131
|
-
|
|
132
|
-
// send without token id
|
|
133
|
-
result = await aliceWallet.slp.send([
|
|
134
|
-
{ slpaddr: bobWallet.slp.slpaddr, value: 5, tokenId: tokenId },
|
|
135
|
-
]);
|
|
136
|
-
|
|
137
|
-
expect(result.balance.value.isEqualTo(9990));
|
|
138
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
139
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
140
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
141
|
-
|
|
142
|
-
expect(await bobWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
143
|
-
2 * DUST_UTXO_THRESHOLD
|
|
144
|
-
);
|
|
145
|
-
expect(await bobWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
146
|
-
bobBalance = await bobWallet.slp.getBalance(tokenId);
|
|
147
|
-
expect(bobBalance.value.isEqualTo(10));
|
|
148
|
-
expect(bobBalance.name).toBe("Mainnet coin");
|
|
149
|
-
expect(bobBalance.ticker).toBe(ticker);
|
|
150
|
-
expect(bobBalance.tokenId).toBe(tokenId);
|
|
151
|
-
|
|
152
|
-
// send twice to bob
|
|
153
|
-
result = await aliceWallet.slp.send([
|
|
154
|
-
{ slpaddr: bobWallet.slp.slpaddr, value: 5, tokenId: tokenId },
|
|
155
|
-
{ slpaddr: bobWallet.slp.slpaddr, value: 5, tokenId: tokenId },
|
|
156
|
-
]);
|
|
157
|
-
|
|
158
|
-
expect(result.balance.value.isEqualTo(9980));
|
|
159
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
160
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
161
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
162
|
-
|
|
163
|
-
expect(await bobWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
164
|
-
4 * DUST_UTXO_THRESHOLD
|
|
165
|
-
);
|
|
166
|
-
expect(await bobWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
167
|
-
bobBalance = await bobWallet.slp.getBalance(tokenId);
|
|
168
|
-
expect(bobBalance.value.isEqualTo(20));
|
|
169
|
-
expect(bobBalance.name).toBe("Mainnet coin");
|
|
170
|
-
expect(bobBalance.ticker).toBe(ticker);
|
|
171
|
-
expect(bobBalance.tokenId).toBe(tokenId);
|
|
172
|
-
|
|
173
|
-
const charlieWallet = await getRandomWallet();
|
|
174
|
-
result = await aliceWallet.slp.send([
|
|
175
|
-
{ slpaddr: bobWallet.slp.slpaddr, value: 5, tokenId: tokenId },
|
|
176
|
-
{ slpaddr: charlieWallet.slp.slpaddr, value: 5, tokenId: tokenId },
|
|
177
|
-
]);
|
|
178
|
-
|
|
179
|
-
expect(result.balance.value.isEqualTo(9970));
|
|
180
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
181
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
182
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
183
|
-
|
|
184
|
-
expect(await bobWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
185
|
-
5 * DUST_UTXO_THRESHOLD
|
|
186
|
-
);
|
|
187
|
-
expect(await bobWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
188
|
-
bobBalance = await bobWallet.slp.getBalance(tokenId);
|
|
189
|
-
expect(bobBalance.value.isEqualTo(25));
|
|
190
|
-
expect(bobBalance.name).toBe("Mainnet coin");
|
|
191
|
-
expect(bobBalance.ticker).toBe(ticker);
|
|
192
|
-
expect(bobBalance.tokenId).toBe(tokenId);
|
|
193
|
-
|
|
194
|
-
expect(await charlieWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
195
|
-
1 * DUST_UTXO_THRESHOLD
|
|
196
|
-
);
|
|
197
|
-
expect(await charlieWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
198
|
-
const charlieBalance = await charlieWallet.slp.getBalance(tokenId);
|
|
199
|
-
expect(charlieBalance.value.isEqualTo(25));
|
|
200
|
-
expect(charlieBalance.name).toBe("Mainnet coin");
|
|
201
|
-
expect(charlieBalance.ticker).toBe(ticker);
|
|
202
|
-
expect(charlieBalance.tokenId).toBe(tokenId);
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
test("Send-return test", async () => {
|
|
206
|
-
let aliceWallet = await getAliceWallet();
|
|
207
|
-
let bobWallet = await getRandomWallet();
|
|
208
|
-
|
|
209
|
-
genesisOptions.ticker = ticker + "_SR";
|
|
210
|
-
let genesis: SlpGenesisResult = await aliceWallet.slp.genesis(
|
|
211
|
-
genesisOptions
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
// send bob some bch gas to enable him to send slp
|
|
215
|
-
await aliceWallet
|
|
216
|
-
.slpAware()
|
|
217
|
-
.send([{ cashaddr: bobWallet.cashaddr!, value: 3000, unit: "sat" }]);
|
|
218
|
-
|
|
219
|
-
let aliceSlpBalance = (await aliceWallet.slp.getBalance(genesis.tokenId))
|
|
220
|
-
.value;
|
|
221
|
-
let result = await aliceWallet.slp.send([
|
|
222
|
-
{
|
|
223
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
224
|
-
value: 5,
|
|
225
|
-
tokenId: genesis.tokenId,
|
|
226
|
-
},
|
|
227
|
-
]);
|
|
228
|
-
let rawTransaction = (await aliceWallet.provider!.getRawTransactionObject(
|
|
229
|
-
result.txId
|
|
230
|
-
)) as ElectrumRawTransaction;
|
|
231
|
-
expect(rawTransaction.vout.length).toBe(4);
|
|
232
|
-
|
|
233
|
-
// slp op_return
|
|
234
|
-
expect(rawTransaction.vout[0].value).toBe(0);
|
|
235
|
-
|
|
236
|
-
// slp target
|
|
237
|
-
expect(rawTransaction.vout[1].value).toBe(DUST_UTXO_THRESHOLD / 1e8);
|
|
238
|
-
expect(rawTransaction.vout[1].scriptPubKey.addresses[0]).toBe(
|
|
239
|
-
bobWallet.cashaddr
|
|
240
|
-
);
|
|
241
|
-
|
|
242
|
-
// slp change
|
|
243
|
-
expect(rawTransaction.vout[2].value).toBe(DUST_UTXO_THRESHOLD / 1e8);
|
|
244
|
-
expect(rawTransaction.vout[2].scriptPubKey.addresses[0]).toBe(
|
|
245
|
-
aliceWallet.cashaddr
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
// bch change
|
|
249
|
-
expect(rawTransaction.vout[3].scriptPubKey.addresses[0]).toBe(
|
|
250
|
-
aliceWallet.cashaddr
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
expect(result.balance.value.isEqualTo(aliceSlpBalance.minus(5)));
|
|
254
|
-
|
|
255
|
-
let bobSlpBalance = await bobWallet.slp.getBalance(genesis.tokenId);
|
|
256
|
-
expect(bobSlpBalance.value.toNumber()).toBe(5);
|
|
257
|
-
|
|
258
|
-
result = await bobWallet.slp.sendMax(
|
|
259
|
-
aliceWallet.slp.slpaddr,
|
|
260
|
-
genesis.tokenId
|
|
261
|
-
);
|
|
262
|
-
expect(result.balance.value.toNumber()).toBe(0);
|
|
263
|
-
|
|
264
|
-
rawTransaction = (await aliceWallet.provider!.getRawTransactionObject(
|
|
265
|
-
result.txId
|
|
266
|
-
)) as ElectrumRawTransaction;
|
|
267
|
-
expect(rawTransaction.vout.length).toBe(3);
|
|
268
|
-
|
|
269
|
-
// slp op_return
|
|
270
|
-
expect(rawTransaction.vout[0].value).toBe(0);
|
|
271
|
-
|
|
272
|
-
// slp target
|
|
273
|
-
expect(rawTransaction.vout[1].value).toBe(DUST_UTXO_THRESHOLD / 1e8);
|
|
274
|
-
expect(rawTransaction.vout[1].scriptPubKey.addresses[0]).toBe(
|
|
275
|
-
aliceWallet.cashaddr
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
// no slp change!
|
|
279
|
-
|
|
280
|
-
// bch change
|
|
281
|
-
expect(rawTransaction.vout[2].scriptPubKey.addresses[0]).toBe(
|
|
282
|
-
bobWallet.cashaddr
|
|
283
|
-
);
|
|
284
|
-
|
|
285
|
-
let aliceSlpNewBalance = (await aliceWallet.slp.getBalance(genesis.tokenId))
|
|
286
|
-
.value;
|
|
287
|
-
expect(aliceSlpNewBalance.toString()).toBe(aliceSlpBalance.toString());
|
|
288
|
-
|
|
289
|
-
// await bobWallet.sendMax(aliceWallet.cashaddr!);
|
|
290
|
-
|
|
291
|
-
// check non-slp send did not burn tokens
|
|
292
|
-
aliceSlpNewBalance = (await aliceWallet.slp.getBalance(genesis.tokenId))
|
|
293
|
-
.value;
|
|
294
|
-
expect(aliceSlpNewBalance.toString()).toBe(aliceSlpBalance.toString());
|
|
295
|
-
|
|
296
|
-
// send bob some bch gas to enable him to send slp
|
|
297
|
-
// aliceBalance = await aliceWallet.slpAware().send([{cashaddr: bobWallet.cashaddr!, value: 3000, unit: "sat"}]);
|
|
298
|
-
|
|
299
|
-
aliceSlpBalance = (await aliceWallet.slp.getBalance(genesis.tokenId)).value;
|
|
300
|
-
result = await aliceWallet.slp.send([
|
|
301
|
-
{
|
|
302
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
303
|
-
value: 5,
|
|
304
|
-
tokenId: genesis.tokenId,
|
|
305
|
-
},
|
|
306
|
-
]);
|
|
307
|
-
rawTransaction = (await aliceWallet.provider!.getRawTransactionObject(
|
|
308
|
-
result.txId
|
|
309
|
-
)) as ElectrumRawTransaction;
|
|
310
|
-
expect(rawTransaction.vout.length).toBe(3);
|
|
311
|
-
|
|
312
|
-
// slp op_return
|
|
313
|
-
expect(rawTransaction.vout[0].value).toBe(0);
|
|
314
|
-
|
|
315
|
-
// slp target
|
|
316
|
-
expect(rawTransaction.vout[1].value).toBe(DUST_UTXO_THRESHOLD / 1e8);
|
|
317
|
-
expect(rawTransaction.vout[1].scriptPubKey.addresses[0]).toBe(
|
|
318
|
-
bobWallet.cashaddr
|
|
319
|
-
);
|
|
320
|
-
|
|
321
|
-
// no slp change! since we have sent the utxo we received from bob
|
|
322
|
-
|
|
323
|
-
// bch change
|
|
324
|
-
expect(rawTransaction.vout[2].scriptPubKey.addresses[0]).toBe(
|
|
325
|
-
aliceWallet.cashaddr
|
|
326
|
-
);
|
|
327
|
-
|
|
328
|
-
expect(result.balance.value.isEqualTo(aliceSlpBalance.minus(5)));
|
|
329
|
-
|
|
330
|
-
result = await bobWallet.slp.sendMax(
|
|
331
|
-
aliceWallet.slp.slpaddr,
|
|
332
|
-
genesis.tokenId
|
|
333
|
-
);
|
|
334
|
-
expect(result.balance.value.toNumber()).toBe(0);
|
|
335
|
-
|
|
336
|
-
rawTransaction = (await aliceWallet.provider!.getRawTransactionObject(
|
|
337
|
-
result.txId
|
|
338
|
-
)) as ElectrumRawTransaction;
|
|
339
|
-
expect(rawTransaction.vout.length).toBe(3);
|
|
340
|
-
|
|
341
|
-
// slp op_return
|
|
342
|
-
expect(rawTransaction.vout[0].value).toBe(0);
|
|
343
|
-
|
|
344
|
-
// slp target
|
|
345
|
-
expect(rawTransaction.vout[1].value).toBe(DUST_UTXO_THRESHOLD / 1e8);
|
|
346
|
-
expect(rawTransaction.vout[1].scriptPubKey.addresses[0]).toBe(
|
|
347
|
-
aliceWallet.cashaddr
|
|
348
|
-
);
|
|
349
|
-
|
|
350
|
-
// no slp change!
|
|
351
|
-
|
|
352
|
-
// bch change
|
|
353
|
-
expect(rawTransaction.vout[2].scriptPubKey.addresses[0]).toBe(
|
|
354
|
-
bobWallet.cashaddr
|
|
355
|
-
);
|
|
356
|
-
|
|
357
|
-
aliceSlpNewBalance = (await aliceWallet.slp.getBalance(genesis.tokenId))
|
|
358
|
-
.value;
|
|
359
|
-
expect(aliceSlpNewBalance.toString()).toBe(aliceSlpBalance.toString());
|
|
360
|
-
|
|
361
|
-
await bobWallet.sendMax(aliceWallet.cashaddr!);
|
|
362
|
-
|
|
363
|
-
// check non-slp send did not burn tokens
|
|
364
|
-
aliceSlpNewBalance = (await aliceWallet.slp.getBalance(genesis.tokenId))
|
|
365
|
-
.value;
|
|
366
|
-
expect(aliceSlpNewBalance.toString()).toBe(aliceSlpBalance.toString());
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
test("Mint test", async () => {
|
|
370
|
-
const aliceWallet = await getAliceWallet();
|
|
371
|
-
|
|
372
|
-
// can not mint less than or 0 tokens
|
|
373
|
-
await expect(
|
|
374
|
-
aliceWallet.slp.mint({ value: -1, tokenId })
|
|
375
|
-
).rejects.toThrow();
|
|
376
|
-
|
|
377
|
-
let result = await aliceWallet.slp.mint({ value: 50, tokenId });
|
|
378
|
-
expect(result.balance.value.isEqualTo(10040));
|
|
379
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
380
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
381
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
382
|
-
|
|
383
|
-
// the baton must survive the first mint, and we end it now
|
|
384
|
-
result = await aliceWallet.slp.mint({ value: 50, tokenId, endBaton: true });
|
|
385
|
-
expect(result.balance.value.isEqualTo(10090));
|
|
386
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
387
|
-
expect(result.balance.ticker).toBe(ticker);
|
|
388
|
-
expect(result.balance.tokenId).toBe(tokenId);
|
|
389
|
-
|
|
390
|
-
// can not mint after baton is burnt
|
|
391
|
-
await expect(
|
|
392
|
-
aliceWallet.slp.mint({ value: 50, tokenId })
|
|
393
|
-
).rejects.toThrow();
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
test("Test mint baton transfer", async () => {
|
|
397
|
-
const aliceWallet = await getAliceWallet();
|
|
398
|
-
const bobWallet = await getRandomWallet();
|
|
399
|
-
|
|
400
|
-
const options = { ...genesisOptions };
|
|
401
|
-
options.ticker = ticker + "TR";
|
|
402
|
-
options.batonReceiverSlpAddr = bobWallet.slp.slpaddr;
|
|
403
|
-
options.tokenReceiverSlpAddr = bobWallet.slp.slpaddr;
|
|
404
|
-
const genesis: SlpGenesisResult = await aliceWallet.slp.genesis(options);
|
|
405
|
-
|
|
406
|
-
let aliceBalance = await aliceWallet.slp.getBalance(genesis.tokenId);
|
|
407
|
-
expect(aliceBalance.value.isEqualTo(0));
|
|
408
|
-
|
|
409
|
-
let bobBalance = await bobWallet.slp.getBalance(genesis.tokenId);
|
|
410
|
-
expect(bobBalance.value.isEqualTo(10000));
|
|
411
|
-
|
|
412
|
-
await aliceWallet.send([
|
|
413
|
-
{ cashaddr: bobWallet.cashaddr!, value: 10000, unit: "sat" },
|
|
414
|
-
]);
|
|
415
|
-
|
|
416
|
-
const mintOptions = {
|
|
417
|
-
tokenId: genesis.tokenId,
|
|
418
|
-
value: 0,
|
|
419
|
-
tokenReceiverSlpAddr: aliceWallet.slp.slpaddr,
|
|
420
|
-
batonReceiverSlpAddr: aliceWallet.slp.slpaddr,
|
|
421
|
-
};
|
|
422
|
-
await expect(aliceWallet.slp.mint(mintOptions)).rejects.toThrow();
|
|
423
|
-
|
|
424
|
-
await bobWallet.slp.mint(mintOptions);
|
|
425
|
-
|
|
426
|
-
aliceBalance = await aliceWallet.slp.getBalance(genesis.tokenId);
|
|
427
|
-
expect(aliceBalance.value.isEqualTo(0));
|
|
428
|
-
|
|
429
|
-
bobBalance = await bobWallet.slp.getBalance(genesis.tokenId);
|
|
430
|
-
expect(bobBalance.value.isEqualTo(10000));
|
|
431
|
-
|
|
432
|
-
await expect(bobWallet.slp.mint(mintOptions)).rejects.toThrow();
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
test("Test tokenId ambiguity", async () => {
|
|
436
|
-
const aliceWallet = await getAliceWallet();
|
|
437
|
-
|
|
438
|
-
genesisOptions.ticker = ticker + "_AMBIGUOS";
|
|
439
|
-
const genesis1: SlpGenesisResult = await aliceWallet.slp.genesis(
|
|
440
|
-
genesisOptions
|
|
441
|
-
);
|
|
442
|
-
const genesis2: SlpGenesisResult = await aliceWallet.slp.genesis(
|
|
443
|
-
genesisOptions
|
|
444
|
-
);
|
|
445
|
-
|
|
446
|
-
// test empty send requests throw
|
|
447
|
-
await expect(aliceWallet.slp.send([])).rejects.toThrow();
|
|
448
|
-
|
|
449
|
-
// test sending zero amount should throw
|
|
450
|
-
await expect(
|
|
451
|
-
aliceWallet.slp.send([
|
|
452
|
-
{
|
|
453
|
-
slpaddr: aliceWallet.slp.slpaddr,
|
|
454
|
-
value: 0,
|
|
455
|
-
tokenId: genesis1.tokenId,
|
|
456
|
-
},
|
|
457
|
-
])
|
|
458
|
-
).rejects.toThrow();
|
|
459
|
-
|
|
460
|
-
const sendRequests = [...Array(20).keys()].map((_) => ({
|
|
461
|
-
slpaddr: aliceWallet.slp.slpaddr,
|
|
462
|
-
value: 1000,
|
|
463
|
-
tokenId: genesis1.tokenId,
|
|
464
|
-
}));
|
|
465
|
-
|
|
466
|
-
// test throw more than 19 send requests are not allowed
|
|
467
|
-
await expect(aliceWallet.slp.send(sendRequests)).rejects.toThrow();
|
|
468
|
-
|
|
469
|
-
// test tokenId is invalid
|
|
470
|
-
await expect(
|
|
471
|
-
aliceWallet.slp.send([
|
|
472
|
-
{
|
|
473
|
-
slpaddr: aliceWallet.slp.slpaddr,
|
|
474
|
-
value: 1000,
|
|
475
|
-
tokenId: "my cool token",
|
|
476
|
-
},
|
|
477
|
-
])
|
|
478
|
-
).rejects.toThrow();
|
|
479
|
-
|
|
480
|
-
// test sending two tokens with different tokenIds in a single transaction should throw
|
|
481
|
-
await expect(
|
|
482
|
-
aliceWallet.slp.send([
|
|
483
|
-
{
|
|
484
|
-
slpaddr: aliceWallet.slp.slpaddr,
|
|
485
|
-
value: 10,
|
|
486
|
-
tokenId: genesis1.tokenId,
|
|
487
|
-
},
|
|
488
|
-
{
|
|
489
|
-
slpaddr: aliceWallet.slp.slpaddr,
|
|
490
|
-
value: 10,
|
|
491
|
-
tokenId: genesis2.tokenId,
|
|
492
|
-
},
|
|
493
|
-
])
|
|
494
|
-
).rejects.toThrow();
|
|
495
|
-
|
|
496
|
-
const result = await aliceWallet.slp.mint({
|
|
497
|
-
value: 50,
|
|
498
|
-
tokenId: genesis1.tokenId,
|
|
499
|
-
});
|
|
500
|
-
expect(result.balance.value.isEqualTo(10050));
|
|
501
|
-
expect(result.balance.name).toBe("Mainnet coin");
|
|
502
|
-
expect(result.balance.ticker).toBe(genesisOptions.ticker);
|
|
503
|
-
expect(result.balance.tokenId).toBe(genesis1.tokenId);
|
|
504
|
-
});
|
|
505
|
-
|
|
506
|
-
test("Test watching slp balance", async () => {
|
|
507
|
-
const aliceWallet = await getAliceWallet();
|
|
508
|
-
const bobWallet = await getRandomWallet();
|
|
509
|
-
|
|
510
|
-
genesisOptions.ticker = ticker + "WB";
|
|
511
|
-
const genesis = await aliceWallet.slp.genesis(genesisOptions);
|
|
512
|
-
|
|
513
|
-
const cancelFn = bobWallet.slp.watchBalance((balance) => {
|
|
514
|
-
expect(balance.value.toNumber()).toBeGreaterThan(0);
|
|
515
|
-
}, genesis.tokenId);
|
|
516
|
-
await aliceWallet.slp.send([
|
|
517
|
-
{
|
|
518
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
519
|
-
value: 10,
|
|
520
|
-
tokenId: genesis.tokenId,
|
|
521
|
-
},
|
|
522
|
-
]);
|
|
523
|
-
|
|
524
|
-
delay(2000);
|
|
525
|
-
cancelFn();
|
|
526
|
-
});
|
|
527
|
-
|
|
528
|
-
test("Test waiting for slp certain balance", async () => {
|
|
529
|
-
const aliceWallet = await getAliceWallet();
|
|
530
|
-
const bobWallet = await getRandomWallet();
|
|
531
|
-
|
|
532
|
-
genesisOptions.ticker = ticker + "_WFB";
|
|
533
|
-
const genesis = await aliceWallet.slp.genesis(genesisOptions);
|
|
534
|
-
setTimeout(async () => {
|
|
535
|
-
await aliceWallet.slp.send([
|
|
536
|
-
{
|
|
537
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
538
|
-
value: 20,
|
|
539
|
-
tokenId: genesis.tokenId,
|
|
540
|
-
},
|
|
541
|
-
]);
|
|
542
|
-
}, 3000);
|
|
543
|
-
const balance = await bobWallet.slp.waitForBalance(10, genesis.tokenId);
|
|
544
|
-
expect(balance.value.isEqualTo(20));
|
|
545
|
-
await mine({ cashaddr: aliceWallet.cashaddr!, blocks: 1 });
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
test.skip("Test waiting for slp transaction", async () => {
|
|
549
|
-
const aliceWallet = await getAliceWallet();
|
|
550
|
-
const bobWallet = await getRandomWallet();
|
|
551
|
-
|
|
552
|
-
genesisOptions.ticker = ticker + "_WT";
|
|
553
|
-
const genesis: SlpGenesisResult = await aliceWallet.slp.genesis(
|
|
554
|
-
genesisOptions
|
|
555
|
-
);
|
|
556
|
-
|
|
557
|
-
setTimeout(async () => {
|
|
558
|
-
await aliceWallet.slp.send([
|
|
559
|
-
{
|
|
560
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
561
|
-
value: 20,
|
|
562
|
-
tokenId: genesis.tokenId,
|
|
563
|
-
},
|
|
564
|
-
]);
|
|
565
|
-
}, 3000);
|
|
566
|
-
const transaction = await bobWallet.slp.waitForTransaction(genesis.tokenId);
|
|
567
|
-
expect(transaction.tx_hash.length).toBe(64);
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
test("Test getting history", async () => {
|
|
571
|
-
const aliceWallet = await getAliceWallet();
|
|
572
|
-
|
|
573
|
-
if (aliceWallet.slp.provider instanceof GsppProvider) {
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
const history = await aliceWallet.slp.getHistory();
|
|
578
|
-
expect(history.length).toBeGreaterThan(0);
|
|
579
|
-
|
|
580
|
-
const lastTx = await aliceWallet.slp.getLastTransaction(true);
|
|
581
|
-
expect(lastTx.txid.length).toBe(64);
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
test("Test utilities", async () => {
|
|
585
|
-
const aliceWallet = await getAliceWallet();
|
|
586
|
-
|
|
587
|
-
expect(aliceWallet.slp.getDepositAddress()).toContain("slp");
|
|
588
|
-
expect(aliceWallet.slp.getDepositQr().src).toContain("data:image");
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
test("Test faulty wallet", async () => {
|
|
592
|
-
let options = { ...genesisOptions };
|
|
593
|
-
|
|
594
|
-
const bobWallet = await getRandomWallet();
|
|
595
|
-
bobWallet.privateKey = Uint8Array.from([0, 1, 2, 3, 4]);
|
|
596
|
-
// not enough funds
|
|
597
|
-
await expect(bobWallet.slp.genesis(options)).rejects.toThrow();
|
|
598
|
-
|
|
599
|
-
// no private key set
|
|
600
|
-
bobWallet.privateKey = undefined;
|
|
601
|
-
await expect(bobWallet.slp.genesis(options)).rejects.toThrow();
|
|
602
|
-
bobWallet.privateKey = Uint8Array.from([0, 1, 2, 3, 4]);
|
|
603
|
-
|
|
604
|
-
// no network provider set
|
|
605
|
-
const provider = bobWallet.provider;
|
|
606
|
-
bobWallet.provider = undefined;
|
|
607
|
-
await expect(bobWallet.slp.genesis(options)).rejects.toThrow();
|
|
608
|
-
bobWallet.provider = provider;
|
|
609
|
-
|
|
610
|
-
// tokenReceiverSlpAddr is bad
|
|
611
|
-
options.tokenReceiverSlpAddr = "test";
|
|
612
|
-
await expect(bobWallet.slp.genesis(options)).rejects.toThrow();
|
|
613
|
-
|
|
614
|
-
options = { ...genesisOptions };
|
|
615
|
-
|
|
616
|
-
// batonReceiverSlpAddr is bad
|
|
617
|
-
options.batonReceiverSlpAddr = "test";
|
|
618
|
-
await expect(bobWallet.slp.genesis(options)).rejects.toThrow();
|
|
619
|
-
|
|
620
|
-
options = { ...genesisOptions };
|
|
621
|
-
|
|
622
|
-
// bob's slpaddr is bad
|
|
623
|
-
bobWallet.slp.slpaddr = "test";
|
|
624
|
-
options.batonReceiverSlpAddr = undefined;
|
|
625
|
-
options.tokenReceiverSlpAddr = undefined;
|
|
626
|
-
await expect(bobWallet.slp.genesis(options)).rejects.toThrow();
|
|
627
|
-
});
|
|
628
|
-
|
|
629
|
-
test("Test genesis ends baton", async () => {
|
|
630
|
-
const aliceWallet = await getAliceWallet();
|
|
631
|
-
|
|
632
|
-
const options = { ...genesisOptions };
|
|
633
|
-
options.ticker = ticker + "baton_end";
|
|
634
|
-
options.documentUrl = undefined;
|
|
635
|
-
options.documentHash = undefined;
|
|
636
|
-
options.endBaton = true;
|
|
637
|
-
const result: SlpGenesisResult = await aliceWallet.slp.genesis(options);
|
|
638
|
-
|
|
639
|
-
tokenId = result.tokenId;
|
|
640
|
-
|
|
641
|
-
await expect(
|
|
642
|
-
aliceWallet.slp.mint({ value: 100, tokenId, endBaton: false })
|
|
643
|
-
).rejects.toThrow();
|
|
644
|
-
});
|
|
645
|
-
|
|
646
|
-
test("Test should get formatted slp utxos", async () => {
|
|
647
|
-
const aliceWallet = await getAliceWallet();
|
|
648
|
-
|
|
649
|
-
const utxos: any = await aliceWallet.slp.getFormattedSlpUtxos();
|
|
650
|
-
expect(utxos.length).toBeGreaterThan(0);
|
|
651
|
-
expect(utxos[0].utxoId).toContain(":");
|
|
652
|
-
});
|
|
653
|
-
|
|
654
|
-
test("Test NFT Parent creation and transfer", async () => {
|
|
655
|
-
const aliceWallet = await getAliceWallet();
|
|
656
|
-
const bobWallet = await getRandomWallet();
|
|
657
|
-
|
|
658
|
-
const nftParentGenesis = { ...genesisOptions };
|
|
659
|
-
nftParentGenesis.ticker = ticker + "NFTP";
|
|
660
|
-
nftParentGenesis.name = "Mainnet NFT Parent";
|
|
661
|
-
nftParentGenesis.decimals = 0;
|
|
662
|
-
const parentResult: SlpGenesisResult =
|
|
663
|
-
await aliceWallet.slp.nftParentGenesis(nftParentGenesis);
|
|
664
|
-
|
|
665
|
-
const info = await aliceWallet.slp.getTokenInfo(parentResult.tokenId);
|
|
666
|
-
expect(info!.tokenId).toBe(parentResult.tokenId);
|
|
667
|
-
delete (info as any).tokenId;
|
|
668
|
-
|
|
669
|
-
const parentTokenInfo = {
|
|
670
|
-
decimals: 0,
|
|
671
|
-
documentHash:
|
|
672
|
-
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
|
|
673
|
-
documentUrl: "https://mainnet.cash",
|
|
674
|
-
initialAmount: new BigNumber(10000),
|
|
675
|
-
name: "Mainnet NFT Parent",
|
|
676
|
-
ticker: nftParentGenesis.ticker,
|
|
677
|
-
type: 0x81,
|
|
678
|
-
};
|
|
679
|
-
|
|
680
|
-
delete (info as any).tokenId;
|
|
681
|
-
delete (info as any).parentTokenId;
|
|
682
|
-
|
|
683
|
-
expect(info).toEqual(parentTokenInfo);
|
|
684
|
-
|
|
685
|
-
let sendResult = await aliceWallet.slp.send([
|
|
686
|
-
{
|
|
687
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
688
|
-
value: 5,
|
|
689
|
-
tokenId: parentResult.tokenId,
|
|
690
|
-
},
|
|
691
|
-
]);
|
|
692
|
-
|
|
693
|
-
expect(sendResult.balance.value.isEqualTo(9995));
|
|
694
|
-
expect(sendResult.balance.ticker).toBe(nftParentGenesis.ticker);
|
|
695
|
-
expect(sendResult.balance.tokenId).toBe(parentResult.tokenId);
|
|
696
|
-
|
|
697
|
-
expect(await bobWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
698
|
-
DUST_UTXO_THRESHOLD
|
|
699
|
-
);
|
|
700
|
-
expect(await bobWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
701
|
-
let bobBalance = await bobWallet.slp.getBalance(parentResult.tokenId);
|
|
702
|
-
expect(bobBalance.value.isEqualTo(5));
|
|
703
|
-
expect(bobBalance.ticker).toBe(nftParentGenesis.ticker);
|
|
704
|
-
expect(bobBalance.tokenId).toBe(parentResult.tokenId);
|
|
705
|
-
});
|
|
706
|
-
|
|
707
|
-
test("Test NFT Child creation and transfer", async () => {
|
|
708
|
-
const aliceWallet = await getAliceWallet();
|
|
709
|
-
const bobWallet = await getRandomWallet();
|
|
710
|
-
|
|
711
|
-
const nftParentGenesis = { ...genesisOptions };
|
|
712
|
-
nftParentGenesis.ticker = ticker + "NFTP";
|
|
713
|
-
nftParentGenesis.name = "Mainnet NFT Parent";
|
|
714
|
-
nftParentGenesis.decimals = 0;
|
|
715
|
-
nftParentGenesis.initialAmount = 2;
|
|
716
|
-
const parentResult: SlpGenesisResult =
|
|
717
|
-
await aliceWallet.slp.nftParentGenesis(nftParentGenesis);
|
|
718
|
-
|
|
719
|
-
const nftChildGenesis = { ...genesisOptions };
|
|
720
|
-
nftChildGenesis.ticker = ticker + "NFTC";
|
|
721
|
-
nftChildGenesis.name = "Mainnet NFT Child";
|
|
722
|
-
nftChildGenesis.parentTokenId = parentResult.tokenId;
|
|
723
|
-
|
|
724
|
-
const childResult: SlpGenesisResult = await aliceWallet.slp.nftChildGenesis(
|
|
725
|
-
nftChildGenesis
|
|
726
|
-
);
|
|
727
|
-
|
|
728
|
-
const childInfo = await aliceWallet.slp.getTokenInfo(childResult.tokenId);
|
|
729
|
-
expect(childInfo!.tokenId).toBe(childResult.tokenId);
|
|
730
|
-
if (aliceWallet.slp.provider instanceof GsppProvider)
|
|
731
|
-
expect((childInfo! as any).parentTokenId).toBe(parentResult.tokenId);
|
|
732
|
-
|
|
733
|
-
delete (childInfo as any).tokenId;
|
|
734
|
-
|
|
735
|
-
const childTokenInfo = {
|
|
736
|
-
decimals: 0,
|
|
737
|
-
documentHash:
|
|
738
|
-
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
|
|
739
|
-
documentUrl: "https://mainnet.cash",
|
|
740
|
-
initialAmount: new BigNumber(1),
|
|
741
|
-
name: "Mainnet NFT Child",
|
|
742
|
-
ticker: nftChildGenesis.ticker,
|
|
743
|
-
type: 0x41,
|
|
744
|
-
};
|
|
745
|
-
|
|
746
|
-
delete (childInfo as any).tokenId;
|
|
747
|
-
delete (childInfo as any).parentTokenId;
|
|
748
|
-
|
|
749
|
-
expect(childInfo).toEqual(childTokenInfo);
|
|
750
|
-
|
|
751
|
-
let aliceParentBalance = await aliceWallet.slp.getBalance(
|
|
752
|
-
parentResult.tokenId
|
|
753
|
-
);
|
|
754
|
-
expect(aliceParentBalance.value.isEqualTo(1));
|
|
755
|
-
expect(aliceParentBalance.ticker).toBe(nftParentGenesis.ticker);
|
|
756
|
-
expect(aliceParentBalance.tokenId).toBe(parentResult.tokenId);
|
|
757
|
-
|
|
758
|
-
let aliceChildBalance = await aliceWallet.slp.getBalance(
|
|
759
|
-
childResult.tokenId
|
|
760
|
-
);
|
|
761
|
-
expect(aliceChildBalance.value.isEqualTo(1));
|
|
762
|
-
expect(aliceChildBalance.ticker).toBe(nftChildGenesis.ticker);
|
|
763
|
-
expect(aliceChildBalance.tokenId).toBe(childResult.tokenId);
|
|
764
|
-
|
|
765
|
-
let sendResult = await aliceWallet.slp.send([
|
|
766
|
-
{
|
|
767
|
-
slpaddr: bobWallet.slp.slpaddr,
|
|
768
|
-
value: 1,
|
|
769
|
-
tokenId: childResult.tokenId,
|
|
770
|
-
},
|
|
771
|
-
]);
|
|
772
|
-
|
|
773
|
-
expect(sendResult.balance.value.isEqualTo(0));
|
|
774
|
-
expect(sendResult.balance.tokenId).toBe(childResult.tokenId);
|
|
775
|
-
|
|
776
|
-
expect(await bobWallet.slpAware(false).getBalance("satoshi")).toBe(
|
|
777
|
-
DUST_UTXO_THRESHOLD
|
|
778
|
-
);
|
|
779
|
-
expect(await bobWallet.slpAware().getBalance("satoshi")).toBe(0);
|
|
780
|
-
let bobBalance = await bobWallet.slp.getBalance(childResult.tokenId);
|
|
781
|
-
expect(bobBalance.value.isEqualTo(1));
|
|
782
|
-
expect(bobBalance.ticker).toBe(nftChildGenesis.ticker);
|
|
783
|
-
expect(bobBalance.tokenId).toBe(childResult.tokenId);
|
|
784
|
-
|
|
785
|
-
// should throw if parent token is not in possession
|
|
786
|
-
nftChildGenesis.parentTokenId =
|
|
787
|
-
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
|
|
788
|
-
|
|
789
|
-
await expect(
|
|
790
|
-
aliceWallet.slp.nftChildGenesis(nftChildGenesis)
|
|
791
|
-
).rejects.toThrow();
|
|
792
|
-
|
|
793
|
-
// should throw if parent token is not of type 0x81
|
|
794
|
-
nftChildGenesis.parentTokenId = childResult.tokenId;
|
|
795
|
-
await expect(
|
|
796
|
-
aliceWallet.slp.nftChildGenesis(nftChildGenesis)
|
|
797
|
-
).rejects.toThrow();
|
|
798
|
-
|
|
799
|
-
// bug in the SLPDB, the parent burn check is not triggered until new block arrives
|
|
800
|
-
// if (aliceWallet.slp.provider! instanceof SlpDbProvider) {
|
|
801
|
-
// await mine({ cashaddr: aliceWallet.cashaddr!, blocks: 1 });
|
|
802
|
-
// await delay(1000);
|
|
803
|
-
// }
|
|
804
|
-
|
|
805
|
-
// spend last token
|
|
806
|
-
const genesis1 = { ...nftChildGenesis };
|
|
807
|
-
genesis1.parentTokenId = parentResult.tokenId;
|
|
808
|
-
genesis1.ticker = ticker + "1";
|
|
809
|
-
|
|
810
|
-
const childResultLast: SlpGenesisResult =
|
|
811
|
-
await aliceWallet.slp.nftChildGenesis(genesis1);
|
|
812
|
-
|
|
813
|
-
aliceParentBalance = await aliceWallet.slp.getBalance(parentResult.tokenId);
|
|
814
|
-
expect(aliceParentBalance.value.isEqualTo(0));
|
|
815
|
-
aliceChildBalance = await aliceWallet.slp.getBalance(
|
|
816
|
-
childResultLast.tokenId
|
|
817
|
-
);
|
|
818
|
-
expect(aliceParentBalance.value.isEqualTo(1));
|
|
819
|
-
|
|
820
|
-
// fail to to perform child genesis. we are out of parent tokens
|
|
821
|
-
const genesis2 = { ...nftChildGenesis };
|
|
822
|
-
genesis2.parentTokenId = parentResult.tokenId;
|
|
823
|
-
genesis2.ticker = ticker + "0";
|
|
824
|
-
|
|
825
|
-
await expect(aliceWallet.slp.nftChildGenesis(genesis2)).rejects.toThrow();
|
|
826
|
-
});
|
|
827
|
-
|
|
828
|
-
test("Test SLPDB NFT bug", async () => {
|
|
829
|
-
const aliceWallet = await getAliceWallet();
|
|
830
|
-
|
|
831
|
-
const nftParentGenesis = { ...genesisOptions };
|
|
832
|
-
nftParentGenesis.ticker = ticker + "NFTP_Bug";
|
|
833
|
-
nftParentGenesis.name = "Mainnet NFT Parent";
|
|
834
|
-
nftParentGenesis.decimals = 0;
|
|
835
|
-
nftParentGenesis.initialAmount = 1;
|
|
836
|
-
const parentResult: SlpGenesisResult =
|
|
837
|
-
await aliceWallet.slp.nftParentGenesis(nftParentGenesis);
|
|
838
|
-
|
|
839
|
-
const nftChildGenesis1 = { ...genesisOptions };
|
|
840
|
-
nftChildGenesis1.ticker = ticker + "NFTC_Bug";
|
|
841
|
-
nftChildGenesis1.name = "Mainnet NFT Child";
|
|
842
|
-
nftChildGenesis1.parentTokenId = parentResult.tokenId;
|
|
843
|
-
|
|
844
|
-
const childResult: SlpGenesisResult = await aliceWallet.slp.nftChildGenesis(
|
|
845
|
-
nftChildGenesis1
|
|
846
|
-
);
|
|
847
|
-
|
|
848
|
-
// // bug in the SLPDB, the parent burn check is not triggered until new block arrives
|
|
849
|
-
// await mine({ cashaddr: aliceWallet.cashaddr!, blocks: 1 });
|
|
850
|
-
// await delay(5000);
|
|
851
|
-
|
|
852
|
-
// fail to to perform child genesis. we are out of parent tokens
|
|
853
|
-
const nftChildGenesis2 = { ...genesisOptions };
|
|
854
|
-
nftChildGenesis2.ticker = ticker + "1_Bug";
|
|
855
|
-
nftChildGenesis2.parentTokenId = parentResult.tokenId;
|
|
856
|
-
|
|
857
|
-
await expect(
|
|
858
|
-
aliceWallet.slp.nftChildGenesis(nftChildGenesis2)
|
|
859
|
-
).rejects.toThrow();
|
|
860
|
-
});
|
|
861
|
-
|
|
862
|
-
test.skip("test times", async () => {
|
|
863
|
-
// const aliceWallet = await getAliceWallet();
|
|
864
|
-
|
|
865
|
-
const slpDbProvider = new SlpDbProvider(Network.REGTEST);
|
|
866
|
-
const gsppProvider = new GsppProvider(Network.REGTEST);
|
|
867
|
-
|
|
868
|
-
const start1 = new Date().getTime();
|
|
869
|
-
const count1 = await slpDbProvider.SlpUtxos(
|
|
870
|
-
"simpleledger:qqr7rg6t5pd0xux35297etxklhe4l6p6uua8f5gump"
|
|
871
|
-
);
|
|
872
|
-
const end1 = new Date().getTime();
|
|
873
|
-
|
|
874
|
-
const start2 = new Date().getTime();
|
|
875
|
-
const count2 = await gsppProvider.SlpUtxos(
|
|
876
|
-
"simpleledger:qqr7rg6t5pd0xux35297etxklhe4l6p6uua8f5gump"
|
|
877
|
-
);
|
|
878
|
-
const end2 = new Date().getTime();
|
|
879
|
-
// console.log("Slpdb", end1-start1);
|
|
880
|
-
console.log(
|
|
881
|
-
"Slpdb",
|
|
882
|
-
end1 - start1,
|
|
883
|
-
"Gspp",
|
|
884
|
-
end2 - start2,
|
|
885
|
-
count1.length,
|
|
886
|
-
count2.length
|
|
887
|
-
);
|
|
888
|
-
|
|
889
|
-
// expect(count1.length).toBe(count2.length);
|
|
890
|
-
// console.log(count1.length, count2.length);
|
|
891
|
-
});
|
|
892
|
-
|
|
893
|
-
test("Slp wallet creation", async () => {
|
|
894
|
-
const m = await Wallet.slp.named("wallet");
|
|
895
|
-
expect(m.name).toBe("wallet");
|
|
896
|
-
expect(m.network).toBe(Network.MAINNET);
|
|
897
|
-
expect(m.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
898
|
-
expect(m.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
899
|
-
|
|
900
|
-
const t = await TestNetWallet.slp.named("testnetwallet");
|
|
901
|
-
expect(t.name).toBe("testnetwallet");
|
|
902
|
-
expect(t.network).toBe(Network.TESTNET);
|
|
903
|
-
expect(t.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
904
|
-
expect(t.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
905
|
-
|
|
906
|
-
const r = await RegTestWallet.slp.named("regwallet");
|
|
907
|
-
expect(r.name).toBe("regwallet");
|
|
908
|
-
expect(r.network).toBe(Network.REGTEST);
|
|
909
|
-
expect(r.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
910
|
-
expect(r.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
911
|
-
|
|
912
|
-
let wallet: Wallet;
|
|
913
|
-
wallet = await Wallet.slp.fromSeed(new Array(12).join("abandon "));
|
|
914
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
915
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
916
|
-
expect(wallet.network).toBe(Network.MAINNET);
|
|
917
|
-
|
|
918
|
-
wallet = await TestNetWallet.slp.fromSeed(
|
|
919
|
-
new Array(12).join("abandon "),
|
|
920
|
-
"m/44'/200'/0'/0/0"
|
|
921
|
-
);
|
|
922
|
-
expect(wallet.derivationPath).toBe("m/44'/200'/0'/0/0");
|
|
923
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/200'/0'/0/0");
|
|
924
|
-
expect(wallet.network).toBe(Network.TESTNET);
|
|
925
|
-
|
|
926
|
-
wallet = await Wallet.slp.newRandom();
|
|
927
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
928
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
929
|
-
expect(wallet.network).toBe(Network.MAINNET);
|
|
930
|
-
|
|
931
|
-
wallet = await Wallet.slp.newRandom("name", "name");
|
|
932
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
933
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
934
|
-
expect(wallet.network).toBe(Network.MAINNET);
|
|
935
|
-
|
|
936
|
-
wallet = await createSlpWallet({
|
|
937
|
-
name: "test",
|
|
938
|
-
network: "mainnet",
|
|
939
|
-
type: WalletTypeEnum.Seed,
|
|
940
|
-
});
|
|
941
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
942
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
943
|
-
expect(wallet.network).toBe(Network.MAINNET);
|
|
944
|
-
|
|
945
|
-
wallet = await createSlpWallet({
|
|
946
|
-
name: "test2",
|
|
947
|
-
network: "testnet",
|
|
948
|
-
type: WalletTypeEnum.Seed,
|
|
949
|
-
});
|
|
950
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
951
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
952
|
-
expect(wallet.network).toBe(Network.TESTNET);
|
|
953
|
-
|
|
954
|
-
wallet = await createSlpWallet({
|
|
955
|
-
name: "test3",
|
|
956
|
-
network: "regtest",
|
|
957
|
-
type: WalletTypeEnum.Seed,
|
|
958
|
-
});
|
|
959
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
960
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
961
|
-
expect(wallet.network).toBe(Network.REGTEST);
|
|
962
|
-
|
|
963
|
-
wallet = await createSlpWallet({
|
|
964
|
-
network: "mainnet",
|
|
965
|
-
type: WalletTypeEnum.Seed,
|
|
966
|
-
});
|
|
967
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
968
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
969
|
-
expect(wallet.network).toBe(Network.MAINNET);
|
|
970
|
-
|
|
971
|
-
wallet = await createSlpWallet({
|
|
972
|
-
network: "testnet",
|
|
973
|
-
type: WalletTypeEnum.Seed,
|
|
974
|
-
});
|
|
975
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
976
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
977
|
-
expect(wallet.network).toBe(Network.TESTNET);
|
|
978
|
-
|
|
979
|
-
wallet = await createSlpWallet({
|
|
980
|
-
network: "regtest",
|
|
981
|
-
type: WalletTypeEnum.Seed,
|
|
982
|
-
});
|
|
983
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
984
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
985
|
-
expect(wallet.network).toBe(Network.REGTEST);
|
|
986
|
-
});
|
|
987
|
-
|
|
988
|
-
test("Slp wallet retrieval", async () => {
|
|
989
|
-
let wallet: Wallet;
|
|
990
|
-
wallet = await createSlpWallet({
|
|
991
|
-
name: "test",
|
|
992
|
-
network: "testnet",
|
|
993
|
-
type: WalletTypeEnum.Seed,
|
|
994
|
-
});
|
|
995
|
-
expect(wallet.derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
996
|
-
expect(wallet.getSeed().derivationPath).toBe("m/44'/245'/0'/0/0");
|
|
997
|
-
expect(wallet.network).toBe(Network.TESTNET);
|
|
998
|
-
expect(wallet.name).toBe("test");
|
|
999
|
-
});
|
|
1000
|
-
});
|